disassembler checklist maker

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

disassembler checklist maker

Post by C.Born »

Hi
becouse off the basic disassembler from mr Man, 1985,
viewtopic.php?t=10187

i now write a disassembler checker wich just build a long BIN file with all the documented codes.
its a simple and pragmatic aproach i gues. just repeat the byte as long as needed
by using the value of the code as a value its easy to see it in the list.
this is an example result with above disassembler, beneath its the "build" for the MCtest.BIN
now i HOPE you will ...
test this test file. if you have that possibility?
it should function as a list for every Z80 disassembler and i hope its realy complete :dance !

Code: Select all

7FE6 00        NOP
7FE7 010101    LD BC,0101
7FEA 02        LD (BC),A
7FEB 03        INC BC
7FEC 04        INC B
7FED 05        DEC B
7FEE 0606      LD B,06
7FF0 07        RLCA
7FF1 08        EX AF,A'F'
7FF2 09        ADD HL,BC
7FF3 0A        LD A,(BC)
7FF4 0B        DEC BC
7FF5 0C        INC C
7FF6 0D        DEC C
7FF7 0E0E      LD C,0E
7FF9 0F        RRCA
7FFA 1010      DJNZ 800C
7FFC 111111    LD DE,1111
7FFF 12        LD (DE),A
8000 13        INC DE
8001 14        INC D
8002 15        DEC D
8003 1616      LD D,16
8005 17        RLA
8006 1818      JR 8020
8008 19        ADD HL,DE
8009 1A        LD A,(DE)
800A 1B        DEC DE
800B 1C        INC E
800C 1D        DEC E
800D 1E1E      LD E,1E
800F 1F        RRA

