Spectrum Disassembler 128k BASIC

The place for codemasters or beginners to talk about programming any language for the Spectrum.
Post Reply
C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Spectrum Disassembler 128k BASIC

Post by C.Born »

Hi
so i found this BASIC Disassembler:
viewtopic.php?t=9995

and made it hopefullu a 128k BASIC version.
i HOPE its all still functional, 99% sure
if you want to test it and give some comments
I included a line that saves a file to RAMdrive so you can check that in BANK=1.
and i set an #sr for the PRINT , to send it to a printer, but you have to set that manualy at line 13
the more its expended the less ram stay free, although its still 1k shorter then the original...
VAL"" is slow !!

Code: Select all

   3 DEF FN a(a)=PEEK a+256*PEEK (a+1)
   5 DEF FN a$(d)=CHR$ ((48+d AND d<10)+(55+d AND d>9))
   7 DEF FN b(b$)=(CODE b$-48 AND CODE b$<64)+(CODE b$-55 AND CODE b$>64)
   9 GO TO VAL "5000"
  12 DATA "B","C","D","E","H","L","(HL)","A"
  13 LET st=VAL "50": LET e=NOT PI: LET g=NOT e: LET SR=VAL "2"
  15 DIM d$(VAL "8",VAL "4"): POKE VAL "23658",VAL "8"
  17 FOR j=g TO VAL "8": READ d$(j): NEXT j
  50 INPUT "ADDRESS? "'k$: LET j$=k$(g): IF k$="" OR (j$<>"D" AND j$<>"H") THEN  GO TO st
  52 IF LEN k$<2 OR LEN k$>(5+(j$="D")) THEN  GO TO st
  54 GO SUB VAL "1400": IF NOT z THEN  GO TO st
  55 GO SUB VAL "1300"+5*(j$="H")
  57 IF ZX THEN  INPUT "BANK 1-6:";BANK: IF BANK<E OR BANK>6 THEN  GO TO VAL "57"
  60 LET PA=E: LET c=e: CLS 
  75 IF ZX THEN  GO SUB VAL "5010"
  90 LET c$="": LET b$=""
 100 GO SUB VAL "950": GO SUB VAL "980"
 110 IF c$(LEN c$-g TO )="ED" THEN  GO TO VAL "510"
 120 IF c$(LEN c$-g TO )="CB" THEN  GO TO VAL "550"
 130 IF c$(LEN c$-g TO )="DD" THEN  GO TO VAL "590"
 140 IF c$(LEN c$-g TO )="FD" THEN  GO TO VAL "610"
 145 IF c$<"39" AND C$>"0F" THEN  IF c$(2)="0" OR c$(2)="8" THEN  GO TO VAL "4E3"
 160 GO SUB VAL "1100"
 185 LET n$="": FOR j=g TO LEN i$: IF i$(j)="#" THEN  LET n$=n$+FN a$(j)
 190 NEXT j
 200 IF n$="" THEN  GO TO VAL "340"
 210 IF LEN n$=g THEN  GO TO VAL "300"
 230 GO SUB VAL "980": GO SUB VAL "980"
 250 LET b$=c$(LEN c$-g TO )+c$(LEN c$-3 TO LEN c$-2)
 270 LET n=FN b(n$(g))
 280 LET i$=i$( TO n-g)+b$+(i$(n+g+(LEN n$=2) TO ) AND i$(LEN i$)<>"#")
 290 GO TO VAL "350"
 310 GO SUB VAL "980"
 320 LET b$=c$(LEN c$-g TO )
 330 GO TO VAL "270"
 350 PRINT #SR; a$;TAB 6;c$;TAB 15;i$
 360 LET c=c+g
 370 IF c=VAL "22" THEN  GO TO VAL "870"
 380 IF i$="RST 0028" THEN  GO TO VAL "400"
 390 GO TO VAL "90"
 410 LET c$=""
 420 GO SUB VAL "950"
 430 GO SUB VAL "980"
 440 LET i$="DEFB "+c$
 460 PRINT #SR;a$;TAB 6;c$;TAB 15;i$
 470 IF c$="38" THEN  GO TO VAL "360"
 480 LET c=c+g
 490 IF c=VAL "22" THEN  GO TO VAL "870"
 500 GO TO VAL "410"
 520 GO SUB VAL "980"
 525 LET b=b-VAL "64"
 530 RESTORE VAL "2500"+10*INT VAL "b/10"
 535 GO SUB VAL "1120"
 540 GO TO VAL "170"
 553 GO SUB VAL "980"
 555 GO SUB VAL "560"
 556 GO TO VAL "185"
 560 RESTORE VAL "3E3"+10*INT VAL "b/64"
 565 LET v=INT VAL "b/8"-8*INT VAL "b/64"
 570 FOR j=e TO v: READ l$: NEXT j
 571 LET v=b-8*INT VAL "b/8"
 572 LET e$=d$(v+g)
 575 LET i$=l$+e$(g TO g+VAL "3*(g+v=7)")
 580 RETURN 
 600 LET x$="IX": GO TO VAL "620"
 610 LET x$="IY"
 620 GO SUB VAL "980"
 630 IF c$(LEN c$-g TO )="CB" THEN  GO TO VAL "790"
 640 GO SUB VAL "1100"
 680 LET k=g
 690 IF k>LEN i$-g THEN  STOP 
 700 IF i$(k)="H" AND i$(k+1)="L" THEN  GO TO 720
 710 LET k=k+g: GO TO VAL "690"
 720 IF b<=43 OR b=57 OR b>=225 THEN  GO TO VAL "760"
 730 GO SUB VAL "980"
 735 LET u$=""
 736 IF k<>LEN i$-g THEN  LET u$=i$(k+2 TO )
 740 LET i$=i$(g TO k-g)+x$+"+"+c$(LEN c$-g TO )+u$
 750 GO TO VAL "185"
 762 LET u$=""
 764 IF k<>LEN i$-g THEN  LET u$=i$(k+2 TO )
 770 LET i$=i$(g TO k-g)+x$+u$
 780 GO TO VAL "185"
 800 GO SUB VAL "980": GO SUB VAL "980"
 810 LET b=PEEK (a-g)
 820 GO SUB VAL "560"
 840 LET i$=i$( TO LEN i$-3)+x$+"+"+c$(5 TO 6)+i$(LEN i$)
 850 GO TO VAL "340"
 870 PRINT #e;AT e,e;"MORE? (Y/N/C/E) BANK:";BANK: PAUSE PA: LET q$=INKEY$
 875 IF q$="E" THEN  STOP 
 880 IF q$="N" THEN  GO TO st
 882 IF q$="Y" THEN  GO TO VAL "890"
 884 IF q$="C" THEN  IF NOT ZX THEN  COPY 
 885 GO TO VAL "870"
 890 IF i$="RST 0028" THEN  GO TO VAL "910"
 900 IF i$<>"DEFB "+c$ OR c$="38" THEN  GO TO VAL "60"
 910 CLS : LET c=e
 920 GO TO VAL "400"
 950 LET a$="": LET r=a: LET k=3
 955 LET i=INT VAL "r/(16^k)"
 960 LET a$=a$+FN a$(i)
 965 LET r=r-VAL "16^k"*i
 970 IF NOT K THEN  RETURN 
 975 LET k=k-g: GO TO VAL "955"
 980 IF a>FN A(VAL "23732") THEN  GO TO VAL "992"
 983 LET B=PEEK A: LET i=INT VAL "b/16"
 987 LET c$=c$+FN A$(I)+FN a$(b-16*i)
 990 LET a=a+g: RETURN 
 992 PRINT #e;AT e,6;;"ADDRESS EXCEEDS MAXIMUM": BEEP 3,st: LET q$=""
 994 IF c THEN  PRINT #e;AT g,e;"COPY? Y/N": PAUSE e: LET q$=INKEY$
 995 IF q$="Y" THEN  COPY 
 996 GO TO st
1100 IF b>=64 THEN  GO TO VAL "1140"
1110 RESTORE VAL "2010"+10*INT VAL "b/10"
1120 FOR j=e TO b-10*INT VAL "b/10": READ i$: NEXT j
1130 RETURN 
1140 IF b<=191 THEN  GO TO VAL "1180"
1150 RESTORE VAL "2200"+10*INT VAL "(b-192)/10"
1160 FOR j=e TO b-10*INT VAL "(b-192)/10"-192: READ i$: NEXT j
1170 RETURN 
1180 RESTORE VAL "2700"+10*INT VAL "(b-64)/64"
1182 LET v=INT VAL "(b-64)/8"-8*INT VAL "(b-64)/64"
1184 FOR j=e TO v: READ l$: NEXT j
1185 LET v=b-64-8*INT VAL "(b-64)/8"
1186 LET e$=d$(g+v)
1190 LET i$=l$+e$(g TO g+VAL "3*(g+v=7)")
1195 IF b=VAL "118" THEN  LET i$="HALT"
1200 RETURN 
1300 LET a=VAL k$(2 TO ): RETURN 
1310 LET a=e: LET a$=k$(2 TO )
1320 FOR j=LEN A$ TO g STEP -g
1340 LET a=a+(16^(LEN A$-j))*FN b(a$(j)): NEXT j: RETURN 
1400 FOR k=2 TO LEN k$: LET z=(k$(k)>="0" AND k$(k)<="9"): IF k$(g)="H" THEN  LET z=z+(k$(k)>="A" AND k$(k)<="F")
1410 IF z THEN  NEXT k
1420 LET z=(k=LEN k$+g): RETURN 
2010 DATA "NOP","LD BC,##","LD (BC),A","INC BC","INC B","DEC B","LD B,#","RLCA","EX AF,A'F'","ADD HL,BC"
2020 DATA "LD A,(BC)","DEC BC","INC C","DEC C","LD C,#","RRCA","DJNZ #","LD DE,##","LD (DE),A","INC DE"
2030 DATA "INC D","DEC D","LD D,#","RLA","JR #","ADD HL,DE","LD A,(DE)","DEC DE","INC E","DEC E"
2040 DATA "LD E,#","RRA","JR NZ,#","LD HL,##","LD (##),HL","INC HL","INC H","DEC H","LD H,#","DAA"
2050 DATA "JR Z,#","ADD HL,HL","LD HL,(##)","DEC HL","INC L","DEC L","LD L,#","CP L","JR NC,#","LD SP,##"
2060 DATA "LD (##),A","INC SP","INC (HL)","DEC (HL)","LD (HL),#","SCF","JR C,#","ADD HL,SP","LD A,(##)","DEC SP"
2070 DATA "INC A","DEC A","LD A,#","CCF"
2200 DATA "RET NZ","POP BC","JP NZ,##","JP ##","CALL NZ,##","PUSH BC","ADD A,#","RST 0000","RET Z","RET "
2210 DATA "JP Z,##","","CALL Z,##","CALL ##","ADC A,#","RST 0008,#","RET NC","POP DE","JP NC,##","OUT (#),A"
2220 DATA "CALL NC,##","PUSH DE","SUB #","RST 0010","RET C","EXX","JP C,##","IN A,(#)","CALL C,##","***"
2230 DATA "SBC A,#","RST 0018","RET PO","POP HL","JP PO,##","EX (SP),HL","CALL PO,##","PUSH HL","AND #","RST 0020"
2240 DATA "RET PE","JP (HL)","JP PE,##","EX DE,HL","CALL PE,##","","XOR #","RST 0028","RET P","POP AF"
2250 DATA "JP P,##","DI","CALL P,##","PUSH AF","OR H","RST 0030","RET M","LD SP,HL","JP M,##","EI"
2260 DATA "CALL M,##","***","CP #","RST 0038"
2500 DATA "IN B,(C)","OUT (C),B","SBC HL,BC","LD (##),BC","NEG","RET N","IM 0","LD I,A","IN C,(C)","OUT (C),C"
2510 DATA "ADC HL,BC","LD BC,(##)","","RET I","","LD R,A","IN D,(C)","OUT (C),D","SBC HL,DE","LD (##),DE"
2520 DATA "","","IM 1","LD A,I","IN E,(C)","OUT (C),E","ADC HL,DE","LD DE,(##)","",""
2530 DATA "IM 2","LD A,R","IN H,(C)","OUT (C),H","SBC HL,HL","LD HL,(##)","","","","RRD"
2540 DATA "IN L,(C)","OUT (C),L","ADC HL,HL","LD HL,(##)","","","","RLD","IN F,(C)",""
2550 DATA "SBC HL,SP","LD (##),SP","","","","","IN A,(C)","OUT (C),A","ADC HL,SP","LD SP,(##)"
2590 DATA "","","","","","","LDI","CPI","INI","OUTI"
2600 DATA "","","","","LDD","CPD","IND","OUTD","",""
2610 DATA "","","LDIR","CPIR","INIR","OTIR","","","",""
2620 DATA "LDDR","CPDR","INDR","OTDR"
2700 DATA "LD B,","LD C,","LD D,","LD E,","LD H,","LD L,","LD (HL),","LD A,"
2710 DATA "ADD A,","ADC A,","SUB ","SBC A,","AND ","XOR ","OR ","CP "
3000 DATA "RLC ","RRC ","RL ","RR ","SLA ","SRA ","","SRL "
3010 DATA "BIT 0,","BIT 1,","BIT 2,","BIT 3,","BIT 4,","BIT 5,","BIT 6,","BIT 7,"
3020 DATA "RES 0,","RES 1,","RES 2,","RES 3,","RES 4,","RES 5,","RES 6,","RES 7,"
3030 DATA "SET 0,","SET 1,","SET 2,","SET 3,","SET 4,","SET 5,","SET 6,","SET 7,"
3950 DATA "DJNZ ","JR ","JR NZ,","JR Z,","JR NC,","JR C,"
4000 RESTORE VAL "3950"
4010 FOR j=e TO INT VAL "b/8"-2
4020 READ i$: NEXT j: GO SUB VAL "980"
4030 LET q=a: LET q$=a$
4040 LET a=VAL "a+b-256*(b>127)"
4050 GO SUB VAL "950": LET i$=i$+a$
4060 LET a=q: LET a$=q$: GO TO VAL "350"
5000 LET A=FN A(VAL "23627"): CLEAR VAL "A+1024": LET A=FN A(VAL "23730")+SGN PI: PRINT A
5005 LET ZX=(PEEK VAL "2899"=VAL "159" OR PEEK VAL "2899"=VAL "126"): IF NOT ZX THEN  PRINT "48K": BEEP 1,-10: GO TO 10
5006 PRINT "128K": LET RM=0: SAVE !"THIS"+CHR$ (32+RND*96) LINE 1: BEEP 1,-10: GO TO 10
5010 LET RM=16+VAL "134670"(BANK)
5020 POKE VAL "23388",RM: OUT VAL "32765",RM: RETURN 
9900 CLEAR : SAVE "SpDisas" LINE 1
9990 REM Spectrum Disassembler
9991 REM by SH Man 1985
9992 REM  + WE Thomson 1986
9993 REM  + J Grimwood 2004
9994 REM  + C Born 2023
C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Re: Spectrum Disassembler 128k BASIC

