** К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 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 LDX #>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 МДЩ #>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 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 #<SPREAD DFB $2CDECT0 LDX #0 LDY TMP0,X BNE DEC20 LDY TMP0+1,X BNE DEC10* INC WRAP DEC TMP0+2DEC10 DEC TMP0+1,XDEC20 DEC TMP0,XRET1 RTSа; ** GET A NON SPACE **GTCHR JSR RDOC CMP #$20 BEQ GTCHR RTSа; ** INCLUDING ГТ **GETCHAR JSR RDT CMP #$20 BEQ GETCHAR RTSа; ** GET ADDRESS **INPUT LDA #00 STA INBUF STA ACMD JSR GTCHR JSR RDOB1 JSR RDOA1 BCC ERROR JMP READ24Bа; ** GET ADDRESS **GET2B CMP #$0D BEQ ERROR JSR READ24 BCS RET1а; ** ERROR EXIT **ERROR JSR GETSP TCS LDA #$3F JSR WRT JMP STRTа; ** GET STACK POINTER **GETSP REP #$30 LDA SP SEP #$30 RTSа; ** PRINT SPACES **SPACD JSR SPACE DEX BNE SPACD RTSа; ** INC TMP 2 **PTRINC INC TMP2 BNE P1OV INC TMP2+1P1OV RTSа; ** SWAP AFLG, TMP0 **SWAP LDX #$03SWP1 LDA TMP0-1,X PHA LDA AFLG-1,X STA TMP0-1,X PLA STA AFLG-1,X DEX BNE SWP1 RTSа; ** CALC TMP2-TMP0-2 **DIFFB LDA TMP2 LDY TMP2+1 LDX TMP2+2 SEC SBC #2 BCS DECK DEY CPY #$FF BNE DECK DEX BRA DECKа; ** CALC AFLG-TMP0 **DIFFA LDA AFLG LDY AFLG+1 LDX AFLG+2 BRA DECKа; ** CALC TMP2-TMP0 **DIFFP LDA TMP2 LDY TMP2+1 LDX TMP2+2DECK SEC SBC TMP0 STA NEMO XBA TYA SBC TMP0+1 TAY ORA NEMO STA NEMO TXA SBC TMP0+2 TAX ORA NEMO RTSа; ** CHECK ADDRESS RANGE **CHKRANGE LDY #01а;0 < ADDR-BEGIN < END-BEGIN LDX LENGTH SEC:LOOP JSR FETCHY SBC TMP2-1,Y STA STAGE+5,Y INY DEX BNE :LOOP BCC :RTS LDX LENGTH LDY #01 SEC:LOOP2 LDA AFLG-1,Y SBC STAGE+5,Y INY DEX BNE :LOOP2:RTS RTSа; ** RELOCATE **RELOCATE LDA #$FF DFB $2Cа; ** .TRANSFER **TRANS LDA #00 STA TMPC JSR INPUT PHA JSR T2T2 PLA JSR GET2B PHA LDA TMPC BEQ :SKIP JSR DIFFPа;START-END CODE = -# OF BYTES BCS :ERR XBA STA STAGE STY STAGE+1 INX BNE :ERR PLA JSR GET2Bа;END VARS PHA:SKIP JSR DIFFP BCC :OK BEQ :OK:ERR JMP ERROR:OK JSR SWAP PLA JSR GET2Bа;DEST LDA TMP0+2 STA :MOV+1 LDA TMP2+2 STA :MOV+2 PHB REP #$30 LDX TMP2 LDY TMP0 LDA AFLG SEC SBC TMP2 STA AFLGа;END-BEGIN:MOV HEX 540000а;НЦО SEP #$30 PLB LDA TMPC BNE RELOC JMP STRTа;** RELOCATE CHUNK OF CODE **RELOC STZ AFLG+2 JSR DIFFPа;BEGIN-DEST XBA STA STAGE+3 STY STAGE+4 STX STAGE+5:LOOP JSR FETCH JSR GETMIDX LDA ACMDа;MODES 9-E, 11 ARE ABSOLUTE CMP #9 BCC :NOPE CMP #$0F BCC :MAYBE CMP #$11 BNE :NOPE:MAYBE JSR FETCH CMP #$2Cа;ВЙФ IS USUALLY USED E.G. ВЙФ МДБ #$20 BEQ :NOPEа;SO DON'T FIX IT! JSR CHKRANGE BCC :NOPE LDX LENGTH LDY #01 SEC:YEP JSR FETCHY SBC STAGE+2,Y DFB $97,TMP0а;УФБ [ФНР0],Щ INY DEX BNE :YEP:NOPE JSR MEMADJ LDA STAGE SEC ADC LENGTH STA STAGE BCC :LOOP INC STAGE+1 BNE :LOOP JMP STRT; ** .FILL **FILL JSR INPUT PHA JSR T2T2 PLA JSR GET2B CMP #$0D BEQ ERROR2 JSR T2T2 JSR RDOB BCC ERROR2 STA TMPCFLUP1 LDX WRAP BNE STRT1 JSR DIFFP BCC STRT1 LDA TMPC DFB $87,TMP0а;STA [TMP0] JSR INCTMP BNE FLUP1ERROR2 JMP ERRORSTRT1 JMP STRT; ** .HUNT **HUNT JSR INPUT PHA JSR T2T2 PLA JSR GET2B CMP #$0D BEQ ERROR2 JSR T2T2 LDX #0 JSR RDOC CMP #$22 BNE NOSTRH JSR RDOCHPAR STA STAGE,X INX JSR RDT CMP #$0D BEQ HTGO CMP #$22 BEQ HTGO CPX #$1E BNE HPAR BEQ HTGONOSTRH STX INBUF JSR RDOB1 BCC ERROR2HLP STA STAGE,X INX JSR RDT CMP #$0D BEQ HTGO JSR RDOB BCC ERROR2 CPX #$1E BNE HLPHTGO STX SAVX JSR CRLFHSCAN JSR STOP1 BEQ HNJMP LDX #0 LDY #0HLP3 JSR FETCHY CMP STAGE,X BNE HNMTCH INY INX CPX SAVX BNE HLP3; ** MATCH FOUND ** JSR WROA24 JSR SPACEHNMTCH JSR INCTMP LDX WRAP BNE STRT1 JSR DIFFP BCS HSCANHNJMP JMP STRTа; ** ЖETCH A BYTE USING $01 **FETCHY PHP SEC DFB $2CFETCH PHP CLC PHX SEI LDX $01 LDA OHONE STA $01*         LDA TMP0+1*         ORA TMP0+2*         BEQ :ZP:CONT BCS :FETCHY DFB $A7,TMP0а;LDA [TMP0] DFB $2C:FETCHY DFB $B7,TMP0а;LDA [TMP0],Y:OK STX $01 CLI PLX PLP AND #$FFа;SET FLAGS RTS*:ZP      PHP*         LDA TMP0*         CLC*         ADC #<ZP*         STA TMP0*         LDA TMP0+1*         ADC #>ZP*         STA TMP0+1*         PLP*         BCS :Y2*         LDA [TMP0]*         DFB $2C*:Y2      LDA [TMP0],Y*         PHA*         LDA TMP0*         SEC*         SBC #<ZP*         STA TMP0*         LDA TMP0+1*         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.:РМПР КУТ ГИТПХФ ДЕШ ВОЕ :РППР ТФУ