?login_element?

Subversion Repositories NedoOS

Rev

Rev 1158 | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;выводит в текстовый буфер
  2. SMALLLETTERADD=32;0
  3.  
  4. ;TODO fix out (c),(hl) -> out (c),0
  5.  
  6. Disasm_PrWord_de
  7. ;de=word
  8.         ld a,d
  9.         call Disasm_PrHex_a
  10.         ld a,e
  11. Disasm_PrHex_a
  12.         push af
  13.         rra
  14.         rra
  15.         rra
  16.         rra
  17.         call Disasm_PrHexDig
  18.         pop af
  19. Disasm_PrHexDig
  20.         or 0xf0
  21.         daa
  22.         add a,0xa0
  23.         adc a,0x40
  24. Disasm_PrChar
  25.         ld (ix),a
  26.         inc ix
  27.         ret
  28.  
  29. ED      INC HL
  30.         LD B,' ';32
  31.         LD A,(HL)
  32.         SUB 64
  33.         RET C
  34.         SUB 64
  35.         JR NC,C5
  36.         CP 196
  37.         LD DE,COMN
  38.         JR Z,CT
  39.         AND 7
  40.         CP 7
  41.         LD DE,COME
  42.         JR Z,CT
  43.         CP 5
  44.         JR NZ,C6
  45.         LD A,(HL)
  46.         CP 80
  47.         LD DE,COMR
  48.         RET NC
  49. CT      CALL CALC
  50. TXT     JP TEXT
  51.  
  52. C6      CP 4
  53.         RET Z
  54.         CP 6
  55.         JR NZ,C7
  56.         LD A,(HL)
  57.         CP 100
  58.         LD DE,COMHim ;"IM "
  59.         RET NC
  60.         CALL T0
  61.         CALL CALC
  62.         CP 1
  63.         RET Z
  64.         JR C,$+3
  65.         DEC A
  66.         ADD A,'0'
  67.        jp Disasm_PrChar
  68.  
  69. C7      LD E,A
  70.         LD A,(HL)
  71.         AND 15
  72.         CP 10
  73.         LD A,E
  74.         JR C,C8
  75.         ADD A,2
  76. C8
  77.        or a
  78.        jr nz,noinregc
  79.        ld a,(hl)
  80.        sub 0x70
  81.        ld de,COMINF
  82.        jr z,TXT
  83.        xor a
  84. noinregc
  85.         LD DE,COMI
  86.         CP 3 ;ld (nn), ;ld rp,(nn) - как работает? показывает правильно даже с префиксом
  87.         JR NZ,TXT ;а как проверяется 2? sbc/adc hl,rp - всегда hl, а не ix/iy! показывает правильно даже с префиксом
  88.         LD C,(HL)
  89.         CALL TEXT
  90.         LD A,C
  91. PAIR    CALL CALCa
  92.         RRA
  93.         CP 2 ;hl?
  94.         LD DE,RP
  95.         JR NZ,TXT
  96. LHL     LD DE,RPhl
  97.         BIT 6,B
  98.         JP Z,T0
  99.         LD A,'I'+SMALLLETTERADD
  100.        call Disasm_PrChar
  101.         LD A,B
  102.        jp Disasm_PrChar
  103.  
  104. C5      SUB 32
  105.         RET C
  106.         CP 32
  107.         RET NC
  108.         BIT 2,A
  109.         RET NZ
  110.         BIT 4,A
  111.         JR Z,C9
  112.         SUB 12
  113. C9      LD DE,COMM
  114.         JR TXT
  115.  
  116. disasmbit
  117.         INC HL
  118.         BIT 6,B
  119.         JR Z,B0
  120.         INC HL
  121.         DEC B
  122.         DEC B
  123. B0      LD A,(HL)
  124.         SUB 64
  125.         LD DE,COMB
  126.         JR NC,B1
  127.         CALL CT ;rl/rlc/...
  128.         LD A,' '
  129.         JR B2
  130.  
  131. B1      RLCA
  132.         RLCA
  133.         AND 3
  134.         ADD A,8 ;bit/res/set
  135.         CALL TEXT
  136.         CALL CALC
  137.         ADD A,'0'
  138.        call Disasm_PrChar
  139.         LD A,',';44
  140. B2     call Disasm_PrChar
  141.         LD A,(HL)
  142.         ;BIT 5,B
  143.         ;JR NZ,$+6
  144.         bit 6,b
  145.         jp z,REG;jr z,$+6
  146.          AND 7
  147.          CP 6
  148.         CALL NZ,REG
  149.         BIT 6,B
  150.         RET Z
  151.         INC B ;???
  152.         INC B ;???
  153.         JP R1p4 ;(hl)/(iz+)
  154.  
  155. Disasm_COMMAND
  156.         LD B,' ';32
  157. clear   LD A,(HL)
  158.         CP 0xdd;221
  159.         JR NZ,CY
  160.         LD B,'X'+SMALLLETTERADD
  161. CX      INC HL
  162.         INC HL
  163.         LD C,(HL)
  164.         DEC HL
  165.         JR clear
  166.  
  167. CY      CP 0xfd;253
  168.         JR NZ,CZ
  169.         LD B,'Y'+SMALLLETTERADD
  170.         JR CX
  171.  
  172. CZ      CP 0xcb;203
  173.         JR Z,disasmbit
  174.         CP 0xed;237
  175.         JP Z,ED
  176.         CP 0x76;118
  177.         LD DE,COMH ;"halt"
  178.         JR Z,T0
  179.         CP 0x40;64
  180.         JP NC,C1
  181.         AND 7
  182.         LD DE,COM0
  183.         JR Z,jpCT
  184. C0      CP 7
  185.         LD DE,COM7
  186.         JR Z,jpCT
  187.         CP 2
  188.         JR NZ,TZ
  189.         LD A,8 ;"ld "
  190.         CALL TEXT
  191.         LD DE,COM2
  192. jpCT    JP CT
  193.  
  194. TZ      LD A,(HL)
  195.         AND 15
  196.         CP 12
  197.         JR NC,TEXT ;inc reg, dec reg, ld reg,i8 - и для чётных, и для нечётных восьмёрок
  198.         ADD A,8 ;[8],9,[10],11,12,13,14,[15],[16],17,[18],19: [], ld rp,i16, [], inc rp, inc reg, dec reg, ld reg,i8, add hl,rp, [], dec rp
  199. TEXT    OR A
  200.         JR NZ,T7
  201. T0      LD A,(DE)
  202.         BIT 7,A
  203.         PUSH AF
  204.         PUSH DE
  205.         AND 127
  206.         JR NZ,T1
  207.         CALL LHL ;0=hl/ix/iy
  208.         JR T6
  209. T1      DEC A
  210.         JR NZ,T2
  211.         CALL CALC ;1=reg (n/8)
  212.         CALL REG
  213.         JR T6
  214. T2      DEC A
  215.         JR NZ,T3
  216.         LD A,(HL) ;2=rp
  217.         CALL PAIR
  218.         JR T6
  219. T3      DEC A
  220.         JR NZ,T4
  221.         INC HL
  222.         LD C,(HL) ;3=i8
  223.         CALL S7
  224.         JR T6
  225. T4      DEC A
  226.         JR NZ,TX
  227.         INC HL
  228.         LD E,(HL) ;4=i16
  229.         INC HL
  230.         LD D,(HL)
  231.         CALL Disasm_PrHashWord_de
  232.         JR T6
  233. TX      DEC A
  234.         JR NZ,TY
  235.         INC HL
  236.         PUSH HL
  237.         LD E,(HL) ;5=$+shift (for 0x10,0x18..0x38, в 0x00,0x08 нет параметров)
  238.         LD D,A
  239.         BIT 7,E
  240.         JR Z,$+3
  241.         DEC D
  242. disasmcmdaddr=$+1
  243. asmcmdaddr=$+1
  244.        ld hl,0
  245.        inc hl
  246.         INC HL
  247.         ADD HL,DE
  248.         EX DE,HL
  249.         POP HL
  250.         CALL Disasm_PrHashWord_de
  251.         JR T6
  252. TY      DEC A
  253.         JR NZ,T5
  254.         LD DE,CC ;6=cc
  255.         CALL CT
  256.         JR T6
  257. T5
  258.        or SMALLLETTERADD
  259.        call Disasm_PrChar
  260. T6      POP DE
  261.         POP AF
  262.         INC DE
  263.         JR Z,T0
  264.         RET
  265.  
  266. T7      DEC A
  267.         EX DE,HL
  268. T8      BIT 7,(HL)
  269.         INC HL
  270.         JR Z,T8
  271.         EX DE,HL
  272.         JR TEXT
  273.  
  274. C1      CP 128
  275.         JR NC,C4
  276.         LD DE,COML ;"ld reg,"
  277.         PUSH AF
  278.         CALL T0
  279.         POP AF
  280.         LD D,A
  281.         JR REGd
  282.  
  283. C4      CP 192
  284.         LD DE,COM
  285.         JR NC,C2
  286.         CALL CT
  287.         LD A,(HL)
  288. REG     LD D,(HL)
  289. REGd    AND 7
  290.         ADD A,66+SMALLLETTERADD
  291.         AND 71+SMALLLETTERADD ;0x47+
  292.         CP 70+SMALLLETTERADD ;0x46+
  293.         JR NZ,R0
  294.         LD A,'H'+SMALLLETTERADD
  295.         JR R6
  296.  
  297. R0      CP 71+SMALLLETTERADD ;0x47+
  298.         JR NZ,R1
  299.         LD A,'L'+SMALLLETTERADD
  300. R6     call Disasm_PrChar
  301.         LD A,D
  302.         and 0xf7
  303.         cp 0x26 ;ld h,i8 (0x2e=ld l,i8)
  304.         jr z,REG_hzlz
  305.         AND 7
  306.         CP 6
  307.         RET Z ;(hl)/(iz+),h/l не пересчитываем
  308.         XOR D
  309.         CP 112
  310.         RET Z ;h/l,(hl)/(iz+) не пересчитываем
  311. REG_hzlz
  312.         LD A,B
  313.         CP 'X'
  314.         RET C
  315.         ;LD A,B
  316. R8     jp Disasm_PrChar
  317.  
  318. R1      CP 64+SMALLLETTERADD
  319.         JR NZ,R8
  320. R1p4
  321.         LD A,'('
  322.        call Disasm_PrChar
  323.         CALL LHL
  324.         BIT 6,B
  325.         JR Z,R5
  326.        inc hl
  327.         LD A,C
  328.         RLA
  329.         LD A,'+'
  330.         JR NC,R4
  331.         XOR A
  332.         SUB C
  333.         LD C,A
  334.         LD A,'-'
  335. R4     call Disasm_PrChar
  336.         CALL S7 ;prnum C
  337. R5      LD A,')'
  338.        jp Disasm_PrChar
  339.  
  340. C2      AND 7
  341.         CP 6
  342.         JR NZ,C3
  343.         CALL CT
  344.         INC HL
  345.         LD C,(HL)
  346.         JR S7
  347.  
  348. C3      CP 1
  349.         LD DE,COM1
  350. CTT     JP Z,CT
  351.         CP 3
  352.         LD DE,COM3
  353.         JR Z,CTT
  354.         CP 5
  355.         LD DE,COM5
  356.         JR Z,CTT
  357.         CP 7
  358.         LD DE,COMJ
  359.         JP NZ,TEXT
  360.         CALL TEXT
  361.         LD A,(HL)
  362.         SUB 199
  363.         LD C,A
  364. S7      ;LD A,(S1)
  365.         ;CP 24
  366.         ;JR Z,S8_100 ;decimal mode
  367.         LD A,'#'
  368.        call Disasm_PrChar
  369.         LD E,C
  370.         JR prhex_e;S2
  371.  
  372.        if 0
  373. S8_100  LD D,100
  374.         CALL S9
  375. S8_10   LD D,10
  376.         CALL S9
  377.         LD D,1
  378. S9      LD E,47
  379.         LD A,C
  380.         INC E
  381.         SUB D
  382.         JR NC,$-2;S9+3
  383.         ADD A,D
  384.         LD C,A
  385.         LD A,E
  386.        call Disasm_PrChar
  387.         RET
  388.        endif
  389.  
  390. ;S1
  391. Disasm_PrHashWord_de
  392.         LD A,'#' ;WARNING! рассчитано на JR ZZZZZZ
  393.        call Disasm_PrChar
  394.         jp Disasm_PrWord_de
  395. prhex_e
  396.         LD A,E
  397.        jp Disasm_PrHex_a
  398.  
  399.        if 0
  400. ZZZZZZ
  401.         EX DE,HL
  402.         LD BC,10000
  403.         CALL S5
  404.         LD BC,1000
  405.         CALL S5
  406.         LD BC,100
  407.         CALL S5
  408.         EX DE,HL
  409.         LD C,E
  410.         JR S8_10
  411.  
  412. S5      LD A,47
  413. S6      INC A
  414.         SBC HL,BC
  415.         JR NC,S6
  416.         ADD HL,BC
  417.        jp Disasm_PrChar
  418.        endif
  419.  
  420. CALC    LD A,(HL)
  421. CALCa   RRA
  422.         RRA
  423.         RRA
  424.         AND 7
  425.         RET
  426.  
  427.        macro dbletter s1
  428.         if (s1&0x7f) < 'A'
  429.         if (s1&0x7f) < ' '
  430.         db s1
  431.         else
  432.         db s1+6
  433.         endif
  434.         else
  435.         db (s1^SMALLLETTERADD)+6
  436.         endif
  437.        endm
  438.        macro db1letter s1
  439.         dbletter s1+128
  440.        endm
  441.        macro db2letter s1,s2
  442.         dbletter s1
  443.         dbletter s2+128
  444.        endm
  445.        macro db3letter s1,s2,s3
  446.         dbletter s1
  447.         dbletter s2
  448.         dbletter s3+128
  449.        endm
  450.        macro db4letter s1,s2,s3,s4
  451.         dbletter s1
  452.         dbletter s2
  453.         dbletter s3
  454.         dbletter s4+128
  455.        endm
  456.        macro db5letter s1,s2,s3,s4,s5
  457.         dbletter s1
  458.         dbletter s2
  459.         dbletter s3
  460.         dbletter s4
  461.         dbletter s5+128
  462.        endm
  463.        macro db6letter s1,s2,s3,s4,s5,s6
  464.         dbletter s1
  465.         dbletter s2
  466.         dbletter s3
  467.         dbletter s4
  468.         dbletter s5
  469.         dbletter s6+128
  470.        endm
  471.        macro db7letter s1,s2,s3,s4,s5,s6,s7
  472.         dbletter s1
  473.         dbletter s2
  474.         dbletter s3
  475.         dbletter s4
  476.         dbletter s5
  477.         dbletter s6
  478.         dbletter s7+128
  479.        endm
  480.        macro db8letter s1,s2,s3,s4,s5,s6,s7,s8
  481.         dbletter s1
  482.         db7letter s2,s3,s4,s5,s6,s7,s8
  483.        endm
  484. COM7
  485.         db4letter 'R','L','C','A';DB 88,82,73,199
  486.         db4letter 'R','R','C','A';db 88,88,73,199
  487.         db3letter 'R','L','A';db 88,82,199
  488.         db3letter 'R','R','A';db 88,88,199
  489.         db3letter 'D','A','A';db 74,71,199
  490.         db3letter 'C','P','L';db 73,86,210
  491.         db3letter 'S','C','F';db 89,73,204
  492.         db3letter 'C','C','F';db 73,73,204
  493. ;8
  494.         db3letter 'L','D',' ';db 82,74,166
  495. ;9
  496.         db6letter 'L','D',' ',2,',',4;DB 82,74,38,2,50,132 ;rp,i16
  497. COMN
  498.          db3letter 'N','E','G';DB 84,75,205
  499. ;11
  500.         db5letter 'I','N','C',' ',2;db 79,84,73,38,2+128 ;rp
  501. ;12
  502.         db5letter 'I','N','C',' ',1;db 79,84,73,38,1+128 ;reg ;например, 0x3c
  503. ;13
  504.         db5letter 'D','E','C',' ',1;db 74,75,73,38,1+128 ;reg ;например, 0x3d
  505. ;14
  506.         db6letter 'L','D',' ',1,',',3;db 82,74,38,1,50,3+128 ;reg,i8 ;например, 0x3e
  507. COMR
  508.          db4letter 'R','E','T','N';DB 88,75,90,212
  509.          db4letter 'R','E','T','I';db 88,75,90,207
  510. ;17
  511.         db7letter 'A','D','D',' ',0,',',2;db 71,74,74,38,0,50,2+128 ;hl/ix/iy,rp
  512. COML
  513.         db5letter 'L','D',' ',1,',';DB 82,74,38,1,178 ;reg,
  514. ;19
  515.         db5letter 'D','E','C',' ',2;db 74,75,73,38,2+128 ;rp
  516. RP
  517.         db2letter 'B','C';DB 72,201
  518.         db2letter 'D','E';db 74,203
  519. RPhl
  520.         db2letter 'H','L';db 78,210
  521.         db2letter 'S','P';db 89,214
  522. COM5
  523.         db6letter 'P','U','S','H',' ',2;DB 86,91,89,78,38,2+128 ;push rp ;bc
  524.         db6letter 'C','A','L','L',' ',4;db 73,71,82,82,38,4+128 ;call i16
  525.         db6letter 'P','U','S','H',' ',2;db 86,91,89,78,38,2+128 ;push rp ;de
  526. COMJ
  527.         db5letter 'R','E','T',' ',6;db 88,75,90,38,6+128 ;ret cc
  528.         db6letter 'P','U','S','H',' ',2;db 86,91,89,78,38,2+128 ;push rp ;hl
  529.         db6letter 'J','P',' ',6,',',4;db 80,86,38,6,50,4+128 ;jp cc,i16
  530.         db7letter 'P','U','S','H',' ','A','F';db 86,91,89,78,38,71,204 ;push af
  531.         db8letter 'C','A','L','L',' ',6,',',4;db 73,71,82,82,38,6,50,4+128 ;call cc,i16
  532. COMH
  533.         db4letter 'H','A','L','T';DB 78,71,82,218
  534. COMHim
  535.         db3letter 'I','M',' ';db 79,83,166
  536.         db4letter 'R','S','T',' ';db 88,89,90,166
  537. CC
  538.        if SMALLLETTERADD
  539.         db2letter 'N','z';DB 84,224 ;'z'+6=128!!!
  540.         db1letter 'z';db 224
  541.        else
  542.         db2letter 'N','Z';DB 84,224 ;'z'+6=128!!!
  543.         db1letter 'Z';db 224
  544.        endif
  545.         db2letter 'N','C';db 84,201
  546.         db1letter 'C';db 201
  547.         db2letter 'P','O';db 86,213
  548.         db2letter 'P','E';db 86,203
  549.         db1letter 'P';db 214
  550.         db1letter 'M';db 211
  551. COM0
  552.         DB 84,85,214 ;nop
  553.         db 75,94,38,71,76,50,71,76,173 ;ex af,af'
  554.         db 74,80,84,96,38,133 ;djnz $+
  555.         db 80,88,38,133 ;jr $+
  556.         db 80,88,38,84,96,50,133 ;jr nz,$+
  557.         db 80,88,38,96,50,133 ;jr z,$+
  558.         db 80,88,38,84,73,50,133 ;jr nc,$+
  559.         db 80,88,38,73,50,133 ;jr c,$+
  560. COM
  561.         DB 71,74,74,38,71,178 ;add a,
  562.         db 71,74,73,38,71,178 ;adc a,
  563.         db 89,91,72,166 ;sub
  564.         DB 89,72,73,38,71,178 ;sbc a,
  565.         db 71,84,74,166 ;and
  566.         db 94,85,88,166 ;xor
  567.         db 85,88,166 ;or
  568.         db 73,86,166 ;cp
  569. COMB
  570.         DB 88,82,201 ;rlc
  571.         db 88,88,201 ;rrc
  572.         db 88,210 ;rl
  573.         db 88,216 ;rr
  574.         db 89,82,199 ;sla
  575.         db 89,88,199 ;sra
  576.         db 89,82,207 ;sli
  577.         db 89,88,210 ;srl
  578.         db 72,79,90,166 ;bit
  579.         db 88,75,89,166 ;res
  580.         DB 89,75,90,166 ;ret
  581. COM3
  582.         DB 80,86,38,4+128 ;jp i16
  583.         ;db 166 ;NU
  584. COMINF
  585.        db3letter 'I','N','F'
  586.         db 85,91,90,38,46,3,47,50,199 ;out (i8),a
  587.         db 79,84,38,71,50,46,3,175 ;in a,(i8)
  588.         db 75,94,38,46,89,86,47,50,128 ;ex (sp),hl/ix/iy
  589.         db 75,94,38,74,75,50,128 ;ex de,hl
  590.         db 74,207 ;di
  591.         db 75,207 ;ei
  592. COM1
  593.         DB 86,85,86,38,130 ;pop rp ;bc
  594.         db 88,75,218 ;ret
  595.         db 86,85,86,38,130 ;pop rp ;de
  596.         db 75,94,222 ;exx
  597.         DB 86,85,86,38,130 ;pop rp ;hl
  598.         db 80,86,38,46,0,175 ;jp (hl/ix/iy)
  599.         db 86,85,86,38,71,204 ;pop af
  600.         db 82,74,38,2,50,128 ;ld rp,hl/ix/iy (rp=sp)
  601. COME
  602.         DB 82,74,38,79,50,199 ;ld i,a
  603.         db 82,74,38,88,50,199 ;ld r,a
  604.         db 82,74,38,71,50,207 ;ld a,i
  605.         db 82,74,38,71,50,216 ;ld a,r
  606.         db 88,88,202 ;rrd
  607.         db 88,82,202 ;rld
  608.         db 166 ;wrong ED XX
  609.         DB 166 ;wrong ED XX
  610. COMI
  611.         DB 79,84,38,1,50,46,73,175 ;in reg,(c)
  612.         db 85,91,90,38,46,73,47,50,129 ;out (c),reg
  613.         DB 89,72,73,38,0,50,130 ;sbc hl,rp
  614.         db 82,74,38,46,4,47,178 ;ld (i16), ;rp печатается отдельно с проверкой hl
  615.         db 71,74,73,38,0,50,130 ;adc hl,rp
  616.         db 82,74,38,2,50,46,4,175 ;ld rp,(i16)
  617. COMM
  618.         DB 82,74,207 ;ldi
  619.         db 73,86,207 ;cpi
  620.         db 79,84,207 ;ini
  621.         db 85,91,90,207 ;outi
  622.         db 82,74,79,216 ;ldir
  623.         db 73,86,79,216 ;cpir
  624.         db 79,84,79,216 ;inir
  625.         db 85,90,79,216 ;otir
  626.         db 82,74,202 ;ldd
  627.         db 73,86,202 ;cpd
  628.         db 79,84,202 ;ind
  629.         db 85,91,90,202 ;outd
  630.         db 82,74,74,216 ;lddr
  631.         DB 73,86,74,216 ;cpdr
  632.         db 79,84,74,216 ;indr
  633.         db 85,90,74,216 ;otdr
  634. COM2
  635.         DB 46,2,47,50,199 ;(rp),a
  636.         db 71,50,46,2,175 ;a,(rp)
  637.         db 46,2,47,50,199 ;(rp),a
  638.         db 71,50,46,2,175 ;a,(rp)
  639.         db 46,4,47,50,128 ;(i16),hl/ix/iy
  640.         db 0,50,46,4,175 ;hl/ix/iy,(i16)
  641.         db 46,4,47,50,199 ;(i16),a
  642.         db 71,50,46,4,175 ;a,(i16)
  643.  
  644. Disasm_GetCmdLen_bc
  645.        ;push hl
  646.         call Disasm_LEN ;return b=len
  647.        ;pop hl
  648.         LD A,B
  649.         DEC A
  650.         CP 5
  651.         JR C,$+4
  652.          LD B,1 ;если много префиксов, оставляем один
  653.         ld c,b
  654.         ld b,0
  655.         ret
  656.  
  657. ;COUNT Z80 COMMAND LENGTH
  658. Disasm_LEN ;return b=len
  659.         ;PUSH HL
  660.         LD E,0x40;64 ;const (used 5 times)
  661.         LD BC,#0301;769 ;c=1: не было dd/fd
  662. LNX     LD D,(HL)
  663.         LD A,D
  664.         CP 0xdd;221
  665.         JR NZ,LENL1
  666. LENL0   INC HL
  667.         INC C
  668.         INC B
  669.         JR LNX
  670. LENL1
  671. ;b=3+
  672.         CP 0xfd;253
  673.         JR Z,LENL0 ;может зациклиться на префиксах
  674.         CP 0xcd;205 ;call
  675.         JR Z,LENend
  676.         CP 0xc3;195 ;jp
  677.         JR Z,LENend
  678.         DEC B ;b=2+
  679.         CP 0xcb;203
  680.         JR Z,LENend
  681.         CP 0xd3;211 ;out (n),a
  682.         JR Z,LENend
  683.         CP 0xdb;219 ;in a,(n)
  684.         JR Z,LENend
  685.         CP 0xed;237
  686.         JR NZ,LENL2
  687. ;ed
  688.         INC HL
  689.         LD A,(HL)
  690.         add a,a
  691.         LD A,(HL)
  692.         ;POP HL
  693.         RET C
  694.        ret p
  695. ;ed 40..7f
  696.         AND 7
  697.         CP 3
  698.         RET NZ
  699.         INC B
  700.         INC B ;ld rp,(mm)/ld (mm),rp
  701.         RET
  702. LENL2 ;b=2+
  703.         AND 7
  704.         JR NZ,LENL6
  705.         LD A,D
  706.         CP 16
  707.         JR C,LENendB1
  708. LNY     CP E;0x40
  709.         JR LENL7
  710. LENL6 ;b=2+
  711.         CP 6
  712.         JR NZ,LENL5
  713.         LD A,D
  714.         SUB E;0x40
  715. ;LENrlaL7
  716.         RLA
  717. LENL7
  718.         JR C,LENend
  719. LENendB1
  720.         dec b ;LD B,1
  721. LENend
  722.         ;POP HL
  723.         DEC C
  724.         RET Z ;не было dd/fd
  725. ;b=длина команды + длина префикса
  726. ;надо добавить 1 байт (iz+) для некоторых команд
  727.         ;INC B
  728.         LD A,D
  729.         CP 0xcb;203
  730.         JR Z,LENINCB ;везде появляется iz+d
  731.         CP 0x34;52 ;inc (hl)/(iz+)
  732.         ret c ;JR C,LENL3 ;<0x34
  733.         CP 0x37;55
  734.        if 0
  735.         CCF
  736.         JR LENretcINCB ;0x34..0x36: inc (hl),dec (hl),ld (hl),i8 do b++
  737.        endif
  738.        if 1
  739.         JR c,LENINCB ;0x34..0x36: inc (hl),dec (hl),ld (hl),i8 do b++
  740.         xor 6 ;чтобы halt вышел за диапазон сравнения
  741.         cp 0x70
  742.         ret z ;halt
  743.         jr c,LENend_noldmreg
  744.         cp 0x78
  745.         jr c,LENINCB ;ld (hl),reg
  746. LENend_noldmreg
  747.         sub 0x40
  748.         ret m
  749.         and 7
  750.         ret nz
  751.         ;jr LENINCB
  752.        endif
  753.        if 0
  754. LENL3
  755.         AND 7
  756.         CP 6
  757.         JR NZ,LENL4
  758.         LD A,D
  759.         ADD A,E;0x40
  760.         RLA
  761. LENretcINCB
  762.         RET C
  763.        endif
  764. LENINCB
  765.         INC B
  766.         RET
  767.        if 0
  768. LENL4
  769.         XOR D
  770.         CP 0x70 ;112
  771.         RET NZ
  772.         INC B
  773.         RET
  774.        endif
  775.  
  776. LENL5
  777.         INC B ;b=3+
  778.         CP 2
  779.         JR NZ,LENL8
  780.         LD A,D
  781.         ADD A,E;0x40
  782.         JR C,LENend
  783.         CP 0x60 ;96
  784.        dec b
  785.         JR C,LENendB1
  786.        inc b
  787.         CPL
  788.         ;JR LENrlaL7
  789.         RLA
  790.         jr len3or1
  791. LENL8 ;b=3+
  792.         CP 4
  793.         LD A,D
  794.         JR NZ,LENL9
  795.         ADD A,E;0x40
  796.         ;JR LENL7
  797. len3or1
  798.         JR C,LENend ;call pp,nn
  799.         dec b
  800.         jr LENendB1
  801. LENL9 ;b=3+
  802.         AND 15
  803.        dec b
  804.         DEC A
  805.         JR NZ,LENendB1
  806.        inc b
  807.         LD A,D
  808.         ;JR LNY
  809.         CP E;0x40
  810.         jr len3or1
  811.