Post by C.Born »

hmmmmmmmm
actualy it a to simple routine for the RST 28.
the FPcalculator has at least 4 instruction codes that are 2 bytes
34 has a STACK value eg #38 at adres 0x3728
#34,#38
which #38 is now falsly seen as an "end-calc" instruction
while #00, #33 and #35 are jumps with a 2-complement value >> x = x-256*(x>127), correct ??
this jump can jump OVER an normal z80 asm instruction like with adres 0x3717, #00,#04, a jump of 4 to 0x371c meaning the jump is calculated AFTER the instruction >#3719+#0004=#371c and jumping over the ERROR message coded in Z80
this can be LOOPED and probably NESTED ....
can i get this working?

https://github.com/ZXSpectrumVault/rom- ... trum48.asm
this shows codes with "exponents" upto 4 bytes!
that needs a rather big extra cluster to disassemble

Code: Select all

L36C4:  RST     28H             ;; FP-CALC
        DEFB    $3D             ;;re-stack      (not required - mult will do)
        DEFB    $34             ;;stk-data
        DEFB    $F1             ;;Exponent: $81, Bytes: 4
        DEFB    $38,$AA,$3B,$29 ;;
        DEFB    $04             ;;multiply
        DEFB    $31             ;;duplicate
        DEFB    $27             ;;int
        DEFB    $C3             ;;st-mem-3
        DEFB    $03             ;;subtract
        DEFB    $31             ;;duplicate
        DEFB    $0F             ;;addition
        DEFB    $A1             ;;stk-one
        DEFB    $03             ;;subtract
        DEFB    $88             ;;series-08
        DEFB    $13             ;;Exponent: $63, Bytes: 1
        DEFB    $36             ;;(+00,+00,+00)
        DEFB    $58             ;;Exponent: $68, Bytes: 2
        DEFB    $65,$66         ;;(+00,+00)
        DEFB    $9D             ;;Exponent: $6D, Bytes: 3
        DEFB    $78,$65,$40     ;;(+00)
        DEFB    $A2             ;;Exponent: $72, Bytes: 3
        DEFB    $60,$32,$C9     ;;(+00)
        DEFB    $E7             ;;Exponent: $77, Bytes: 4
        DEFB    $21,$F7,$AF,$24 ;;
        DEFB    $EB             ;;Exponent: $7B, Bytes: 4
        DEFB    $2F,$B0,$B0,$14 ;;
        DEFB    $EE             ;;Exponent: $7E, Bytes: 4
        DEFB    $7E,$BB,$94,$58 ;;
        DEFB    $F1             ;;Exponent: $81, Bytes: 4
        DEFB    $3A,$7E,$F8,$CF ;;
        DEFB    $E3             ;;get-mem-3
        DEFB    $38             ;;end-calc
I have to include those numbers in my FP equ list.
C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Re: Spectrum Disassembler 128k BASIC

Post by C.Born »

the first step is taken, its a real FP_disassembler if i may say so.
but still a LOT to do like be sure there is as few as possible variables used, by good double use
a re-number off this basic listing would be good, meaning i have to remove all the VAL"" around the gosubs,gotos and maybe even the restores ..
and then get them back since a single VAL"" saves 3 bytes and slows a bit down. that VAL sequence will need workspace for it self,meaning that it gives some space and takes some space.
it now
+ sees 128k
+ sets automatic ramtop 1k above "clear" memory. that can be lowered a bit
+ it sees 70% off all FP opcodes
+ it memorises the extra jump adresses where the FP asm may lead to.
TODO:
- double check if that adres is already passed, like jr -20 or djnz
- Pn_, restM_ and storeM_ all need a final number that is correct

Code: Select all

   3 GO TO VAL "5E3": DEF FN a(a)=PEEK a+256*PEEK (a+1)
   5 DEF FN a$(d)=CHR$ ((48+d AND d<10)+(55+d AND d>9))
   7 DEF FN b(b$)=(CODE b$-48 AND CODE b$<64)+(CODE b$-55 AND CODE b$>64)
   8 DEF FN Z$()=a$+CHR$ 23+CHR$ 6+CHR$ E+c$+CHR$ 23+CHR$ 15+CHR$ E+i$
  12 DATA "B","C","D","E","H","L","(HL)","A","Pn_","rec_M","stor_M"
  13 LET st=VAL "40": LET e=NOT PI: LET g=NOT e: LET SR=VAL "2": LET FP=E: LET rst=e: LET MX=E: LET F$=""
  15 DIM d$(VAL "8",VAL "4"): POKE VAL "23658",VAL "8"
  17 FOR j=g TO VAL "8": READ d$(j): NEXT j: READ p$,r$,s$
  40 INPUT "ADDRESS? "'k$: LET C$=k$(g): IF k$="" OR (C$<>"D" AND C$<>"H") THEN  GO TO st
  52 IF LEN k$<VAL "2" OR LEN k$> 5+(C$="D") THEN  GO TO st
  54 GO SUB VAL "1400": IF NOT z THEN  GO TO st
  55 GO SUB VAL "1300"+5*(C$="H")
  57 IF ZX THEN  INPUT "BANK 1-6:";BK: IF BK<E OR BK>VAL "6" THEN  GO TO VAL "57"
  60 LET c=e: CLS 
  75 IF ZX THEN  GO SUB VAL "5010"
  90 LET c$=""
 100 GO SUB VAL "950": GO SUB VAL "980": IF NOT FP AND F$<>"" THEN  GO SUB VAL "385"
 105 IF FP THEN  GO TO VAL "1210"
 110 IF c$="ED" THEN  GO TO VAL "525"
 120 IF c$="CB" THEN  GO TO VAL "550"
 130 IF c$="DD" THEN  GO TO VAL "600"
 140 IF c$="FD" THEN  GO TO VAL "610"
 145 IF c$<"39" AND C$>"0F" THEN  IF c$(2)="0" OR c$(2)="8" THEN  GO TO VAL "4E3"
 150 IF C$="EF" THEN  LET FP=G
 160 GO SUB VAL "1100"
 185 LET n$="": FOR j=g TO LEN i$: IF i$(j)="#" THEN  LET n$=n$+FN a$(j)
 200 NEXT j: LET l$="": IF n$="" THEN  GO TO VAL "350"
 210 GO SUB VAL "980": IF LEN n$=g THEN  LET l$=c$(LEN c$-g): GO TO VAL "270"
 230 GO SUB VAL "980"
 250 LET l$=c$(LEN c$-g TO )+c$(LEN c$-3 TO LEN c$-2)
 270 LET n=FN b(n$(g))
 280 LET i$=i$( TO n-g)+l$+(i$(n+g+(LEN n$=2) TO ) AND i$(LEN i$)<>"#")
 350 PRINT #SR;FN Z$(): IF SR<>2 THEN  PRINT FN Z$()
 360 PRINT #E;AT E,E;FP;",";RS T;" ";F$
 370 LET C=C+G: IF c=VAL "22" THEN  GO TO VAL "870"
 380 GO TO VAL "90"
 385 FOR F=G TO RST: IF F$(F TO F+3)=A$ THEN  LET FP=G
 386 IF FP THEN  LET F$=F$( TO F-G)+F$(VAL "F+4" TO ): LET RST=RST-G: RETURN 
 387 NEXT F: RETURN 
 525 GO SUB VAL "980": LET b=b-VAL "64"
 530 RESTORE VAL "2500"+10*INT VAL "b/10"
 535 GO SUB VAL "1120": GO TO VAL "170"
 550 GO SUB VAL "980": GO SUB VAL "560": GO TO VAL "185"
 560 RESTORE VAL "3E3"+10*INT VAL "b/64"
 565 LET v=INT VAL "b/8"-8*INT VAL "b/64"
 570 FOR j=e TO v: READ l$: NEXT j
 571 LET v=b+g-8*INT VAL "b/8": LET e$=d$(v)
 575 LET i$=l$+e$(g TO g+VAL "3*(v=7)"): RETURN 
 600 LET x$="IX": GO TO VAL "630"
 610 LET x$="IY"
 630 GO SUB VAL "980": IF c$(LEN c$-g TO )="CB" THEN  GO TO VAL "790"
 640 GO SUB VAL "1100"
 680 LET k=g
 690 IF k>LEN i$-g THEN  STOP 
 700 IF i$(k)="H" AND i$(k+1)="L" THEN  GO TO VAL "720"
 710 LET k=k+g: GO TO VAL "690"
 720 LET u$="": IF k<>LEN i$-g THEN  LET u$=i$(k+2 TO )
 723 LET i$=i$(g TO k-g)+x$
 725 IF b<=43 OR b=57 OR b>=225 THEN  GO TO VAL "760"
 730 GO SUB VAL "980"
 740 LET i$=i$+"+"+c$(LEN c$-g TO )
 760 LET i$=i$+u$: GO TO VAL "185"
 800 GO SUB VAL "980": GO SUB VAL "980"
 810 LET b=PEEK (a-g)
 820 GO SUB VAL "560"
 840 LET i$=i$( TO LEN i$-3)+x$+"+"+c$(5 TO 6)+i$(LEN i$)
 850 GO TO VAL "340"
 870 PRINT #e;AT G,e;"MORE? (Y/N/E) BANK:";BK: PAUSE E: LET q$=INKEY$
 875 IF q$="E" THEN  STOP 
 880 IF q$="N" THEN  GO TO st
 882 IF q$="Y" THEN  GO TO VAL "60"
 885 GO TO VAL "870"
 950 LET r=a
 951 LET a$="": LET k=INT PI
 955 LET i=INT VAL "r/(16^k)"
 960 LET a$=a$+FN a$(i)
 965 LET r=r-VAL "16^k"*i
 970 IF NOT K THEN  RETURN 
 975 LET k=k-g: GO TO VAL "955"
 980 IF a>FN A(VAL "23732") THEN  LET A=E
 982 LET B=PEEK A
 983 LET i=INT VAL "b/16"
 987 LET c$=c$+FN A$(I)+FN a$(b-16*i)
 990 LET a=a+g: RETURN 
