-- license:MIT -- copyright-holders:David Kolf local exports = {} exports.name = "luvit/json" exports.version = "2.5.0" exports.homepage = "http://dkolf.de/src/dkjson-lua.fsl" exports.description = "David Kolf's JSON library repackaged for lit." exports.tags = {"json", "codec"} exports.license = "MIT" exports.author = { name = "David Kolf", homepage = "http://dkolf.de/", } exports.contributors = { "Tim Caswell", } -- Module options: local always_try_using_lpeg = false local register_global_module_table = false local global_module_name = 'json' --[==[ David Kolf's JSON module for Lua 5.1/5.2 Version 2.5 For the documentation see the corresponding readme.txt or visit . You can contact the author by sending an e-mail to 'david' at the domain 'dkolf.de'. Copyright (C) 2010-2013 David Heiko Kolf Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --]==] -- global dependencies: local pairs, type, tostring, tonumber, getmetatable, setmetatable = pairs, type, tostring, tonumber, getmetatable, setmetatable local error, require, pcall, select = error, require, pcall, select local floor, huge = math.floor, math.huge local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat = string.rep, string.gsub, string.sub, string.byte, string.char, string.find, string.len, string.format local strmatch = string.match local concat = table.concat local json = exports json.original_version = "dkjson 2.5" if register_global_module_table then _G[global_module_name] = json end _ENV = nil -- blocking globals in Lua 5.2 pcall (function() -- Enable access to blocked metatables. -- Don't worry, this module doesn't change anything in them. local debmeta = require "debug".getmetatable if debmeta then getmetatable = debmeta end end) json.null = setmetatable ({}, { __tojson = function () return "null" end }) local function isarray (tbl) local max, n, arraylen = 0, 0, 0 for k,v in pairs (tbl) do if k == 'n' and type(v) == 'number' then arraylen = v if v > max then max = v end else if type(k) ~= 'number' or k < 1 or floor(k) ~= k then return false end if k > max then max = k end n = n + 1 end end if max > 10 and max > arraylen and max > n * 2 then return false -- don't create an array with too many holes end return true, max end local escapecodes = { ["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t" } local function escapeutf8 (uchar) local value = escapecodes[uchar] if value then return value end local a, b, c, d = strbyte (uchar, 1, 4) a, b, c, d = a or 0, b or 0, c or 0, d or 0 if a <= 0x7f then value = a elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then value = (a - 0xc0) * 0x40 + b - 0x80 elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80 elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80 else return "" end if value <= 0xffff then return strformat ("\\u%.4x", value) elseif value <= 0x10ffff then -- encode as UTF-16 surrogate pair value = value - 0x10000 local highsur, lowsur = 0xD800 + floor (value/0x400), 0xDC00 + (value % 0x400) return strformat ("\\u%.4x\\u%.4x", highsur, lowsur) else return "" end end local function fsub (str, pattern, repl) -- gsub always builds a new string in a buffer, even when no match -- exists. First using find should be more efficient when most strings -- don't contain the pattern. if strfind (str, pattern) then return gsub (str, pattern, repl) else return str end end local function quotestring (value) -- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js value = fsub (value, "[%z\1-\31\"\\\127]", escapeutf8) if strfind (value, "[\194\216\220\225\226\239]") then value = fsub (value, "\194[\128-\159\173]", escapeutf8) value = fsub (value, "\216[\128-\132]", escapeutf8) value = fsub (value, "\220\143", escapeutf8) value = fsub (value, "\225\158[\180\181]", escapeutf8) value = fsub (value, "\226\128[\140-\143\168-\175]", escapeutf8) value = fsub (value, "\226\129[\160-\175]", escapeutf8) value = fsub (value, "\239\187\191", escapeutf8) value = fsub (value, "\239\191[\176-\191]", escapeutf8) end return "\"" .. value .. "\"" end json.quotestring = quotestring local function replace(str, o, n) local i, j = strfind (str, o, 1, true) if i then return strsub(str, 1, i-1) .. n .. strsub(str, j+1, -1) else return str end end -- locale independent num2str and str2num functions local decpoint, numfilter local function updatedecpoint () decpoint = strmatch(tostring(0.5), "([^05+])") -- build a filter that can be used to remove group separators numfilter = "[^0-9%-%+eE" .. gsub(decpoint, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0") .. "]+" end updatedecpoint() local function num2str (num) return replace(fsub(tostring(num), numfilter, ""), decpoint, ".") end local function str2num (str) local num = tonumber(replace(str, ".", decpoint)) if not num then updatedecpoint() num = tonumber(replace(str, ".", decpoint)) end return num end local function addnewline2 (level, buffer, buflen) buffer[buflen+1] = "\n" buffer[buflen+2] = strrep (" ", level) buflen = buflen + 2 return buflen end function json.addnewline (state) if state.indent then state.bufferlen = addnewline2 (state.level or 0, state.buffer, state.bufferlen or #(state.buffer)) end end local encode2 -- forward declaration local function addpair (key, value, prev, indent, level, buffer, buflen, tables, globalorder, state) local kt = type (key) if kt ~= 'string' and kt ~= 'number' then return nil, "type '" .. kt .. "' is not supported as a key by JSON." end if prev then buflen = buflen + 1 buffer[buflen] = "," end if indent then buflen = addnewline2 (level, buffer, buflen) end buffer[buflen+1] = quotestring (key) buffer[buflen+2] = ":" return encode2 (value, indent, level, buffer, buflen + 2, tables, globalorder, state) end local function appendcustom(res, buffer, state) local buflen = state.bufferlen if type (res) == 'string' then buflen = buflen + 1 buffer[buflen] = res end return
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/*********************************************************************

    formats/comx35_dsk.c

    COMX-35 disk image format

*********************************************************************/

/*

    TODO:

    - implement 70 track image detection (first byte of file = 0x01 -> single sided)
    - format double sided, single track density

        :exp:fd:wd1770: track description
        40xff 6x00
        fe 4x00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 07 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 0e 00 f7 17x00 fb 128x00 f7 16x00
        fe 2x00 05 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 0c 00 f7 17x00 fb 128x00 f7 16x00
        fe 2x00 03 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 0a 00 f7 17x00 fb 128x00 f7 16x00
        fe 2x00 01 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 08 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 0f 00 f7 17x00 fb 128x00 f7 16x00
        fe 2x00 06 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 0d 00 f7 17x00 fb 128x00 f7 16x00
        fe 2x00 04 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 0b 00 f7 17x00 fb 128x00 f7 16x00
        fe 2x00 02 00 f7 17x00 fb 128x00 f7 17x00
        fe 2x00 09 00 f7 17x00 fb 128x00 f7 3476x00

*/

#include <cassert>

#include "formats/comx35_dsk.h"

comx35_format::comx35_format() : wd177x_format(formats)
{
}

const char *comx35_format::name() const
{
	return "comx35";
}

const char *comx35_format::description() const
{
	return "COMX-35 disk image";
}

const char *comx35_format::extensions() const
{
	return "img";
}

// Unverified gap sizes
const comx35_format::format comx35_format::formats[] = {
	{   //  70K 5 1/4 inch single density, single sided, 35 tracks
		floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
		4000, 16, 35, 1, 128, {}, -1, { 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }, 40, 11, 10
	},
	{   //  140K 5 1/4 inch single density, double sided, 35 tracks
		floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
		4000, 16, 35, 2, 128, {}, -1, { 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }, 40, 11, 10
	},
	/*{   //  140K 5 1/4 inch single density, double track density, single sided, 70 tracks
	    floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM,
	    4000, 16, 70, 1, 128, {}, -1, { 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 }, 40, 11, 10
	},*/
	{}
};

const floppy_format_type FLOPPY_COMX35_FORMAT = &floppy_image_format_creator<comx35_format>;