/** * This file is a part of JaC64 - a Java C64 Emulator * Main Developer: Joakim Eriksson (Dreamfabric.com) * Contact: joakime@sics.se * Web: http://www.dreamfabric.com/c64 * --------------------------------------------------- */ package com.dreamfabric.c64utils; import com.dreamfabric.jac64.*; /** * @author jblok * @author Joakim Eriksson (joakime@sics.se */ public class Debugger implements IMonitor,M6510Ops { private boolean DEBUG = false; private boolean DEBUG_IRQ = true; private boolean noinstructions = false; private int level = 10; String prefix = ""; public long lastCycles = 0; private MOS6510Core cpu; private int[] memory; public void init(MOS6510Core cpu) { this.cpu = cpu; memory = cpu.getMemory(); } /** * @see IMonitor#isEnabled() */ public boolean isEnabled() { return DEBUG; } public void setPrefix(String prefix) { this.prefix = prefix; } public void info(Object o) { output((String) o); } public void warning(Object o) { output((String) o); } public void error(Object o) { output((String) o); } private void output(String s) { if (prefix != null) { if (s.startsWith(prefix)) { System.out.println(s); } } else { System.out.println(s); } } private int fetchByte(int pc) { return memory[pc]; } /** * Only for debugging purposes * @see IMonitor#disAssemble(int, int, int, int, int, byte, boolean) */ public void disAssemble(int[] memory, int pc, int acc, int x, int y, byte status, int interruptInExec, int lastInterrupt) { if (DEBUG || (interruptInExec > 0)) { int startPC = pc; StringBuffer line = new StringBuffer(); if (!noinstructions) { line.append(Integer.toHexString(pc)); for(int i = 5-line.length(); i >= 0 ;i--) { line.append(" "); } // Will not be exactly the same as the PC fetch?! int data = MOS6510Ops.INSTRUCTION_SET[memory[pc++]]; int op = data & MOS6510Ops.OP_MASK; int addrMode = data & MOS6510Ops.ADDRESSING_MASK; int adMode = addrMode >> 8; boolean read = (data & MOS6510Ops.READ) != 0; boolean write = (data & MOS6510Ops.WRITE) != 0; int adr = 0; int tmp = 0; // fetch first argument (always fetched...) - but not always pc++!! int p1 = memory[pc]; line.append(MOS6510Ops.INS_STR[op]); line.append(MOS6510Ops.ADR_STR_PRE[adMode]); // Fetch addres, and read if it should be done! switch (addrMode) { // never any address when immediate case MOS6510Ops.IMMEDIATE: pc++; data = p1; line.append("$" + Hex.hex2(data)); break; case MOS6510Ops.ABSOLUTE: pc++; adr = (fetchByte(pc++) << 8) + p1; line.append("$" + Hex.hex2(adr)); if (read) { data = fetchByte(adr); line.append("=" + Hex.hex2(data)); } break; case MOS6510Ops.ZERO: pc++; adr = p1; line.append("$" + Hex.hex2(adr)); if (read) { data = fetchByte(adr); line.append("=" + Hex.hex2(data)); } break; case MOS6510Ops.ZERO_X: case MOS6510Ops.ZERO_Y: pc++; // Read from wrong address first... fetchByte(p1); if (addrMode == MOS6510Ops.ZERO_X) adr = (p1 + x) & 0xff; else adr = (p1 + y) & 0xff; line.append("$" + Hex.hex2(adr)); if (read) { data = fetchByte(adr); line.append("=" + Hex.hex2(data)); } break; case MOS6510Ops.ABSOLUTE_X: case MOS6510Ops.ABSOLUTE_Y: pc++; // Fetch hi byte! adr = fetchByte(pc++) << 8; // add x/y to low byte & possibly faulty fetch! if (addrMode == MOS6510Ops.ABSOLUTE_X) p1 += x; else p1 += y; data = fetchByte(adr + (p1 & 0xff)); adr += p1; // If read - a fifth cycle patches the incorrect address... // Always done if RMW! line.append("$" + Hex.hex2(adr)); if (read && (p1 > 0xff || write)) { data = fetchByte(adr); line.append("=" + Hex.hex2(data)); } break; case MOS6510Ops.RELATIVE: pc++; adr = pc + (byte) p1; if (((adr ^ pc) & 0xff00) > 0) { // loose one cycle since adr is on another page... tmp = 2; } else { tmp = 1; } line.append("$" + Hex.hex2(adr)); break; case MOS6510Ops.ACCUMULATOR: data = acc; write = false; break; case MOS6510Ops.INDIRECT_X: pc++; // unneccesary read... fetchByte(p1); tmp = (p1 + x) & 0xff; adr = (fetchByte(tmp + 1) << 8); adr |= fetchByte(tmp); line.append("$" + Hex.hex2(adr)); if (read) { data = fetchByte(adr); line.append("=" + Hex.hex2(data)); } break; case MOS6510Ops.INDIRECT_Y: pc++; // Fetch hi and lo adr = (fetchByte(p1 + 1) << 8); p1 = fetchByte(p1); p1 += y; data = fetchByte(adr + (p1 & 0xff)); adr += p1; // If read - a sixth cycle patches the incorrect address... // Always done if RMW! line.append("$" + Hex.hex2(adr)); if (read && (p1 > 0xff || write)) { data = fetchByte(adr); line.append("=" + Hex.hex2(data)); } break; case MOS6510Ops.INDIRECT: pc++; // Fetch pointer adr = (fetchByte(pc) << 8) + p1; // Calculate address tmp = (adr & 0xfff00) | ((adr + 1) & 0xff); // fetch the real address adr = (fetchByte(tmp) << 8) + fetchByte(adr); line.append("$" + Hex.hex2(adr)); break; } line.append(MOS6510Ops.ADR_STR_POST[adMode]); StringBuffer bytes = new StringBuffer(); for (int i = startPC; i < pc; i++) { bytes.append(Integer.toString(memory[i], 16)); bytes.append(" "); } for (int i = 9-bytes.length(); i > 0; i--) { bytes.append(" "); } if (interruptInExec > 0) { if (lastInterrupt == MOS6510Core.NMI_INT) bytes.append("[NMI] " + interruptInExec + " "); else bytes.append("[IRQ] " + interruptInExec + " "); } else { bytes.append(" "); } if (line.length() > 6) line.insert(6, bytes.toString()); for (int i = 45-line.length(); i > 0; i--) { line.append(" "); } if (!noinstructions) { line.append("A:"); line.append(Hex.hex2(acc)); line.append(" X:"); line.append(Hex.hex2(x)); line.append(" Y:"); line.append(Hex.hex2(y)); line.append(" "); boolean carry = ((status & 0x01) != 0); boolean zero = ((status & 0x02) != 0); boolean disableInterupt = ((status & 0x04) != 0); boolean decimal = ((status & 0x08) != 0); boolean brk = ((status & 0x10) != 0); boolean overflow = ((status & 0x40) != 0); boolean sign = ((status & 0x80) != 0); line.append(carry ? "C" : "-"); line.append(zero ? "Z" : "-"); line.append(disableInterupt ? "I" : "-"); line.append(decimal ? "D" : "-"); line.append(brk ? "B" : "-"); line.append(overflow ? "O" : "-"); line.append(sign ? "S" : "-"); if (DEBUG_IRQ) { line.append(" "); line.append(cpu.NMILow ? "N" : "-"); line.append(cpu.getIRQLow() ? "I" : "-"); } line.append(" S:" + Hex.hex2(cpu.getSP())); line.append(" " + Hex.hex2((int) (cpu.cycles - lastCycles))); // Print out system routine names getFunction(memory, startPC, line); } System.out.println(line); lastCycles = cpu.cycles; // if (line.length() > 0) // { //// while (line.length() < 40) line.append(" "); // // if (noinstructions) // { // line.append(" pc ="); // line.append(Integer.toString(pc, 16)); // System.out.println(str); // } // else // { // line.insert(0,'\n'); // System.out.print(str); // } // } } } } public void getFunction(int[] memory, int startPC, StringBuffer line) { if ((memory[1] & 3) == 3) switch (startPC) { case 0xa000: line.append(" % - Restart Vectors WORD"); break; case 0xa00c: line.append(" % stmdsp BASIC Command Vectors WORD"); break; case 0xa052: line.append(" % fundsp BASIC Function Vectors WORD"); break; case 0xa080: line.append(" % optab BASIC Operator Vectors WORD"); break; case 0xa09e: line.append(" % reslst BASIC Command Keyword Table DATA"); break; case 0xa129: line.append(" % msclst BASIC Misc. Keyword Table DATA"); break; case 0xa140: line.append(" % oplist BASIC Operator Keyword Table DATA"); break; case 0xa14d: line.append(" % funlst BASIC Function Keyword Table DATA"); break; case 0xa19e: line.append(" % errtab Error Message Table DATA"); break; case 0xa328: line.append(" % errptr Error Message Pointers WORD"); break; case 0xa364: line.append(" % okk Misc. Messages TEXT"); break; case 0xa38a: line.append(" % fndfor Find FOR/GOSUB Entry on Stack"); break; case 0xa3b8: line.append(" % bltu Open Space in Memory"); break; case 0xa3fb: line.append(" % getstk Check Stack Depth"); break; case 0xa408: line.append(" % reason Check Memory Overlap / Array area overflow check"); break; case 0xa435: line.append(" % omerr Output ?OUT OF MEMORY Error"); break; case 0xa437: line.append(" % error Error Routine"); break; case 0xa469: line.append(" % errfin Break Entry"); break; case 0xa474: line.append(" % ready Restart BASIC"); break; case 0xa480: line.append(" % main Input & Identify BASIC Line"); break; case 0xa49c: line.append(" % main1 Get Line Number & Tokenise Text"); break; case 0xa4a2: line.append(" % inslin Insert BASIC Text"); break; case 0xa533: line.append(" % linkprg Rechain Lines"); break; case 0xa560: line.append(" % inlin Input Line Into Buffer"); break; case 0xa579: line.append(" % crunch Tokenise Input Buffer"); break; case 0xa613: line.append(" % fndlin Search for Line Number"); break; case 0xa642: line.append(" % scrtch Perform [new]"); break; case 0xa65e: line.append(" % clear Perform [clr]"); break; case 0xa68e: line.append(" % stxpt Reset TXTPTR"); break; case 0xa69c: line.append(" % list Perform [list]"); break; case 0xa717: line.append(" % qplop Handle LIST Character"); break; case 0xa742: line.append(" % for Perform [for]"); break; case 0xa7ae: line.append(" % newstt BASIC Warm Start"); break; case 0xa7c4: line.append(" % ckeol Check End of Program"); break; case 0xa7e1: line.append(" % gone Prepare to execute statement"); break; case 0xa7ed: line.append(" % gone3 Perform BASIC Keyword,Execute command in A"); break; case 0xa81d: line.append(" % restor Perform [restore]"); break; case 0xa82c: line.append(" % stop Perform [stop], [end], break"); break; case 0xa857: line.append(" % cont Perform [cont]"); break; case 0xa871: line.append(" % run Perform [run]"); break; case 0xa883: line.append(" % gosub Perform [gosub]"); break; case 0xa8a0: line.append(" % goto Perform [goto]"); break; case 0xa8d2: line.append(" % return Perform [return]"); break; case 0xa8f8: line.append(" % data Perform [data]"); break; case 0xa906: line.append(" % datan Search for Next Statement / Line"); break; case 0xa928: line.append(" % if Perform [if]"); break; case 0xa93b: line.append(" % rem Perform [rem]"); break; case 0xa94b: line.append(" % ongoto Perform [on]"); break; case 0xa96b: line.append(" % linget Fetch linnum From BASIC"); break; case 0xa9a5: line.append(" % let Perform [let]"); break; case 0xa9c4: line.append(" % putint Assign Integer"); break; case 0xa9d6: line.append(" % ptflpt Assign Floating Point"); break; case 0xa9d9: line.append(" % putstr Assign String"); break; case 0xa9e3: line.append(" % puttim Assign TI$"); break; case 0xaa2c: line.append(" % getspt Add Digit to FAC#1"); break; case 0xaa80: line.append(" % printn Perform [print]#"); break; case 0xaa86: line.append(" % cmd Perform [cmd]"); break; case 0xaa9a: line.append(" % strdon Print String From Memory"); break; case 0xaaa0: line.append(" % print Perform [print]"); break; case 0xaab8: line.append(" % varop Output Variable"); break; case 0xaad7: line.append(" % crdo Output CR/LF"); break; case 0xaae8: line.append(" % comprt Handle comma, TAB(, SPC("); break; case 0xab1e: line.append(" % strout Output String"); break; case 0xab3b: line.append(" % outspc Output Format Character"); break; case 0xab4d: line.append(" % doagin Handle Bad Data"); break; case 0xab7b: line.append(" % get Perform [get]"); break; case 0xaba5: line.append(" % inputn Perform [input#]"); break; case 0xabbf: line.append(" % input Perform [input]"); break; case 0xabea: line.append(" % bufful Read Input Buffer"); break; case 0xabf9: line.append(" % qinlin Do Input Prompt"); break; case 0xac06: line.append(" % read Perform [read]"); break; case 0xac35: line.append(" % rdget General Purpose Read Routine"); break; case 0xacfc: line.append(" % exint Input Error Messages TEXT"); break; case 0xad1e: line.append(" % next Perform [next]"); break; case 0xad61: line.append(" % donext Check Valid Loop"); break; case 0xad8a: line.append(" % frmnum Confirm Result"); break; case 0xad9e: line.append(" % frmevl Evaluate Expression in Text"); break; case 0xae83: line.append(" % eval Evaluate Single Term"); break; case 0xaea8: line.append(" % pival Constant - pi DATA"); break; case 0xaead: line.append(" % qdot Continue Expression"); break; case 0xaef1: line.append(" % parchk Expression in Brackets"); break; case 0xaef7: line.append(" % chkcls Confirm Character"); break; // case 0xaef7: // line.append(" % - -test ')'-"); // break; case 0xaefa: line.append(" % - -test '('-"); break; case 0xaefd: line.append(" % - -test comma-"); break; case 0xaf08: line.append(" % synerr Output ?SYNTAX Error"); break; case 0xaf0d: line.append(" % domin Set up NOT Function"); break; case 0xaf14: line.append(" % rsvvar Identify Reserved Variable"); break; case 0xaf28: line.append(" % isvar Search for Variable"); break; case 0xaf48: line.append(" % tisasc Convert TI to ASCII String"); break; case 0xafa7: line.append(" % isfun Identify Function Type"); break; case 0xafb1: line.append(" % strfun Evaluate String Function"); break; case 0xafd1: line.append(" % numfun Evaluate Numeric Function"); break; case 0xafe6: line.append(" % orop Perform [or], [and]"); break; case 0xb016: line.append(" % dorel Perform <, =, >"); break; case 0xb01b: line.append(" % numrel Numeric Comparison"); break; case 0xb02e: line.append(" % strrel String Comparison"); break; case 0xb07e: line.append(" % dim Perform [dim]"); break; case 0xb08b: line.append(" % ptrget Identify Variable"); break; case 0xb0e7: line.append(" % ordvar Locate Ordinary Variable"); break; case 0xb11d: line.append(" % notfns Create New Variable"); break; case 0xb128: line.append(" % notevl Create Variable"); break; case 0xb194: line.append(" % aryget Allocate Array Pointer Space"); break; case 0xb1a5: line.append(" % n32768 Constant 32768 in Flpt DATA"); break; case 0xb1aa: line.append(" % facinx FAC#1 to Integer in (AC/YR)"); break; case 0xb1b2: line.append(" % intidx Evaluate Text for Integer (convert)"); break; case 0xb1bf: line.append(" % ayint Float (FAC#1) to Positive Integer (convert)"); break; case 0xb1d1: line.append(" % isary Get Array Parameters"); break; case 0xb218: line.append(" % fndary Find Array"); break; case 0xb245: line.append(" % bserr ?BAD SUBSCRIPT/?ILLEGAL QUANTITY"); break; case 0xb261: line.append(" % notfdd Create Array"); break; case 0xb30e: line.append(" % inlpn2 Locate Element in Array"); break; case 0xb34c: line.append(" % umult Number of Bytes in Subscript"); break; case 0xb37d: line.append(" % fre Perform [fre]"); break; case 0xb391: line.append(" % givayf Convert Integer in (AC/YR) to Flpt"); break; case 0xb39e: line.append(" % pos Perform [pos]"); break; case 0xb3a6: line.append(" % errdir Confirm Program Mode"); break; case 0xb3e1: line.append(" % getfnm Check Syntax of FN"); break; case 0xb3f4: line.append(" % fndoer Perform [fn]"); break; case 0xb465: line.append(" % strd Perform [str$]"); break; case 0xb487: line.append(" % strlit Set Up String"); break; case 0xb4d5: line.append(" % putnw1 Save String Descriptor"); break; case 0xb4f4: line.append(" % getspa Allocate Space for String"); break; case 0xb526: line.append(" % garbag Garbage Collection"); break; case 0xb5bd: line.append(" % dvars Search for Next String"); break; case 0xb606: line.append(" % grbpas Collect a String"); break; case 0xb63d: line.append(" % cat Concatenate Two Strings"); break; case 0xb67a: line.append(" % movins Store String in High RAM"); break; case 0xb6a3: line.append(" % frestr Perform String Housekeeping"); break; case 0xb6db: line.append(" % frefac Clean Descriptor Stack"); break; case 0xb6ec: line.append(" % chrd Perform [chr$]"); break; case 0xb700: line.append(" % leftd Perform [left$]"); break; case 0xb72c: line.append(" % rightd Perform [right$]"); break; case 0xb737: line.append(" % midd Perform [mid$]"); break; case 0xb761: line.append(" % pream Pull sTring Parameters"); break; case 0xb77c: line.append(" % len Perform [len]"); break; case 0xb782: line.append(" % len1 Exit String Mode"); break; case 0xb78b: line.append(" % asc Perform [asc]"); break; case 0xb79b: line.append(" % gtbytc Evaluate Text to 1 Byte in XR"); break; case 0xb7ad: line.append(" % val Perform [val]"); break; case 0xb7b5: line.append(" % strval Convert ASCII String to Flpt"); break; case 0xb7eb: line.append(" % getnum Get parameters for POKE/WAIT"); break; case 0xb7f7: line.append(" % getadr Convert FAC#1 to Integer in LINNUM"); break; case 0xb80d: line.append(" % peek Perform [peek]"); break; case 0xb824: line.append(" % poke Perform [poke]"); break; case 0xb82d: line.append(" % wait Perform [wait]"); break; case 0xb849: line.append(" % faddh Add 0.5 to FAC#1"); break; case 0xb850: line.append(" % fsub Perform Subtraction"); break; case 0xb862: line.append(" % fadd5 Normalise Addition"); break; case 0xb867: line.append(" % fadd Perform Addition"); break; case 0xb947: line.append(" % negfac 2's Complement FAC#1"); break; case 0xb97e: line.append(" % overr Output ?OVERFLOW Error"); break; case 0xb983: line.append(" % mulshf Multiply by Zero Byte"); break; case 0xb9bc: line.append(" % fone Table of Flpt Constants DATA"); break; case 0xb9ea: line.append(" % log Perform [log]"); break; case 0xba28: line.append(" % fmult Perform Multiply"); break; case 0xba59: line.append(" % mulply Multiply by a Byte"); break; case 0xba8c: line.append(" % conupk Load FAC#2 From Memory"); break; case 0xbab7: line.append(" % muldiv Test Both Accumulators"); break; case 0xbad4: line.append(" % mldvex Overflow / Underflow"); break; case 0xbae2: line.append(" % mul10 Multiply FAC#1 by 10"); break; case 0xbaf9: line.append(" % tenc Constant 10 in Flpt DATA"); break; case 0xbafe: line.append(" % div10 Divide FAC#1 by 10"); break; case 0xbb07: line.append(" % fdiv Divide FAC#2 by Flpt at (AC/YR)"); break; case 0xbb0f: line.append(" % fdivt Divide FAC#2 by FAC#1"); break; case 0xbba2: line.append(" % movfm Load FAC#1 From Memory"); break; case 0xbbc7: line.append(" % mov2f Store FAC#1 in Memory"); break; case 0xbbfc: line.append(" % movfa Copy FAC#2 into FAC#1"); break; case 0xbc0c: line.append(" % movaf Copy FAC#1 into FAC#2"); break; case 0xbc1b: line.append(" % round Round FAC#1"); break; case 0xbc2b: line.append(" % sign Check Sign of FAC#1"); break; case 0xbc39: line.append(" % sgn Perform [sgn]"); break; case 0xbc58: line.append(" % abs Perform [abs]"); break; case 0xbc5b: line.append(" % fcomp Compare FAC#1 With Memory"); break; case 0xbc9b: line.append(" % qint Convert FAC#1 to Integer"); break; case 0xbccc: line.append(" % int Perform [int]"); break; case 0xbcf3: line.append(" % fin Convert ASCII String to a Float in FAC#1"); break; case 0xbdb3: line.append(" % n0999 String Conversion Constants DATA"); break; case 0xbdc2: line.append(" % inprt Output 'IN' and Line Number"); break; case 0xbddd: line.append(" % fout Convert FAC#1 to ASCII String"); break; case 0xbe68: line.append(" % foutim Convert TI to String"); break; case 0xbf11: line.append(" % fhalf Table of Constants DATA"); break; case 0xbf71: line.append(" % sqr Perform [sqr]"); break; case 0xbf7b: line.append(" % fpwrt Perform power ($)"); break; case 0xbfb4: line.append(" % negop Negate FAC#1"); break; case 0xbfbf: line.append(" % logeb2 Table of Constants DATA"); break; case 0xbfed: line.append(" % exp Perform [exp]"); break; case 0xe000: line.append(" % (exp continues) EXP continued From BASIC ROM"); break; case 0xe043: line.append(" % polyx Series Evaluation"); break; case 0xe08d: line.append(" % rmulc Constants for RND DATA"); break; case 0xe097: line.append(" % rnd Perform [rnd]"); break; case 0xe0f9: line.append(" % bioerr Handle I/O Error in BASIC"); break; case 0xe10c: line.append(" % bchout Output Character"); break; case 0xe112: line.append(" % bchin Input Character"); break; case 0xe118: line.append(" % bckout Set Up For Output"); break; case 0xe11e: line.append(" % bckin Set Up For Input"); break; case 0xe124: line.append(" % bgetin Get One Character"); break; case 0xe12a: line.append(" % sys Perform [sys]"); break; case 0xe156: line.append(" % savet Perform [save]"); break; case 0xe165: line.append(" % verfyt Perform [verify / load]"); break; case 0xe1be: line.append(" % opent Perform [open]"); break; case 0xe1c7: line.append(" % closet Perform [close]"); break; case 0xe1d4: line.append(" % slpara Get Parameters For LOAD/SAVE"); break; case 0xe200: line.append(" % combyt Get Next One Byte Parameter"); break; case 0xe206: line.append(" % deflt Check Default Parameters"); break; case 0xe20e: line.append(" % cmmerr Check For Comma"); break; case 0xe219: line.append(" % ocpara Get Parameters For OPEN/CLOSE"); break; case 0xe264: line.append(" % cos Perform [cos]"); break; case 0xe26b: line.append(" % sin Perform [sin]"); break; case 0xe2b4: line.append(" % tan Perform [tan]"); break; case 0xe2e0: line.append(" % pi2 Table of Trig Constants DATA"); break; case 0xe30e: line.append(" % atn Perform [atn]"); break; case 0xe33e: line.append(" % atncon Table of ATN Constants DATA"); break; case 0xe37b: line.append(" % bassft BASIC Warm Start [RUNSTOP-RESTORE]"); break; case 0xe394: line.append(" % init BASIC Cold Start"); break; case 0xe3a2: line.append(" % initat CHRGET For Zero-page"); break; case 0xe3ba: line.append(" % rndsed RND Seed For zero-page DATA"); break; case 0xe3bf: line.append(" % initcz Initialize BASIC RAM"); break; case 0xe422: line.append(" % initms Output Power-Up Message"); break; case 0xe447: line.append(" % bvtrs Table of BASIC Vectors (for 0300) WORD"); break; case 0xe453: line.append(" % initv Initialize Vectors"); break; case 0xe45f: line.append(" % words Power-Up Message DATA"); break; case 0xe4ad: line.append(" % - Patch for BASIC Call to CHKOUT"); break; case 0xe4b7: line.append(" % - Unused Bytes For Future Patches EMPTY"); break; case 0xe4da: line.append(" % - Reset Character Colour"); break; case 0xe4e0: line.append(" % - Pause After Finding Tape File"); break; case 0xe4ec: line.append(" % - RS-232 Timing Table -- PAL DATA"); break; case 0xe500: line.append(" % iobase Get I/O Address"); break; case 0xe505: line.append(" % screen Get Screen Size"); break; case 0xe50a: line.append(" % plot Put / Get Row And Column"); break; case 0xe518: line.append(" % cint1 Initialize I/O"); break; case 0xe544: line.append(" % - Clear Screen"); break; case 0xe566: line.append(" % - Home Cursor"); break; case 0xe56c: line.append(" % - Set Screen Pointers"); break; case 0xe59a: line.append(" % - Set I/O Defaults (Unused Entry)"); break; case 0xe5a0: line.append(" % - Set I/O Defaults"); break; case 0xe5b4: line.append(" % lp2 Get Character From Keyboard Buffer"); break; case 0xe5ca: line.append(" % - Input From Keyboard"); break; case 0xe632: line.append(" % - Input From Screen or Keyboard"); break; case 0xe684: line.append(" % - Quotes Test"); break; case 0xe691: line.append(" % - Set Up Screen Print"); break; case 0xe6b6: line.append(" % - Advance Cursor"); break; case 0xe6ed: line.append(" % - Retreat Cursor"); break; case 0xe701: line.append(" % - Back on to Previous Line"); break; case 0xe716: line.append(" % - Output to Screen"); break; case 0xe72a: line.append(" % - -unshifted characters-"); break; case 0xe7d4: line.append(" % - -shifted characters-"); break; case 0xe87c: line.append(" % - Go to Next Line"); break; case 0xe891: line.append(" % - Output "); break; case 0xe8a1: line.append(" % - Check Line Decrement"); break; case 0xe8b3: line.append(" % - Check Line Increment"); break; case 0xe8cb: line.append(" % - Set Colour Code"); break; case 0xe8da: line.append(" % - Colour Code Table"); break; case 0xe8ea: line.append(" % - Scroll Screen"); break; case 0xe965: line.append(" % - Open A Space On The Screen"); break; case 0xe9c8: line.append(" % - Move A Screen Line"); break; case 0xe9e0: line.append(" % - Syncronise Colour Transfer"); break; case 0xe9f0: line.append(" % - Set Start of Line"); break; case 0xe9ff: line.append(" % - Clear Screen Line"); break; case 0xea13: line.append(" % - Print To Screen"); break; case 0xea24: line.append(" % - Syncronise Colour Pointer"); break; case 0xea31: line.append(" % - Main IRQ Entry Point"); break; case 0xea87: line.append(" % scnkey Scan Keyboard"); break; case 0xeadd: line.append(" % - Process Key Image"); break; case 0xeb79: line.append(" % - Pointers to Keyboard decoding tables WORD"); break; case 0xeb81: line.append(" % - Keyboard 1 -- unshifted DATA"); break; case 0xebc2: line.append(" % - Keyboard 2 -- Shifted DATA"); break; case 0xec03: line.append(" % - Keyboard 3 -- Commodore DATA"); break; case 0xec44: line.append(" % - Graphics/Text Control"); break; case 0xec78: line.append(" % - Keyboard 4 -- Control DATA"); break; case 0xecb9: line.append(" % - Video Chip Setup Table DATA"); break; case 0xece7: line.append(" % - Shift-Run Equivalent"); break; case 0xecf0: line.append(" % - Low Byte Screen Line Addresses DATA"); break; case 0xed09: line.append(" % talk Send TALK Command on Serial Bus"); break; case 0xed0c: line.append(" % listn Send LISTEN Command on Serial Bus"); break; case 0xed40: line.append(" % - Send Data On Serial Bus"); break; case 0xedad: line.append(" % - Flag Errors"); break; case 0xf707: line.append(" % - Status #80 - device not present"); break; case 0xedb0: line.append(" % - Status #03 - write timeout"); break; case 0xedb9: line.append(" % second Send LISTEN Secondary Address"); break; case 0xedbe: line.append(" % - Clear ATN"); break; case 0xedc7: line.append(" % tksa Send TALK Secondary Address"); break; case 0xedcc: line.append(" % - Wait For Clock"); break; case 0xeddd: line.append(" % ciout Send Serial Deferred"); break; case 0xedef: line.append(" % untlk Send UNTALK / UNLISTEN"); break; case 0xee13: line.append(" % acptr Receive From Serial Bus"); break; case 0xee85: line.append(" % - Serial Clock On"); break; case 0xee8e: line.append(" % - Serial Clock Off"); break; case 0xee97: line.append(" % - Serial Output 1"); break; case 0xeea0: line.append(" % - Serial Output 0"); break; case 0xeea9: line.append(" % - Get Serial Data And Clock In"); break; case 0xeeb3: line.append(" % - Delay 1 ms"); break; case 0xeebb: line.append(" % - RS-232 Send"); break; case 0xef06: line.append(" % - Send New RS-232 Byte"); break; case 0xef2e: line.append(" % - 'No DSR' / 'No CTS' Error"); break; case 0xef39: line.append(" % - Disable Timer"); break; case 0xef4a: line.append(" % - Compute Bit Count"); break; case 0xef59: line.append(" % - RS-232 Receive"); break; case 0xef7e: line.append(" % - Set Up To Receive"); break; case 0xef90: line.append(" % - Process RS-232 Byte"); break; case 0xefe1: line.append(" % - Submit to RS-232"); break; case 0xf00d: line.append(" % - No DSR (Data Set Ready) Error"); break; case 0xf017: line.append(" % - Send to RS-232 Buffer"); break; case 0xf04d: line.append(" % - Input From RS-232"); break; case 0xf086: line.append(" % - Get From RS-232"); break; case 0xf0a4: line.append(" % - Serial Bus Idle"); break; case 0xf0bd: line.append(" % - Table of Kernal I/O Messages DATA"); break; case 0xf12b: line.append(" % - Print Message if Direct"); break; case 0xf12f: line.append(" % - Print Message"); break; case 0xf13e: line.append(" % getin Get a byte"); break; case 0xf157: line.append(" % chrin Input a byte"); break; case 0xf199: line.append(" % - Get From Tape / Serial / RS-232"); break; case 0xf1ca: line.append(" % chrout Output One Character"); break; case 0xf20e: line.append(" % chkin Set Input Device"); break; case 0xf250: line.append(" % chkout Set Output Device"); break; case 0xf291: line.append(" % close Close File"); break; case 0xf30f: line.append(" % - Find File"); break; case 0xf31f: line.append(" % - Set File values"); break; case 0xf32f: line.append(" % clall Abort All Files"); break; case 0xf333: line.append(" % clrchn Restore Default I/O"); break; case 0xf34a: line.append(" % open Open File"); break; case 0xf3d5: line.append(" % - Send Secondary Address"); break; case 0xf409: line.append(" % - Open RS-232"); break; case 0xf49e: line.append(" % load Load RAM"); break; case 0xf4b8: line.append(" % - Load File From Serial Bus"); break; case 0xf533: line.append(" % - Load File From Tape"); break; case 0xf5af: line.append(" % - Print 'SEARCHING'"); break; case 0xf5c1: line.append(" % - Print Filename"); break; case 0xf5d2: line.append(" % - Print 'LOADING / VERIFYING'"); break; case 0xf5dd: line.append(" % save Save RAM"); break; case 0xf5fa: line.append(" % - Save to Serial Bus"); break; case 0xf659: line.append(" % - Save to Tape"); break; case 0xf68f: line.append(" % - Print 'SAVING'"); break; case 0xf69b: line.append(" % udtim Bump Clock"); break; case 0xf6dd: line.append(" % rdtim Get Time"); break; case 0xf6e4: line.append(" % settim Set Time"); break; case 0xf6ed: line.append(" % stop Check STOP Key"); break; case 0xf6fb: line.append(" % - 'too many files'"); break; case 0xf6fe: line.append(" % - 'file open'"); break; case 0xf701: line.append(" % - 'file not open'"); break; case 0xf704: line.append(" % - 'file not found'"); break; case 0xf70a: line.append(" % - 'not input file'"); break; case 0xf70d: line.append(" % - 'not output file'"); break; case 0xf710: line.append(" % - 'missing filename'"); break; case 0xf713: line.append(" % - 'illegal device number'"); break; case 0xf72d: line.append(" % - Find Any Tape Header"); break; case 0xf76a: line.append(" % - Write Tape Header"); break; case 0xf7d0: line.append(" % - Get Buffer Address"); break; case 0xf7d7: line.append(" % - Set Buffer Stat / End Pointers"); break; case 0xf7ea: line.append(" % - Find Specific Tape Header"); break; case 0xf80d: line.append(" % - Bump Tape Pointer"); break; case 0xf817: line.append(" % - Print 'PRESS PLAY ON TAPE'"); break; case 0xf82e: line.append(" % - Check Tape Status"); break; case 0xf838: line.append(" % - Print 'PRESS RECORD...'"); break; case 0xf841: line.append(" % - Initiate Tape Read"); break; case 0xf864: line.append(" % - Initiate Tape Write"); break; case 0xf875: line.append(" % - Common Tape Code"); break; case 0xf8d0: line.append(" % - Check Tape Stop"); break; case 0xf8e2: line.append(" % - Set Read Timing"); break; case 0xf92c: line.append(" % - Read Tape Bits"); break; case 0xfa60: line.append(" % - Store Tape Characters"); break; case 0xfb8e: line.append(" % - Reset Tape Pointer"); break; case 0xfb97: line.append(" % - New Character Setup"); break; case 0xfba6: line.append(" % - Send Tone to Tape"); break; case 0xfbc8: line.append(" % - Write Data to Tape"); break; case 0xfbcd: line.append(" % - IRQ Entry Point"); break; case 0xfc57: line.append(" % - Write Tape Leader"); break; case 0xfc93: line.append(" % - Restore Normal IRQ"); break; case 0xfcb8: line.append(" % - Set IRQ Vector"); break; case 0xfcca: line.append(" % - Kill Tape Motor"); break; case 0xfcd1: line.append(" % - Check Read / Write Pointer"); break; case 0xfcdb: line.append(" % - Bump Read / Write Pointer"); break; case 0xfce2: line.append(" % - Power-Up RESET Entry"); break; case 0xfd02: line.append(" % - Check For 8-ROM"); break; case 0xfd12: line.append(" % - 8-ROM Mask '80CBM' DATA"); break; case 0xfd15: line.append(" % restor Restore Kernal Vectors (at 0314)"); break; case 0xfd1a: line.append(" % vector Change Vectors For User"); break; case 0xfd30: line.append(" % - Kernal Reset Vectors WORD"); break; case 0xfd50: line.append(" % ramtas Initialise System Constants"); break; case 0xfd9b: line.append(" % - IRQ Vectors For Tape I/O WORD"); break; case 0xfda3: line.append(" % ioinit Initialise I/O"); break; case 0xfddd: line.append(" % - Enable Timer"); break; case 0xfdf9: line.append(" % setnam Set Filename"); break; case 0xfe00: line.append(" % setlfs Set Logical File Parameters"); break; case 0xfe07: line.append(" % readst Get I/O Status Word"); break; case 0xfe18: line.append(" % setmsg Control OS Messages"); break; case 0xfe21: line.append(" % settmo Set IEEE Timeout"); break; case 0xfe25: line.append(" % memtop Read / Set Top of Memory"); break; case 0xfe34: line.append(" % membot Read / Set Bottom of Memory"); break; case 0xfe43: line.append(" % - NMI Transfer Entry"); break; case 0xfe66: line.append(" % - Warm Start Basic [BRK]"); break; case 0xfebc: line.append(" % - Exit Interrupt"); break; case 0xfec2: line.append(" % - RS-232 Timing Table - NTSC DATA"); break; case 0xfed6: line.append(" % - NMI RS-232 In"); break; case 0xff07: line.append(" % - NMI RS-232 Out"); break; case 0xff43: line.append(" % - Fake IRQ Entry"); break; case 0xff48: line.append(" % - IRQ Entry"); break; case 0xff5b: line.append(" % cint Initialize screen editor"); break; case 0xff80: line.append(" % - Kernal Version Number [03] DATA"); break; case 0xff81: line.append(" % cint Init Editor & Video Chips"); break; case 0xff84: line.append(" % ioinit Init I/O Devices, Ports & Timers"); break; case 0xff87: line.append(" % ramtas Init Ram & Buffers"); break; case 0xff8a: line.append(" % restor Restore Vectors"); break; case 0xff8d: line.append(" % vector Change Vectors For User"); break; case 0xff90: line.append(" % setmsg Control OS Messages"); break; case 0xff93: line.append(" % secnd Send SA After Listen"); break; case 0xff96: line.append(" % tksa Send SA After Talk"); break; case 0xff99: line.append(" % memtop Set/Read System RAM Top"); break; case 0xff9c: line.append(" % membot Set/Read System RAM Bottom"); break; case 0xff9f: line.append(" % scnkey Scan Keyboard"); break; case 0xffa2: line.append(" % settmo Set Timeout In IEEE"); break; case 0xffa5: line.append(" % acptr Handshake Serial Byte In"); break; case 0xffa8: line.append(" % ciout Handshake Serial Byte Out"); break; case 0xffab: line.append(" % untalk Command Serial Bus UNTALK"); break; case 0xffae: line.append(" % unlsn Command Serial Bus UNLISTEN"); break; case 0xffb1: line.append(" % listn Command Serial Bus LISTEN"); break; case 0xffb4: line.append(" % talk Command Serial Bus TALK"); break; case 0xffb7: line.append(" % readss Read I/O Status Word"); break; case 0xffba: line.append(" % setlfs Set Logical File Parameters"); break; case 0xffbd: line.append(" % setnam Set Filename"); break; case 0xffc0: line.append(" % (iopen) Open Vector [f34a]"); break; case 0xffc3: line.append(" % (iclose) Close Vector [f291]"); break; case 0xffc6: line.append(" % (ichkin) Set Input [f20e]"); break; case 0xffc9: line.append(" % (ichkout) Set Output [f250]"); break; case 0xffcc: line.append(" % (iclrch) Restore I/O Vector [f333]"); break; case 0xffcf: line.append(" % (ichrin) Input Vector, chrin [f157]"); break; case 0xffd2: line.append(" % (ichrout) Output Vector, chrout [f1ca]"); break; case 0xffd5: line.append(" % load Load RAM From Device"); break; case 0xffd8: line.append(" % save Save RAM To Device"); break; case 0xffdb: line.append(" % settim Set Real-Time Clock"); break; case 0xffde: line.append(" % rdtim Read Real-Time Clock"); break; case 0xffe1: line.append(" % (istop) Test-Stop Vector [f6ed]"); break; case 0xffe4: line.append(" % (igetin) Get From Keyboad [f13e]"); break; case 0xffe7: line.append(" % (iclall) Close All Channels And Files [f32f]"); break; case 0xffea: line.append(" % udtim Increment Real-Time Clock"); break; case 0xffed: line.append(" % screen Return Screen Organization"); break; case 0xfff0: line.append(" % plot Read / Set Cursor X/Y Position"); break; case 0xfff3: line.append(" % iobase Return I/O Base Address"); break; case 0xfff6: line.append(" % - [5252]"); break; case 0xfff8: line.append(" % SYSTEM [5942]"); break; case 0xfffa: line.append(" % NMI [fe43]"); break; case 0xfffc: line.append(" % RESET [fce2]"); break; case 0xfffe: line.append(" % IRQ [ff48]"); break; case 0xbdcd: line.append(" % Print number from AX"); break; } } /** * @see IMonitor#setEnabled(boolean) */ public void setEnabled(boolean b) { DEBUG = b; } public void setLevel(int level) { this.level = level; } public int getLevel() { return level; } }