1100 IF b>=VAL "64" THEN  GO TO VAL "1140"
1110 RESTORE VAL "2010"+10*INT VAL "b/10"
1120 FOR j=e TO b-10*INT VAL "b/10": READ i$: NEXT j
1130 RETURN 
1140 IF b<=191 THEN  GO TO VAL "1180"
1150 RESTORE VAL "2200"+10*INT VAL "(b-192)/10"
1160 FOR j=e TO b-10*INT VAL "(b-192)/10"-192: READ i$: NEXT j
1170 RETURN 
1180 RESTORE VAL "2700"+10*INT VAL "(b-64)/64"
1182 LET v=INT VAL "(b-64)/8"-8*INT VAL "(b-64)/64"
1184 FOR j=e TO v: READ l$: NEXT j
1185 LET v=b+g-64-8*INT VAL "(b-64)/8"
1186 LET e$=d$(v)
1190 LET i$=l$+e$(g TO g+VAL "3*(v=7)")
1195 IF b=VAL "118" THEN  LET i$="HALT"
1200 RETURN 
1210 RESTORE VAL "3210"+10*INT (B/8)
1220 FOR j=e TO b-8*INT VAL "b/8": READ i$: NEXT j: LET I$=C$+","+I$
1230 IF C$="00" OR C$="33" OR C$="35" THEN  GO TO VAL "4030"
1240 IF C$="34" THEN  GO SUB VAL "980": GO SUB VAL "1495"
1280 IF C$="38" THEN  LET FP=E
1290 GO TO VAL "185"
1300 LET a=VAL k$(2 TO ): RETURN 
1310 LET a=e: LET a$=k$(2 TO )
1320 FOR j=LEN A$ TO g STEP -g
1340 LET a=a+(16^(LEN A$-j))*FN b(a$(j)): NEXT j: RETURN 
1400 FOR k=2 TO LEN k$: LET z=(k$(k)>="0" AND k$(k)<="9"): IF k$(g)="H" THEN  LET z=z+(k$(k)>="A" AND k$(k)<="F")
1410 IF z THEN  NEXT k
1420 LET z=(k=LEN k$+g): RETURN 
1495 LET L$=C$(3 TO ): LET EX=4-3*(L$="32" OR L$="35" OR L$="37" OR L$="38")
1497 FOR F=G TO EX: GO SUB VAL "980": LET L$=L$+C$+("," AND F < EX): NEXT F: RETURN 
2010 DATA "NOP","LD BC,##","LD (BC),A","INC BC","INC B","DEC B","LD B,#","RLCA","EX AF,A'F'","ADD HL,BC"
2020 DATA "LD A,(BC)","DEC BC","INC C","DEC C","LD C,#","RRCA","DJNZ #","LD DE,##","LD (DE),A","INC DE"
2030 DATA "INC D","DEC D","LD D,#","RLA","JR #","ADD HL,DE","LD A,(DE)","DEC DE","INC E","DEC E"
2040 DATA "LD E,#","RRA","JR NZ,#","LD HL,##","LD (##),HL","INC HL","INC H","DEC H","LD H,#","DAA"
2050 DATA "JR Z,#","ADD HL,HL","LD HL,(##)","DEC HL","INC L","DEC L","LD L,#","CP L","JR NC,#","LD SP,##"
2060 DATA "LD (##),A","INC SP","INC (HL)","DEC (HL)","LD (HL),#","SCF","JR C,#","ADD HL,SP","LD A,(##)","DEC SP"
2070 DATA "INC A","DEC A","LD A,#","CCF"
2200 DATA "RET NZ","POP BC","JP NZ,##","JP ##","CALL NZ,##","PUSH BC","ADD A,#","RST 0000","RET Z","RET "
2210 DATA "JP Z,##","","CALL Z,##","CALL ##","ADC A,#","RST 0008,#","RET NC","POP DE","JP NC,##","OUT (#),A"
2220 DATA "CALL NC,##","PUSH DE","SUB #","RST 0010","RET C","EXX","JP C,##","IN A,(#)","CALL C,##","***"
2230 DATA "SBC A,#","RST 0018","RET PO","POP HL","JP PO,##","EX (SP),HL","CALL PO,##","PUSH HL","AND #","RST 0020"
2240 DATA "RET PE","JP (HL)","JP PE,##","EX DE,HL","CALL PE,##","","XOR #","RST 0028","RET P","POP AF"
2250 DATA "JP P,##","DI","CALL P,##","PUSH AF","OR H","RST 0030","RET M","LD SP,HL","JP M,##","EI"
2260 DATA "CALL M,##","***","CP #","RST 0038"
2500 DATA "IN B,(C)","OUT (C),B","SBC HL,BC","LD (##),BC","NEG","RET N","IM 0","LD I,A","IN C,(C)","OUT (C),C"
2510 DATA "ADC HL,BC","LD BC,(##)","","RET I","","LD R,A","IN D,(C)","OUT (C),D","SBC HL,DE","LD (##),DE"
2520 DATA "","","IM 1","LD A,I","IN E,(C)","OUT (C),E","ADC HL,DE","LD DE,(##)","",""
2530 DATA "IM 2","LD A,R","IN H,(C)","OUT (C),H","SBC HL,HL","LD HL,(##)","","","","RRD"
2540 DATA "IN L,(C)","OUT (C),L","ADC HL,HL","LD HL,(##)","","","","RLD","IN F,(C)",""
2550 DATA "SBC HL,SP","LD (##),SP","","","","","IN A,(C)","OUT (C),A","ADC HL,SP","LD SP,(##)"
2590 DATA "","","","","","","LDI","CPI","INI","OUTI"
2600 DATA "","","","","LDD","CPD","IND","OUTD","",""
2610 DATA "","","LDIR","CPIR","INIR","OTIR","","","",""
2620 DATA "LDDR","CPDR","INDR","OTDR"
2700 DATA "LD B,","LD C,","LD D,","LD E,","LD H,","LD L,","LD (HL),","LD A,"
2710 DATA "ADD A,","ADC A,","SUB ","SBC A,","AND ","XOR ","OR ","CP "
3000 DATA "RLC ","RRC ","RL ","RR ","SLA ","SRA ","","SRL "
3010 DATA "BIT 0,","BIT 1,","BIT 2,","BIT 3,","BIT 4,","BIT 5,","BIT 6,","BIT 7,"
3020 DATA "RES 0,","RES 1,","RES 2,","RES 3,","RES 4,","RES 5,","RES 6,","RES 7,"
3030 DATA "SET 0,","SET 1,","SET 2,","SET 3,","SET 4,","SET 5,","SET 6,","SET 7,"
3100 DATA "DJNZ ","JR ","JR NZ,","JR Z,","JR NC,","JR C,"
3210 DATA "jumptrue#","exchange","delete","substract","multiply","division","power","or_"
3220 DATA "n_and","n_le","n_ge","n_ne","n_gt","n_lt","n_eq","add"
3230 DATA "s_and","s_le","s_ge","s_ne","s_gt","s_lt","s_eq","s_add"
3240 DATA "val$","usr_s","read_in","negate","code","val","len","sin"
3250 DATA "cos","tan","asn","acs","atn","ln","exp","int"
3260 DATA "sqr","sgn","abs","peek","in_","usr_n","str_s","chr_s"
3270 DATA "not_","duplicate","mod_div","jump#","stk_data","djnz#","lt_z","gt-z"
3280 DATA "end_calc","get_argt","truncate","exec_B","e2fp","restack","ser06","stk0etc"
3290 DATA "stmem0","gmem0","","","","","",""
3300 DATA "","","","","","","",""
3310 DATA "","","","","","","",""
3320 DATA "","","","","","","",""
3330 DATA "","","","","","","",""
3340 DATA "","","","","","","",""
3350 DATA "","","","","","","",""
3360 DATA "","","","","","","",""
3370 DATA p$,p$,p$,p$,p$,p$,p$,p$
3380 DATA p$,p$,p$,p$,p$,p$,p$,p$
3390 DATA p$,p$,p$,p$,p$,p$,p$,p$
3400 DATA p$,p$,p$,p$,p$,p$,p$,p$
3410 DATA "stk_zero","stk_one","stk_half","stkpi2","stk_ten"
3420 DATA "","","","","","","",""
3430 DATA "","","","","","","",""
3440 DATA "","","","","","","",""
3450 DATA s$,s$,s$,s$,s$,s$,s$,s$
3460 DATA s$,s$,s$,s$,s$,s$,s$,s$
3470 DATA s$,s$,s$,s$,s$,s$,s$,s$
3480 DATA s$,s$,s$,s$,s$,s$,s$,s$
3490 DATA r$,r$,r$,r$,r$,r$,r$,r$
3500 DATA r$,r$,r$,r$,r$,r$,r$,r$
3510 DATA r$,r$,r$,r$,r$,r$,r$,r$
3520 DATA r$,r$,r$,r$,r$,r$,r$,r$
4000 RESTORE VAL "3100"
4010 FOR j=e TO INT VAL "b/8"-2: READ I$: NEXT J
4030 GO SUB VAL "980": LET q=a: LET q$=a$
4040 LET a=a-FP+b-VAL "256*(b>127)"
4050 GO SUB VAL "950": LET i$=i$+a$: IF FP THEN  LET RST=RST+G: LET F$=F$+A$
4060 LET a=q: LET a$=q$: GO TO VAL "350"
5000 LET A=FN A(VAL "23627"): CLEAR VAL "A+1024": LET A=FN A(VAL "23730")+SGN PI
5005 LET ZX=(PEEK VAL "2899"=VAL "159" OR PEEK VAL "2899"=VAL "126"): IF NOT ZX THEN  PRINT "48K ";
5006 IF ZX THEN  PRINT "128K ";: LET BK=VAL "6"
5007 PRINT "RAMTOP:";A: GO TO VAL "10"
5010 LET RM=VAL "16"+VAL "134670"(BK)
5020 POKE VAL "23388",RM: OUT VAL "32765",RM: RETURN 
9900 CLEAR : LET N$="Man52_#34"
9901 SAVE d*;N$ LINE SGN PI: VERIFY d*;n$: CAT *;n$: GO TO VAL "9995"
9990 REM Spectrum Disassembler
9991 REM S.H.Man1985
9992 REM +W.E.Thomson1986
9993 REM +J.Grimwood2004
9994 REM +C.Born2023
9995 POKE @5,VAL "255": POKE @10,NOT PI: POKE @11,NOT PI: LPRINT : LPRINT : LLIST : LPRINT 

Code: Select all

; from MACHINE CODE CALCULATOR, by Toni Baker, from ZX Computing, (September) 1986
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;Figure 1
;CODE NAME            BEFORE AFTER          CORRUPTS COMMENTS
;---- ----            ------ -----          -------- --------
;00ee jump true       x                              jump if x is true
;01   exchange        x,y    y,x
;02   delete          x
;03   subtract        x,y    x-y
;04   multiply        x,y    x*y
;05   divide          x,y    x/y
;06   power           x,y    x^y            B,M0-M3
;07   OR              x,y    x OR y
;08   n_and           x,y    x AND y
;09   n_le            x,y    x<=y                    B must equal 09
;0A   n_ge            x,y    x>=y                    B must equal 0A
;0B   n_ne            x,y    x<>y                    B must equal 0B
;0C   n_gt            x,y    x>y                     B must equal 0C
;0D   n_lt            x,y    x<y                     B must equal 0D
;0E   n_eq            x,y    x=y                     B must equal 0E
;0F   add             x,y    x+y
;10   s_and           x$,y   x$ AND y
;11   s_le            x$,y$  x$<=y$                  B must equal 11
;12   s_ge            x$,y$  x$>=y$                  B must equal 12
;13   s_ne            x$,y$  x$<>y$                  B must equal 13
;14   s_gt            x$,y$  x$>y$                   B must equal 14
;15   s_lt            x$,y$  x$<y$                   B must equal 15
;16   s_eq            x$,y$  x$=y$                   B must equal 16
;17   s_add           x$,y$  x$+y$
;18   val$            x$     VAL$ x$                 B must equal 18
;19   usr_s           x$     USR x$
;1A   read_in         x      INKEY$ #x
;1B   negate          x      -x
;1C   code            x$     CODE x$
;1D   val             x$     VAL x$                  B must equal 1D
;1E   len             x$     LEN x$
;1F   sin             x      SIN x          B,M0-M2
;20   cos             x      COS x          B,M0-M2
;21   tan             x      TAN x          B,M0-M2
;22   asn             x      ASN x          B,M0-M2
;23   acs             x      ACS x          B,M0-M2
;24   atn             x      ATN x          B,M0-M2
;25   ln              x      LN x           B,M0-M2
;26   exp             x      EXP x          B,M0-M3
;27   int             x      INT x          M0
;28   sqr             x      SQR x          B,M0-M3
;29   sgn             x      SGN x
;2A   abs             x      ABS x
;2B   peek            x      PEEK x
;2C   in              x      IN x
;2D   usr_n           x      USR x          ?
;2E   str$            x      STR$ x         M0-M5    (MEM) must equal MEMBOT
;2F   chr$            x      CHR$ x

