* * ÊAMAICAÍÏÎ * * ÏRIGINAL SUPERMON SOURCE CODE COURTESY ÊIM ÂUTTERFIELD * * ÍERLINIZED AND ADAPTED FOR THE ÓUPERÃÐÕ BY * ÓTEPHEN Ì. ÊUDD * 12/7/97 (1/98) * * V1.0 1/31/98 * V2.0 10/28/98 * V2.1 9/9/99 * V3.0 12/14/99 * V3.2 1/15/00 * V4.0 ÁUGUST 2000 * V4.1 ÓEPT. 2000 * V4.2 ÓEPT. 2001 -- RELOCATION DOES NOT MODIFY ÂÉÔ INSTRUCTIONS * V4.2A ÁPR. 2002 -- D DISASSEMBLES FROM CURRENT ADDR * * ÔHIS PROGRAM IS PUBLIC DOMAIN. * * ÄIRECT PAGE VARIABLES TMP2 = $A6à;3 BYTES EACH TMP0 = $A9 SATUS = $90 LVFLAG = $93 INDEV = $99 OUTDEV = $9A EAL = $AE EAH = $AF FNLEN = $B7 WTYPE = $B9 FA = $BA FNADR = $BB INBUF = $0100 SCPU = $0208à;SCPU STUFF STAGE = $0210 ADDRS = $0240à;LOAD/SAVE STRING LASTMEM = $0257 BKVEC = $0316 LDVEC = $0330 SVVEC = $0332 READY = $A002 SETMSG = $FF90 RDT = $FFCF WRT = $FFD2 STOP1 = $FFE1 KLOAD = $FFD5 KSAVE = $FFD8 ÒÅÁÄÓÔ = $ÆÆÂ7 ÓÅÔÌÆÓ = $ÆÆÂÁ ÓÅÔÎÁÍ = $ÆÆÂÄ ÏÐÅΠ= $ÆÆÃ0 ÃÌÏÓÅ = $ÆÆÃ3 ÃÈËÉΠ= $ÆÆÃ6 ÃÈËÏÕÔ = $ÆÆÃ9 ÃÌÒÃÈΠ= $ÆÆÃà ÃÈÒÉΠ= $ÆÆÃÆ ÃÈÒÏÕÔ = $ÆÆÄ2 ÓÔÏР= $ÆÆÅ1 ÃÌÁÌÌ = $ÆÆÅ7 ÐÌÏÔ = $ÆÆÆ0 ÍÕÌ = $5Áà;TMP2 ÁÕØ = ÍÕÌ+2 ÅØÔ = ÁÕØ+2à;TMP0 ÓÔÒÂÕÆ = ADDRS ; ** INITIALIZATION ** SUPER CLC  XCEà;NATIVE MODE  REP #$30à;EVERYONE 16-BITS  PER VBREAK  SEI  PLA  STA BKVEC  PER BREAK  PLA  STA $01FC9Dà;ÎÂÒË  STA $017C9D  LDA #0000  DFB $5Bà;ÄÐ -> ZERO-PAGE  SEP #$30à;EVERYONE 8-BITS  STA $01FC9Fà;BANK 0  STA $017C9F  CLI  LDA #$80  JSR SETMSG  SEC  XCE  JSR ÉÎÉÔà;INIT ÐÐÐ  BRK *------------------------------- * ÄEBUGGING ROUTINES  DO 0 DEBUG1 LDA #00  STA $D020  RTS DEBUG2 INC $D020 :WAIT JSR $FFE4  BEQ :WAIT  RTS  FIN * TXT 'AH, MOON OF MY DELIGHT THAT KNOWS NO WANE' VBREAKà; ** VECTOR BREAK ENTRY **  PLY  PLX  PLA ; ** BREAK ENTRY ** BREAK  CLC  XCE  REP #$30  PHBà;PULLED BELOW  PHK  PLB  STY YR  STX XR  STA ACC  PHD  PLA  STA DP  LDA #0000  TCDà;DIRECT REG=$0000  SEP #$30à;EVERYONE 8-BITS  ROR EMULà;HIGH BIT = E * JSR ZP2RAM  HEX AF010000à;ÌÄÁ $000001  STA OHONE  LDA #$36  HEX 8F010000  LDA $D0B2à;ÓUPERÃÐÕ STATUS REG  STA SCPU  LDA $D0BCà;ÒÁÍÌINK STATUS  STA $D073à;SYS SPEED TO TURBO  STA SCPU+1  AND #%01000000  BEQ :SKIP  STA $DF20à;RL WRT-PROT OFF  STA $DF7Fà;RL HW REG OUT :SKIP STA $D0BFà;DOS EXT ,PDE PFF  STA $D07Fà;SCPU HW OUT  PLA  STA DBR  PLA  STA FLGS  REP #$30  PLA  SEC  HEX E90200à;ÓÂà #0002  STA PCL  SEP #$30  LDA #00  LDX EMUL  BMI :EMUL  PLA :EMUL STA PBR  TSC  STA SP  XBA  STA SP+1 * LDA PCL * CMP BRKADDR * BNE :NOTBRK * LDA PCH * SBC BRKADDR+1 * BNE :NOTBRK * LDA PBR * SBC BRKADDR+2 * BNE :NOTBRK  LDA BRKADDR  AND BRKADDR+1  AND BRKADDR+2  CMP #$FF  BEQ :NOTBRK * JSR GETP2  LDA BRKADDR  STA TMP0  LDA BRKADDR+1  STA TMP0+1  LDA BRKADDR+2  STA TMP0+2  LDA BRKINST  STA [TMP0]  LDA #$FF  STA BRKADDR  STA BRKADDR+1  STA BRKADDR+2 :NOTBRK CLI  JSR CRLF  LDX #$42  LDA #$2A  JSR WRTWO  LDA #$52  BNE S0 à; ** PRINT ADDRESSES ** WHEREAMI LDY #'N'  JSR ALTRIT  JSR SPACE  PER SUPER  PLX  PLA  JSR WRAX  PER ENDCODE  PLX  PLA  JSR WRAX  PER ENDVARS  PLX  PLA  JSR WRAX  JMP STRT à; ** WRITE 16-BITS IN Ø,Á ** WRAX STX TMPC  JSR WROB  LDA TMPC  JSR WROB  JMP SPACE à; ** INCREMENT TEMP POINTER ** INCTMP INC TMP0  BNE SETWR  INC TMP0+1  BNE SETWR * INC WRAP  INC TMP0+2 SETWR RTS à; ** READ CHARACTER ** RDOC JSR RDT  CMP #$0D  BNE SETWR  PLA  PLA à; ** PROMPT FOR COMMAND ** STRT LDA #0  STA WRAP  LDA DISPFLAG  BEQ :C0  JSR DISP2 :C0 LDX #$0D  LDA #$2E  JSR WRTWO à; ** CHECK INPUT COMMAND ** ST1 JSR RDOC  CMP #$2E  BEQ ST1  CMP #$20  BEQ ST1 S0 LDX #$1B S1 CMP KEYW,X  BNE S2  TXA  ASL  TAX  PER SUPER  REP #$20  PLA  CLC  ADC KADDR,X  PHA  SEP #$30  RTS S2 DEX  BPL S1  JMP ERROR à; ** HELP! I NEED SOMEBODY ** HELP JSR CRLF  LDX #00 :LOOP LDA KEYW,X  BEQ STRT  JSR WRT  INX  BNE :LOOP à; ** DEBUGGING DISPLAY ** DISP2  LDA #$93  JSR WRT  JSR MEM2  JSR DIS2  LDX #20  LDY #00  CLC  JSR PLOT  LDY #40  LDA #'¨' :L2 JSR WRT  DEY  BNE :L2  JMP DISPLAYR MEM2  LDX #00  TXY  CLC  JSR PLOT  LDX #00 :LOOP CPX QLEN  BCS :DONE  LDA MEMQ+32,X  STA TMP0+2  LDA MEMQ+16,X  STA TMP0+1  LDA MEMQ,X  STA TMP0  STX COUNT  LDA #':'  JSR WRT  JSR WROA24  LDA #$04  JSR OLDDM2  LDA #13  JSR WRT  LDX COUNT  INX  BNE :LOOP :DONE RTS DIS2  JSR PSAV2TMP  LDX #0  STX AFLG :LOOP STX COUNT  LDY #$13  CLC  JSR PLOT  LDA #'Ü'  JSR WRT  REP #$20  LDA TMP0  CMP PCL  SEP #$20  BNE :C2  INC $C7à;HIGHLIGHT :C2 JSR DISS1A  STZ $C7 *:L2 LDX $D3 ;BLANK OUT LINE * CPX #40 * BCS :DONE * LDA #32 * JSR WRT * BNE :L2 *:DONE  JSR MEMADJ  LDX COUNT  INX  CPX #20  BNE :LOOP  RTS à; ** ÔOGGLE ÒÅÐ/ÓÅÐ FLAG ** REPSEP LDA REPFLAG  EOR #$FF  STA REPFLAG  TAX  LDA #32  JSR WRT  LDA #'O'  JSR WRT  LDA #'N'  TXY  BPL :SKIP  LDA #'F'  JSR WRT :SKIP JSR WRT  BRL STRT à; ** SET PC ADDRRESS ** PUTP2 LDA TMP0+2  STA PBR PUTP LDA TMP0  STA PCL  LDA TMP0+1  STA PCH  RTS à; ** GET PC ADDRRESS ** GETP2 LDA PBR  STA TMP0+2 GETP LDA PCL  STA TMP0  LDA PCH  STA TMP0+1  RTS à; ** MEMORY DISPLAY ** DM JSR OLDDM  JSR MEMADJ  JMP TMP2PSAV OLDDM LDA #$08 OLDDM2 STA TMPC  LDY #$FF :LOOP JSR SPACE  INY  JSR FETCHY  JSR WROB  DEC TMPC  BNE :LOOP  STY LENGTH  RTS à; ** SCREEN CODE DISPLAY ** DSCR LDA #32  STA TMPC  LDY #$FF :LOOP INY  JSR FETCHY  JSR WRSCR  DEC TMPC  BNE :LOOP  STY LENGTH  JSR MEMADJ  JMP TMP2PSAV à; ** TEXT DISPLAY ** DT LDA #$08  STA TMPC  LDY #$FF :LOOP INY  JSR FETCHY  JSR WRTEXT  DEC TMPC  BNE :LOOP  STY LENGTH MEMADJ JSR PCADJ  STA TMP0  STY TMP0+1  STX TMP0+2  RTS à; ** CHANGE MEMORY ** BYTE JSR RDOB  BCC BY3 BYTEST DFB $87,TMP0à;ÓÔÁ [ÔÍÐ0]  DFB $C7,TMP0à;ÃÍÐ [ÔÍÐ0]  BEQ BY3  JMP ERROR BY3 JSR INCTMP  DEC TMPC  RTS à; ** STORE ADDRESS ** WORD JSR RDOB  PHA  JSR BYTE  PLA  JMP BYTEST à; ** SET PC REG ADDRS ** SETR LDA #ACC  STA TMP0+1  LDA #00  STA TMP0+2  LDA #8  RTS à; ** WRITE DISPLAY PROMPT ** ALTRIT PHY  JSR CRLF  PLA  LDX #$2E  JMP WRTWO à; ** PRINT TEXT ** PRREG LDA REGK,X  BEQ :DONE  JSR WRT  INX  BNE PRREG :DONE JMP ALTRIT à; ** DISPLAY REGISTERS ** DSPLYR JSR DISPLAYR  JMP STRT DISPLAYR LDX #0  LDY #$3B  JSR PRREG  LDA #00  LDY EMUL  BMI :SKIP  LDA PBR :SKIP JSR WROB  JSR SPACE  LDY #00 :LOOP LDA PCL+1,Y  JSR WROB  LDA PCL,Y  JSR WROB  JSR SPACE  INY  INY  CPY #10  BCC :LOOP  LDA FLGS  JSR WRBIN  LDA EMUL  ASL  JMP WRBIT à; ** DISPLAY EXTRA REGS DISPR2 LDX #REGK2-REGK  LDY #'^'  JSR PRREG  LDA DBR  JSR WROB  JSR SPACE  LDA DP+1  JSR WROB  LDA DP  JSR WROB  JSR SPACE  LDA OHONE  JSR WROB  BRL A9 à; ** DISPLAY MEMORY/MEM+TEXT ** DSPLYT LDA #$FF  DFB $2C DSPLYM LDA #$00  STA AFLG :RDT JSR RDT  CMP #'*'à;I*  BNE :CR  ASL AFLGà;$00 OR $FE  BRA :RDT :CR CMP #$0D  BNE :C0  JSR PSAV2TMP  LDA #$FF  STA TMP2  STA TMP2+1  STA TMP2+2  BNE DSP1 :C0 JSR READ24  BCS :C1  CMP #$0D  BNE MERRS1 :C1 LDX TMP0  STX TMP2  LDX TMP0+1  STX TMP2+1  LDX TMP0+2  STX TMP2+2  CMP #$0D  BEQ DSP1  JSR READ24  BCC MERRS1  JSR T2T2 DSP1 LDA DISPFLAG  BNE :SPECIAL  JSR STOP1  BEQ :BRA  LDX WRAP  BNE :BRA  JSR DIFFP  BCC :BRA  LDX AFLG  BMI :TEXT  LDY #$3A  JSR ALTRIT  JSR WROA24  JSR DM  BRA DSP1 :TEXT INX  BNE :TEXT2à;I*  JSR CRLF  JSR WROA24  JSR OLDDM  JSR SPACE  JSR DT :BLAH  JSR TMP2PSAV  BRA DSP1 :TEXT2 JSR CRLF  JSR WROA24  JSR SPACE  JSR DSCR  BRA :BLAH :SPECIALà;ÁDD TO MEMORY QUEUE  LDX QLEN  CPX #15  BCS ALTJMP  LDA TMP0  STA MEMQ,X  LDA TMP0+1  STA MEMQ+16,X  LDA TMP0+2  STA MEMQ+32,X  INC QLEN :BRA BRA ALTJMP MERRS1 JMP ERROR à; ** ALTER MAIN REGS ** ALTR JSR RDOB  BCC :SKIP1  STA PBR :SKIP1 JSR RDOC  JSR RDOA  BCC :SKIP2  JSR PUTP :SKIP2 JSR SETR  STA TMPC :LOOP JSR RDOC  JSR WORD  BNE :LOOP  JSR RDOC  JSR GETBITS  STA FLGS  JSR GETBIT  ROR EMUL  BPL ALTJMP  LDA FLGS  ORA #$30  STA FLGS ALTJMP JMP STRT à; ** ALTERNATE REGS ** ALTR2 JSR RDOB  STA DBR  JSR RDOC  JSR RDOB  STA DP+1  JSR RDOB  STA DP  JSR RDOC  JSR RDOB  BCC :EXIT  STA OHONE * ORA #$02 * HEX 8F010000 :EXIT JMP STRT à; ** ALTER MEMORY ** ALTM JSR READ24  BCC ERRS2  LDA #$08  LDX DISPFLAG  BEQ :STA  LDA #$04 :STA STA TMPC  BRA :LOOP2à;KLUDGE :LOOP JSR RDOC :LOOP2 JSR BYTE  BNE :LOOP A9 JMP STRT ERRS2 JMP ERROR à; ** ÎUMBER CONVERSION ** CONVNUM JSR RDOC  CMP #39à;'  BNE :NUM  JSR RDOC  STA ÍÕÌ  LDA #00  STA ÍÕÌ+1  JSR RDT  CMP #13  BNE ERRS2  BEQ :OUTPUT :NUM  LDY #10à;BASE  CMP #'$'  BNE :C1  LDY #16 :C1 CMP #'%'  BNE :C2  LDY #2 :C2 PHY  LDX #00  STX SAVX  CPY #10  BEQ :STA :READ JSR RDT  LDX SAVX  CMP #13  BNE :STA  LDA #00 :STA STA ADDRS,X  INC SAVX  TAX  BNE :READ  PLY  LDA #ADDRS  JSR ÁÓÃÔÏÎÕÍ  BCS ERRS2 :OUTPUT LDX #13  LDA #' '  JSR WRTWO  LDA ÍÕÌ  LDX ÍÕÌ+1  STA AFLG  STX AFLG+1  LDY #10  JSR ÐÒÉÎÔÎÕÍ  LDX #' '  LDA #'$'  JSR WRTWO  LDA AFLG  LDX AFLG+1  LDY #16  JSR ÐÒÉÎÔÎÕÍ  LDX #' '  LDA #'%'  JSR WRTWO  LDA AFLG  LDX AFLG+1  LDY #2  JSR ÐÒÉÎÔÎÕÍ  LDX #' '  LDA #39  JSR WRTWO  LDA AFLG+1  BNE :JMP  LDA AFLG  CMP #32  BCC :JMP  CMP #128  BCC :WRT  CMP #160  BCC :JMP :WRT JSR WRT :JMP JMP STRT à; ** ÔOGGLE STUFF ** TOGGLE  JSR RDOC  CMP #'E'  BEQ :EMUL  CMP #'J'  BEQ :JSR  CMP #'M'  BEQ :MEM  CMP #'D'  BNE :JMP :DISP LDA DISPFLAG  EOR #$01  STA DISPFLAG :JMP JMP STRT :EMUL LDA EMUL  EOR #$80  STA EMUL  JMP STRT :JSR LDA JSRFLAG  EOR #01  STA JSRFLAG  JMP STRT :MEM LDA #00  STA QLEN  BEQ :JMP à; ** ÓET BREAKPOINT SETBRK JSR RDT  JSR READ24  JSR SETBRK2  JSR PRLINE  JMP STRT SETBRK2 LDA TMP0  STA BRKADDR  LDA TMP0+1  STA BRKADDR+1  LDA TMP0+2  STA BRKADDR+2  JSR FETCHà;LDA [TMP0]  TAY  LDA #00  DFB $87,TMP0à;STA [TMP0]  TYA  STA BRKINST  RTS à; ** ÃALCULATE Ðà FOR SINGLE STEP ** CALCPC  JSR FETCH  STA NEMO  CMP #$4C  BNE :C0  JMP :JMP :C0 CMP #$5C  BNE :C1  JMP :JML :C1 CMP #$6C  BNE :C2  JMP :JMPI :C2 CMP #$7C  BNE :C3  JMP :JMPAX :C3 CMP #$DC  BNE :C4  JMP :JMLI :C4 CMP #$FC  BNE :C5  LDA JSRFLAG  BEQ :NOPE  JMP :JSRAX :C5 CMP #$6B  BNE :C6  JMP :RTL :C6 CMP #$22  BNE :C7  LDA JSRFLAG  BEQ :NOPE  JMP :JSL :C7 CMP #$82  BEQ :BRL  TAX  AND #$0F  BNE :NOPE  TXA  AND #$10  BNE :BRANCH  TXA  CMP #$20  BNE :C8  LDA JSRFLAG  BEQ :NOPE  JMP :JSR :C8 CMP #$40  BNE :C9  JMP :RTI :C9 CMP #$60  BNE :C10  JMP :RTS :C10 CMP #$80  BEQ :BRA :NOPE TXA  JSR GETMIDX  JMP MEMADJ :BRL  JSR INCTMP  JSR FETCH  XBA  JSR INCTMP  JSR FETCH :BRL2 XBA  REP #$20  SEC  ADC TMP0  STA TMP0  SEP #$30  RTS :BRANCH  CPX #$10  BEQ :BPL  CPX #$30  BEQ :BMI  CPX #$50  BEQ :BVC  CPX #$70  BEQ :BVS  CPX #$80  BEQ :BRA  CPX #$90  BEQ :BCC  CPX #$B0  BEQ :BCS  CPX #$D0  BEQ :BNE :BEQ LDA #$02  DFB $2C :BCS LDA #$01  DFB $2C :BVS LDA #$40  DFB $2C :BMI LDA #$80  AND FLGS  BNE :BRA  JMP :NOPE :BRA JSR INCTMP  JSR FETCH  BPL :POS  XBA  LDA #$FF  BNE :BRL2 :POS XBA  LDA #00  BEQ :BRL2 :BNE LDA #$02  DFB $2C :BCC LDA #$01  DFB $2C :BVC LDA #$40  DFB $2C :BPL LDA #$80  AND FLGS  BEQ :BRA  JMP :NOPE :JSRAX :JMPAX JSR :JMP  LDA XR  CLC  ADC TMP0  STA TMP0  LDA XR+1  ADC TMP0+1  STA TMP0+1  BCC :JMP2  INC TMP0+2  BCS :JMP2 :JMPI JSR :JMP  JMP :JMP2 :JMLI JSR :JMP  DEC NEMOà;-> $FF  BNE :JMP2 :JSL :JML LDX #$FF  DFB $2C :JSR :JMP LDX #0  STX NEMO  JSR INCTMP :JMP2 JSR FETCH  PHA  JSR INCTMP  JSR FETCH  LDX NEMO  BPL :STA1  PHA  JSR INCTMP  JSR FETCH  STA TMP0+2  PLA :STA1 STA TMP0+1  PLA  STA TMP0  RTS :RTS LDX #01  DFB $2C :RTL LDX #00 :RTL2 STX NEMO  REP #$10  LDX SP  ASL NEMO  BCC :LDAà;ÁLSO SET BY ÒÔÉ  INX  CLC :LDA LDA $0001,X  ADC #1  STA TMP0  LDA $0002,X  ADC #00  STA TMP0+1  LDA PBR  STA TMP0+2  LDA NEMO  BNE :OK  LDA $0003,X  ADC #00  STA TMP0+2 :OK SEP #$30  RTS :RTI LDX #$81  LDA EMUL  BMI :RTL2  DEX  BNE :RTL2 à; ** ÓINGLE STEP ** SINGSTEP LDA #00  DFB $2C à; ** .GO ** GO LDA #$FF  PHA  JSR RDT  CMP #$0D  BEQ :G1  CMP #$20  BNE ERRS3  JSR READ24  JSR PUTP2 :G1 PLA  BMI :NOBRK  JSR GETP2  JSR CALCPC  JSR SETBRK2 :NOBRK STA $D07Eà;RESTORE ÓÃÐÕ STUFF  LDA SCPU+1à;DOS EXT + RL STATUS  STA $D0BC  AND #$40  BEQ :SKIP  STA $DF7E :SKIP LDA SCPU  STA $D0B2  JSR GETSP  TCS  SEI * JSR RAM2ZP  LDA OHONE  HEX 8F010000  ASL EMUL  BCS :EMUL  LDA PBR  PHA :EMUL LDA PCH  PHA  LDA PCL  PHA  LDA FLGS  PHA  LDA DBR  PHA  HEX C230à;REP #$30  LDA DP  PHA  LDA ACC  LDX XR  LDY YR  PLD  PLB  XCE  RTI ERRS3 JMP ERROR à; ** BACK TO BASIC ** EXIT JSR GETSP  TCS  LDA $031000à;ÅL CHEAPO CHECK  CMP #$4C  BNE :SEC  JMP $031000 :SEC SEC  XCE  JMP (READY) à; ** READ 1 OR 2 (DECIMAL) CHARS ** READ12 JSR RDOC  JSR DECIT  STA ACMD  JSR RDT  CMP #$2C  BEQ :SKIP  CMP #$0D  BEQ :SKIP  JSR DECIT  LDX ACMD  BEQ :DONE  CLC :L1 ADC #10  DEX  BNE :L1 :DONE STA ACMD  JSR RDT :SKIP LDX ACMD  RTS à; ** SEND DISK COMMAND ** DISKCMD JSR RDT  CMP #'$'  BEQ :DIR  CMP #13  BEQ :ERCHAN  CMP #'#'  BNE :SENDCMD  JSR READ12à;GET DEVICE NUMBER  STX FA  JMP STRT :DIR JSR RDT  CMP #13  BNE :ERR  JSR ÐÒÉÎÔÄÉÒ  JMP STRT :ERR JMP ERROR :ERCHAN JSR ÇÅÔÅÒÒ  JMP STRT :SENDCMD LDX #00  STX ACMD :LOOP LDX ACMD  STA ÓÔÒÂÕÆ,X  INC ACMD  JSR RDT  CMP #13  BNE :LOOP  LDX ACMD  LDA #00  STA ÓÔÒÂÕÆ,X  JSR ÓÅÎÄÃÍÄ  JMP STRT * * ÄISK ROUTINES * * ÐÒÉÎÔÄÉÒ READS THE DIRECTORY FROM THE CURRENT DEVICE * AND PRINTS IT TO THE SCREEN. * ÐÒÉÎÔÄÉÒ  ÌÄÁ #01à;ÆILE NO.  ÌÄØ $ÂÁà;ÃURRENT DEVICE NUMBER  ÌÄÙ #00à;ÓECONDARY ADDRESS  ÊÓÒ ÓÅÔÌÆÓ  ÌÄÁ #'$'  ÓÔÁ ADDRS  ÌÄÁ #1  ÌÄØ #ADDRS  ÊÓÒ ÓÅÔÎÁÍ  ÊÓÒ ÏÐÅÎ  ÌÄØ #01  ÊÓÒ ÃÈËÉÎ  ÂÃÓ :ÅÎÄà;ÅRROR IF CARRY SET  ÊÓÒ ÃÈÒÉÎà;ÇRAB LOAD ADDRESS  ÊÓÒ ÃÈÒÉÎ :ÌÏÏÐ1 ÌÄÁ #13  ÊÓÒ ÃÈÒÏÕÔ  ÊÓÒ ÃÈÒÉÎà;ÌINE LINK  ÊÓÒ ÃÈÒÉÎ  ÊÓÒ ÃÈÒÉÎà;ÌINE NUMBER (FILE SIZE)  ÔÁÙ  ÊÓÒ ÃÈÒÉÎ  ÔÁØ  ÊÓÒ ÒÅÁÄÓÔ  ÂÎÅ :ÅÎÄ  ÔÙÁ  ÌÄÙ #10à;ÂASE  ÊÓÒ ÐÒÉÎÔÎÕÍà;ÐRINT OUT THE NUMBER IN Ø,Ù  ÌÄÁ #32  ÊÓÒ ÃÈÒÏÕÔà;ÁDD A SPACE TO LOOK NICE :ÌÏÏÐ2 ÊÓÒ ÃÈÒÉÎ  ÔÁØ  ÂÅÑ :ÓÔÏÐ  ÊÓÒ ÃÈÒÏÕÔ  ÂÎÅ :ÌÏÏÐ2 :ÓÔÏРÊÓÒ ÓÔÏÐ  ÂÎÅ :ÌÏÏÐ1 :ÅÎÄ ÌÄÁ #01  ÊÓÒ ÃÌÏÓÅ  ÊÍÐ ÃÌÒÃÈÎ * * ÓÅÎÄÃÍÄ SENDS A COMMAND TO THE CURRENT DRIVE * ÃOMMAND CONTAINED IN ÓÔÒÂÕÆ * ÓÅÎÄÃÍÄ  ÌÄÁ #$0Æ  ÌÄØ $ÂÁ  ÌÄÙ #$0Æ  ÊÓÒ ÓÅÔÌÆÓ  ÌÄÁ #00  ÊÓÒ ÓÅÔÎÁÍ  ÊÓÒ ÏÐÅÎ  ÂÃÓ :ÅÒÒÏÒ  ÌÄØ #$0Æ  ÊÓÒ ÃÈËÏÕÔ  ÌÄÙ #00 :ÌÏÏРÌÄÁ ÓÔÒÂÕÆ,Ù  ÂÅÑ :ÅÒÒÏÒ  ÊÓÒ ÃÈÒÏÕÔ  ÉÎÙ  ÂÎÅ :ÌÏÏÐ :ÅÒÒÏÒ ÊÓÒ ÃÌÒÃÈÎ  ÌÄÁ #$0Æ  ÊÓÒ ÃÌÏÓÅ  ÊÍÐ ÃÌÒÃÈÎ * * ÇÅÔÅÒÒ PRINTS THE ERROR MESSAGE FROM THE CURRENT DISK DRIVE. * ÇÅÔÅÒÒ  ÌÄÁ #13  ÊÓÒ ÃÈÒÏÕÔ * * ÔHIS METHOD IS A BIT FASTER ON OUTPUT TO SCREEN. *  ÊÓÒ ÏÐÅÎÅÒÒ  ÂÃÓ ÇÅÔÅØÉÔ ÇÅÔÅÒÒ2 :ÌÏÏРÊÓÒ ÃÈÒÉÎ  ÃÍÐ #$0Ä  ÂÅÑ ÇÅÔÅØÉÔ  ÊÓÒ ÃÈÒÏÕÔ  ÂÎÅ :ÌÏÏÐ ÇÅÔÅØÉÔ ÊÓÒ ÃÈÒÏÕÔ  ÊÓÒ ÃÈÒÏÕÔà;ÏNE MORE TO LOOK NICE  ÌÄÁ #15  ÊÓÒ ÃÌÏÓÅ  ÊÍÐ ÃÌÒÃÈÎ ÏÐÅÎÅÒÒ  ÌÄÁ #$Ã0à;ËERNAL MSG ON  ÓÔÁ $90  ÌÄÁ #$0Æ  ÌÄØ $ÂÁ  ÌÄÙ #$0Æ  ÊÓÒ ÓÅÔÌÆÓ  ÌÄÁ #00  ÊÓÒ ÓÅÔÎÁÍ  ÊÓÒ ÏÐÅÎ  ÌÄÁ #00  ÓÔÁ $90  ÂÃÓ :ÅÒÒÏÒ  ÌÄØ #$0Æ  ÊÍÐ ÃÈËÉÎà;ÃARRY CLEAR -> ÏË :ÅÒÒÏÒ ÌÄÁ #13  ÓÅà  ÒÔÓ *------------------------------- ; ** LOAD/SAVE ** LD LDY #1  STY FA  STY WTYPE  DEY  STY FNLEN  STY SATUS  STY LVFLAG  LDA #ADDRS  STA FNADR+1  JSR GETCHAR  CMP #$0D  BEQ L5  CMP #$22  BNE ERRL L3 JSR RDT  CMP #$22  BEQ L8  CMP #$0D  BEQ L5  STA (FNADR),Y  INC FNLEN  INY  CPY #$10  BNE L3 ERRL JMP ERROR L8 JSR RDT  CMP #$0D  BEQ L5  CMP #$2C  BNE ERRL  JSR READ12  PHA  TXA  AND #$0F  BEQ ERRL  CMP #$03  BEQ ERRL  STA FA  PLA  CMP #$0D  BEQ L5  CMP #$2C  BNE ERRL  JSR READ24  BCC ERRL  DEC WTYPE  LDX $F7E5à;CHECK FOR 24-BIT LOAD/SAVE  CPX #$91  BEQ :CONT  DEC WTYPEà;$FF  LDX TMP0+2  STX $B0à;BANK :CONT CMP #$0D L5 RTS LOAD JSR LD  BNE ERRL  LDA WTYPE  PHA  LDX TMP0  LDY TMP0+1  LDA #00  JSR KLOAD  BCS :BYE  JSR SPACE  LDA #'$'  JSR WRT  PLA  BMI :C1  LDA $C3  STA TMP0  LDA $C4  STA TMP0+1  LDA #$00  STA TMP0+2 :C1 JSR WROA24  LDA #'-'  JSR WRT  LDX $B0  LDA $AF  JSR WRHEX  LDA $AE  JSR WROB :BYE JMP STRT SAVE JSR LD  CMP #$2C  BNE :ERRL  JSR T2T2  JSR READ24  BCC :ERRL  CMP #$0D  BNE :ERRL  LDA $F7E5à;CHECK FOR 24-BIT LOAD/SAVE  CMP #$91  BEQ :CONT  LDA TMP0+2  STA $ABà;BANK :CONT LDX TMP0  LDY TMP0+1  LDA #TMP2  JSR KSAVE  JMP STRT :ERRL JMP ERROR à; ** PRINT TEXT CHAR ** WRTEXT CMP #32  BCC :ZAP  CMP #128  BCC :OK  CMP #160  BCS :OK :ZAP LDA #'.' :OK JMP WRT à; ** PRINT AS SCREEN CODE ** WRSCR TAX  BPL :C1  INC $C7à;RVS ON :C1 TXA  AND #$7F  EOR #32à;ÃONVERT TO CHR$  CLC  ADC #32  CMP #96à;BLEAH  BCC :WRT  EOR #$E0  BPL :WRT  EOR #32 :WRT JSR WRT  STZ $C7  RTS à; ** PRINT HEX BYTE ** WROA24 LDA TMP0+2  JSR WROB WROA LDA TMP0+1  JSR WROB  LDA TMP0 WROB PHA  LSR A  LSR A  LSR A  LSR A  JSR ASCII  TAX  PLA  AND #$0F  JSR ASCII à; ** PRINT TWO CHARS ** WRTWO PHA  TXA  JSR WRT  PLA  JMP WRT à; ** PRINT HEX ADDRESS ** WRHEX PHA  LDA #'$'  JSR WRT  TXA  JSR WROB  PLA  JMP WROB à; ** CONVERT TO ASCII ** ASCII ORA #$30  CMP #$3A  BCC ASC1  ADC #$06 ASC1 RTS à; ** PRINT A BINARY BYTE ** WRBIN STA TMPC  LDY #08 :LOOP ASL TMPC  JSR WRBIT  DEY  BNE :LOOP  RTS à; ** PRINT BIT IN à ** WRBIT LDA #'0'  ADC #00  JMP WRT à; ** READ BINARY BYTE ** GETBITS LDA #8  STA SAVX :LOOP JSR GETBIT  ROL TMPC  DEC SAVX  BNE :LOOP  LDA TMPC  RTS à; ** READ A BIT ** GETBIT JSR RDOC  CMP #'1'  RTS ; ** SWAP TMP0, TMP2 ** T2T2 LDX #$03 T2T21 LDA TMP0-1,X  PHA  LDA TMP2-1,X  STA TMP0-1,X  PLA  STA TMP2-1,X  DEX  BNE T2T21  RTS à; ** READ 16/24 BIT HEX ADDR ** READ24 JSR RDOA  BCC RDERR READ24B LDX PBR  STX TMP0+2  JSR RDT  CMP #$0D  BEQ RDEXIT  CMP #$20  BEQ RDEXIT  CMP #$2C  BEQ RDEXIT RDOA24 JSR RDOB2  BCC RDEXIT  LDX TMP0+1  STX TMP0+2  LDX TMP0  STX TMP0+1  STA TMP0  JSR RDTà;.A = NEXT CHAR  SEC  RTS RDERR JMP ERROR à; ** READ HEX ADDRESS ** RDOA JSR RDOB RDOA1 BCC RDOA2  STA TMP0+1 RDOA2 JSR RDOB  BCC RDEXIT  STA TMP0 RDEXIT RTS à; ** SCAN FOR HEX BYTE ** RDOB LDA #0  STA ACMD  JSR RDOC RDOB1 CMP #$20  BNE RDOB2  JSR RDOC  CMP #$20  BNE RDOB3  CLC  RTS à; ** READ HEX BYTE ** RDOB2 JSR HEXIT  ASL A  ASL A  ASL A  ASL A  STA ACMD  JSR RDOC RDOB3 JSR HEXIT  ORA ACMD  SEC  RTS DECITà; ** CONVERT FROM BASE 10 **  EOR #48  CMP #10  BCS :ERR  RTS :ERR JMP ERROR à; ** CONVERT FROM HEX ** HEXIT CMP #$3A  BCC HEX08  ADC #$08 HEX08 AND #$0F  RTS à; ** DECREMENT T0,T2 ** SPREAD = TMP2-TMP0 DECT2 LDX #ZP * STA TMP0+1 * PLP * BCS :Y2 * LDA [TMP0] * DFB $2C *:Y2 LDA [TMP0],Y * PHA * LDA TMP0 * SEC * SBC #ZP * STA TMP0+1 * PLA * BRA :OK à; ** ÃOPY TMP0 TO PSAV ** TMP2PSAV LDX #2 :LOOP LDA TMP0,X  STA PSAV,X  DEX  BPL :LOOP  RTS à; ** ÃOPY PSAV TO TMP0 ** PSAV2TMP LDX #2 :LOOP LDA PSAV,X  STA TMP0,X  DEX  BPL :LOOP  RTS à; ** ÂACKWARDS DISASSEMBLE ** BACKDIS  LDA #21  STA SAVXà;DISTANCE :LOOP1 JSR PSAV2TMP  INC SAVX  JSR SUBSAVX  LDA #$16  STA TMPC :LOOP2 JSR FETCHà;DISASSEMBLE 22 LINES  JSR GETMIDX  JSR MEMADJ :C2 DEC TMPC  BNE :LOOP2  LDA PSAV  CMP TMP0  LDA PSAV+1  SBC TMP0+1  LDA PSAV+2  SBC TMP0+2  BCC :LOOP1à;ÕNTIL PSAV >= TMP0  JSR SUBSAVX  JMP DISAS2à;ÁND DISASSEMBLE! SUBSAVX  LDA TMP0  SEC  SBC SAVX  STA TMP0  BCS :C1  DEC TMP0+1à;ÎO 24-BIT WRAPPING :C1 RTS à; ** .DISASSEMBLE ** *DISAS JSR RDOC DISAS JSR RDT  CMP #$0D  BNE :CONT  LDA PBR  STA TMP0+2  LDA PCH  STA TMP0+1  LDA PCL  STA TMP0  BRA DISAS2 :CONT JSR READ24 DISAS2 JSR TMP2PSAV  LDX DISPFLAG  BEQ :CONT  JMP STRT :CONT LDX #0  STX AFLG DPAG LDA #$93à;CLR  JSR WRT  LDA #$16  STA TMPC DISLP JSR DISS1  JSR MEMADJ  DEC TMPC  BNE DISLP  LDA #$91à;UP  JSR WRT  JMP STRT à; ** DISS 1 LINE ** DISS1 LDY #','  JSR ALTRIT  JSR SPACE DISS1A JSR WROA24  JSR SPACE  JSR FETCH  STA REPTEMP  JSR GETMIDXà;MNEMONIC INDEX  TXA  PHA  LDA DISPFLAGà;ÓKIP HEX DURING DEBUG  BNE :CKIP  LDY #0  JSR DISVV :CKIP PLA  TAX  JSR PROPXX  JSR PRLCHARà;LEADING CHARS  JSR PRADDRà;ADDRESS  LDA REPFLAG  BMI :SKIP  LDA REPVAL  LDX REPTEMPà;ÃHECK FOR ÒÅÐ/ÓÅÐ AND ADJUST  CPX #$C2  BNE :SEPà;STATUS REG ACCORDINGLY  EOR #$FF  AND FLGS  BRA :STA :SEP CPX #$E2  BNE :SKIP  ORA FLGS :STA LDX EMUL  BPL :STA2  ORA #$30à;Ø AND Í ALWAYS SET :STA2 STA FLGS :SKIP JMP PRECHARà;FINAL CHARS à;** ÃOMPUTE MNEMONIC INDEX,MODE ** GETMIDX LSR  TAY  BCC :EVEN :ODD CMP #$44à;ÂÉÔ #  BNE :NOTBIT  LDX #6  LDA #1  BNE :LEN :NOTBIT AND #$07à;ÅXCEPTION IS $X  CMP #%00000101  BEQ :EXCEPT  TYA  LSR  LSR  LSR  LSRà;MSD/16/2  TAX  LDA NEMTAB2,X  TAX  TYA  AND #$0F  TAYà;LOW 5 BITS/2  LDA MODETAB2,Y  BPL :LENà;.Ø .Á = MNEMONIC, ADR MODE :EXCEPT TYA  LSR  LSR  LSR  TAY  LDX NEMTAB+$80,Y  LDA #00à;ÁLL ARE MODE 0  BEQ :LEN :EVEN LDX NEMTAB,Y  LDA MODETAB,Y :LEN STA ACMDà;MODE  TAY  LDA MODELEN,Y  STA LENGTH  DEY  BNE CHKRTS à;** TEST FOR 16-BIT **  JSR FETCH CHECK16 CMP #$A2à;ÌÄØ  BEQ :XCHK  AND #$0Fà;ÃÐØ ÃÐÙ ÌÄÙ  BEQ :XCHK  CMP #9à;ÓÅÐ ÒÅÐ  BNE CHKRTS  LDA #%00100000  DFB $2C :XCHK LDA #%00010000  AND FLGS  BNE CHKRTS  INC LENGTH CHKRTS RTS à;** PRINT LEADING CHARS ** PRLCHAR LDA ACMD  BEQ DONE  CMP #1  BNE :C1  LDX #'#'  BNE :TWO :C1 CMP #14  BCC :DOLLAR  LDX #'('  CMP #20  BCC :TWO  LDX #'[' :TWO TXA  JSR WRT :DOLLAR LDA #'$'  JMP WRT à;** PRINT ADDRESS ** PRADDR LDY LENGTH  BEQ DONE  LDA ACMD  CMP #2  BEQ PRMOVE  CMP #3  BEQ PREL  CMP #4  BEQ PREL :LOOP JSR FETCHY  STA REPVALà;ÕSED WITH ÒÅÐ/ÓÅÐ STUFF  JSR WROB  DEY  BNE :LOOP DONE RTS ;** ÍÖÎ/ÍÖÐ ADDRESS ** PRMOVE JSR :PRINT  LDX #','  LDA #'$'  JSR WRTWO  DEY :PRINT JSR FETCHY  JMP WROB ; ** PRINT REL ADDRESS ** PREL LDX #00  JSR FETCHY  CLC  BPL :TEST  DEX :TEST DEYà;LENGTH  BEQ :8BIT  TAX  JSR FETCHY  SEC :8BIT ADC #2à;BLEAH  BCC :CALC  INX  CLC :CALC JSR PCADJ2  TAX  TYA  JSR PRBYTE  TXA PRBYTE STX SAVX  JSR WROB  LDX SAVX  RTS à;** PRINT END CHARACTERS ** PRECHAR LDY ACMD :SQUARE CPY #20  BCC :COMMAS  LDA #']'  JSR WRT :COMMAS LDX #','  CPY #19  BEQ :PRS  CPY #5  BNE :COMMAX :PRS LDA #'S'  JSR WRTWO :COMMAX JSR ISCOMX  BNE :PAREN  LDA #'X'  JSR WRTWO :PAREN CPY #14  BCC :COMMAY  CPY #20  BCS :COMMAY  LDA #')'  JSR WRT :COMMAY JSR ISCOMY  BNE :BYE  LDA #'Y'  JSR WRTWO :BYE RTS à;** ÃHECK FOR ,X AND ,Y ** ISCOMX CPY #7  BEQ :RTS  CPY #10  BEQ :RTS  CPY #13  BEQ :RTS  CPY #17  BEQ :RTS  CPY #18 :RTS RTS ISCOMY CPY #8  BEQ :RTS  CPY #11  BEQ :RTS  CPY #16  BEQ :RTS  CPY #19  BEQ :RTS  CPY #21 :RTS RTS à; ** ADD LENGTH+1 TO PC ** PCADJ LDX #00  LDA LENGTH  SEC PCADJ2 ADC TMP0à;RESULT-> .Á .Ù .Ø = LO HI HI24  PHA  TXA  ADC TMP0+1  TAY  LDA TMP0+2  ADC #00  TAX  PLA  RTS à; PRINT BYTES DISVV JSR FETCHYà;LDA [TMP0],Y  JSR PRBYTE  LDX #1 DISVL JSR SPACD  CPY LENGTH  INY  BCC DISVV  LDX #$03  CPY #4  BCC DISVL  RTS à; ** PRINT MNEMONIC IN .Ø ** PROPXX LDA MNEML,X  STA AFLG  LDA MNEMR,X  STA AFLG+1  LDX #3 :LOOP1 LDA #0  LDY #$05 :LOOP2 ASL AFLG+1  ROL AFLG  ROL A  DEY  BNE :LOOP2  ADC #$40  JSR WRT  DEX  BNE :LOOP1 ; ** PRINT SPACE ** SPACE LDA #$20  BNE FLIP ; ** PRINT CR, MAYBE LF ** CRLF LDA #$0D  BIT $13  BPL FLIP  JSR WRT  LDA #$0A FLIP JMP WRT à; **.P DISASSEMBLE ** PRIN JSR INPUT  PHA  JSR T2T2  PLA  JSR GET2B  JSR T2T2  STZ AFLG PLOOP JSR CRLF  JSR DISS1A  JSR MEMADJ  JSR STOP1  BEQ STRTX  JSR DIFFP  BCS PLOOP STRTX JMP STRT ; ** RE-DISASSEMBLE ** REDIS JSR INPUT  LDA #$04  STA TMPC :LOOP JSR BYTE  BEQ :DONE  JSR RDOC  CMP #$20  BEQ :LOOP :DONE JSR PSAV2TMP  JMP DPAG FINDMNEM LDX #91à;ÆIND MNEMONIC IN THE TABLE :LOOP LDA MNEML,X  CMP STAGE  BNE :NEXT  LDA MNEMR,X  CMP STAGE+1  BNE :NEXT  STX STAGEà;ÍNEMONIC INDEX  RTS :NEXT DEX  BPL :LOOP  JMP ERROR ISLEADà;** ÉS .Á A LEADING CHAR? :LOOP CMP LEADCHAR,X  BEQ :OUT  DEX  BPL :LOOP :OUT RTS ISEND LDX #3à;** ÉS .Á AN ENDING CHAR? :LOOP CMP ENDCHAR,X  BEQ :OUT  DEX  BPL :LOOP :OUT RTS à;** ÆLIP Ø AND Í BITS ** FLIPBIT JSR RDT  LDX #$30  CMP #'M'  BNE :C1  LDX #$20 :C1 CMP #'X'  BNE :C2  LDX #$10 :C2 LDA EMUL  BMI :SKIP  TXA  EOR FLGS  STA FLGS :SKIP JSR DISPLAYR  PLA  PLA  JMP ASMNEXT à;** ÒEAD IN AND PACK MNEMONIC PACKM  STZ STAGE  STZ STAGE+1  JSR GTCHR  CMP #'!'  BEQ FLIPBIT  PHA  JSR RDOC  PHA  JSR RDOC  PHA  LDY #3 :LOOP2 PLA  LDX #5 :LOOP LSR  ROR STAGE  ROR STAGE+1  DEX  BNE :LOOP  DEY  BNE :LOOP2  JMP FINDMNEMà;...AND FIND IT IN THE TABLE à;** ÁSSEMBLE ** ASSEMBLE JSR RDOC  JSR READ24à;ADDRESS  BCC JERR1  CMP #$0D  BNE ARDARG  JMP STRT ARDARG JSR PACKMà;MNEMONIC  JSR GETCHARà;ARGUMENT  LDX #7  JSR ISLEAD  BNE JERR1  STZ AFLG  TXA  ASL  TAX  PER SUPER  REP #$20  PLA  CLC  ADC LEADADR,X  PHA  SEP #$30  RTS à;** ÆORM NUMBER FROM STACK CPSTACK PLA  STA TMP2  PLA  STA TMP2+1  LDY #00 :LOOP TXAà;.Ø CONTAINS # OF BYTES  BEQ :SKIP  DEX  PLA :SKIP STA STAGE+4,Y  INY  CPY #3à;ZERO OUT ANY EXTRA  BNE :LOOP  TXA  BNE JERR1à;ÎO MORE THAN 24 BITS  BEQ RESTORE à;** ÒEAD IN AN ADDRESS GETADDR JSR GETCHARà;(OF ARBITRARY LENGTH) GETADDR3 CMP #'$'  BNE JERR1 GETADDR2 PLA  STA TMP2  PLA  STA TMP2+1  STZ TMPCà;ÃOUNT # OF BYTES READ  STZ ACMD  JSR RDT :LOOP JSR RDOB1à;READ HEX BYTES  BCC JERR1  PHA  INC TMPC  STZ ACMD  JSR RDT  JSR ISEND  BNE :LOOP  LDX TMPC RESTORE TAY  LDA TMP2+1  PHA  LDA TMP2  PHA  TYA  RTS JERR1 JMP ERROR *** ÉNSTRUCTION MODES à;** ÁBSOLUTE MODE $ ABS JSR GETADDR2  STX STAGE+2  LDY TIMES3P3,X  STY STAGE+1  BNE ABSEND ABS8 LDY #1à;ÚERO PAGE ABSOLUTE <  HEX 2Cà;ÂÉÔ ABS16 LDY #2à;16-BIT ABSOLUTE !  HEX 2C ABS24 LDY #3à;24-BIT ABSOLUTE >  STY STAGE+2à;MAX # OF BYTES ALLOWED  LDA TIMES3P3,Y  STA STAGE+1à;ADDRESSING MODE  JSR GETADDR  CPX STAGE+2  BCC ABSEND  BNE JERR1 ABSEND STX TMPC  CMP #$0Dà;LAST CHAR READ  BEQ :DONE  CMP #','à;INDEX  BNE JERR1  JSR RDT  LDX TMPC  CMP #'$'  BEQ :MOVE  CMP #'S'  BEQ :STACK  INC STAGE+1  CMP #'X'  BEQ :DONE  INC STAGE+1  CMP #'Y'  BNE JERR1 :DONE LDY STAGE+1  CPY #14à;13 IS HIGHEST  BCS JERR1  JMP INSTOUT :STACK CPX #1à;D,S  BNE JERR1  LDY #5  JMP INSTOUT :MOVE DEXà;** ÍÖÎ/ÍÖÐ D,D  BNE JERR1  JSR GETADDR2  DEXà;1 BYTE ONLY  BNE JERR1  LDX #2  LDY #2  JMP INSTOUT INDIR JSR GETADDRà;** ÉNDIRECT ()  STX STAGE+2  CMP #')'  BNE :INDEX  LDY #14  STY STAGE+1  DEX  BNE :DONE  INC STAGE+1  JSR RDT  CMP #$0D  BEQ :DONE  INC STAGE+1  JSR RDOC  CMP #'Y'  BNE JERR2 :DONE LDY STAGE+1  LDX STAGE+2  JMP INSTOUT :INDEX CMP #','  BNE JERR2  LDY #17  DEX  BNE :ZP  INY :ZP STY STAGE+1  JSR RDOC  CMP #'X'  BEQ :DONE  CMP #'S'  BNE JERR2  LDA #19  STA STAGE+1  JSR RDT  JSR RDT  JSR RDT  CMP #'Y'  BEQ :DONE JERR2 JMP ERROR LINDIR JSR GETADDRà;ÌONG INDIRECT []  STX STAGE+2  DEX  BNE JERR2  CMP #']'  BNE JERR2  LDY #20  STY STAGE+1  JSR RDT  CMP #$0D  BEQ :DONE  INC STAGE+1  JSR RDT  CMP #'Y'  BNE JERR2 :DONE LDX STAGE+2  LDY STAGE+1  BRA INSTOUT ACCUM LDY #0à;ÎO ARGUMENTS  LDX #0  BEQ INSTOUT ;** ÉMMEDIATE ADDRESSING # IMMED JSR GETADDR  CMP #$0Dà;ÅND WITH A ÃÒ!  BNE JERR2  LDY #1à;.Ù = ADDRESS MODE à;** ÃHECK AND OUTPUT INST BYTES INSTOUT STY STAGE+1  JSR CPSTACK  JSR ISOP2à;ÓEARCH THROUGH OPCODE TABLES  BCC :GOTCHA  JSR ISOP1  BCC :GOTCHA  JMP ERROR :GOTCHA STA STAGE+3à;OPCODE  LDX STAGE+1à;MODE  LDY MODELEN,Xà;NUMBER OF BYTES  DEX  BNE :LOOP  STY LENGTH  JSR CHECK16  LDY LENGTH :LOOP LDA STAGE+3,Y  DFB $97,TMP0à;STA [TMP0],Y  DEY  BPL :LOOP  JSR PRLINEà;PRINT ASSEMBLED LINE  JSR MEMADJà;INC TMP0 ASMNEXT LDY #'A'  JSR ALTRIT  JSR SPACE  JSR WROA24  JSR SPACE  JMP ARDARG à;** PRINT ASSEMBLED LINE PRLINE JSR CRLF  LDA #145à;UP  JSR WRT  JSR WRT  JMP DISS1 à;** ÓEARCH THROUGH NEMTAB2 ISOP2 LDY #$07  LDA STAGE :LOOP CMP NEMTAB2,Y  BEQ :MODE  DEY  BPL :LOOP  CMP #6à;ÂÉÔ  BNE :FAIL  LDX STAGE+1  DEX  BNE :FAIL  LDY #8  LDA #$89  CLC  RTS :MODE LDX #15à;16 POSSIBLE MODES  LDA STAGE+1 :LOOP2 CMP MODETAB2,X  BEQ :CRAZY  DEX  BPL :LOOP2 :FAIL SEC  RTS :CRAZY TXAà;ÆIGURE OUT THIS CRAZY THING  SEC  ROLà;LOW 5 BITS OF OPCODE  STA TMPC  TYA  ASLà;MSB = MNEM*32  ASL  ASL  ASL  ASL  ORA TMPCà;ADD TO GET OPCODE  CMP #$89à;ÓÔÁ #  BEQ :FAIL  CLC  RTS à;** ÓEARCH THROUGH TABLE 1 ** ISOP1 LDY #$7F  LDA STAGE :LOOP CMP NEMTAB,Y  BNE :DEY  LDX MODETAB,Y  CPX STAGE+1  BEQ :GOTCHA  CPX #3à;ÃHECK FOR RELATIVE ADDRESSES  BEQ :REL  CPX #4  BEQ :REL :DEY DEY  BPL :LOOP  LDY #$8Fà;SECOND PART OF TABLE  LDX STAGE+1à;$X IS ALL NO ARGS  BNE :EXIT :LOOP2 CMP NEMTAB,Y  BEQ :GOTCHA2 :DEY2 DEY  BMI :LOOP2 :EXIT SEC  RTS :REL LDA STAGE+1  CMP #9à;A  BNE :EXIT  STX STAGE+1  LDA STAGE+2  CMP #2  BNE :EXIT  JSR MAKERELà;MAKE ADDRESS RELATIVE :GOTCHA TYA  ASL  RTS :GOTCHA2 TYA  ASL  ASL  ASL  ASL  ORA #$0B  RTS à;** ÃONVERT STAGE ADDRESS TO REL MAKEREL STX TMPC  DEC TMPC  LDA STAGE+4  SEC  SBC TMPCà;2/3 FOR R/RLONG  BCS :CONT  DEC STAGE+5  SEC :CONT SBC TMP0  STA STAGE+4  LDA STAGE+5  SBC TMP0+1  STA STAGE+5  CPX #3à;CHECK FOR OVERFLOW  BNE :RTS  LDA STAGE+4  CLC  ADC #$80  LDA STAGE+5  ADC #00  BEQ :RTS  JMP ERROR :RTS RTS à;** COPY ZERO PAGE *ZP2RAM * LDX #$FF *:COPY LDA $00,X * STA ZP,X * DEX * BNE :COPY * RTS * ;** COPY IT BACK *RAM2ZP * LDX #$FF *:COPY LDA ZP,X * STA $00,X * DEX * BNE :COPY * RTS *------------------------------------- * 16 BIT MULTIPLY AND DIVIDE ROUTINES. * ÔHREE 16 BIT (TWO-BYTE) LOCATIONS * ÍÕÌ, ÁÕØ AND ÅØÔ MUST BE SET UP, * PREFERABLY ON ZERO PAGE. *------------------------------------- * ÍÕÌÔÉÐÌÙ ÒÏÕÔÉÎÅ * ÍÕÌ*ÁÕØ -> [ÍÕÌ,ÅØÔ] (LOW,HI) 32 BIT RESULT ÍÕÌÔ16  ÌÄÁ #0  ÓÔÁ ÅØÔ+1  ÌÄÙ #$11 :ÌÏÏРÌÓÒ ÅØÔ+1  ÒÏÒ  ÒÏÒ ÍÕÌ+1  ÒÏÒ ÍÕÌ  ÂÃà :ÍÕÌ2  ÃÌà  ÁÄà ÁÕØ  ÐÈÁ  ÌÄÁ ÁÕØ+1  ÁÄÃ ÅØÔ+1  ÓÔÁ ÅØÔ+1  ÐÌÁ :ÍÕÌ2 ÄÅÙ  ÂÎÅ :ÌÏÏÐ  ÓÔÁ ÅØÔ  ÒÔÓ * ÄÉÖÉÄÅ ÒÏÕÔÉÎÅ * ÍÕÌ/ÁÕØ -> ÍÕÌ, REMAINDER IN ÅØÔ ÄÉÖ16  ÌÄÁ #0  ÓÔÁ ÅØÔ+1  ÌÄÙ #$10 :ÌÏÏРÁÓÌ ÍÕÌ  ÒÏÌ ÍÕÌ+1  ÒÏÌ  ÒÏÌ ÅØÔ+1  ÐÈÁ  ÃÍÐ ÁÕØ  ÌÄÁ ÅØÔ+1  ÓÂà ÁÕØ+1  ÂÃà :ÄÉÖ2  ÓÔÁ ÅØÔ+1  ÐÌÁ  ÓÂà ÁÕØ  ÐÈÁ  ÉÎà ÍÕÌ :ÄÉÖ2 ÐÌÁ  ÄÅÙ  ÂÎÅ :ÌÏÏÐ  ÓÔÁ ÅØÔ  ÒÔÓ * * ÁÓÃÔÏÎÕÍ * ÃONVERTS A STRING TO A 16-BIT NUMBER. ÔHE ADDRESS * OF THE STRING IS PASSED IN IN (Á,Ø) = (LO,HI), AND * THE BASE OF THE NUMBER IS CONTAINED IN Ù. ÖALID * BASES ARE 0-16. ÔHE STRING IS ASSUMED TO BE * NULL-TERMINATED. * * ÏN EXIT, CARRY SET DENOTES AN ERROR, EITHER AN * INVALID BASE, AN INVALID STRING, OR A NUMBER * OVERFLOW. ÔHE NUMBER IS CONTAINED IN ÁÃÃ, AS * USED IN ÍÕÌÔ16. ÔHE LAST CHAR READ IS CONTAINED * IN (Á,Ø)=(LO,HI). Ù IS TOAST. * ÁÓÃÔÏÎÕÍ  ÃÐÙ #17  ÂÃÓ :ÅØÉÔ  ÓÔÙ ÁÕØà;ÁÕØ=NUMBER BASE  ÌÄÙ #00  ÓÔÙ ÁÕØ+1  ÓÔÙ ÍÕÌ  ÓÔÙ ÍÕÌ+1  ÓÔØ :ÌÏÏÐ+2  ÔÁØà;Ø=LO BYTE STRING :ÌÏÏРÌÄÁ $Á000,Øà;ÖALID CHARS ARE $30-$39, $41-$46  ÂÅÑ :ÅØÉÔ  ÅÏÒ #$30  ÃÍÐ #10  ÂÃà :ÃÏÎÔ  ÅÏÒ #$70à;ÓHOULD USE ÓÂà #$70-9  ÁÄà #8à;ÎOW Á-Æ = 10-16 :ÃÏÎÔ ÃÍÐ ÁÕØà;ÃOMPARE WITH NUMBER BASE  ÂÃÓ :ÅØÉÔ  ÐÈÁ  ÊÓÒ ÍÕÌÔ16à;ÍULTIPLY NUMBER TIMES BASE  ÐÌÁ  ÌÄÙ ÅØÔà;ÄID MULTIPLICATION EXCEED 16 BITS?  ÂÎÅ :ÅÒÒÏÒ  ÃÌà  ÁÄà ÍÕÌ  ÓÔÁ ÍÕÌ  ÌÄÁ ÍÕÌ+1  ÁÄà #00  ÓÔÁ ÍÕÌ+1  ÉÎØ  ÂÎÅ :ÌÏÏÐ  ÉÎà :ÌÏÏÐ+2  ÂÎÅ :ÌÏÏÐ :ÅÒÒÏÒ ÓÅà :ÅØÉÔ ÔØÁ  ÌÄØ :ÌÏÏÐ+2  ÒÔÓ * * ÐÒÉÎÔÎÕÍ * ÐRINTS THE 16-BIT NUMBER IN (Á,Ø) = (LO,HI) * TO THE SCREEN, I.E. PRINTS USING ÃÈÒÏÕÔ. * ÔHE NUMBER BASE IS CONTAINED IN Ù. * ÐÒÉÎÔÎÕÍ  ÓÔÁ ÍÕÌ  ÓÔØ ÍÕÌ+1  ÓÔÙ ÁÕØà;ÂASE  ÌÄØ #00  ÓÔØ ÁÕØ+1 * ÍÕÌ/ÁÕØ -> ÍÕÌ, REMAINDER IN ÅØÔ :ÌÏÏРÊÓÒ ÄÉÖ16  ÉÎØ  ÌÄÁ ÅØÔ  ÐÈÁ  ÌÄÁ ÍÕÌ  ÏÒÁ ÍÕÌ+1  ÂÎÅ :ÌÏÏÐà;ÄIVIDE UNTIL RESULT=0 :ÐÏÏРÐÌÁ  ÏÒÁ #$30à;ÃONVERT TO CHR$  ÃÍÐ #$3Á  ÂÃà :ÐÌÏÐ  ÁÄà #$06à;$3Á->Á $3Â-> ETC. :ÐÌÏРÊÓÒ ÃÈÒÏÕÔ  ÄÅØ  ÂÎÅ :ÐÏÏÐ  ÒÔÓ