>Z80TAIL 6 End of Z80BASIC Rom with Z80 & 8085 disassembler " By J.G.Harston, (C)1991-2000 ( 70 Camm Street 2 SHEFFIELD < S6 3TR. F Public Domain P: Z=&7000:Assem d"*SAVE Z80R2 7000 "+~O% n"KEY0 *LOAD Z80R1 3000|M*LOAD Z80BAS 3100|M*LOAD Z80R2 "+~(start-&5000)+"|M*SAVE Z80ROM 3000 "+~(P%-&5000)+" FFFF0000 FFFBBC00|M*FX18|M" x *FX225,1 *FX138,0,128 *BASIC : @ݤs(A$):$O%=A$:P%=P%+$O%:O%=O%+$O%:O%?-1=O%?-1 &80:=P*3+4 Assem *LOAD Z80R1 7000 BasicName=&800D @OSBYTE=&FFF4:OSNEWL=&FFE7:OSWRCH=&FFEE:OSASCI=&FFE3:ProgID=9 PLA:CMP #&C3:BNE LanguageOff :\ Byte not a JP opcode : BLDX #&0F :\ Disable nonZ80 languages .CheckRomsLp  8LDA &2A1,X:ROL A:BPL CheckNextRom :\ Not a language 9 #15*2:CMP #8*2:BEQ CheckNextRom:\ Contains Z80 code  ;LDA &2A1,X: #&BF:STA &2A1,X :\ Remove language bit *.CheckNextRom 4DEX:BPL CheckRomsLp >: HJLDX &28C:LDA &2A1,X:LDX &F4 :\ Find current language's ROM type R@ #&4F:CMP #&48:BEQ SetBasic :\ It is a Z80, so leave it \FSTX &28C :\ Make me the current language f .SetBasic pITXA:A #&80:STA &24B :\ Pass *BASIC to with my ROM num z: CLDA &28D:A #&40:STA &DF0,X :\ Save Break type in my flag :LDA #2:STA &28D :\ Set 'Hard Break' BNE ServQuitRestoreY : .LanguageOff BLDX &F4:LDA &2A1,X: #&BF:STA &2A1,X :\ Remove my language bit .ServQuitRestoreY  PLA:TAY  PLA:RTS : 6.Serv06:\ Check for 'This is not a language' error  TYA:PHA 3LDY #0:LDA (&FD),Y:BNE ServQuitRestoreY :\ <>0 ELDA &DF0,X:CMP #&40:BCC Serv06MoveError :\ Get rid of =0 problem TYA  .Serv06Lp $=ADC (&FD),Y:INY:CPY #23:BNE Serv06Lp:\ Hash up the string .8CMP #&EB:BNE ServQuitRestoreY :\ Not the error 8.Serv06Enter B3LDA #142:LDX &F4:JMP OSBYTE :\ Enter me LE:]:TubeAddr=P%-2:[OPT P*3+4:EQUW 0 :\ Address of OSBYTE in copro V.Serv06MoveError `CINY:LDA (&FD),Y:STA &101,Y :\ Copy error block to &100 jBNE Serv06MoveError t?LDA #1:STA &FD:STA &FE :\ Adjust error pointer ~7LDA #&FF:STA &101:BNE ServQuitRestoreY:\ Make =255 :  .Serv07 ;LDA &EF:CMP #90:BNE Serv07Quit :\ Not *FX90,x,x - quit >LDA &F0:BEQ Serv07Help :\ *FX90,0 - Display names .Serv07Display :\ A<>0, X=0 at this point xLDX #MsgServ07-MsgBase :JSR PrMessage :\ Print ProgID prefix : PLA  .PrName PHA  .PrName2 =TYA:PHA:LDX #0:LDY #3 :\ Terminate at 2nd space  .PrNameLp /LDA &8009,X:BNE P%+4:LDA #32 :\ &00 -> CMP #32:BNE PrNameChar DEY:BEQ PrNameEnd .PrNameChar JSR OSWRCH:INX:BNE PrNameLp .PrNameEnd JSR OSNEWL:PLA:TAY .Serv07Quit " PLA:RTS ,: 6 .Serv09 @&LDA (&F2),Y:CMP #13:BEQ serv9simpl J!CMP #".":BEQ serv9all: #&DF TCMP #"Z":BNE serv9exit ^ .serv9all:JSR serv9simplPush h&LDX #MsgHelp-MsgBase:JSR PrMessage r.serv9exit:PLA:RTS |.serv9simplPush:PHA .serv9simpl JSR OSNEWL:JMP PrName2 :  .Serv04 TYA:PHA:LDX #0:.serv4lp LDA (&F2),Y:INY:CMP #"." BEQ serv4ok  #&DF:CMP BasicName,X BNE serv4not INX:LDA BasicName,X BNE serv4lp LDA (&F2),Y:CMP #33 BCS serv4not  .serv4ok LDA (&F2),Y:INY:CMP #32 BEQ serv4ok &CMP #"-":BNE serv4select 0.serv4skip :LDA (&F2),Y:INY DCMP #33:BCS serv4skip NBCC serv4ok X.serv4select bCMP #13:BEQ serv4enter lDEY:LDX #0:.serv4sel_lp vLDA (&F2),Y:STA &781,X #INX:INY:CMP #13:BNE serv4sel_lp  STX &780 LDA &DC6:STA &779 LDA &DC7:STA &77A LDA &DC8:STA &77B LDA #newGBPB 255:STA &DC6 LDA #newGBPB 256:STA &DC7 LDA &F4:STA &DC8 .serv4enter JMP Serv06Enter  .serv4not PLA:TAY:LDX &F4:PLA:RTS  .newGBPB CMP #&80:BEQ do_newGBPB  &PHA:JSR restore_GBPB:PLA:JMP &FFD1 .do_newGBPB  STX &A8:STY &A9:LDY #4 *.newGBPBlp1 4LDA (&A8),Y:STA &77B,Y >DEY:BNE newGBPBlp1 H.newGBPBclaim RJSR TubeClaim \LDX #&7C:LDY #7:LDA #1 f JSR &406 pLDX #0:LDY &780 z.newGBPBloop LDA &780,X:STA &FEE5 TXA:LDX #9:.newGBPBwait DEX:BNE newGBPBwait:TAX INX:DEY:BPL newGBPBloop $JSR TubeRelease:JSR restore_GBPB LDX &A8:LDY &A9:LDA #0:RTS .restore_GBPB LDA &779:STA &DC6 LDA &77A:STA &DC7 LDA &77B:STA &DC8:RTS : .TubeClaim LDA #&C0+16+ProgID JSR &406:BCC TubeClaim:RTS : .TubeRelease $LDA #&80+16+ProgID:JMP &406 .: 8 .Serv08 B&PLA:LDA &EF:CMP #190:BNE Serv8Exit LLDY #0:LDA (&F0),Y:TAX V)INY:LDA (&F0),Y:CMP #16:BCC Serv8Exit `INY:LDA (&F0),Y jCMP #80:BEQ Serv8Mine t1CMP #85:BNE Serv8Exit :\ Not Z80 or 8080/8085 ~.Serv8Mine CPX #12:BCS DisWhich CMP #85:BEQ FindName LDX #0 .FindName LDY #4 .FindNameLp #LDA Names,X:STA (&F0),Y:INX:INY CMP #13:BNE FindNameLp LDA #0:RTS : .Serv8Exit LDA #8:RTS : .Names EQUS "Z80":EQUB 13 EQUS "8080/8085":EQUB 13 (: 2 .DisWhich <CPX #12:BCC Serv8Exit FLDY #11:PHA P.DisDataLp ZLDA (ptr),Y:STA data-8,Y dDEY:CPY #7:BNE DisDataLp nLDX #0:STX indexP:PLA xCMP #80:BEQ DisZ80 : ;\ Now attach Dis8085 and DisZ80 from DisAssem rom here: : .Dis85:.Dis8085 LDA data:PHA:JSR DisZ80 .dissChkErr ELDY #2:LDA (ptr),Y: #&BF:BEQ dis85ok:\ If any z80 done, not 8085 .dissIsErr PLA:PHA:STA data:JSR do_defb .dis85ok PLA:LDA #0:RTS : .Dis80:.DisZ80  .diss_try INX #LDY #table2-table3:LDA data-1,X "CMP #&ED:BNE notED ,6LDA indexP:A #2:STA indexP:\ ED codes not on 8085 6JMP search_go @ .notED JCMP #&DD:BEQ indexes TCMP #&FD:BEQ indexes ^CMP #&CB:BNE notCB h=LDA indexP: #&F7:A #2:STA indexP:\ CB codes not on 8085 r#LDY #0:BIT indexP:BPL search_go |LDA data+3 STA opcode:JMP search_loopX .indexes CPX #1:BEQ index_ok .do_defb KLDA #2:PHA:LDA #&36:JMP diss_cont:\ Too many indexes, do 'B' (was A=0) .index_ok J #&4F:STA indexP:JMP diss_try:\ Set Index,~End,X/Y,Unf---Not85,~UnDoc .notCB LDY #table1-table3 DEX:CMP #&D9:BNE search_go 1LDA indexP:A #2:STA indexP:\ EXX not on 8085 \ search table .search_go LDA data,X:STA opcode .search_loopX  STX Dptr &.search_loop 0PHA: table3,Y:INY :!CMP table3,Y:BEQ search_found D%INY:LDA table3,Y:BPL search_2:INY N .search_2 XPLA bINY:BNE search_loop lPHA:\ should never get here v.search_found INY:PLA LDA table3,Y:\ index \ BMI diss_mode CMP #&40:BCS diss_index PHA  #&F:CMP #&F:BNE diss_comp PLA:LDA opcode: #3:A #&18 JSR get_mn_text LDA opcode:LSR A:LSR A:LSR A ADC #8:JSR get_mn_text2 JMP diss_done \Separate index and mode .diss_comp #PLA:PHA:CMP #&10:BCC diss_comp2 CMP #&20:BCS diss_comp2 /LDA opcode: #&F8:CMP #&30:\ Is it CB-SLS? *BNE diss_comp2 44LDA indexP:A #1:STA indexP:\ SLS not documented >.diss_comp2 H LDA opcode:LSR A:LSR A:LSR A R #7:STA data \PLA:PHA:LSR A: #&18 fA data:STA data pPLA: #&F:PHA z"LDA data:CMP #&4:BCS diss_cont PLA:A #&70:PHA LDA data:BPL diss_cont .diss_index SEC:SBC #32:STA data LDA #0:PHA:\ mode LDA data:BPL diss_cont : $.diss_mode:\ Table byte has b7=1 /CMP #&E6:BNE diss_mode_2:\ Is it 'RETI/N' ? 5PHA:LDA indexP:A #64:STA indexP:PLA:.diss_mode_2 : TAX:LDA table3+1,Y:\ mode PHA:TXA: #127 CMP #&40:BCC diss_cont 2PHA:LDA opcode:LSR A:LSR A:LSR A: #1:STA data PLA:A data: #63 $.diss_cont .CCMP #&36:BNE diss_cont2:\ If unrecognised, reset input pointer 83LDX #0:STX Dptr:LDX data:STX data+1:.diss_cont2 BPHA:LDY #4 L)LDA (ptr),Y:CLC:ADC #2:STA data-1:INY V#LDA (ptr),Y:ADC #0:STA data:PLA `0\ data-1,data holds PC+2 for JR instructions jJSR get_mn_text tPLA:BEQ diss_done ~ PHA:LDA #32:.diss_do_mode_lp STA (ptr),Y:INY CPY #9:BCC diss_do_mode_lp  LDY #9 PLA:\ mode PHA: #&F0:BEQ do_second LSR A:LSR A:LSR A:LSR A  #&0F:JSR opernd1 PLA: #&0F:BEQ diss_done !PHA:LDA #",":STA (ptr),Y:INY .do_second PLA:JSR opernd2 .diss_done LDA indexP:BPL diss_finish  . #&10:BEQ diss_finish:\ Incomplete index? +\LDA #&36:\JSR get_mn_text:\ ********** 7LDA indexP: #&FD:A #&DD:STA data:\ Restore opcode (*LDX #0:STX Dptr:STX indexP:JMP do_defb 2.diss_finish <LDA #13:STA (ptr),Y:CLC:PHP F?LDA indexP:BMI diss_fin_index:\ index only JP (hxy) checked P1 #2:BNE diss_fin_unkn:\ EDxx already checked Z.LDA opcode:CMP #&C9:BEQ diss_fin_end:\ RET d"CMP #&C3:BEQ diss_fin_end:\ JP n.diss_fin_index x4LDA opcode:CMP #&E9:BNE diss_fin_unkn:\ JP (hxy) .diss_fin_end 2LDA indexP:A #64:STA indexP:BNE diss_fin_unkn .diss_fin_unkn (LDY #7:LDA (ptr),Y:CMP #"B":\ 'B'? BNE diss_finish2 -LDA #0:STA Dptr:PLP:SEC:PHP:.diss_finish2 8LDY #3:LDX Dptr:INX:TXA:STA (ptr),Y:\ Bytes occupied 4LDA indexP:ROL A:PLP:ROR A:\ Put Unknown flag in " #&C3:DEY:STA (ptr),Y:\ Flags "LDA #0:RTS:\ Claim and return : \ Table format: 0\ mask match mode1 [ mode2 if mode1b7=1 ] \ mode1=mnemomic+32 ??? \ \ ".table3:\ CB bytes ,%EQUB &C0:EQUB &00:EQUB &16:\ rots 6-EQUB &C0:EQUB &40:EQUB &91:EQUB &36:\ BIT @-EQUB &C0:EQUB &80:EQUB &92:EQUB &36:\ RES J-EQUB &C0:EQUB &C0:EQUB &93:EQUB &36:\ SET T.table2:\ ED bytes ^&EQUB &E4:EQUB &A0:EQUB &0F:\ BLOCK h$EQUB &FF:EQUB &44:EQUB &41:\ NEG r.EQUB &FF:EQUB &46:EQUB &B3:EQUB &40:\ IM 0 |0EQUB &F7:EQUB &56:EQUB &B3:EQUB &40:\ IM 1/2 0EQUB &CF:EQUB &42:EQUB &83:EQUB &FD:\ SBC HL 0EQUB &CF:EQUB &4A:EQUB &81:EQUB &FD:\ ADC HL 1EQUB &F7:EQUB &67:EQUB &E8:EQUB &00:\ RRD/RLD 3EQUB &F7:EQUB &45:EQUB &E6:EQUB &00:\ RETN/RETI 4EQUB &CF:EQUB &4B:EQUB &98:EQUB &DA:\ LD dd,(nn) 4EQUB &CF:EQUB &43:EQUB &98:EQUB &AD:\ LD (nn),dd ,EQUB &C7:EQUB &40:EQUB &9A:EQUB &B8:\ IN -EQUB &C7:EQUB &41:EQUB &B2:EQUB &8B:\ OUT 2EQUB &F7:EQUB &57:EQUB &98:EQUB &7C:\ LD A,I/R 2EQUB &F7:EQUB &47:EQUB &98:EQUB &C7:\ LD I/R,A 8EQUB &00:EQUB &00:EQUB &B6:EQUB &02:\ was &56:\ *NOP .table1:\ plain bytes $EQUB &FF:EQUB &00:EQUB &40:\ NOP %EQUB &FF:EQUB &76:EQUB &42:\ HALT $EQUB &FF:EQUB &D9:EQUB &43:\ EXX 2EQUB &FF:EQUB &08:EQUB &90:EQUB &04:\ EX af,af &$EQUB &C0:EQUB &80:EQUB &06:\ alu 0%EQUB &C7:EQUB &C6:EQUB &02:\ alu# :0EQUB &C7:EQUB &06:EQUB &98:EQUB &B2:\ LD r,n D'EQUB &E7:EQUB &27:EQUB &20:\ DAAetc N(EQUB &E7:EQUB &07:EQUB &17:\ RLCAetc X0EQUB &C0:EQUB &40:EQUB &98:EQUB &B6:\ ld r,r b: l/EQUB &F7:EQUB &F3:EQUB &E4:EQUB &00:\ DI/EI v1EQUB &F7:EQUB &10:EQUB &EC:EQUB &01:\ DJNZ/JR 1EQUB &C7:EQUB &03:EQUB &EA:EQUB &D0:\ INC/DEC 4EQUB &CF:EQUB &01:EQUB &98:EQUB &D3:\ LD dr,nnnn 3EQUB &EF:EQUB &02:EQUB &98:EQUB &E7:\ LD (dr),A 3EQUB &EF:EQUB &0A:EQUB &98:EQUB &7E:\ LD A,(dr) /EQUB &C7:EQUB &04:EQUB &AA:EQUB &0B:\ INC r /EQUB &C7:EQUB &05:EQUB &AB:EQUB &0B:\ DEC r 3EQUB &CF:EQUB &09:EQUB &80:EQUB &FD:\ ADD HL,dr 3EQUB &E7:EQUB &20:EQUB &AD:EQUB &21:\ JR cc,dis 4EQUB &FF:EQUB &22:EQUB &98:EQUB &AF:\ LD (nn),hl 4EQUB &FF:EQUB &2A:EQUB &98:EQUB &FA:\ LD hl,(nn) 3EQUB &FF:EQUB &32:EQUB &98:EQUB &A7:\ LD (nn),A 3EQUB &FF:EQUB &3A:EQUB &98:EQUB &7A:\ LD A,(nn) 0EQUB &C7:EQUB &C0:EQUB &AF:EQUB &20:\ RET cc 3EQUB &C7:EQUB &C4:EQUB &AE:EQUB &23:\ cc,addr  -EQUB &FF:EQUB &C9:EQUB &AF:EQUB &00:\ RET 0EQUB &FF:EQUB &CD:EQUB &AE:EQUB &03:\ addr  4EQUB &C7:EQUB &C2:EQUB &B4:EQUB &23:\ JP cc,addr *1EQUB &FF:EQUB &C3:EQUB &B4:EQUB &03:\ JP addr 41EQUB &FF:EQUB &E9:EQUB &B4:EQUB &0E:\ JP (hl) >0EQUB &CF:EQUB &C1:EQUB &B0:EQUB &60:\ pop dr H1EQUB &CF:EQUB &C5:EQUB &B1:EQUB &60:\ push dr R/EQUB &C7:EQUB &C7:EQUB &B5:EQUB &10:\ rst x \3EQUB &FF:EQUB &D3:EQUB &B2:EQUB &97:\ OUT A,(n) f2EQUB &FF:EQUB &DB:EQUB &9A:EQUB &79:\ IN A,(n) p4EQUB &FF:EQUB &E3:EQUB &90:EQUB &5F:\ EX (SP),HL z2EQUB &FF:EQUB &EB:EQUB &90:EQUB &05:\ EX DE,HL 2EQUB &FF:EQUB &F9:EQUB &98:EQUB &DF:\ LD SP,HL 8EQUB &00:EQUB &00:EQUB &B6:EQUB &02:\ was &56:\ *NOP  .d_text  EQUB &80 OPT s("ADD"):OPT s("ADC") OPT s("SUB"):OPT s("SBC") OPT s("AND"):OPT s("XOR") OPT s("OR"):OPT s("CP") OPT s("RLC"):OPT s("RRC") OPT s("RL"):OPT s("RR") OPT s("SLA"):OPT s("SRA") OPT s("SLS"):OPT s("SRL") OPT s("EX"):OPT s("BIT") OPT s("RES"):OPT s("SET") OPT s("DAA"):OPT s("CPL") OPT s("SCF"):OPT s("CCF") $OPT s("LD"):OPT s("CP") .OPT s("IN"):OPT s("OT") 8OPT s("I"):OPT s("D") BOPT s("IR"):OPT s("DR") LOPT s("NOP"):OPT s("NEG") V OPT s("HALT"):OPT s("EXX") `OPT s("DI"):OPT s("EI") j!OPT s("RETN"):OPT s("RETI") tOPT s("RRD"):OPT s("RLD") ~OPT s("INC"):OPT s("DEC") OPT s("DJNZ"):OPT s("JR")  OPT s("CALL"):OPT s("RET")  OPT s("POP"):OPT s("PUSH") OPT s("OUT"):OPT s("IM") OPT s("JP"):OPT s("RST") OPT s("DEFB"):\ Was ???? OPT s("BC"):OPT s("DE") OPT s("AF"):OPT s("SP") OPT s("HL"):OPT s("(SP)") OPT s("IX"):OPT s("IY") $OPT s("AF,AF'"):OPT s("DE,HL") OPT s("NZ"):OPT s("Z") OPT s("NC"):OPT s("C")  OPT s("PO"):OPT s("PE") OPT s("P"):OPT s("M") OPT s("B"):OPT s("C") (OPT s("D"):OPT s("E") 2OPT s("H"):OPT s("L") <OPT s("(C)"):OPT s("A") FOPT s("I"):OPT s("R") P: Z.get_mn_text:LDY #4 d.get_mn_text2 nTAX:TYA:PHA:TXA xLDX #0:TAY .get_mn_text_lp )INX:LDA d_text-1,X:BPL get_mn_text_lp DEY:BPL get_mn_text_lp  PLA:TAY .get_mn_text_lp1 LDA d_text,X:PHA  #&7F:STA (ptr),Y #INY:INX:PLA:BPL get_mn_text_lp1 LDX Dptr:RTS %\ Returns Y=next char, X=data ptr \ !\ 0-7 -> nothing, &nn, ??, ??  .opernd1 TAX:LDA opcode DEX:BNE condit  #&38:JMP out_hex ": ,!\ 0-7 -> nothing, ??, ??, ??, 6 .opernd2 @TAX:LDA opcode JDEX:BNE dat8 T\ ^/.outRelAddr:\ Also called by 65x02 routines hJSR fetch:BMI pc_neg rCLC:ADC data-1:PHA |LDA #0:ADC data:JMP pc_pos  .pc_neg CLC:ADC data-1:PHA LDA #&FF:ADC data  .pc_pos JSR out_hex ALDA indexP:A #2:STA indexP:\ Relative addr, so not 8080/8085 %LDA opcode:CMP #&18:BNE pc_pos_jr 8LDA indexP:A #64:STA indexP:\ JR is code end marker .pc_pos_jr PLA:JMP da  .condit LSR A:LSR A:LSR A DEX:BNE bitnum PHA: #&10:BNE abs PLA: #3:PHA:.abs !PLA: #7:CLC:ADC #&41:BPL ps1 & .dat8 0DEX:BNE dat16 :.d8 DJSR fetch:JMP out_hex N .bitnum XDEX:BNE intmod b# #7:A #48:STA (ptr),Y:INY:RTS l .dat16 vDEX:BNE exaf .d16 JSR fetch:\ Get lo byte PHA:JSR fetch:\ Do hi byte JSR out_hex:PLA .da PHA:LSR A:LSR A:LSR A:LSR A JSR dnyb:PLA:.dnyb  #15:CMP #10:BCC dnyb2 ADC #6:.dnyb2 ADC #48:STA (ptr),Y:INY:RTS .ps1:JMP ps2  .intmod DEX:BNE stktop  #3:CMP #2:BCS intmod2  LDA #1:.intmod2 #CLC:ADC #47:STA (ptr),Y:INY:RTS  .stktop *DEX:BNE reg16p 4LDA #60:JMP ps2 >.reg16p:\ reg pair HDEX:BNE comm_jmp R LSR A: #3:CMP #3:BNE rx_jmp \LDA #2:JMP rnx f.rx_jmp:JMP rx p.comm_jmp:JMP common z .exaf DEX:BNE exde 7LDA indexP:A #2:STA indexP:\ EX AF,AF' not on 8085 LDA #&3F:JMP ps2  .exde DEX:BNE reg8s LDA #&40:JMP ps2  .reg8s DEX:BNE accum .r8  #7:CMP #6:BEQ r8hl BIT indexP:BPL ps3jmp CMP #4:BEQ r8xh CMP #5:BNE ps3jmp  .r8xh PHA:LDA opcode: #&F7 CMP #&66:BEQ r8xl $LDA opcode: #&FE:CMP #&74 . BEQ r8xl 8FLDA indexP:A #1:STA indexP:\ Using 8bit index regs not documented B #&10:BNE r8xy LINC Dptr:.r8xy V)JSR regx:.r8xl:PLA:\ drop thru to ps3 `.ps3jmp:JMP ps3 j .r8hl tJSR lp:\ '(' ~JSR regx:\ HL/IX/IY BIT indexP:BPL rp_jmp  INC Dptr "LDA data+1:CMP #&36:BNE r8next DEY:DEY:DEY:DEY:DEY JSR lp:JSR regx  .r8next LDA #"+":STA (ptr),Y LDA data+2:BPL pos LDA #"-":STA (ptr),Y  LDA data+2: #255:CLC:ADC #1  .pos:INY JSR out_hex !\ change this so it's decimal  .rp_jmp  JMP rp  .accum (LSR A:LSR A:LSR A 2 .common <DEX:BNE portC FLDA opcode: #&E7:CMP #&07 PBNE accum2 ZDEY:DEY:DEY:LDA (ptr),Y dCMP #" ":BEQ accum2 nINY:.accum2 xLDA #&50:BNE ps2  .portC DEX:BNE idat8  LDA #&4F %.ps2:\ A=text entry no. to output JMP get_mn_text2 .ps3:\ A+'B'=entry no. CLC:ADC #&49:BNE ps2  .idat8 DEX:BNE idat16 JSR lp:\ '(' JSR d8:CLC:BCC rp  .idat16 DEX:BNE reg8 JSR lp:\ '(' JSR d16:CLC:BCC rp  .reg8 "DEX:BEQ r8_jmp , .iparef 6DEX:BNE reg16 @" #9:BNE ps3:\ jump to do regs J.r8_jmp:JMP r8 T .reg16 ^LSR A:DEX:BNE ireg16 h.r16 r #3 |.rx CMP #2:BEQ regx .rnx CLC:ADC #&37  BNE ps2  .ireg16 DEX:BNE regx  JSR lp  JSR r16 .rp LDA #")":STA (ptr),Y:INY RTS .regx:\ HL or IX/IY  \ indexes HLDA indexP:ROL A:PHP:ROL A:PLP:ROL A:ROL A:\ Convert indexP to 0/2/3 0 #3:CMP #2:BCC regx2:\ 0=HL, so not indexed 6PHA:LDA indexP: #&EF:STA indexP:\ Index completed &PLA:.regx2 0CLC:ADC #&3B:BNE ps2 :.lp D!PHA:LDA #"(":STA (ptr),Y:INY N PLA:RTS X .out_amp b!PHA:LDA #"&":STA (ptr),Y:INY l PLA:RTS v .out_hex JSR out_amp:JMP da  .fetch (LDX Dptr:INX:LDA data,X:STX Dptr:RTS .Rol4:ROL A .Rol3:ROL A:ROL A:ROL A:RTS : ]