;30   eq_z            x      x=0                     TRUE if x=0; false otherwise
;30   not             x      NOT x                   TRUE becomes fales & v.versa

;31   duplicate       x      x,x
;32   mod_div        x,y  x-y*INT(x/y), INT(x/y) M0  Will not work if x negative
;33ee jump                                           Jump by displacement ee
;34ee stk_data               x                       Byte 34 must be followed by
;     #xx,#02,                                       value x in compressed form
;     #03,#04,#05  
;35ee djnz                                           B= B-1; jump unless B=0
;36   lt_z            x      x<0                     TRUE if x<0; FALSE otherwise
;37   gt_z            x      x>0                     TRUE if x>0; FALSE otherwise
;38   end_calc                                       Switch off calculator
;39   get_argt        x      2*ASN SIN x/PI M0       See Figure 3 [MCCALC3.GIF]
;3A   truncate        x      SGN x*INT ABS x
;3B   execute B                                      Execute calc.instr. in B reg
;3C   e_to_fp         x      ?                       Doesn't work because of bug

;"e to fp" is completely and utterly useless, due to a bug even more stupid than the one in "read-in". Its purpose is to calculate X*10^A,where X is the number at the top of the calculator stack, and A is the ordinary machine code A register (which may contain either a positive or a negative number). The problem is that when RST 28, or any of the calculator instructions, is executed, the A register is corrupted, making it completely impossible to use this function! (Note: You can however use CALL 2D4F to use this subroutine from machine code).


;3D   restack         x      x                       Restack floating point form
;8n   series n        x      Pn(x)          B,M0-M2  Evaluate Tchebyshev p'nomial
;9n   series n+10h    x      Pn+10h(x)      B,M0-M2  (see Part 5 of this series)
;A0   const_zero             0
;A1   const_one              1
;A2   const_half             0.5
;A3   const_pi/2             1.5707963269
;A4   const_ten              10
;Cn   store_Mn        x      x                       Store x in memory n (M6-M1F
;Dn   store_M(n+10h)  x      x                       not poss. if (MEM)=MEMBOT)
;En   recall_Mn              Mn                      M6 to M1F not possible
;Fn   recall_M(n+10h)        M(n+10h)                if (MEM)=MEMBOT)
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

;EQU list for the regular Floating point Calculator
;This calculator is invoked with command
;          RST  #28                    ;  FP_CALC
; Followed by the right code sequence for calculations.
; RST #28 uses a jumptable for the 66(#42) subroutines which are
; calculation operations:

; sysvar BREG is used for counting by the CALCULATOR
BREG equ  0x5c67 ; 1 byte at 23655 

;table of constants (rom address)
FP_CALC      EQU  #28               ; Restart call to FP calculator(mode)
STACK_A      EQU  #2d28             ; preload stack with value reg A, Integers Between 0 and +255d
FP_TO_A      EQU  #2dd5             ; Load A with float point value

STACK_BC     equ  #2D2B             ;Integers Between 0 and +65535d
FP_TO_BC     equ  #2DA2             ;BC= required factorial

STACK_AEDCB  equ  #2AB6
STK_STORE    equ  STACK_AEDCB       ; ROM name=STK_STORE
FP_TO_AEDCB  equ  #2BF1
PRINT_FP     equ  #2DE3
STACK_NUM    equ  #33B4             ; move 5 bytes to 'stkend'
e_to_fp2     equ  #2D4F             ; the DIRECT use off the bugged calculator call  ; eg  rst#28,(..),end_calc : ld a,n : call e_to_fp2 : rst#28, (..),end_calc

;table with values in ROM
rom_stk_zero     EQU  #32C5             ;3b=00 b0 00             zero
rom_stk_one      EQU  #32C8             ;4b=40 b0 00 01           one
rom_stk_half     EQU  #32CC             ;2b=30 00               a half
rom_stk_pi_2     EQU  #32CE             ;5b=f1 49 0f da a2 =half of PI
rom_stk_ten      EQU  #32D3             ;4b=40 b0 00 0a           ten

;table off addresses at ROM address #32d7
;               IY=#32D7  or 13015 decimal
fpc_table     equ  #32D7             ;#32D7  Floating Point Calculator table


;name         equ  IY-index+equ       HEX ROM Entry address
jump_true     EQU  #00               ;#368f
exchange      EQU  #01               ;#343c
delete        EQU  #02               ;#33a1
subtract      EQU  #03               ;#300f
multiply      EQU  #04               ;#30ca
division      EQU  #05               ;#31af
to_power      EQU  #06               ;#3851
or_           EQU  #07               ;#351b

no_e_no       EQU  #08               ;#3524
no_l_eql      EQU  #09               ;#353b
no_gr_eq      EQU  #0A               ;#353b
nos_neql      EQU  #0B               ;#353b
no_grtr       EQU  #0C               ;#353b
no_less       EQU  #0D               ;#353b
nos_eql       EQU  #0E               ;#353b
addition      EQU  #0F               ;#3014

str_e_no      EQU  #10               ;#352d
str_l_eql     EQU  #11               ;#353b
str_gr_eq     EQU  #12               ;#353b
strs_neql     EQU  #13               ;#353b
str_grtr      EQU  #14               ;#353b
str_less      EQU  #15               ;#353b
strs_eql      EQU  #16               ;#353b
strs_add      EQU  #17               ;#359c

vals          EQU  #18               ;#35de
usr_s         EQU  #19               ;#34bc
read_in       EQU  #1A               ;#3645
negate        EQU  #1B               ;#346e
code          EQU  #1C               ;#3669
val           EQU  #1D               ;#35de
len           EQU  #1E               ;#3674
sin           EQU  #1F               ;#37b5

cos           EQU  #20               ;#37aa
tan           EQU  #21               ;#37da
asn           EQU  #22               ;#3833
acs           EQU  #23               ;#3843
atn           EQU  #24               ;#37e2
ln            EQU  #25               ;#3713
exp           EQU  #26               ;#36c4
int           EQU  #27               ;#36af

sqr           EQU  #28               ;#384a
sgn           EQU  #29               ;#3492
abs           EQU  #2A               ;#346a
peek          EQU  #2B               ;#34ac
in_           EQU  #2C               ;#34a5
usr_no        EQU  #2D               ;#34b3
str_s         EQU  #2E               ;#361f
chrs          EQU  #2F               ;#35c9

not_          EQU  #30               ;#3501
duplicate     EQU  #31               ;#33c0
n_mod_m       EQU  #32               ;#36a0
jump          EQU  #33               ;#3686
stk_data      EQU  #34               ;#33c6
dec_jr_nz     EQU  #35               ;#367a
less_0        EQU  #36               ;#3506
greater_0     EQU  #37               ;#34f9

end_calc      EQU  #38               ;#369b  !!!  END of RST #28   
get_argt      EQU  #39               ;#3783
truncate      EQU  #3A               ;#3214
exec_b        EQU  #3B
fp_calc_2     EQU  #3B               ;#33a2
e_to_fp       EQU  #3C               ;#2d4f
re_stack      EQU  #3D               ;#3297
series06      EQU  #3E               ;#3449 #3e,#86 #3e,#88 #3e,#8c series06, series08 & series0C >> literals 86, 88 & 8C
stk_zero_etc  EQU  #3F               ;#341B stk_zero,stk_one,etc              literals  #A0 to #A4

st_mem_0_etc  EQU #40             ;#342D
;st_mem_0,st_mem_1,etc             literals #C0 to #C5

get_mem_0_etc EQU #41             ;#340F
;get_mem_0,get_mem_1,etc           literals #E0 to #E5

;8n   series n        x      Pn(x)          B,M0-M2  Evaluate Tchebyshev p'nomial
;9n   series n+10h    x      Pn+10h(x)      B,M0-M2  (see Part 5 of this series)
Pn_00 equ #80
Pn_01 equ #81
Pn_02 equ #82
Pn_03 equ #83
Pn_04 equ #84
Pn_05 equ #85
Pn_06 equ #86
Pn_07 equ #87
Pn_08 equ #88
Pn_09 equ #89
Pn_0A equ #8A
Pn_0B equ #8B
Pn_0C equ #8C
Pn_0D equ #8D
Pn_0E equ #8E
Pn_0F equ #8F

Pn_10 equ #90
Pn_11 equ #91
Pn_12 equ #92
Pn_13 equ #93
Pn_14 equ #94
Pn_15 equ #95
Pn_16 equ #96
Pn_17 equ #97
Pn_18 equ #98
Pn_19 equ #99
Pn_1A equ #9A
Pn_1B equ #9B
Pn_1C equ #9C
Pn_1D equ #9D
Pn_1E equ #9E
Pn_1F equ #9F


stk_zero      EQU    #A0 ;              0                stack the number zero
const_zero    EQU    stk_zero
stk_one       EQU    #A1 ;              1                stack the number one
const_one     EQU    stk_one
stk_half      EQU    #A2 ;              0.5              stack the number one half
const_half    EQU    stk_half
stk_pi_2      EQU    #A3 ;  1.5707963269   PI/2             stack the number half of PI
const_pi_2    EQU    stk_pi_2   
stk_ten       EQU    #A4 ;              10d              stack the number ten
const_ten     EQU    stk_ten 


store_M0   EQU    #C0 ;       x      x                store in memory zero
store_M1   EQU    #C1 ;       x      x                store in memory one
store_M2   EQU    #C2 ;       x      x                store in memory two
store_M3   EQU    #C3 ;       x      x                store in memory three
store_M4   EQU    #C4 ;       x      x                store in memory four
store_M5   EQU    #C5 ;       x      x                store in memory five
;after SETTING MEMORY LOCATION BESIDE system variable area
store_M6   EQU    #C6 ;       x      x                store in memory
store_M7   EQU    #C7 ;       x      x                store in memory
store_M8   EQU    #C8 ;       x      x                store in memory
store_M9   EQU    #C9 ;       x      x                store in memory
store_MA   EQU    #CA ;       x      x                store in memory
store_MB   EQU    #CB ;       x      x                store in memory
store_MC   EQU    #CC ;       x      x                store in memory
store_MD   EQU    #CD ;       x      x                store in memory
store_ME   EQU    #CE ;       x      x                store in memory
store_MF   EQU    #CF ;       x      x                store in memory
store_M10  EQU    #D0 ;       x      x                store in memory
store_M11  EQU    #D1 ;       x      x                store in memory
store_M12  EQU    #D2 ;       x      x                store in memory
store_M13  EQU    #D3 ;       x      x                store in memory
store_M14  EQU    #D4 ;       x      x                store in memory
store_M15  EQU    #D5 ;       x      x                store in memory
store_M16  EQU    #D6 ;       x      x                store in memory
store_M17  EQU    #D7 ;       x      x                store in memory
store_M18  EQU    #D8 ;       x      x                store in memory
store_M19  EQU    #D9 ;       x      x                store in memory
store_M1A  EQU    #DA ;       x      x                store in memory
store_M1B  EQU    #DB ;       x      x                store in memory
store_M1C  EQU    #DC ;       x      x                store in memory
store_M1D  EQU    #DD ;       x      x                store in memory
store_M1E  EQU    #DE ;       x      x                store in memory
store_M1F  EQU    #DF ;       x      x                store in memory