Code: Select all

  10 DEF FN A(A)=PEEK A+VAL "256"*PEEK VAL "A+1"
  20 DEF FN m(m)=(((m/16)-INT (m/16))*16)
  30 DEF FN A$(A)=CHR$ (48+A+7*(A>9))
  40 DEF FN H$(A)=FN A$(INT (A/16))+FN A$(FN M(A))
  60 PRINT " This routine creates a BIN FILEas list of MC opcodes that will be saved."
  70 PRINT '"It will POKE the opcode number  and if the opcode needs a VALUE,the momentary opcode number is  used as that value."
  80 PRINT '"Those equal numbers are easy to check.Only the Documented opcodeare used and saved at 30000 witha length of 1423 bytes."
  90 PRINT '"UNdocumented opcodes are skippedand need a file for themselves"'
 100 PRINT ' INVERSE 1;TAB 31;" "'TAB 31;" "'TAB 9;"press any key";TAB 31;" "'TAB 31;" "'TAB 31;" "
 110 PAUSE 0: CLEAR VAL "29999": LET r=FN A(VAL "23730")+SGN PI: LET scr=VAL "23692"
 111 LET ST=VAL "2": LET PR=VAL "660": LET X$=""
 120 LET a=r: LET cb=VAL "203": LET dd=VAL "221": LET ed=VAL "237": LET fd=VAL "253"
 130 PRINT  INVERSE 1;"00-FF"
 140 FOR h=NOT PI TO VAL "255": POKE scr,-1
 150 IF h=cb OR h=dd OR h=ed OR h=fd THEN  NEXT h
 160 LET H$=FN H$(H): LET z=NOT PI: LET y=Z: LET x=Z
 170 IF H=1 OR H=17 OR H=33 OR H=34 OR H=42 OR H=49 OR H=50 OR H=58 OR H=194 OR H=195  OR H=196 OR H=202 OR H=203 OR H=204 OR H=205 OR H= 210 OR H=212 OR H=218 OR H=220 OR H=226 OR H=228 OR H=234 OR H=236 OR H=242 OR H=244 OR H=250 OR H=252 THEN  LET z=1
 180 IF H=6 OR H=14 OR H=16 OR H=22 OR H=24 OR H=30 OR H=32 OR H=38 OR H=40 OR H=46 OR H=48 OR H=54 OR H=56 OR H=62 OR H=198 OR H=206 OR H=211 OR H=214 OR H=219 OR H=222 OR H=230 OR H=238 OR H=254 THEN  LET y=1
 190 IF z THEN  POKE A,H: LET A=A+1: LET X$=X$+H$
 200 IF y OR z THEN  POKE A,H: LET A=A+1: LET X$=X$+H$
 210 POKE A,h: LET A=A+1: LET X$=X$+H$
 220 IF h=239 THEN  POKE A,56: LET A=A+1
 230 GO SUB PR: NEXT h
 240 PRINT  INVERSE 1;"CBxx"
 250 FOR h=NOT PI TO VAL "255": IF h=cb OR (h>=48 AND h<=55) THEN  NEXT h
 260 POKE scr,-1
 270 POKE A,cb: POKE A+1,h: LET A=A+2: LET X$=X$+FN H$(cb)+FN H$(H): GO SUB PR: NEXT h
 280 PRINT  INVERSE 1;"DDxx": POKE scr,-1
 290 LET xx=dd: GO SUB 490
 300 PRINT  INVERSE 1;"DDCBxx": POKE scr,-1
 310 GO SUB 600
 320 PRINT  INVERSE 1;"EDxx": POKE scr,-1
 330 FOR h=64 TO 187: LET z=1: LET y=0: LET x=0: IF h=124 THEN  LET h=160
 340 LET H$=FN H$(H)
 350 IF h=78 OR h=80 OR h=84 OR h=85 OR h=92 OR h=93 OR (h>=100 AND h<=102) OR (h>=108 AND h<=110) OR h=113 OR (h>=116 AND h<=120) THEN  LET z=0
 360 IF (h>=164 AND h<=167) OR (h>=172 AND h<=175) OR (h>=180 AND h<=183) THEN  LET z=0
 370 IF h=67 OR h=75 OR h=83 OR h=91 OR h=99 OR h=107 OR h=115 OR h=123 THEN  LET y=1
 380 IF h=97 THEN  LET x=1
 390 IF z THEN  POKE a,ed: POKE a+1,h: LET a=a+2: LET X$=X$+FN h$(ed)+h$
 400 IF y OR x THEN  POKE a,h: LET A=A+1: LET X$=X$+h$
 410 IF y THEN  POKE a,h: LET a=a+1: LET X$=X$+h$
 420 IF x OR y OR z THEN  PRINT 
 430 GO SUB PR: NEXT h
 440 PRINT  INVERSE 1;"FDxx": POKE scr,-1
 450 LET xx=fd: GO SUB 490
 460 PRINT  INVERSE 1;"FDCBxx": POKE scr,-1
 470 GO SUB 600
 480 GO TO 650
 490 FOR h=0 TO 255: IF h=cb THEN  NEXT h
 500 LET H$=FN H$(H): LET z=0: LET y=z: LET x=z: LET M=FN M(H)
 510 IF h=9 OR h=25 OR h=35 OR h=41 OR h=43 OR h=57 OR h=126 OR h=134 OR h=142 OR h=150 OR h=158 OR h=166 OR h=174 OR h=182 OR h=190 OR h=225 OR h=227 OR h=229 OR h=233 OR h=249 THEN  LET z=1
 520 IF h=52 OR h=53 OR (h>=112 AND h<=117) OR H=119 THEN  LET y=1
 530 IF (M=6 OR M=14) AND ((h>=70 AND h<=110) OR (H>=126 AND H<=190)) THEN  LET y=1
 540 IF h=33 OR h=34 OR h=42 OR h=54 THEN  LET x=1
 550 IF z OR y OR x THEN  POKE A,xx: POKE VAL "A+1",h: LET A=VAL "A+2": LET X$=X$+FN H$(xx)+H$
 560 IF x OR y THEN  POKE a,h: LET a=a+1: LET X$=X$+H$
 570 IF x THEN  POKE a,h: LET a=a+1: LET X$=X$+H$
 580 IF x OR y OR z THEN  PRINT 
 590 GO SUB PR: NEXT h: RETURN 
 600 FOR h=NOT PI TO 255: IF H=54 THEN  NEXT H
 610 LET z=FN m(h): LET z=(z=6 OR z=14)
 620 IF z THEN  POKE a,xx: POKE a+1,cb: POKE a+2,H: POKE a+3,h: LET a=a+4
 630 IF z THEN  LET X$=X$+FN h$(xx)+FN h$(cb)+FN h$(z)+FN h$(h)
 640 GO SUB PR: NEXT h: RETURN 
 650 SAVE d*"MCtest.BIN"CODE r,a-r: STOP 
 660 IF X$<>"" THEN  PRINT #ST;X$: IF ST<>2 THEN  PRINT #2;X$
 670 LET X$="": RETURN 
 680 CLEAR : SAVE d*"MClist33"
 690 POKE @5,255: POKE @10,0: POKE @11,0: LPRINT : LPRINT : LLIST : LPRINT 


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

Re: disassembler checklist maker

Post by C.Born »

there is 1 thing
i build in a bug for disas progs that DONT view the FP.
thats 99% or more.
its the switch off for the RST28 command
the basic disas has this FP switch and needs the signal "end_calc" to stop with it.
i will have to make a preset condition for that.
sorry and if you did try and had a problem, big chance its that code 56 ,$38

220 IF h=239 THEN POKE A,56: LET A=A+1

cheers
Post Reply