10 REM >Z80TAIL
   20 REM End of Z80BASIC Rom with Z80 & 8085 disassembler
   30 REM By J.G.Harston, (C)1991-2000
   40 REM 70 Camm Street
   50 REM SHEFFIELD
   60 REM S6 3TR.
   70 REM Public Domain
   80 :
   90 HIMEM=&7000:PROCAssem
  100 OSCLI"*SAVE Z80R2 7000 "+STR$~O%
  110 OSCLI"KEY0 *LOAD Z80R1 3000|M*LOAD Z80BAS 3100|M*LOAD Z80R2 "+STR$~(start-&5000)+"|M*SAVE Z80ROM 3000 "+STR$~(P%-&5000)+" FFFF0000 FFFBBC00|M*FX18|M"
  120 *FX225,1
  130 *FX138,0,128
  140 *BASIC
  150 :
  160 DEFFNs(A$):$O%=A$:P%=P%+LEN$O%:O%=O%+LEN$O%:O%?-1=O%?-1 OR&80:=P*3+4
  170 DEFPROCAssem
  180 *LOAD Z80R1 7000
  190 BasicName=&800D
  200 OSBYTE=&FFF4:OSNEWL=&FFE7:OSWRCH=&FFEE:OSASCI=&FFE3:ProgID=9
  210 ptr=&F0:data=&AC:Tptr=&AB:indexP=&AA:opcode=&A9:Dptr=&A8
  220 start=&FFFF AND !&7004
  230 PrMessage=&8062
  240 FOR P=0 TO 1
  250   P%=start:O%=&7000
  260   [OPT P*3+4
  270   .Service
  280   JMP ServiceEntry
  290   :
  300   .MsgBase
  310   EQUS "Z80 needed":EQUB 13:BRK
  320   .MsgHelp
  330   EQUS "  Z80BASIC ROM Header (C)J.G.Harston":EQUB 13
  340   EQUS "  BBCBASIC(Z80) code (C)R.T.Russell":EQUB 13:BRK
  350   .MsgServ07
  360   EQUS STR$(ProgID)+": ":BRK
  370   :
  380   .ServiceEntry
  390   PHA
  400   CMP #&07:BNE P%+5:JMP Serv07
  410   CMP #&01:BNE P%+5:JMP Serv01:\ Pre-Tube checking
  420   CMP #&25:BNE P%+5:JMP Serv25:\ Pre-Tube checking
  430   LDA &DF0,X:BMI ServQuit     :\ ROM is disabled, so skip all rest
  440   PLA:PHA                     :\ Get service number back
  450   CMP #&08:BNE P%+5:JMP Serv08:\ OSWORD - DisAssem routine
  460   CMP #&09:BNE P%+5:JMP Serv09:\ *HELP
  470   LDA &2A1,X:ROL A            :\ Get my language bit
  480   AND &27A:BPL ServQuit       :\ If no Tube OR no Z80, skip following
  490   PLA:PHA                     :\ Get service number back
  500   CMP #&04:BNE P%+5:JMP Serv04:\ Check for '*Basic' command
  510   CMP #&06:BNE P%+5:JMP Serv06:\ Check for 'Not a language' error
  520   CMP #&0F:BNE P%+5:JMP Serv0F:\ Pre-language checking
  530   .ServQuit
  540   PLA
  550   .Delay12us
  560   RTS
  570   :
  580   .Serv01
  590   .Serv25
  600   TYA:PHA
  610   LDA &DF0,X:BMI LanguageOff  :\ I am disabled, turn me off
  620   BIT &27A:BPL LanguageOff    :\ No Tube present, turn me off
  630   LDA #&20:STA &DF0,X         :\ Set Pre-Tube processing done
  640   BNE ServQuitRestoreY
  650   :
  660   .Serv0F
  670   TYA:PHA:LDA &DF0,X
  680   AND #&20:BEQ ServQuitRestoreY      :\ Pre-Tube not yet done
  690   JSR TubeClaim
  700   LDX #TubeAddr AND 255:LDY #TubeAddr DIV 256
  710   LDA #0:JSR &406:JSR Delay12us      :\ Init read bytes from Tube
  720   JSR Delay12us:LDA &FEE5:PHA        :\ Get the byte
  730   JSR TubeRelease
  740   PLA:CMP #&C3:BNE LanguageOff       :\ Byte not a JP opcode
  750   :
  760   LDX #&0F                           :\ Disable nonZ80 languages
  770   .CheckRomsLp
  780   LDA &2A1,X:ROL A:BPL CheckNextRom  :\ Not a language
  790   AND #15*2:CMP #8*2:BEQ CheckNextRom:\ Contains Z80 code
  800   LDA &2A1,X:AND #&BF:STA &2A1,X     :\ Remove language bit
  810   .CheckNextRom
  820   DEX:BPL CheckRomsLp
  830   :
  840   LDX &28C:LDA &2A1,X:LDX &F4        :\ Find current language's ROM type
  850   AND #&4F:CMP #&48:BEQ SetBasic     :\ It is a Z80, so leave it
  860   STX &28C                           :\ Make me the current language
  870   .SetBasic
  880   TXA:ORA #&80:STA &24B              :\ Pass *BASIC to OSCLI with my ROM num
  890   :
  900   LDA &28D:ORA #&40:STA &DF0,X       :\ Save Break type in my flag
  910   LDA #2:STA &28D                    :\ Set 'Hard Break'
  920   BNE ServQuitRestoreY
  930   :
  940   .LanguageOff
  950   LDX &F4:LDA &2A1,X:AND #&BF:STA &2A1,X :\ Remove my language bit
  960   .ServQuitRestoreY
  970   PLA:TAY
  980   PLA:RTS
  990   :
 1000   .Serv06:\ Check for 'This is not a language' error
 1010   TYA:PHA
 1020   LDY #0:LDA (&FD),Y:BNE ServQuitRestoreY :\ ERR<>0
 1030   LDA &DF0,X:CMP #&40:BCC Serv06MoveError :\ Get rid of ERR=0 problem
 1040   TYA
 1050   .Serv06Lp
 1060   ADC (&FD),Y:INY:CPY #23:BNE Serv06Lp:\ Hash up the string
 1070   CMP #&EB:BNE ServQuitRestoreY       :\ Not the error
 1080   .Serv06Enter
 1090   LDA #142:LDX &F4:JMP OSBYTE         :\ Enter me
 1100   :]:TubeAddr=P%-2:[OPT P*3+4:EQUW 0  :\ Address of OSBYTE in copro
 1110   .Serv06MoveError
 1120   INY:LDA (&FD),Y:STA &101,Y          :\ Copy error block to &100
 1130   BNE Serv06MoveError
 1140   LDA #1:STA &FD:STA &FE              :\ Adjust error pointer
 1150   LDA #&FF:STA &101:BNE ServQuitRestoreY:\ Make ERR=255
 1160   :
 1170   .Serv07
 1180   LDA &EF:CMP #90:BNE Serv07Quit  :\ Not *FX90,x,x - quit
 1190   LDA &F0:BEQ Serv07Help          :\ *FX90,0 - Display names
 1200   CMP #ProgID:BNE Serv07Quit      :\ Not *FX90,me,x - quit
 1210   LDY &DF0,X:STY &F0              :\ All calls return pre-changed flag
 1220   LDA &F1:CMP #1:BNE Serv07RdBreak:\ Not *FX90,9,1, jump to read Break
 1230   LDA #&80:BMI Serv07Store        :\ Set disable flag and jump to store
 1240   .Serv07RdBreak
 1250   TYA:AND #&7F                    :\ Mask out en/di bit
 1260   CMP #&40:BCC Serv07Enable       :\ Break processing already done
 1270   AND #&0F:STA &28D               :\ Restore Break type
 1280   .Serv07Enable
 1290   LDA #0                          :\ Flag Break processing done
 1300   .Serv07Store
 1310   STA &DF0,X                      :\ Update flag
 1320   .Serv07Exit
 1330   LDY &F4:PLA:LDA #0:RTS          :\ Exit and claim
 1340   :
 1350   .Serv07Help                     :\ A=0 at this point
 1360   TAX:LDA &F1:BNE Serv07Display
 1370   LDY #1:LDA #90:JSR OSBYTE       :\ Call on ROMs to display info
 1380   JMP Serv07Exit
 1390   .Serv07Display                  :\ A<>0, X=0 at this point
 1400   LDX #MsgServ07-MsgBase
 1410   JSR PrMessage                   :\ Print ProgID prefix
 1420   :
 1430   PLA
 1440   .PrName
 1450   PHA
 1460   .PrName2
 1470   TYA:PHA:LDX #0:LDY #3           :\ Terminate at 2nd space
 1480   .PrNameLp
 1490   LDA &8009,X:BNE P%+4:LDA #32    :\ &00 -> SPC
 1500   CMP #32:BNE PrNameChar
 1510   DEY:BEQ PrNameEnd
 1520   .PrNameChar
 1530   JSR OSWRCH:INX:BNE PrNameLp
 1540   .PrNameEnd
 1550   JSR OSNEWL:PLA:TAY
 1560   .Serv07Quit
 1570   PLA:RTS
 1580   :
 1590   .Serv09
 1600   LDA (&F2),Y:CMP #13:BEQ serv9simpl
 1610   CMP #ASC".":BEQ serv9all:AND #&DF
 1620   CMP #ASC"Z":BNE serv9exit
 1630   .serv9all:JSR serv9simplPush
 1640   LDX #MsgHelp-MsgBase:JSR PrMessage
 1650   .serv9exit:PLA:RTS
 1660   .serv9simplPush:PHA
 1670   .serv9simpl
 1680   JSR OSNEWL:JMP PrName2
 1690   :
 1700   .Serv04
 1710   TYA:PHA:LDX #0:.serv4lp
 1720   LDA (&F2),Y:INY:CMP #ASC"."
 1730   BEQ serv4ok
 1740   AND #&DF:CMP BasicName,X
 1750   BNE serv4not
 1760   INX:LDA BasicName,X
 1770   BNE serv4lp
 1780   LDA (&F2),Y:CMP #33
 1790   BCS serv4not
 1800   .serv4ok
 1810   LDA (&F2),Y:INY:CMP #32
 1820   BEQ serv4ok
 1830   CMP #ASC"-":BNE serv4select
 1840   .serv4skip
 1850   LDA (&F2),Y:INY
 1860   CMP #33:BCS serv4skip
 1870   BCC serv4ok
 1880   .serv4select
 1890   CMP #13:BEQ serv4enter
 1900   DEY:LDX #0:.serv4sel_lp
 1910   LDA (&F2),Y:STA &781,X
 1920   INX:INY:CMP #13:BNE serv4sel_lp
 1930   STX &780
 1940   LDA &DC6:STA &779
 1950   LDA &DC7:STA &77A
 1960   LDA &DC8:STA &77B
 1970   LDA #newGBPB AND 255:STA &DC6
 1980   LDA #newGBPB DIV 256:STA &DC7
 1990   LDA &F4:STA &DC8
 2000   .serv4enter
 2010   JMP Serv06Enter
 2020   .serv4not
 2030   PLA:TAY:LDX &F4:PLA:RTS
 2040   .newGBPB
 2050   CMP #&80:BEQ do_newGBPB
 2060   PHA:JSR restore_GBPB:PLA:JMP &FFD1
 2070   .do_newGBPB
 2080   STX &A8:STY &A9:LDY #4
 2090   .newGBPBlp1
 2100   LDA (&A8),Y:STA &77B,Y
 2110   DEY:BNE newGBPBlp1
 2120   .newGBPBclaim
 2130   JSR TubeClaim
 2140   LDX #&7C:LDY #7:LDA #1
 2150   JSR &406
 2160   LDX #0:LDY &780
 2170   .newGBPBloop
 2180   LDA &780,X:STA &FEE5
 2190   TXA:LDX #9:.newGBPBwait
 2200   DEX:BNE newGBPBwait:TAX
 2210   INX:DEY:BPL newGBPBloop
 2220   JSR TubeRelease:JSR restore_GBPB
 2230   LDX &A8:LDY &A9:LDA #0:RTS
 2240   .restore_GBPB
 2250   LDA &779:STA &DC6
 2260   LDA &77A:STA &DC7
 2270   LDA &77B:STA &DC8:RTS
 2280   :
 2290   .TubeClaim
 2300   LDA #&C0+16+ProgID
 2310   JSR &406:BCC TubeClaim:RTS
 2320   :
 2330   .TubeRelease
 2340   LDA #&80+16+ProgID:JMP &406
 2350   :
 2360   .Serv08
 2370   PLA:LDA &EF:CMP #190:BNE Serv8Exit
 2380   LDY #0:LDA (&F0),Y:TAX
 2390   INY:LDA (&F0),Y:CMP #16:BCC Serv8Exit
 2400   INY:LDA (&F0),Y
 2410   CMP #80:BEQ Serv8Mine
 2420   CMP #85:BNE Serv8Exit :\ Not Z80 or 8080/8085
 2430   .Serv8Mine
 2440   CPX #12:BCS DisWhich
 2450   CMP #85:BEQ FindName
 2460   LDX #0
 2470   .FindName
 2480   LDY #4
 2490   .FindNameLp
 2500   LDA Names,X:STA (&F0),Y:INX:INY
 2510   CMP #13:BNE FindNameLp
 2520   LDA #0:RTS
 2530   :
 2540   .Serv8Exit
 2550   LDA #8:RTS
 2560   :
 2570   .Names
 2580   EQUS "Z80":EQUB 13
 2590   EQUS "8080/8085":EQUB 13
 2600   :
 2610   .DisWhich
 2620   CPX #12:BCC Serv8Exit
 2630   LDY #11:PHA
 2640   .DisDataLp
 2650   LDA (ptr),Y:STA data-8,Y
 2660   DEY:CPY #7:BNE DisDataLp
 2670   LDX #0:STX indexP:PLA
 2680   CMP #80:BEQ DisZ80
 2690   :
 2700   \ Now attach Dis8085 and DisZ80 from DisAssem rom here:
 2710   :
 2720   .Dis85:.Dis8085
 2730   LDA data:PHA:JSR DisZ80
 2740   .dissChkErr
 2750   LDY #2:LDA (ptr),Y:AND #&BF:BEQ dis85ok:\ If any z80 done, not 8085
 2760   .dissIsErr
 2770   PLA:PHA:STA data:JSR do_defb
 2780   .dis85ok
 2790   PLA:LDA #0:RTS
 2800   :
 2810   .Dis80:.DisZ80
 2820   .diss_try
 2830   INX
 2840   LDY #table2-table3:LDA data-1,X
 2850   CMP #&ED:BNE notED
 2860   LDA indexP:ORA #2:STA indexP:\ ED codes not on 8085
 2870   JMP search_go
 2880   .notED
 2890   CMP #&DD:BEQ indexes
 2900   CMP #&FD:BEQ indexes
 2910   CMP #&CB:BNE notCB
 2920   LDA indexP:AND #&F7:ORA #2:STA indexP:\ CB codes not on 8085
 2930   LDY #0:BIT indexP:BPL search_go
 2940   LDA data+3
 2950   STA opcode:JMP search_loopX
 2960   .indexes
 2970   CPX #1:BEQ index_ok
 2980   .do_defb
 2990   LDA #2:PHA:LDA #&36:JMP diss_cont:\ Too many indexes, do 'DEFB' (was A=0)
 3000   .index_ok
 3010   EOR #&4F:STA indexP:JMP diss_try:\ Set Index,~End,X/Y,Unf---Not85,~UnDoc
 3020   .notCB
 3030   LDY #table1-table3
 3040   DEX:CMP #&D9:BNE search_go
 3050   LDA indexP:ORA #2:STA indexP:\ EXX not on 8085
 3060   \ search table
 3070   .search_go
 3080   LDA data,X:STA opcode
 3090   .search_loopX
 3100   STX Dptr
 3110   .search_loop
 3120   PHA:AND table3,Y:INY
 3130   CMP table3,Y:BEQ search_found
 3140   INY:LDA table3,Y:BPL search_2:INY
 3150   .search_2
 3160   PLA
 3170   INY:BNE search_loop
 3180   PHA:\ should never get here
 3190   .search_found
 3200   INY:PLA
 3210   LDA table3,Y:\ index
 3220   \
 3230   BMI diss_mode
 3240   CMP #&40:BCS diss_index
 3250   PHA
 3260   AND #&F:CMP #&F:BNE diss_comp
 3270   PLA:LDA opcode:AND #3:ORA #&18
 3280   JSR get_mn_text
 3290   LDA opcode:LSR A:LSR A:LSR A
 3300   ADC #8:JSR get_mn_text2
 3310   JMP diss_done
 3320   \Separate index and mode
 3330   .diss_comp
 3340   PLA:PHA:CMP #&10:BCC diss_comp2
 3350   CMP #&20:BCS diss_comp2
 3360   LDA opcode:AND #&F8:CMP #&30:\  Is it CB-SLS?
 3370   BNE diss_comp2
 3380   LDA indexP:ORA #1:STA indexP:\ SLS not documented
 3390   .diss_comp2
 3400   LDA opcode:LSR A:LSR A:LSR A
 3410   AND #7:STA data
 3420   PLA:PHA:LSR A:AND #&18
 3430   ORA data:STA data
 3440   PLA:AND #&F:PHA
 3450   LDA data:CMP #&4:BCS diss_cont
 3460   PLA:ORA #&70:PHA
 3470   LDA data:BPL diss_cont
 3480   .diss_index
 3490   SEC:SBC #32:STA data
 3500   LDA #0:PHA:\ mode
 3510   LDA data:BPL diss_cont
 3520   :
 3530   .diss_mode:\ Table byte has b7=1
 3540   CMP #&E6:BNE diss_mode_2:\ Is it 'RETI/N' ?
 3550   PHA:LDA indexP:ORA #64:STA indexP:PLA:.diss_mode_2
 3560   :
 3570   TAX:LDA table3+1,Y:\ mode
 3580   PHA:TXA:AND #127
 3590   CMP #&40:BCC diss_cont
 3600   PHA:LDA opcode:LSR A:LSR A:LSR A:AND #1:STA data
 3610   PLA:ORA data:AND #63
 3620   .diss_cont
 3630   CMP #&36:BNE diss_cont2:\  If unrecognised, reset input pointer
 3640   LDX #0:STX Dptr:LDX data:STX data+1:.diss_cont2
 3650   PHA:LDY #4
 3660   LDA (ptr),Y:CLC:ADC #2:STA data-1:INY
 3670   LDA (ptr),Y:ADC #0:STA data:PLA
 3680   \ data-1,data holds PC+2 for JR instructions
 3690   JSR get_mn_text
 3700   PLA:BEQ diss_done
 3710   PHA:LDA #32:.diss_do_mode_lp
 3720   STA (ptr),Y:INY
 3730   CPY #9:BCC diss_do_mode_lp
 3740   LDY #9
 3750   PLA:\ mode
 3760   PHA:AND #&F0:BEQ do_second
 3770   LSR A:LSR A:LSR A:LSR A
 3780   AND #&0F:JSR opernd1
 3790   PLA:AND #&0F:BEQ diss_done
 3800   PHA:LDA #ASC",":STA (ptr),Y:INY
 3810   .do_second
 3820   PLA:JSR opernd2
 3830   .diss_done
 3840   LDA indexP:BPL diss_finish
 3850   AND #&10:BEQ diss_finish:\ Incomplete index?
 3860   \LDA #&36:\JSR get_mn_text:\ **********
 3870   LDA indexP:AND #&FD:ORA #&DD:STA data:\ Restore opcode
 3880   LDX #0:STX Dptr:STX indexP:JMP do_defb
 3890   .diss_finish
 3900   LDA #13:STA (ptr),Y:CLC:PHP
 3910   LDA indexP:BMI diss_fin_index:\ index only JP (hxy) checked
 3920   AND #2:BNE diss_fin_unkn:\ EDxx already checked
 3930   LDA opcode:CMP #&C9:BEQ diss_fin_end:\ RET
 3940   CMP #&C3:BEQ diss_fin_end:\ JP
 3950   .diss_fin_index
 3960   LDA opcode:CMP #&E9:BNE diss_fin_unkn:\ JP (hxy)
 3970   .diss_fin_end
 3980   LDA indexP:ORA #64:STA indexP:BNE diss_fin_unkn
 3990   .diss_fin_unkn
 4000   LDY #7:LDA (ptr),Y:CMP #ASC"B":\ 'DEFB'?
 4010   BNE diss_finish2
 4020   LDA #0:STA Dptr:PLP:SEC:PHP:.diss_finish2
 4030   LDY #3:LDX Dptr:INX:TXA:STA (ptr),Y:\ Bytes occupied
 4040   LDA indexP:ROL A:PLP:ROR A:\ Put Unknown flag in
 4050   AND #&C3:DEY:STA (ptr),Y:\ Flags
 4060   LDA #0:RTS:\  Claim and return
 4070   :
 4080   \ Table format:
 4090   \ mask  match  mode1  [ mode2 if mode1b7=1 ]
 4100   \ mode1=mnemomic+32 ???
 4110   \
 4120   \
 4130   .table3:\ CB bytes
 4140   EQUB &C0:EQUB &00:EQUB &16:\ rots
 4150   EQUB &C0:EQUB &40:EQUB &91:EQUB &36:\ BIT
 4160   EQUB &C0:EQUB &80:EQUB &92:EQUB &36:\ RES
 4170   EQUB &C0:EQUB &C0:EQUB &93:EQUB &36:\ SET
 4180   .table2:\ ED bytes
 4190   EQUB &E4:EQUB &A0:EQUB &0F:\ BLOCK
 4200   EQUB &FF:EQUB &44:EQUB &41:\ NEG
 4210   EQUB &FF:EQUB &46:EQUB &B3:EQUB &40:\ IM 0
 4220   EQUB &F7:EQUB &56:EQUB &B3:EQUB &40:\ IM 1/2
 4230   EQUB &CF:EQUB &42:EQUB &83:EQUB &FD:\ SBC HL
 4240   EQUB &CF:EQUB &4A:EQUB &81:EQUB &FD:\ ADC HL
 4250   EQUB &F7:EQUB &67:EQUB &E8:EQUB &00:\ RRD/RLD
 4260   EQUB &F7:EQUB &45:EQUB &E6:EQUB &00:\ RETN/RETI
 4270   EQUB &CF:EQUB &4B:EQUB &98:EQUB &DA:\ LD dd,(nn)
 4280   EQUB &CF:EQUB &43:EQUB &98:EQUB &AD:\ LD (nn),dd
 4290   EQUB &C7:EQUB &40:EQUB &9A:EQUB &B8:\ IN
 4300   EQUB &C7:EQUB &41:EQUB &B2:EQUB &8B:\ OUT
 4310   EQUB &F7:EQUB &57:EQUB &98:EQUB &7C:\ LD A,I/R
 4320   EQUB &F7:EQUB &47:EQUB &98:EQUB &C7:\ LD I/R,A
 4330   EQUB &00:EQUB &00:EQUB &B6:EQUB &02:\ was &56:\ *NOP
 4340   .table1:\ plain bytes
 4350   EQUB &FF:EQUB &00:EQUB &40:\ NOP
 4360   EQUB &FF:EQUB &76:EQUB &42:\ HALT
 4370   EQUB &FF:EQUB &D9:EQUB &43:\ EXX
 4380   EQUB &FF:EQUB &08:EQUB &90:EQUB &04:\ EX af,af
 4390   EQUB &C0:EQUB &80:EQUB &06:\ alu
 4400   EQUB &C7:EQUB &C6:EQUB &02:\ alu#
 4410   EQUB &C7:EQUB &06:EQUB &98:EQUB &B2:\ LD r,n
 4420   EQUB &E7:EQUB &27:EQUB &20:\ DAAetc
 4430   EQUB &E7:EQUB &07:EQUB &17:\ RLCAetc
 4440   EQUB &C0:EQUB &40:EQUB &98:EQUB &B6:\ ld r,r
 4450   :
 4460   EQUB &F7:EQUB &F3:EQUB &E4:EQUB &00:\ DI/EI
 4470   EQUB &F7:EQUB &10:EQUB &EC:EQUB &01:\ DJNZ/JR
 4480   EQUB &C7:EQUB &03:EQUB &EA:EQUB &D0:\ INC/DEC
 4490   EQUB &CF:EQUB &01:EQUB &98:EQUB &D3:\ LD dr,nnnn
 4500   EQUB &EF:EQUB &02:EQUB &98:EQUB &E7:\ LD (dr),A
 4510   EQUB &EF:EQUB &0A:EQUB &98:EQUB &7E:\ LD A,(dr)
 4520   EQUB &C7:EQUB &04:EQUB &AA:EQUB &0B:\ INC r
 4530   EQUB &C7:EQUB &05:EQUB &AB:EQUB &0B:\ DEC r
 4540   EQUB &CF:EQUB &09:EQUB &80:EQUB &FD:\ ADD HL,dr
 4550   EQUB &E7:EQUB &20:EQUB &AD:EQUB &21:\ JR cc,dis
 4560   EQUB &FF:EQUB &22:EQUB &98:EQUB &AF:\ LD (nn),hl
 4570   EQUB &FF:EQUB &2A:EQUB &98:EQUB &FA:\ LD hl,(nn)
 4580   EQUB &FF:EQUB &32:EQUB &98:EQUB &A7:\ LD (nn),A
 4590   EQUB &FF:EQUB &3A:EQUB &98:EQUB &7A:\ LD A,(nn)
 4600   EQUB &C7:EQUB &C0:EQUB &AF:EQUB &20:\ RET cc
 4610   EQUB &C7:EQUB &C4:EQUB &AE:EQUB &23:\ CALL cc,addr
 4620   EQUB &FF:EQUB &C9:EQUB &AF:EQUB &00:\ RET
 4630   EQUB &FF:EQUB &CD:EQUB &AE:EQUB &03:\ CALL addr
 4640   EQUB &C7:EQUB &C2:EQUB &B4:EQUB &23:\ JP cc,addr
 4650   EQUB &FF:EQUB &C3:EQUB &B4:EQUB &03:\ JP addr
 4660   EQUB &FF:EQUB &E9:EQUB &B4:EQUB &0E:\ JP (hl)
 4670   EQUB &CF:EQUB &C1:EQUB &B0:EQUB &60:\ pop dr
 4680   EQUB &CF:EQUB &C5:EQUB &B1:EQUB &60:\ push dr
 4690   EQUB &C7:EQUB &C7:EQUB &B5:EQUB &10:\ rst x
 4700   EQUB &FF:EQUB &D3:EQUB &B2:EQUB &97:\ OUT A,(n)
 4710   EQUB &FF:EQUB &DB:EQUB &9A:EQUB &79:\ IN A,(n)
 4720   EQUB &FF:EQUB &E3:EQUB &90:EQUB &5F:\ EX (SP),HL
 4730   EQUB &FF:EQUB &EB:EQUB &90:EQUB &05:\ EX DE,HL
 4740   EQUB &FF:EQUB &F9:EQUB &98:EQUB &DF:\ LD SP,HL
 4750   EQUB &00:EQUB &00:EQUB &B6:EQUB &02:\ was &56:\ *NOP
 4760   .d_text
 4770   EQUB &80
 4780   OPT FNs("ADD"):OPT FNs("ADC")
 4790   OPT FNs("SUB"):OPT FNs("SBC")
 4800   OPT FNs("AND"):OPT FNs("XOR")
 4810   OPT FNs("OR"):OPT FNs("CP")
 4820   OPT FNs("RLC"):OPT FNs("RRC")
 4830   OPT FNs("RL"):OPT FNs("RR")
 4840   OPT FNs("SLA"):OPT FNs("SRA")
 4850   OPT FNs("SLS"):OPT FNs("SRL")
 4860   OPT FNs("EX"):OPT FNs("BIT")
 4870   OPT FNs("RES"):OPT FNs("SET")
 4880   OPT FNs("DAA"):OPT FNs("CPL")
 4890   OPT FNs("SCF"):OPT FNs("CCF")
 4900   OPT FNs("LD"):OPT FNs("CP")
 4910   OPT FNs("IN"):OPT FNs("OT")
 4920   OPT FNs("I"):OPT FNs("D")
 4930   OPT FNs("IR"):OPT FNs("DR")
 4940   OPT FNs("NOP"):OPT FNs("NEG")
 4950   OPT FNs("HALT"):OPT FNs("EXX")
 4960   OPT FNs("DI"):OPT FNs("EI")
 4970   OPT FNs("RETN"):OPT FNs("RETI")
 4980   OPT FNs("RRD"):OPT FNs("RLD")
 4990   OPT FNs("INC"):OPT FNs("DEC")
 5000   OPT FNs("DJNZ"):OPT FNs("JR")
 5010   OPT FNs("CALL"):OPT FNs("RET")
 5020   OPT FNs("POP"):OPT FNs("PUSH")
 5030   OPT FNs("OUT"):OPT FNs("IM")
 5040   OPT FNs("JP"):OPT FNs("RST")
 5050   OPT FNs("DEFB"):\ Was ????
 5060   OPT FNs("BC"):OPT FNs("DE")
 5070   OPT FNs("AF"):OPT FNs("SP")
 5080   OPT FNs("HL"):OPT FNs("(SP)")
 5090   OPT FNs("IX"):OPT FNs("IY")
 5100   OPT FNs("AF,AF'"):OPT FNs("DE,HL")
 5110   OPT FNs("NZ"):OPT FNs("Z")
 5120   OPT FNs("NC"):OPT FNs("C")
 5130   OPT FNs("PO"):OPT FNs("PE")
 5140   OPT FNs("P"):OPT FNs("M")
 5150   OPT FNs("B"):OPT FNs("C")
 5160   OPT FNs("D"):OPT FNs("E")
 5170   OPT FNs("H"):OPT FNs("L")
 5180   OPT FNs("(C)"):OPT FNs("A")
 5190   OPT FNs("I"):OPT FNs("R")
 5200   :
 5210   .get_mn_text:LDY #4
 5220   .get_mn_text2
 5230   TAX:TYA:PHA:TXA
 5240   LDX #0:TAY
 5250   .get_mn_text_lp
 5260   INX:LDA d_text-1,X:BPL get_mn_text_lp
 5270   DEY:BPL get_mn_text_lp
 5280   PLA:TAY
 5290   .get_mn_text_lp1
 5300   LDA d_text,X:PHA
 5310   AND #&7F:STA (ptr),Y
 5320   INY:INX:PLA:BPL get_mn_text_lp1
 5330   LDX Dptr:RTS
 5340   \ Returns Y=next char, X=data ptr
 5350   \
 5360   \ 0-7 -> nothing, &nn, ??, ??
 5370   .opernd1
 5380   TAX:LDA opcode
 5390   DEX:BNE condit
 5400   AND #&38:JMP out_hex
 5410   :
 5420   \ 0-7 -> nothing, ??, ??, ??,
 5430   .opernd2
 5440   TAX:LDA opcode
 5450   DEX:BNE dat8
 5460   \
 5470   .outRelAddr:\ Also called by 65x02 routines
 5480   JSR fetch:BMI pc_neg
 5490   CLC:ADC data-1:PHA
 5500   LDA #0:ADC data:JMP pc_pos
 5510   .pc_neg
 5520   CLC:ADC data-1:PHA
 5530   LDA #&FF:ADC data
 5540   .pc_pos
 5550   JSR out_hex
 5560   LDA indexP:ORA #2:STA indexP:\ Relative addr, so not 8080/8085
 5570   LDA opcode:CMP #&18:BNE pc_pos_jr
 5580   LDA indexP:ORA #64:STA indexP:\ JR is code end marker
 5590   .pc_pos_jr
 5600   PLA:JMP da
 5610   .condit
 5620   LSR A:LSR A:LSR A
 5630   DEX:BNE bitnum
 5640   PHA:AND #&10:BNE abs
 5650   PLA:AND #3:PHA:.abs
 5660   PLA:AND #7:CLC:ADC #&41:BPL ps1
 5670   .dat8
 5680   DEX:BNE dat16
 5690   .d8
 5700   JSR fetch:JMP out_hex
 5710   .bitnum
 5720   DEX:BNE intmod
 5730   AND #7:ORA #48:STA (ptr),Y:INY:RTS
 5740   .dat16
 5750   DEX:BNE exaf
 5760   .d16
 5770   JSR fetch:\ Get lo byte
 5780   PHA:JSR fetch:\ Do hi byte
 5790   JSR out_hex:PLA
 5800   .da
 5810   PHA:LSR A:LSR A:LSR A:LSR A
 5820   JSR dnyb:PLA:.dnyb
 5830   AND #15:CMP #10:BCC dnyb2
 5840   ADC #6:.dnyb2
 5850   ADC #48:STA (ptr),Y:INY:RTS
 5860   .ps1:JMP ps2
 5870   .intmod
 5880   DEX:BNE stktop
 5890   AND #3:CMP #2:BCS intmod2
 5900   LDA #1:.intmod2
 5910   CLC:ADC #47:STA (ptr),Y:INY:RTS
 5920   .stktop
 5930   DEX:BNE reg16p
 5940   LDA #60:JMP ps2
 5950   .reg16p:\ reg pair
 5960   DEX:BNE comm_jmp
 5970   LSR A:AND #3:CMP #3:BNE rx_jmp
 5980   LDA #2:JMP rnx
 5990   .rx_jmp:JMP rx
 6000   .comm_jmp:JMP common
 6010   .exaf
 6020   DEX:BNE exde
 6030   LDA indexP:ORA #2:STA indexP:\ EX AF,AF' not on 8085
 6040   LDA #&3F:JMP ps2
 6050   .exde
 6060   DEX:BNE reg8s
 6070   LDA #&40:JMP ps2
 6080   .reg8s
 6090   DEX:BNE accum
 6100   .r8
 6110   AND #7:CMP #6:BEQ r8hl
 6120   BIT indexP:BPL ps3jmp
 6130   CMP #4:BEQ r8xh
 6140   CMP #5:BNE ps3jmp
 6150   .r8xh
 6160   PHA:LDA opcode:AND #&F7
 6170   CMP #&66:BEQ r8xl
 6180   LDA opcode:AND #&FE:CMP #&74
 6190   BEQ r8xl
 6200   LDA indexP:ORA #1:STA indexP:\ Using 8bit index regs not documented
 6210   AND #&10:BNE r8xy
 6220   INC Dptr:.r8xy
 6230   JSR regx:.r8xl:PLA:\ drop thru to ps3
 6240   .ps3jmp:JMP ps3
 6250   .r8hl
 6260   JSR lp:\ '('
 6270   JSR regx:\ HL/IX/IY
 6280   BIT indexP:BPL rp_jmp
 6290   INC Dptr
 6300   LDA data+1:CMP #&36:BNE r8next
 6310   DEY:DEY:DEY:DEY:DEY
 6320   JSR lp:JSR regx
 6330   .r8next
 6340   LDA #ASC"+":STA (ptr),Y
 6350   LDA data+2:BPL pos
 6360   LDA #ASC"-":STA (ptr),Y
 6370   LDA data+2:EOR #255:CLC:ADC #1
 6380   .pos:INY
 6390   JSR out_hex
 6400   \ change this so it's decimal
 6410   .rp_jmp
 6420   JMP rp
 6430   .accum
 6440   LSR A:LSR A:LSR A
 6450   .common
 6460   DEX:BNE portC
 6470   LDA opcode:AND #&E7:CMP #&07
 6480   BNE accum2
 6490   DEY:DEY:DEY:LDA (ptr),Y
 6500   CMP #ASC" ":BEQ accum2
 6510   INY:.accum2
 6520   LDA #&50:BNE ps2
 6530   .portC
 6540   DEX:BNE idat8
 6550   LDA #&4F
 6560   .ps2:\ A=text entry no. to output
 6570   JMP get_mn_text2
 6580   .ps3:\ A+'B'=entry no.
 6590   CLC:ADC #&49:BNE ps2
 6600   .idat8
 6610   DEX:BNE idat16
 6620   JSR lp:\ '('
 6630   JSR d8:CLC:BCC rp
 6640   .idat16
 6650   DEX:BNE reg8
 6660   JSR lp:\ '('
 6670   JSR d16:CLC:BCC rp
 6680   .reg8
 6690   DEX:BEQ r8_jmp
 6700   .iparef
 6710   DEX:BNE reg16
 6720   AND #9:BNE ps3:\ jump to do regs
 6730   .r8_jmp:JMP r8
 6740   .reg16
 6750   LSR A:DEX:BNE ireg16
 6760   .r16
 6770   AND #3
 6780   .rx
 6790   CMP #2:BEQ regx
 6800   .rnx
 6810   CLC:ADC #&37
 6820   BNE ps2
 6830   .ireg16
 6840   DEX:BNE regx
 6850   JSR lp
 6860   JSR r16
 6870   .rp
 6880   LDA #ASC")":STA (ptr),Y:INY
 6890   RTS
 6900   .regx:\ HL or IX/IY
 6910   \ indexes
 6920   LDA indexP:ROL A:PHP:ROL A:PLP:ROL A:ROL A:\ Convert indexP to 0/2/3
 6930   AND #3:CMP #2:BCC regx2:\ 0=HL, so not indexed
 6940   PHA:LDA indexP:AND #&EF:STA indexP:\ Index completed
 6950   PLA:.regx2
 6960   CLC:ADC #&3B:BNE ps2
 6970   .lp
 6980   PHA:LDA #ASC"(":STA (ptr),Y:INY
 6990   PLA:RTS
 7000   .out_amp
 7010   PHA:LDA #ASC"&":STA (ptr),Y:INY
 7020   PLA:RTS
 7030   .out_hex
 7040   JSR out_amp:JMP da
 7050   .fetch
 7060   LDX Dptr:INX:LDA data,X:STX Dptr:RTS
 7070   .Rol4:ROL A
 7080   .Rol3:ROL A:ROL A:ROL A:RTS
 7090   :
 7100 ]NEXT
 7110 ENDPROC