10
20
30
40
50
60
70
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