recall_M0  EQU    #E0 ;              M0               recall from memory zero
recall_M1  EQU    #E1 ;              M1               recall from memory one
recall_M2  EQU    #E2 ;              M2               recall from memory two
recall_M3  EQU    #E3 ;              M3               recall from memory three
recall_M4  EQU    #E4 ;              M4               recall from memory four
recall_M5  EQU    #E5 ;              M5               recall from memory five
;after SETTING MEMORY LOCATION BESIDE system variable area
recall_M6   EQU    #E6 ;       x      x                store in memory
recall_M7   EQU    #E7 ;       x      x                store in memory
recall_M8   EQU    #E8 ;       x      x                store in memory
recall_M9   EQU    #E9 ;       x      x                store in memory
recall_MA   EQU    #EA ;       x      x                store in memory
recall_MB   EQU    #EB ;       x      x                store in memory
recall_MC   EQU    #EC ;       x      x                store in memory
recall_MD   EQU    #ED ;       x      x                store in memory
recall_ME   EQU    #EE ;       x      x                store in memory
recall_MF   EQU    #EF ;       x      x                store in memory
recall_M10  EQU    #F0 ;       x      x                store in memory
recall_M11  EQU    #F1 ;       x      x                store in memory
recall_M12  EQU    #F2 ;       x      x                store in memory
recall_M13  EQU    #F3 ;       x      x                store in memory
recall_M14  EQU    #F4 ;       x      x                store in memory
recall_M15  EQU    #F5 ;       x      x                store in memory
recall_M16  EQU    #F6 ;       x      x                store in memory
recall_M17  EQU    #F7 ;       x      x                store in memory
recall_M18  EQU    #F8 ;       x      x                store in memory
recall_M19  EQU    #F9 ;       x      x                store in memory
recall_M1A  EQU    #FA ;       x      x                store in memory
recall_M1B  EQU    #FB ;       x      x                store in memory
recall_M1C  EQU    #FC ;       x      x                store in memory
recall_M1D  EQU    #FD ;       x      x                store in memory
recall_M1E  EQU    #FE ;       x      x                store in memory
recall_M1F  EQU    #FF ;       x      x                store in memory

;end off jumptable

C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Re: Spectrum Disassembler 128k BASIC

Post by C.Born »

I found a bug that not even Jimmy marked.
its "OR H" which obvious has to be "OR #"

2250 DATA "JP P,##","DI","CALL P,##","PUSH AF","OR H","RST 0030","RET M","LD SP,HL","JP M,##","EI"

2250 DATA "JP P,##","DI","CALL P,##","PUSH AF","OR #","RST 0030","RET M","LD SP,HL","JP M,##","EI"

the RST 0028 bug was marked withINV VIDEO markers, by Jimmy, but not corrected.
I found those markers only when i started the disas in 48k since in 128k it only flashes trough the screen if you scroll.
they are disposed by the 128k editor.

i wonder what the two "***" markers do
2260 DATA "CALL M,##","***","CP #","RST 0038"

hmm, ok, i see it while i write and check my z80boekje
its the FD command!
maybe an empty "" will do saving another 3 bytes
C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Re: Spectrum Disassembler 128k BASIC

Post by C.Born »

99% aint 100% yet

WIP

i miss a thinghie in FP=on (bigger then 1)
then
code #34 has multiple answers
shortened 5 digit numbers off 2 only or 3 only?
and it keeps passing an C$ like #38 (after #34, not regular) while putting tho much at the other side
its ABOVE 32768 now! :mrgreen:

so tester needed!!plz.

Code: Select all


  10 GO TO 9020: DEF FN a(a)=PEEK a+256*PEEK (a+1)
  20 DEF FN a$(d)=CHR$ ((48+d AND d<10)+(55+d AND d>9))
  30 DEF FN b(b$)=(CODE b$-48 AND CODE b$<64)+(CODE b$-55 AND CODE b$>64)
  40 DEF FN Z$()=a$+CHR$ 23+CHR$ 5+CHR$ E+c$+CHR$ 23+CHR$ 15+CHR$ E+i$

  50 DATA "B","C","D","E","H","L","(HL)","A","Pn_","get_M","stor_M"
  60 LET st=VAL "40": LET e=NOT PI: LET g=NOT e: LET FP=E: LET rst=e: LET MX=E: LET F$=""
  70 LET SR=VAL "2": DIM d$(VAL "8",VAL "4"): POKE VAL "23658",VAL "8"
  80 FOR j=g TO VAL "8": READ d$(j): NEXT j: READ p$,g$,s$

  90 GO SUB 9580

 100 CLS 
 110 LET c=e: POKE VAL "23692",VAL "-1"
 120 LET c$="": LET X$=""
 130 GO SUB 670: GO SUB 740: IF RST AND F$<>"" THEN  GO SUB 330
 140 IF FP THEN  GO TO 950
 150 IF c$="ED" THEN  GO TO 360
 160 IF c$="CB" THEN  GO TO 390
 170 IF C$="DD" THEN  LET x$="IX": GO TO 450
 180 IF C$="FD" THEN  LET x$="IY": GO TO 450
 191 IF C$="10" OR C$="18" OR C$="20" OR C$="28" OR C$="30" OR C$="38" THEN  GO TO 391
 200 IF C$="EF" THEN  LET FP=sfp
 210 GO SUB 790
 220 LET n$="": FOR j=g TO LEN i$: IF i$(j)="#" THEN  LET n$=n$+FN a$(j)
 230 NEXT j: LET l$="": IF n$="" THEN  GO TO 290
 240 GO SUB 740: IF LEN n$=g THEN  LET l$=c$(LEN c$-g TO ): GO TO 270
 250 GO SUB 740
 260 LET l$=c$(LEN c$-g TO )+c$(LEN c$-3 TO LEN c$-2)
 270 LET n=FN b(n$(g))
 280 LET i$=i$( TO n-g)+l$+(i$(n+g+(LEN n$=2) TO ) AND i$(LEN i$)<>"#")
 290 PRINT FN Z$(): IF SR<>2 THEN  PRINT #SR;FN Z$()
 300 PRINT #E;AT E,E;"FP"+STR$ FP+":" AND FP;(STR$ RST AND RST);":";F$;TAB 31;
 310 LET C=C+G: IF C=VAL "22" OR INKEY$<>"" THEN  GO TO 610
 320 GO TO 120

 330 LET Z=0: FOR F=G TO RST: IF F$(F TO F+3)=A$ THEN  LET Z=G
 340 IF Z THEN  LET F$=F$( TO F-G)+F$(VAL "F+4" TO ): LET F=RST: LET FP=FP+NOT FP: LET RST=RST-G
 350 NEXT F: RETURN 

 360 GO SUB 740: LET b=b-VAL "64"
 370 RESTORE 1270+10*INT VAL "b/10"
 380 GO SUB 810: GO TO 220

 390 GO SUB 740: GO SUB 400: GO TO 220

 391 RESTORE 1430: FOR j=e TO INT VAL "b/8"-2: READ I$: NEXT J
 392 GO SUB 740: LET q=a: LET q$=a$
 393 LET a=a-SGN FP+b-VAL "256*(b>127)"
 394 GO SUB 670: LET i$=i$+a$: IF FP THEN  LET RST=RST+G: LET F$=F$+A$
 395 LET a=q: LET a$=q$: GO TO 290

 400 RESTORE 1390+10*INT VAL "b/64"
 410 LET v=INT VAL "b/8"-8*INT VAL "b/64"
 420 FOR j=e TO v: READ l$: NEXT j
 430 LET v=b+g-8*INT VAL "b/8": LET e$=d$(v)
 440 LET i$=l$+e$(g TO g+VAL "3*(v=7)"): RETURN 

 450 GO SUB 740: IF c$(LEN c$-g TO )="CB" THEN  GO TO 560
 460 GO SUB 790: LET k=g
 470 IF k>LEN i$-g THEN  PRINT  INVERSE G;C$;"_";I$;":";LEN I$;":";K' INVERSE E;"ERROR?": GO TO 610
 480 IF i$(k)="H" AND i$(k+1)="L" THEN  GO TO 500
 490 LET k=k+g: GO TO 470

 500 LET u$="": IF k<>LEN i$-g THEN  LET u$=i$(k+2 TO )
 510 LET i$=i$(g TO k-g)+x$
 520 IF b<=43 OR b=57 OR b>=225 THEN  GO TO 550
 530 GO SUB 740
 540 LET i$=i$+"+"+c$(LEN c$-g TO )
 550 LET i$=i$+u$: GO TO 220

 560 GO SUB 740: GO SUB 740
 570 LET b=PEEK (a-g)
 580 GO SUB 400
 590 LET i$=i$( TO LEN i$-3)+x$+"+"+c$(5 TO 6)+i$(LEN i$)
 600 GO TO 290

 610 IF INKEY$="" THEN  GO TO 110
 620 PRINT #e;AT G,e;"MORE? (Y/N/E) ";("BANK:"+STR$ BK AND ZX): PAUSE g: LET q$=INKEY$
 630 IF q$="E" THEN  STOP 
 640 IF q$="N" THEN  GO TO st
 650 IF q$="Y" THEN  GO TO 100
 660 GO TO 610

 670 LET r=a
 680 LET a$="": LET k=INT PI
 690 LET i=INT VAL "r/(16^k)"
 700 LET a$=a$+FN a$(i)
 710 LET r=r-VAL "16^k"*i
 720 IF NOT K THEN  RETURN 
 730 LET k=k-g: GO TO 690

 740 IF a>FN A(VAL "23732") THEN  LET A=E
 750 LET B=PEEK A
 760 LET i=INT VAL "b/16"
 770 LET c$=c$+FN A$(I)+FN a$(b-16*i)
 780 LET a=a+g: RETURN 

 790 IF b>=VAL "64" THEN  GO TO 830
 800 RESTORE 1130+10*INT VAL "b/10"
 810 FOR j=e TO b-10*INT VAL "b/10": READ i$: NEXT j
 820 RETURN 

 830 IF b<=191 THEN  GO TO 870
 840 RESTORE 1200+10*INT VAL "(b-192)/10"
 850 FOR j=e TO b-10*INT VAL "(b-192)/10"-192: READ i$: NEXT j
 860 RETURN 

 870 RESTORE 1370+10*INT VAL "(b-64)/64"
 880 LET v=INT VAL "(b-64)/8"-8*INT VAL "(b-64)/64"
 890 FOR j=e TO v: READ l$: NEXT j
 900 LET v=b+g-64-8*INT VAL "(b-64)/8"
 910 LET e$=d$(v)
 920 LET i$=l$+e$(g TO g+VAL "3*(v=7)")
 930 IF b=VAL "118" THEN  LET i$="HALT"
 940 RETURN 

 950 LET L$="": IF FP>G THEN  GO TO 1020
 952 RESTORE 1440+10*INT VAL "B/8"
 960 FOR j=e TO b-8*INT VAL "b/8": READ i$: NEXT j
 965 LET R$="": LET I$=C$+","+I$
 970 IF C$="00" OR C$="33" OR C$="35" THEN  GO TO 392
 991 LET FP=FP+(C$="34" OR (C$>="E0" AND C$<="FF"))+12*(C$>="80" AND C$<="9F")
 995 IF fp>g THEN  LET r$=c$
1000 IF fp=1 AND C$="38" THEN  LET FP=E
1009 PRINT A$; INK 1;".";I$; INK 2;"_";R$; INK 3;"_";C$; INK 4;",";L$
1010 GO TO 220

1020 LET I$="real:": GO SUB 670
1030 REM GO SUB 740: IF C$<>"" AND C$<>"" THEN
1090 LET RE=5
1095 IF R$="34" THEN  GO SUB 740: LET L$=C$: LET RE=5-3*(L$="32" OR L$="35" OR L$="37" OR L$="38")
1098 IF FP>G THEN  GO SUB 1120: LET FP=FP-G
1110 LET I$=I$+L$: GO TO 1009

1120 LET C$="": FOR F=G TO RE: GO SUB 740: NEXT F: LET L$=L$+C$: RETURN 

1130 DATA "NOP","LD BC,##","LD (BC),A","INC BC","INC B","DEC B","LD B,#","RLCA","EX AF,A'F'","ADD HL,BC"
1140 DATA "LD A,(BC)","DEC BC","INC C","DEC C","LD C,#","RRCA","DJNZ #","LD DE,##","LD (DE),A","INC DE"
1150 DATA "INC D","DEC D","LD D,#","RLA","JR #","ADD HL,DE","LD A,(DE)","DEC DE","INC E","DEC E"
1160 DATA "LD E,#","RRA","JR NZ,#","LD HL,##","LD (##),HL","INC HL","INC H","DEC H","LD H,#","DAA"
1170 DATA "JR Z,#","ADD HL,HL","LD HL,(##)","DEC HL","INC L","DEC L","LD L,#","CP L","JR NC,#","LD SP,##"
1180 DATA "LD (##),A","INC SP","INC (HL)","DEC (HL)","LD (HL),#","SCF","JR C,#","ADD HL,SP","LD A,(##)","DEC SP"
1190 DATA "INC A","DEC A","LD A,#","CCF"

