mirror of
https://github.com/whscullin/apple2js.git
synced 2024-01-12 14:14:38 +00:00
173 lines
3.5 KiB
JavaScript
173 lines
3.5 KiB
JavaScript
function ApplesoftDump(mem)
|
|
{
|
|
var _mem = mem;
|
|
|
|
var LETTERS =
|
|
" " +
|
|
" !\"#$%&'()*+,-./0123456789:;<=>?" +
|
|
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +
|
|
"`abcdefghijklmnopqrstuvwxyz{|}~ ";
|
|
var TOKENS = {
|
|
0x80: "END",
|
|
0x81: "FOR",
|
|
0x82: "NEXT",
|
|
0x83: "DATA",
|
|
0x84: "INPUT",
|
|
0x85: "DEL",
|
|
0x86: "DIM",
|
|
0x87: "READ",
|
|
0x88: "GR",
|
|
0x89: "TEXT",
|
|
0x8a: "PR#",
|
|
0x8b: "IN#",
|
|
0x8c: "CALL",
|
|
0x8d: "PLOT",
|
|
0x8e: "HLIN",
|
|
0x8f: "VLIN",
|
|
0x90: "HGR2",
|
|
0x91: "HGR",
|
|
0x92: "HCOLOR=",
|
|
0x93: "HPLOT",
|
|
0x94: "DRAW",
|
|
0x95: "XDRAW",
|
|
0x96: "HTAB",
|
|
0x97: "HOME",
|
|
0x98: "ROT=",
|
|
0x99: "SCALE=",
|
|
0x9a: "SHLOAD",
|
|
0x9b: "TRACE",
|
|
0x9c: "NOTRACE",
|
|
0x9d: "NORMAL",
|
|
0x9e: "INVERSE",
|
|
0x9f: "FLASH",
|
|
0xa0: "COLOR=",
|
|
0xa1: "POP=",
|
|
0xa2: "VTAB",
|
|
0xa3: "HIMEM:",
|
|
0xa4: "LOMEM:",
|
|
0xa5: "ONERR",
|
|
0xa6: "RESUME",
|
|
0xa7: "RECALL",
|
|
0xa8: "STORE",
|
|
0xa9: "SPEED=",
|
|
0xaa: "LET",
|
|
0xab: "GOTO",
|
|
0xac: "RUN",
|
|
0xad: "IF",
|
|
0xae: "RESTORE",
|
|
0xaf: "&",
|
|
0xb0: "GOSUB",
|
|
0xb1: "RETURN",
|
|
0xb2: "REM",
|
|
0xb3: "STOP",
|
|
0xb4: "ON",
|
|
0xb5: "WAIT",
|
|
0xb6: "LOAD",
|
|
0xb7: "SAVE",
|
|
0xb8: "DEF",
|
|
0xb9: "POKE",
|
|
0xba: "PRINT",
|
|
0xbb: "CONT",
|
|
0xbc: "LIST",
|
|
0xbd: "CLEAR",
|
|
0xbe: "GET",
|
|
0xbf: "NEW",
|
|
0xc0: "TAB(",
|
|
0xc1: "TO",
|
|
0xc2: "FN",
|
|
0xc3: "SPC(",
|
|
0xc4: "THEN",
|
|
0xc5: "AT",
|
|
0xc6: "NOT",
|
|
0xc7: "STEP",
|
|
0xc8: "+",
|
|
0xc9: "-",
|
|
0xca: "*",
|
|
0xcb: "/",
|
|
0xcc: "^",
|
|
0xcd: "AND",
|
|
0xce: "OR",
|
|
0xcf: ">",
|
|
0xd0: "=",
|
|
0xd1: "<",
|
|
0xd2: "SGN",
|
|
0xd3: "INT",
|
|
0xd4: "ABS",
|
|
0xd5: "USR",
|
|
0xd6: "FRE",
|
|
0xd7: "SCRN(",
|
|
0xd8: "PDL",
|
|
0xd9: "POS",
|
|
0xda: "SQR",
|
|
0xdb: "RND",
|
|
0xdc: "LOG",
|
|
0xdd: "EXP",
|
|
0xde: "COS",
|
|
0xdf: "SIN",
|
|
0xe0: "TAN",
|
|
0xe1: "ATN",
|
|
0xe2: "PEEK",
|
|
0xe3: "LEN",
|
|
0xe4: "STR$",
|
|
0xe5: "VAL",
|
|
0xe6: "ASC",
|
|
0xe7: "CHR$",
|
|
0xe8: "LEFT$",
|
|
0xe9: "RIGHT$",
|
|
0xea: "MID$"
|
|
};
|
|
|
|
function readByte(addr) {
|
|
var page = addr >> 8,
|
|
off = addr & 0xff;
|
|
|
|
return _mem.read(page, off);
|
|
}
|
|
|
|
function readWord(addr) {
|
|
var lsb, msb;
|
|
|
|
lsb = readByte(addr, debug);
|
|
msb = readByte(addr + 1, debug);
|
|
|
|
return (msb << 8) | lsb;
|
|
}
|
|
|
|
return {
|
|
toString: function () {
|
|
var str = "";
|
|
var start = readWord(0x67); // Start
|
|
var end = readWord(0xaf); // End of program
|
|
var addr = start;
|
|
do {
|
|
var line = "";
|
|
var next = readWord(addr);
|
|
addr += 2;
|
|
var lineno = readWord(addr);
|
|
addr += 2;
|
|
|
|
line += lineno;
|
|
line += " ";
|
|
var val = false;
|
|
do {
|
|
if (addr < start || addr > end)
|
|
return str;
|
|
|
|
var val = readByte(addr++);
|
|
if (val > 0x80) {
|
|
line += " ";
|
|
line += TOKENS[val];
|
|
line += " ";
|
|
}
|
|
else
|
|
line += LETTERS[val];
|
|
} while (val);
|
|
line += "\n";
|
|
str += line;
|
|
addr = next;
|
|
} while (addr && addr >= start && addr < end);
|
|
|
|
return str;
|
|
}
|
|
};
|
|
} |