Subversion Repositories NedoOS

Rev

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