1200 DATA "RET NZ","POP BC","JP NZ,##","JP ##","CALL NZ,##","PUSH BC","ADD A,#","RST0","RET Z","RET "
1210 DATA "JP Z,##","","CALL Z,##","CALL ##","ADC A,#","RST8","RET NC","POP DE","JP NC,##","OUT (#),A"
1220 DATA "CALL NC,##","PUSH DE","SUB #","RST10","RET C","EXX","JP C,##","IN A,(#)","CALL C,##",""
1230 DATA "SBC A,#","RST18","RET PO","POP HL","JP PO,##","EX (SP),HL","CALL PO,##","PUSH HL","AND #","RST20"
1240 DATA "RET PE","JP (HL)","JP PE,##","EX DE,HL","CALL PE,##","","XOR #","RST28","RET P","POP AF"
1250 DATA "JP P,##","DI","CALL P,##","PUSH AF","OR #","RST30","RET M","LD SP,HL","JP M,##","EI"
1260 DATA "CALL M,##","","CP #","RST38"
1270 DATA "IN B,(C)","OUT (C),B","SBC HL,BC","LD (##),BC","NEG","RET N","IM 0","LD I,A","IN C,(C)","OUT (C),C"
1280 DATA "ADC HL,BC","LD BC,(##)","","RET I","","LD R,A","IN D,(C)","OUT (C),D","SBC HL,DE","LD (##),DE"
1290 DATA "","","IM 1","LD A,I","IN E,(C)","OUT (C),E","ADC HL,DE","LD DE,(##)","",""
1300 DATA "IM 2","LD A,R","IN H,(C)","OUT (C),H","SBC HL,HL","LD HL,(##)","","","","RRD"
1310 DATA "IN L,(C)","OUT (C),L","ADC HL,HL","LD HL,(##)","","","","RLD","IN F,(C)",""
1320 DATA "SBC HL,SP","LD (##),SP","","","","","IN A,(C)","OUT (C),A","ADC HL,SP","LD SP,(##)"
1330 DATA "","","","","","","LDI","CPI","INI","OUTI"
1340 DATA "","","","","LDD","CPD","IND","OUTD","",""
1350 DATA "","","LDIR","CPIR","INIR","OTIR","","","",""
1360 DATA "LDDR","CPDR","INDR","OTDR"

1370 DATA "LD B,","LD C,","LD D,","LD E,","LD H,","LD L,","LD (HL),","LD A,"
1380 DATA "ADD A,","ADC A,","SUB ","SBC A,","AND ","XOR ","OR ","CP "

1390 DATA "RLC ","RRC ","RL ","RR ","SLA ","SRA ","","SRL "
1400 DATA "BIT 0,","BIT 1,","BIT 2,","BIT 3,","BIT 4,","BIT 5,","BIT 6,","BIT 7,"
1410 DATA "RES 0,","RES 1,","RES 2,","RES 3,","RES 4,","RES 5,","RES 6,","RES 7,"
1420 DATA "SET 0,","SET 1,","SET 2,","SET 3,","SET 4,","SET 5,","SET 6,","SET 7,"

1430 DATA "DJNZ ","JR ","JR NZ,","JR Z,","JR NC,","JR C,"

1440 DATA "jumptrue#","exchange","delete","substract","multiply","division","power","or_"
1450 DATA "n_and","n_le","n_ge","n_ne","n_gt","n_lt","n_eq","add"
1460 DATA "s_and","s_le","s_ge","s_ne","s_gt","s_lt","s_eq","s_add"
1470 DATA "val$","usr_s","read_in","negate","code","val","len","sin"
1480 DATA "cos","tan","asn","acs","atn","ln","exp","int"
1490 DATA "sqr","sgn","abs","peek","in_","usr_n","str_s","chr_s"
1500 DATA "not_","duplicate","mod_div","jump#","stk_data","djnz#","lt_z","gt-z"
1510 DATA "end_calc","get_argt","truncate","exec_B","e2fp","restack","ser06","stk0etc"
1520 DATA "stmem0","gmem0","","","","","",""
1530 DATA "","","","","","","",""
1540 DATA "","","","","","","",""
1550 DATA "","","","","","","",""
1560 DATA "","","","","","","",""
1570 DATA "","","","","","","",""
1580 DATA "","","","","","","",""
1590 DATA "","","","","","","",""
1600 DATA p$,p$,p$,p$,p$,p$,p$,p$
1610 DATA p$,p$,p$,p$,p$,p$,p$,p$
1620 DATA p$,p$,p$,p$,p$,p$,p$,p$
1630 DATA p$,p$,p$,p$,p$,p$,p$,p$
1640 DATA "stk_zero","stk_one","stk_half","stkpi2","stk_ten","","",""
1650 DATA "","","","","","","",""
1660 DATA "","","","","","","",""
1670 DATA "","","","","","","",""
1680 DATA s$,s$,s$,s$,s$,s$,s$,s$
1690 DATA s$,s$,s$,s$,s$,s$,s$,s$
1700 DATA s$,s$,s$,s$,s$,s$,s$,s$
1710 DATA s$,s$,s$,s$,s$,s$,s$,s$
1720 DATA g$,g$,g$,g$,g$,g$,g$,g$
1730 DATA g$,g$,g$,g$,g$,g$,g$,g$
1740 DATA g$,g$,g$,g$,g$,g$,g$,g$
1750 DATA g$,g$,g$,g$,g$,g$,g$,g$


9000 LET RM=VAL "16"+VAL "134670"(BK)
9010 POKE VAL "23388",RM: OUT VAL "32765",RM: RETURN 
9020 LET A=FN A(VAL "23627"): CLEAR VAL "A+1024": LET A=FN A(VAL "23730")+SGN PI
9030 LET ZX=(PEEK VAL "2899"=VAL "159" OR PEEK VAL "2899"=VAL "126"): IF NOT ZX THEN  PRINT "48K ";
9040 LET BK=6*ZX: IF ZX THEN  PRINT "128K ";
9050 PRINT "RAMTOP:";A: GO TO 20
9580 INPUT "START ADDRESS? "'k$: LET C$=k$(g): IF k$="" OR (C$<>"D" AND C$<>"H") THEN  GO TO 9580
9590 IF LEN k$<VAL "2" OR LEN k$>5+(C$="D") THEN  GO TO 9580
9600 GO SUB 9760: IF NOT z THEN  GO TO 9580
9610 GO SUB 9720+5*(C$="H")
9620 IF ZX THEN  INPUT "BANK 1-6:";BK: IF BK<E OR BK>VAL "6" THEN  GO TO 9620
9630 IF ZX THEN  GO SUB 9E3: PRINT "BANK ";BK;" SET"
9640 CLS : CAT *!
9641 INPUT "filenaam";n$: IF N$<>"" THEN  LET N$=(N$+"          ")( TO 10)
9650 IF N$<>"" THEN  LOAD d*;N$CODE A
9655 LET sfp=1
9660 RETURN 

9720 LET a=VAL k$(2 TO ): RETURN 
9730 LET a=e: LET a$=k$(2 TO )
9740 FOR j=LEN A$ TO g STEP -g
9750 LET a=a+(16^(LEN A$-j))*FN b(a$(j)): NEXT j: RETURN 

9760 FOR k=2 TO LEN k$: LET z=(k$(k)>="0" AND k$(k)<="9"): IF k$(g)="H" THEN  LET z=z+(k$(k)>="A" AND k$(k)<="F")
9770 IF z THEN  NEXT k
9780 LET z=(k=LEN k$+g): RETURN 

9900 CLEAR : LET n$="SpManFP19"
9910 SAVE d*;n$ LINE NOT PI: CAT *;N$

9990 REM Spectrum Disassembler
9991 REM S.H.Man1985
9992 REM +W.E.Thomson1986
9993 REM +J.Grimwood2004
9994 REM +C.Born2023

9995 POKE @5,VAL "255": POKE @10,NOT PI: POKE @11,NOT PI: LPRINT : LPRINT : LLIST : LPRINT 


its very well possible to integrate the extra lines off Jimmy and then save some memory
maybe an DEF FN
C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Re: Spectrum Disassembler 128k BASIC

Post by C.Born »

on the ROM H36c4, is seems to work now
but its NOT YET complete and actually to big

Code: Select all


  10 GO TO 9020: DEF FN a(a)=PEEK a+256*PEEK (a+1)
  20 DEF FN a$(d)=CHR$ ((48+d AND d<10)+(55+d AND d>9))
  30 DEF FN b(b$)=(CODE b$-48 AND CODE b$<64)+(CODE b$-55 AND CODE b$>64)
  40 DEF FN Z$()=a$+CHR$ 23+CHR$ 5+CHR$ E+c$+CHR$ 23+CHR$ 16+CHR$ E+i$

  50 DATA "B","C","D","E","H","L","(HL)","A","Pn_","get_M","stor_M"
  51 LET DEBUG=0
  60 LET st=VAL "40": LET e=NOT PI: LET g=NOT e: LET FP=E: LET rst=e: LET MX=E: LET F$=""
  70 LET SR=VAL "2": DIM d$(VAL "8",VAL "4"): POKE VAL "23658",VAL "8"
  80 FOR j=g TO VAL "8": READ d$(j): NEXT j: READ p$,g$,s$

  90 GO SUB 9580

 100 CLS 

 110 LET c=e: POKE VAL "23692",VAL "-1"
 120 LET c$="": LET X$=""
 130 GO SUB 670: GO SUB 740: IF RST AND F$<>"" THEN  GO SUB 330
 140 IF FP THEN  GO TO 950
 150 IF c$="ED" THEN  GO TO 360
 160 IF c$="CB" THEN  GO SUB 740: GO SUB 400: GO TO 220
 170 IF C$="DD" THEN  LET x$="IX": GO TO 450
 180 IF C$="FD" THEN  LET x$="IY": GO TO 450
 200 IF C$="EF" THEN  LET FP=sfp
 210 GO SUB 790

 220 LET n$="": FOR j=g TO LEN i$: IF i$(j)="#" THEN  LET n$=n$+FN a$(j)
 231 NEXT j: IF n$="" THEN  GO TO 290
 235 LET L$=C$: GO SUB 740: IF L$="10" OR L$="18" OR L$="20" OR L$="28" OR L$="30" OR L$="38" OR (FP AND L$="00" OR L$="33" OR L$="35") THEN  GO SUB 393: GO TO 270
 240 IF LEN n$=g THEN  LET l$=c$(LEN c$-g TO ): GO TO 270
 250 GO SUB 740
 260 LET l$=c$(LEN c$-g TO )+c$(LEN c$-3 TO LEN c$-2)

 270 LET n=FN b(n$(g))
 280 LET i$=i$( TO n-g)+l$+(i$(n+g+(LEN n$=2) TO ) AND i$(LEN i$)<>"#")

 290 PRINT FN Z$(): IF SR<>2 THEN  PRINT #SR;FN Z$()
 300 PRINT #E;AT E,E;"FP"+STR$ FP+":" AND FP;STR$ RST+":" AND RST;F$;TAB 31;
 310 LET C=C+G: IF C=VAL "22" OR INKEY$<>"" THEN  GO TO 610
 320 GO TO 120

 330 LET Z=0: FOR F=G TO RST: IF F$(F TO F+3)=A$ THEN  LET Z=G
 340 IF Z THEN  LET F$=F$( TO F-G)+F$(VAL "F+4" TO ): LET F=RST: LET FP=FP+NOT FP: LET RST=RST-G
 350 NEXT F: RETURN 

 360 GO SUB 740: LET b=b-VAL "64"
 370 RESTORE 1270+10*INT VAL "b/10"
 380 GO SUB 810: GO TO 220

 393 LET Q$=A$: LET v=a-SGN FP+b-VAL "256*(b>127)"
 394 LET L=V: GO SUB 680: LET L$=a$: LET A$=Q$
 397 IF FP AND L>A THEN  LET RST=RST+G: LET F$=F$+L$
 398 RETURN 

 400 RESTORE 1390+10*INT VAL "b/64"
 410 LET v=INT VAL "b/8"-8*INT VAL "b/64"
 420 FOR j=e TO v: READ l$: NEXT j
 430 LET v=1+b-8*INT VAL "b/8": LET E$=D$(V)
 440 LET i$=l$+E$(g TO g+VAL "3*(v=7)"): RETURN 

 450 GO SUB 740: IF c$(LEN c$-g TO )="CB" THEN  GO TO 560
 460 GO SUB 790: LET k=g
 470 IF k>LEN i$-g THEN  PRINT  INVERSE G;C$;"_";I$;":";LEN I$;":";K' INVERSE E;"ERROR?": GO TO 610
 480 IF i$(k)="H" AND i$(k+1)="L" THEN  GO TO 500
 490 LET k=k+g: GO TO 470

 500 LET u$="": IF k<>LEN i$-g THEN  LET u$=i$(k+2 TO )
 510 LET i$=i$(g TO k-g)+x$
 520 IF b<=43 OR b=57 OR b>=225 THEN  GO TO 550
 530 GO SUB 740
 540 LET i$=i$+"+"+c$(LEN c$-g TO )
 550 LET i$=i$+u$: GO TO 220

 560 GO SUB 740: GO SUB 740
 570 LET b=PEEK (a-g)
 580 GO SUB 400
 590 LET i$=i$( TO LEN i$-3)+x$+"+"+c$(5 TO 6)+i$(LEN i$)
 600 GO TO 290

 610 IF INKEY$="" THEN  GO TO 110
 620 PRINT #e;AT G,e;"MORE? (Y/N/E) ";("BANK:"+STR$ BK AND ZX): PAUSE g: LET q$=INKEY$
 630 IF q$="E" THEN  STOP 
 640 IF q$="N" THEN  GO TO st
 650 IF q$="Y" THEN  GO TO 100
 660 GO TO 610

 670 LET v=a
 680 LET a$="": LET k=INT PI
 690 LET i=INT VAL "v/(16^k)"
 700 LET a$=a$+FN a$(i)
 710 LET v=v-VAL "16^k"*i
 720 IF NOT K THEN  RETURN 
 730 LET k=k-g: GO TO 690

 740 IF a>FN A(VAL "23732") THEN  LET A=E
 750 LET B=PEEK A
 760 LET i=INT VAL "b/16"
 770 LET c$=c$+FN A$(I)+FN a$(b-16*i)
 780 LET a=a+g: RETURN 

 790 IF b>=VAL "64" THEN  GO TO 830
 800 RESTORE 1130+10*INT VAL "b/10"
 810 FOR j=e TO b-10*INT VAL "b/10": READ i$: NEXT j
 820 RETURN 

 830 IF b<=191 THEN  GO TO 870
 840 RESTORE 1200+10*INT VAL "(b-192)/10"
 850 FOR j=e TO b-10*INT VAL "(b-192)/10"-192: READ i$: NEXT j
 860 RETURN 

 870 RESTORE 1370+10*INT VAL "(b-64)/64"
 880 LET v=INT VAL "(b-64)/8"-8*INT VAL "(b-64)/64"
 890 FOR j=e TO v: READ l$: NEXT j
 900 LET v=1+b-64-8*INT VAL "(b-64)/8": LET E$=D$(V)
 920 LET i$=l$+E$(g TO g+VAL "3*(v=7)")
 930 IF b=VAL "118" THEN  LET i$="HALT"
 940 RETURN 

 950 LET L$="": LET RE=0: IF FP>G THEN  GO TO 1020
 952 RESTORE 1440+10*INT VAL "B/8"
 960 FOR j=e TO b-8*INT VAL "b/8": READ i$: NEXT j
 965 LET R$="": LET I$=C$+","+I$
 991 LET FP=FP+(C$="34")
 992 IF C$>"80" AND C$<"A0" THEN  LET FP=FP+FN B(C$(1))*16+FN B(C$(2))-128
 995 IF fp>g THEN  LET r$=c$
1000 IF fp=G AND C$="38" THEN  LET FP=E
1010 GO TO 220

1020 LET I$="exp": LET V=A-1: GO SUB 680
1025 LET V=3*(C$="10" OR C$="11" OR C$="13" OR C$="14" OR C$="32" OR C$="35" OR C$="37" OR C$="38")
1030 IF NOT V THEN  LET V=2*(C$="55" OR C$="56" OR C$="58" OR C$="59" OR C$="5B" OR C$="5C" OR C$="63")
1035 IF NOT V THEN  LET V=(C$="9D" OR C$="9E" OR (C$>="A1" AND C$<="A4"))
1040 FOR F=G TO 4-V: GO SUB 740: NEXT F
1050 LET FP=FP-G: LET I$=I$+C$( TO 2)+"_"+C$(3 TO )
1085 IF DEBUG THEN  IF FP>G THEN  PRINT A$; INK 1;".";I$; INK 2;"_";R$; INK 3;"_";C$; INK 4;"_";L$; INK 5;"_";FP: BEEP .1,10
1090 GO TO 220

1130 DATA "NOP","LD BC,##","LD (BC),A","INC BC","INC B","DEC B","LD B,#","RLCA","EX AF,A'F'","ADD HL,BC"
1140 DATA "LD A,(BC)","DEC BC","INC C","DEC C","LD C,#","RRCA","DJNZ #","LD DE,##","LD (DE),A","INC DE"
1150 DATA "INC D","DEC D","LD D,#","RLA","JR #","ADD HL,DE","LD A,(DE)","DEC DE","INC E","DEC E"
1160 DATA "LD E,#","RRA","JR NZ,#","LD HL,##","LD (##),HL","INC HL","INC H","DEC H","LD H,#","DAA"
1170 DATA "JR Z,#","ADD HL,HL","LD HL,(##)","DEC HL","INC L","DEC L","LD L,#","CP L","JR NC,#","LD SP,##"
1180 DATA "LD (##),A","INC SP","INC (HL)","DEC (HL)","LD (HL),#","SCF","JR C,#","ADD HL,SP","LD A,(##)","DEC SP"
1190 DATA "INC A","DEC A","LD A,#","CCF"
1200 DATA "RET NZ","POP BC","JP NZ,##","JP ##","CALL NZ,##","PUSH BC","ADD A,#","RST0","RET Z","RET "
1210 DATA "JP Z,##","","CALL Z,##","CALL ##","ADC A,#","RST8,#","RET NC","POP DE","JP NC,##","OUT (#),A"
1220 DATA "CALL NC,##","PUSH DE","SUB #","RST10","RET C","EXX","JP C,##","IN A,(#)","CALL C,##",""
1230 DATA "SBC A,#","RST18","RET PO","POP HL","JP PO,##","EX (SP),HL","CALL PO,##","PUSH HL","AND #","RST20"
1240 DATA "RET PE","JP (HL)","JP PE,##","EX DE,HL","CALL PE,##","","XOR #","RST28","RET P","POP AF"
1250 DATA "JP P,##","DI","CALL P,##","PUSH AF","OR #","RST30","RET M","LD SP,HL","JP M,##","EI"
1260 DATA "CALL M,##","","CP #","RST38"
1270 DATA "IN B,(C)","OUT (C),B","SBC HL,BC","LD (##),BC","NEG","RET N","IM 0","LD I,A","IN C,(C)","OUT (C),C"
1280 DATA "ADC HL,BC","LD BC,(##)","","RET I","","LD R,A","IN D,(C)","OUT (C),D","SBC HL,DE","LD (##),DE"
1290 DATA "","","IM 1","LD A,I","IN E,(C)","OUT (C),E","ADC HL,DE","LD DE,(##)","",""
1300 DATA "IM 2","LD A,R","IN H,(C)","OUT (C),H","SBC HL,HL","LD HL,(##)","","","","RRD"
1310 DATA "IN L,(C)","OUT (C),L","ADC HL,HL","LD HL,(##)","","","","RLD","IN F,(C)",""
1320 DATA "SBC HL,SP","LD (##),SP","","","","","IN A,(C)","OUT (C),A","ADC HL,SP","LD SP,(##)"
1330 DATA "","","","","","","LDI","CPI","INI","OUTI"
1340 DATA "","","","","LDD","CPD","IND","OUTD","",""
1350 DATA "","","LDIR","CPIR","INIR","OTIR","","","",""
1360 DATA "LDDR","CPDR","INDR","OTDR"
1370 DATA "LD B,","LD C,","LD D,","LD E,","LD H,","LD L,","LD (HL),","LD A,"
1380 DATA "ADD A,","ADC A,","SUB ","SBC A,","AND ","XOR ","OR ","CP "
1390 DATA "RLC ","RRC ","RL ","RR ","SLA ","SRA ","","SRL "
1400 DATA "BIT 0,","BIT 1,","BIT 2,","BIT 3,","BIT 4,","BIT 5,","BIT 6,","BIT 7,"
1410 DATA "RES 0,","RES 1,","RES 2,","RES 3,","RES 4,","RES 5,","RES 6,","RES 7,"
1420 DATA "SET 0,","SET 1,","SET 2,","SET 3,","SET 4,","SET 5,","SET 6,","SET 7,"

1440 DATA "jumptrue,#","exchange","delete","substract","multiply","division","power","or_"
1450 DATA "n_and","n_le","n_ge","n_ne","n_gt","n_lt","n_eq","add"
1460 DATA "s_and","s_le","s_ge","s_ne","s_gt","s_lt","s_eq","s_add"
1470 DATA "val$","usr_s","read_in","negate","code","val","len","sin"
1480 DATA "cos","tan","asn","acs","atn","ln","exp","int"
1490 DATA "sqr","sgn","abs","peek","in_","usr_n","str_s","chr_s"
1500 DATA "not_","duplicate","mod_div","jump,#","stk_data","djnz,#","lt_z","gt-z"
1510 DATA "end_calc","get_argt","truncate","exec_B","e2fp","restack","ser06","stk0etc"
1520 DATA "stmem0","gmem0","","","","","",""
1530 DATA "","","","","","","",""
1540 DATA "","","","","","","",""
1550 DATA "","","","","","","",""
1560 DATA "","","","","","","",""
1570 DATA "","","","","","","",""
1580 DATA "","","","","","","",""
1590 DATA "","","","","","","",""
1600 DATA p$,p$,p$,p$,p$,p$,p$,p$
1610 DATA p$,p$,p$,p$,p$,p$,p$,p$
1620 DATA p$,p$,p$,p$,p$,p$,p$,p$
1630 DATA p$,p$,p$,p$,p$,p$,p$,p$
1640 DATA "stk_zero","stk_one","stk_half","stkpi2","stk_ten","","",""
1650 DATA "","","","","","","",""
1660 DATA "","","","","","","",""
1670 DATA "","","","","","","",""
1680 DATA s$,s$,s$,s$,s$,s$,s$,s$
1690 DATA s$,s$,s$,s$,s$,s$,s$,s$
1700 DATA s$,s$,s$,s$,s$,s$,s$,s$
1710 DATA s$,s$,s$,s$,s$,s$,s$,s$
1720 DATA g$,g$,g$,g$,g$,g$,g$,g$
1730 DATA g$,g$,g$,g$,g$,g$,g$,g$
1740 DATA g$,g$,g$,g$,g$,g$,g$,g$
1750 DATA g$,g$,g$,g$,g$,g$,g$,g$

9000 LET RM=VAL "16"+VAL "134670"(BK)
9010 POKE VAL "23388",RM: OUT VAL "32765",RM: RETURN 

9020 LET A=FN A(VAL "23627"): CLEAR VAL "A+1024": LET A=FN A(VAL "23730")+SGN PI
9030 LET ZX=(PEEK VAL "2899"=VAL "159" OR PEEK VAL "2899"=VAL "126"): IF NOT ZX THEN  PRINT "48K ";
9040 LET BK=6*ZX: IF ZX THEN  PRINT "128K ";
9050 PRINT "RAMTOP:";A: GO TO 20

9580 INPUT "START ADDRESS? "'k$: LET C$=k$(g): IF k$="" OR (C$<>"D" AND C$<>"H") THEN  GO TO 9580
9590 IF LEN k$<VAL "2" OR LEN k$>5+(C$="D") THEN  GO TO 9580
9600 GO SUB 9760: IF NOT z THEN  GO TO 9580
9610 GO SUB 9720+5*(C$="H")
9620 IF ZX THEN  INPUT "BANK 1-6:";BK: IF BK<E OR BK>VAL "6" THEN  GO TO 9620
9630 IF ZX THEN  GO SUB 9E3: PRINT "BANK ";BK;" SET"
9640 CLS : CAT *!
9641 INPUT "filenaam";n$: IF N$<>"" THEN  LET N$=(N$+"          ")( TO 10)
9650 IF N$<>"" THEN  LOAD d*;N$CODE A
9655 LET sfp=1
9660 RETURN 

9720 LET a=VAL k$(2 TO ): RETURN 
9730 LET a=e: LET a$=k$(2 TO )
9740 FOR j=LEN A$ TO g STEP -g
9750 LET a=a+(16^(LEN A$-j))*FN b(a$(j)): NEXT j: RETURN 

9760 FOR k=2 TO LEN k$: LET z=(k$(k)>="0" AND k$(k)<="9"): IF k$(g)="H" THEN  LET z=z+(k$(k)>="A" AND k$(k)<="F")
9770 IF z THEN  NEXT k
9780 LET z=(k=LEN k$+g): RETURN 

9900 CLEAR : LET n$="SpManFP39"
9910 SAVE d*;n$ LINE NOT PI: CAT *;N$

9990 REM ZX_FP_Disassembler
9991 REM S.H.Man1985     16K
9992 REM +W.E.Thomson1986
9993 REM +J.Grimwood2004
9994 REM +C.Born2023    128K

9995 POKE @5,VAL "255": POKE @10,NOT PI: POKE @11,NOT PI: LPRINT : LPRINT : LLIST : LPRINT 

i try to collect ALL "exponent" info and some are a bit strange ...
these are snippets from ROM and only selected to be able to select them ..
in LINE 1000 from ABOVE program i implemented the result off this selection.
are those values continious ?? then its much more easy BUT
what does the #80 AFTER an
code #34, #8n ,#9n
+
EXP
+
#01,#02,#03,#04 bytes

EXPonent has
1 bytes = $10$11 $13$14 $32 $35 $37$38
2 bytes = $55$56 $58$59 $5B$5C $63
3 bytes = $9D$9E $A0$A1$A2$A3$A4

since #34 exp#80 has FOUR bytes, and not 3 !!!!
the exp is postponed 1 byte
#34 #80 #exp #yy #xx #80 ??? 5 bytes together after all , its a trick that isn't is a trick anymore ????

Code: Select all

code #34, #8n ,#9n
+
EXP 
+
#01,#02,#03,#04 bytes

EXPonent has
1 bytes = $10$11 $13$14 $32 $35 $37$38
2 bytes = $55$56 $58$59 $5B$5C $63
3 bytes = $9D$9E $A0$A1$A2$A3$A4 


        DEFB    $34             ;;stk-data      z, sqr(z), 2.
        DEFB    $32             ;;Exponent: $82, Bytes: 1
        DEFB    $00             ;;(+00,+00,+00)


        DEFB    $34             ;;stk-data
        DEFB    $32             ;;Exponent: $82, Bytes: 1
        DEFB    $20             ;;(+00,+00,+00)


        DEFB    $34             ;;stk-data                  ; push constant
        DEFB    $35             ;;Exponent: $85, Bytes: 1   ; constant = 30.125
        DEFB    $71             ;;($71,$00,$00,$00)


        DEFB    $34             ;;stk-data
        DEFB    $37             ;;Exponent: $87, Bytes: 1
        DEFB    $16             ;;(+00,+00,+00)      ;s+1,75.


        DEFB    $34             ;;stk-data
        DEFB    $38             ;;Exponent: $88, Bytes: 1
        DEFB    $00             ;;(+00,+00,+00)


;;??  3 or 4 ??
        DEFB    $34             ;;stk-data           ;v.
        DEFB    $80             ;;Bytes: 3
        DEFB    $41             ;;Exponent $91
        DEFB    $00,$00,$80     ;;(+00)              ;v,65537.

        DEFB    $34             ;;stk-data                  ; push constant
        DEFB    $80             ;;Exponent $93, Bytes: 3    ; constant = 437500
        DEFB    $43,$55,$9F,$80 ;;($55,$9F,$80,$00)



        DEFB    $34             ;;stk-data
        DEFB    $E7             ;;Exponent: $77, Bytes: 4
        DEFB    $21,$F7,$AF,$24 ;;

        DEFB    $34             ;;stk-data
        DEFB    $E9             ;;Exponent: $79, Bytes: 4
        DEFB    $15,$63,$BB,$23 ;;

        DEFB    $34             ;;stk-data
        DEFB    $EA             ;;Exponent: $7A, Bytes: 4
        DEFB    $1B,$43,$CA,$36 ;;

        DEFB    $34             ;;stk-data
        DEFB    $EB             ;;Exponent: $7B, Bytes: 4
        DEFB    $2F,$B0,$B0,$14 ;;

        DEFB    $34             ;;stk-data                   ; push constant
        DEFB    $EC             ;;Exponent: $7C, Bytes: 4    ; constant = 0.05762265
        DEFB    $6C,$98,$1F,$F5 ;;($6C,$98,$1F,$F5)

        DEFB    $34             ;;stk-data
        DEFB    $ED             ;;Exponent: $7D, Bytes: 4
        DEFB    $A7,$9C,$7E,$5E ;;

        DEFB    $34             ;;stk-data
        DEFB    $EE             ;;Exponent: $7E, Bytes: 4
        DEFB    $22,$F9,$83,$6E ;;              X, 1/(2*PI)
        DEFB    $34             ;;stk-data
        DEFB    $EE             ;;Exponent: $7E, Bytes: 4
        DEFB    $7E,$BB,$94,$58 ;;

        DEFB    $34             ;;stk-data          .30103 (log 2)
        DEFB    $EF             ;;Exponent: $7F, Bytes: 4
        DEFB    $1A,$20,$9A,$85 ;;


        DEFB    $34             ;;stk-data
        DEFB    $F0             ;;Exponent: $80, Bytes: 4
        DEFB    $31,$72,$17,$F8 ;;


        DEFB    $34             ;;stk-data
        DEFB    $F1             ;;Exponent: $81, Bytes: 4
        DEFB    $38,$AA,$3B,$29 ;;



;;; --------------------------------------------------------
        DEFB    $86             ;;series-06  is 6 on stack
        DEFB    $14             ;;Exponent: $64, Bytes: 1
        DEFB    $E6             ;;(+00,+00,+00)

        DEFB    $5C             ;;Exponent: $6C, Bytes: 2
        DEFB    $1F,$0B         ;;(+00,+00)

        DEFB    $A3             ;;Exponent: $73, Bytes: 3
        DEFB    $8F,$38,$EE     ;;(+00)

        DEFB    $E9             ;;Exponent: $79, Bytes: 4
        DEFB    $15,$63,$BB,$23 ;;

        DEFB    $EE             ;;Exponent: $7E, Bytes: 4
        DEFB    $92,$0D,$CD,$ED ;;

        DEFB    $F1             ;;Exponent: $81, Bytes: 4
        DEFB    $23,$5D,$1B,$EA ;;
;;;


;;; --------------------------------------------------------
        DEFB    $88             ;;series-08  = 8 on stack
        DEFB    $13             ;;Exponent: $63, Bytes: 1
        DEFB    $36             ;;(+00,+00,+00)

        DEFB    $58             ;;Exponent: $68, Bytes: 2
        DEFB    $65,$66         ;;(+00,+00)

        DEFB    $9D             ;;Exponent: $6D, Bytes: 3
        DEFB    $78,$65,$40     ;;(+00)

        DEFB    $A2             ;;Exponent: $72, Bytes: 3
        DEFB    $60,$32,$C9     ;;(+00)

        DEFB    $E7             ;;Exponent: $77, Bytes: 4
        DEFB    $21,$F7,$AF,$24 ;;

        DEFB    $EB             ;;Exponent: $7B, Bytes: 4
        DEFB    $2F,$B0,$B0,$14 ;;

        DEFB    $EE             ;;Exponent: $7E, Bytes: 4
        DEFB    $7E,$BB,$94,$58 ;;

        DEFB    $F1             ;;Exponent: $81, Bytes: 4
        DEFB    $3A,$7E,$F8,$CF ;;
;;;

;;; --------------------------------------------------------
        DEFB    $8C             ;;series-0C   = 12 on stack
        DEFB    $11             ;;Exponent: $61, Bytes: 1
        DEFB    $AC             ;;(+00,+00,+00)

        DEFB    $14             ;;Exponent: $64, Bytes: 1
        DEFB    $09             ;;(+00,+00,+00)

        DEFB    $56             ;;Exponent: $66, Bytes: 2
        DEFB    $DA,$A5         ;;(+00,+00)

        DEFB    $59             ;;Exponent: $69, Bytes: 2
        DEFB    $30,$C5         ;;(+00,+00)

        DEFB    $5C             ;;Exponent: $6C, Bytes: 2
        DEFB    $90,$AA         ;;(+00,+00)

        DEFB    $9E             ;;Exponent: $6E, Bytes: 3
        DEFB    $70,$6F,$61     ;;(+00)

        DEFB    $A1             ;;Exponent: $71, Bytes: 3
        DEFB    $CB,$DA,$96     ;;(+00)

        DEFB    $A4             ;;Exponent: $74, Bytes: 3
        DEFB    $31,$9F,$B4     ;;(+00)

        DEFB    $E7             ;;Exponent: $77, Bytes: 4
        DEFB    $A0,$FE,$5C,$FC ;;

        DEFB    $EA             ;;Exponent: $7A, Bytes: 4
        DEFB    $1B,$43,$CA,$36 ;;

        DEFB    $ED             ;;Exponent: $7D, Bytes: 4
        DEFB    $A7,$9C,$7E,$5E ;;

        DEFB    $F0             ;;Exponent: $80, Bytes: 4
        DEFB    $6E,$23,$80,$93 ;;
;;;

;;;
        DEFB    $8C             ;;series-0C

        DEFB    $10             ;;Exponent: $60, Bytes: 1
        DEFB    $B2             ;;(+00,+00,+00)

        DEFB    $13             ;;Exponent: $63, Bytes: 1
        DEFB    $0E             ;;(+00,+00,+00)

        DEFB    $55             ;;Exponent: $65, Bytes: 2
        DEFB    $E4,$8D         ;;(+00,+00)

        DEFB    $58             ;;Exponent: $68, Bytes: 2
        DEFB    $39,$BC         ;;(+00,+00)

        DEFB    $5B             ;;Exponent: $6B, Bytes: 2
        DEFB    $98,$FD         ;;(+00,+00)

        DEFB    $9E             ;;Exponent: $6E, Bytes: 3
        DEFB    $00,$36,$75     ;;(+00)

        DEFB    $A0             ;;Exponent: $70, Bytes: 3
        DEFB    $DB,$E8,$B4     ;;(+00)

        DEFB    $63             ;;Exponent: $73, Bytes: 2
        DEFB    $42,$C4         ;;(+00,+00)

        DEFB    $E6             ;;Exponent: $76, Bytes: 4
        DEFB    $B5,$09,$36,$BE ;;

        DEFB    $E9             ;;Exponent: $79, Bytes: 4
        DEFB    $36,$73,$1B,$5D ;;

        DEFB    $EC             ;;Exponent: $7C, Bytes: 4
        DEFB    $D8,$DE,$63,$BE ;;

        DEFB    $F0             ;;Exponent: $80, Bytes: 4
        DEFB    $61,$A1,$B3,$0C ;;
;;;
C.Born
Manic Miner
Posts: 229
Joined: Sat Dec 09, 2017 4:09 pm

Re: Spectrum Disassembler 128k BASIC

Post by C.Born »

digging out ROM 0 i found

Code: Select all

; -------------------------------
; RST $28 - Call Routine in ROM 1
; -------------------------------
; RST 28 calls a routine in ROM 1 (or alternatively a routine in RAM while
; ROM 1 is paged in). Call as follows: RST 28 / DEFW address.

L0028:  EX   (SP),HL      ; Get the address after the RST $28 into HL,
                          ; saving HL on the stack.
        PUSH AF           ; Save the AF registers.
        LD   A,(HL)       ; Fetch the first address byte.
        INC  HL           ; Point HL to the byte after
        INC  HL           ; the required address.
        LD   (RETADDR),HL ; $5B5A. Store this in RETADDR.
        DEC  HL           ; (There is no RST $30)
        LD   H,(HL)       ; Fetch the second address byte.
        LD   L,A          ; HL=Subroutine to call.
        POP  AF           ; Restore AF.
        JP   L005C        ; Jump ahead to continue.
which is the 128k ROM_0 RST#28 routine which should NOT set the FP pointer !!!
which reminds me all that i was bussy some where
Post Reply