?login_element?

Subversion Repositories NedoOS

Rev

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

  1. asmcmd
  2. ;de=cmd text
  3. ;hl=code generated ;out: after the code
  4. ;out: NZ=error
  5.         asmgetchar
  6.         cp 'l'
  7.         jp z,asmcmd_l
  8.         cp 'c'
  9.         jp z,asmcmd_c
  10.         cp 'i'
  11.         jp z,asmcmd_i
  12.         cp 'd'
  13.         jp z,asmcmd_d
  14.         cp 'a'
  15.         jp z,asmcmd_a
  16.         cp 'o'
  17.         jp z,asmcmd_o
  18.         cp 'x'
  19.         jp z,asmcmd_x
  20.         cp 's'
  21.         jp z,asmcmd_s
  22.         cp 'e'
  23.         jp z,asmcmd_e
  24.         cp 'r'
  25.         jp z,asmcmd_r
  26.         cp 'b'
  27.         jp z,asmcmd_b
  28.         cp 'j'
  29.         jr z,asmcmd_j
  30.         cp 'p'
  31.         jr z,asmcmd_p
  32.         cp 'n'
  33.         ret nz
  34. asmcmd_n
  35. ;nop/neg
  36.         asmnextchar ;eat
  37.         asmgetchar
  38.         cp 'o'
  39.         jr z,asmcmd_no_
  40.         MATCH 'e'
  41.         MATCH_NOEAT 'g'
  42.         asmputbyte 0xed
  43.         asmputbyteOK 0x44 ;neg
  44.         ASMNEXTCHAR_LAST;asmnextchar
  45.         ASMGETCHAR_LAST;asmgetchar
  46.         ASMCMD_MATCHENDWORD
  47. asmcmd_no_
  48.         asmnextchar ;eat
  49.         asmgetchar
  50.         sub 'p'
  51.         ret nz
  52.         asmputbyte_a ;nop
  53.         ASMNEXTCHAR_LAST;asmnextchar
  54.         ASMGETCHAR_LAST;asmgetchar
  55.         ASMCMD_MATCHENDWORD
  56.  
  57. asmcmd_p
  58. ;pop/push
  59.         asmnextchar ;eat
  60.         asmgetchar
  61.         cp 'o'
  62.         jr z,asmcmd_po_
  63.         ld b,0xc5 ;push base
  64.         MATCH 'u'
  65.         MATCH 's'
  66.         cp 'h'
  67.         ret nz
  68. asmcmd_poppush
  69.         asmnextchar ;eat
  70.         asmgetchar
  71.         MATCHSPACES
  72.         cp 'i'
  73.         jr z,asmcmd_poppush_i
  74.         cp 'a'
  75.         jr z,asmcmd_poppush_a
  76.         call matchrp
  77.         jp z,asmcmd_putbplusc
  78.         ret ;nz (error)
  79. asmcmd_poppush_i
  80.         asmnextchar ;eat
  81.         asmgetchar
  82.         MATCHXY_PUTDDFD_NOEAT
  83.         set 5,b
  84.         asmputbyte_b ;pop/push hl
  85.         ASMNEXTCHAR_LAST;asmnextchar
  86.         ASMGETCHAR_LAST;asmgetchar
  87.         ASMCMD_MATCHENDWORD
  88. asmcmd_poppush_a
  89.         asmnextchar ;eat
  90.         asmgetchar
  91.         MATCH_NOEAT 'f'
  92.         ld a,b
  93.         add a,0x30
  94.         asmputbyte_a ;pop/push hl
  95.         ASMNEXTCHAR_LAST;asmnextchar
  96.         ASMGETCHAR_LAST;asmgetchar
  97.         ;ASMCMD_MATCHENDWORD
  98.         cp a ;Z
  99.         ret
  100.  
  101. asmcmd_j
  102. ;jr/jp
  103.         asmnextchar ;eat
  104.         asmgetchar
  105.         cp 'p'
  106.         jr z,asmcmd_jp;jp z,asmcmd_jpcall
  107.         MATCH 'r'
  108.         MATCHSPACES
  109.         call matchcc_forjr
  110.         jr z,asmcmd_jrcc
  111.         asmputbyte 0x18
  112.         jp asmcmd_jrs
  113. asmcmd_jp
  114.         asmnextchar ;eat
  115.         asmgetchar
  116.         MATCHSPACES
  117.         CPOPENBRACKET_JR asmcmd_jp_bracket
  118.         ld bc,256*(0xc2-0x20)+0xc3 ;jp base
  119.         jp asmcmd_jpcall
  120.  
  121. asmcmd_po_
  122.         asmnextchar ;eat
  123.         asmgetchar
  124.         cp 'p'
  125.         ld b,0xc1 ;pop base
  126.         jr z,asmcmd_poppush
  127.         ret ;nz (error)
  128.  
  129. asmcmd_jp_bracket
  130.         asmnextchar ;eat
  131.         asmgetchar
  132.         cp 'i'
  133.         jr z,asmcmd_jp_bracket_i
  134.         MATCH 'h'
  135.         MATCH_NOEAT 'l'
  136. asmcmd_jp_bracket_hl
  137.         asmnextchar
  138.         asmgetchar
  139.         MATCHCLOSEBRACKET_NOEAT
  140.         asmputbyte 0xe9 ;jp (hl)
  141.         ASMNEXTCHAR_LAST;asmnextchar
  142.         ASMGETCHAR_LAST;asmgetchar
  143.         ASMCMD_MATCHENDWORD
  144. asmcmd_jp_bracket_i
  145.         asmnextchar ;eat
  146.         asmgetchar
  147.         MATCHXY_PUTDDFD_NOEAT
  148.         jr asmcmd_jp_bracket_hl
  149.  
  150. asmcmd_jrcc
  151.         SKIPSPACES_BEFORECOMMA
  152.         MATCH ','
  153.         SKIPSPACES_AFTERCOMMA
  154.         asmputbyte_c ;jr cc
  155.         jp asmcmd_jrs
  156.  
  157. asmcmd_e
  158. ;ei/ex/exx
  159.         asmnextchar ;eat
  160.         asmgetchar
  161.         cp 'x'
  162.         jr z,asmcmd_ex_
  163.         MATCH_NOEAT 'i'
  164.         asmputbyte 0xfb ;ei
  165.         ASMNEXTCHAR_LAST;asmnextchar
  166.         ASMGETCHAR_LAST;asmgetchar
  167.         ASMCMD_MATCHENDWORD
  168. asmcmd_ex_
  169.         asmnextchar ;eat
  170.         asmgetchar
  171.         cp 'x'
  172.         jr z,asmcmd_exx
  173.         MATCHSPACES
  174. ;ex de,hl/ex af,af'/ex (sp),hl/iz
  175.         cp 'a'
  176.         jr z,asmcmd_ex_a
  177.         cp 'd'
  178.         jr z,asmcmd_ex_d
  179.         MATCHOPENBRACKET
  180.         MATCH 's'
  181.         MATCH 'p'
  182.         MATCHCLOSEBRACKET
  183.         SKIPSPACES_BEFORECOMMA
  184.         MATCH ','
  185.         SKIPSPACES_AFTERCOMMA
  186.         cp 'i'
  187.         jr z,asmcmd_ex_bracket_sp_bracket_i
  188.         MATCH 'h'
  189.         MATCH_NOEAT 'l'
  190. asmcmd_ex_bracket_sp_bracket_hl
  191.         asmputbyte 0xe3 ;ex (sp),hl
  192.         ASMNEXTCHAR_LAST;asmnextchar
  193.         ASMGETCHAR_LAST;asmgetchar
  194.         ASMCMD_MATCHENDWORD
  195. asmcmd_ex_bracket_sp_bracket_i
  196.         asmnextchar ;eat
  197.         asmgetchar
  198.         MATCHXY_PUTDDFD_NOEAT
  199.         jr asmcmd_ex_bracket_sp_bracket_hl
  200. asmcmd_ex_d
  201.         asmnextchar ;eat
  202.         asmgetchar
  203.         MATCH 'e'
  204.         SKIPSPACES_BEFORECOMMA
  205.         MATCH ','
  206.         SKIPSPACES_AFTERCOMMA
  207.         MATCH 'h'
  208.         MATCH_NOEAT 'l'
  209.         asmputbyteOK 0xeb ;ex de,hl
  210.         ASMNEXTCHAR_LAST;asmnextchar
  211.         ASMGETCHAR_LAST;asmgetchar
  212.         ;cp a ;Z
  213.         ret
  214. asmcmd_exx
  215.         asmputbyte 0xd9 ;exx
  216.         ASMNEXTCHAR_LAST;asmnextchar
  217.         ASMGETCHAR_LAST;asmgetchar
  218.         ASMCMD_MATCHENDWORD
  219. asmcmd_ex_a
  220.         asmnextchar ;eat
  221.         asmgetchar
  222.         MATCH 'f'
  223.         SKIPSPACES_BEFORECOMMA
  224.         MATCH ','
  225.         SKIPSPACES_AFTERCOMMA
  226.         MATCH 'a'
  227.         MATCH 'f'
  228.         MATCH_NOEAT 0x27 ;'
  229.         asmputbyteOK 0x08 ;ex af,af'
  230.         ASMNEXTCHAR_LAST;asmnextchar
  231.         ASMGETCHAR_LAST;asmgetchar
  232.         ;cp a ;Z
  233.         ret
  234.  
  235. asmcmd_r
  236. ;ret/res/rl*/rlc*/rr*/rrc*/rst
  237.         asmnextchar ;eat
  238.         asmgetchar
  239.         cp 'e'
  240.         jr z,asmcmd_re_
  241.         cp 'l'
  242.         jr z,asmcmd_rl_
  243.         cp 'r'
  244.         jr z,asmcmd_rr_
  245.         MATCH 's'
  246.         MATCH 't'
  247.         MATCHSPACES
  248.         call matchexpr
  249.         ret nz
  250.         ld a,c
  251.         or 0xc7
  252.         asmputbyte_a
  253.         cp a ;Z
  254.         ret
  255. asmcmd_re_
  256.         asmnextchar ;eat
  257.         asmgetchar
  258.         cp 't'
  259.         jr z,asmcmd_ret
  260.         MATCH_NOEAT 's'
  261.         ld lx,0x80 ;res base
  262.         jp asmcmd_res
  263. asmcmd_ret
  264.         asmnextchar ;eat
  265.         asmgetchar
  266.         call matchspaces
  267.         jr nz,asmcmd_ret_nocc
  268.         call matchcc
  269.         ld a,0xc0-0x20 ;ret cc
  270.         jp z,asmcmd_putaplusc
  271. asmcmd_ret_nocc
  272.         asmputbyte 0xc9 ;ret
  273.         cp a ;Z
  274.         ret
  275.        
  276. asmcmd_rl_
  277.         asmnextchar ;eat
  278.         asmgetchar
  279.         cp 'a'
  280.         jr z,asmcmd_rla
  281.         cp 'c'
  282.         ld b,0x10 ;rl base
  283.         jr nz,asmcmd_anycbshift_noeat
  284.         asmnextchar ;eat
  285.         asmgetchar
  286.         cp 'a'
  287.         ld b,0x00 ;rlc base
  288.         jr nz,asmcmd_anycbshift_noeat
  289.         asmputbyteOK 0x07 ;rlca
  290.         ;cp a ;Z
  291.         ret
  292. asmcmd_rla
  293.         asmputbyteOK 0x17 ;rla
  294.         ;cp a ;Z
  295.         ret
  296. asmcmd_rr_
  297.         asmnextchar ;eat
  298.         asmgetchar
  299.         cp 'a'
  300.         jr z,asmcmd_rra
  301.         cp 'c'
  302.         ld b,0x18 ;rr base
  303.         jr nz,asmcmd_anycbshift_noeat
  304.         asmnextchar ;eat
  305.         asmgetchar
  306.         cp 'a'
  307.         ld b,0x08 ;rrc base
  308.         jr nz,asmcmd_anycbshift_noeat
  309.         asmputbyteOK 0x0f ;rrca
  310.         ;cp a ;Z
  311.         ret
  312. asmcmd_rra
  313.         asmputbyteOK 0x1f ;rra
  314.         ;cp a ;Z
  315.         ret
  316.  
  317. asmcmd_s
  318. ;sub/sbc/scf/set/srl/sra/sla/sli
  319.         asmnextchar ;eat
  320.         asmgetchar
  321.         cp 'u'
  322.         jp z,asmcmd_su_
  323.         cp 'b'
  324.         jp z,asmcmd_sb_
  325.         cp 'c'
  326.         jr z,asmcmd_sc_
  327.         cp 'e'
  328.         jp z,asmcmd_se_
  329.         cp 'r'
  330.         jr z,asmcmd_sr_
  331.         MATCH 'l'
  332.         cp 'a'
  333.         ld b,0x20 ;sla base
  334.         jr z,asmcmd_anycbshift
  335.         cp 'i'
  336.         ret nz
  337.         ld b,0x30 ;sli base
  338. asmcmd_anycbshift
  339.         asmnextchar ;eat
  340.         asmgetchar
  341. asmcmd_anycbshift_noeat
  342.         MATCHSPACES
  343.         call matchrb_ora
  344.         jr nz,asmcmd_anycbshift_noreg
  345.         asmputbyte 0xcb
  346.         ld a,c
  347.         cp 8
  348.         jp c,asmcmd_putaplusb
  349.         ret ;nz (error) if hx/hy/lx/ly
  350.  
  351. asmcmd_sc_
  352.         asmnextchar ;eat
  353.         asmgetchar
  354.         MATCH_NOEAT 'f'
  355.         asmputbyte 0x37 ;scf
  356.         ASMNEXTCHAR_LAST;asmnextchar
  357.         ASMGETCHAR_LAST;asmgetchar
  358.         ASMCMD_MATCHENDWORD
  359.  
  360. asmcmd_sr_
  361.         asmnextchar ;eat
  362.         asmgetchar
  363.         cp 'a'
  364.         ld b,0x28 ;sra base
  365.         jr z,asmcmd_anycbshift
  366.         cp 'l'
  367.         ld b,0x38 ;srl base
  368.         jr z,asmcmd_anycbshift
  369.         ret ;nz (error)
  370. asmcmd_anycbshift_bracket_i
  371.         asmnextchar ;eat
  372.         asmgetchar
  373.         MATCHXY_PUTDDFD_NOEAT
  374.         asmnextchar ;eat
  375.         asmputbyte 0xcb
  376.         ld a,b ;anycbshift base
  377.         add a,6 ;(hl)
  378.        ex af,af' ;'
  379.         asmgetchar
  380.         call matchexpr
  381.         ret nz
  382.         MATCHCLOSEBRACKET_NOGET
  383.         asmputbyte_c
  384.        ex af,af' ;'
  385.         asmputbyte_a
  386.         cp a ;Z
  387.         ret
  388. asmcmd_anycbshift_noreg
  389.         MATCHOPENBRACKET
  390. ;[hl]/[iz+]
  391.         cp 'i'
  392.         jr z,asmcmd_anycbshift_bracket_i
  393.         MATCH 'h'
  394.         MATCH 'l'
  395.         MATCHCLOSEBRACKET_NOGET
  396.         asmputbyte 0xcb
  397.         ld a,b ;anycbshift base
  398.         add a,6 ;(hl)
  399.         asmputbyte_a
  400.         cp a ;Z
  401.         ret
  402.  
  403. asmcmd_b
  404.         ld lx,0x40 ;bit base
  405.         asmnextchar ;eat
  406.         asmgetchar
  407.         cp 'i'
  408.         jr z,asmcmd_bise
  409.         ret ;nz (error)
  410. asmcmd_se_
  411.         ld lx,0xc0 ;set base
  412. asmcmd_bise
  413.         asmnextchar ;eat
  414.         asmgetchar
  415.         MATCH_NOEAT 't'
  416. asmcmd_res
  417.         asmnextchar ;eat
  418.         asmgetchar
  419.         MATCHSPACES
  420.         call matchexpr
  421.         ret nz
  422.         ld a,c
  423.         and 7
  424.         add a,a
  425.         add a,a
  426.         add a,a
  427.         add a,lx ;base
  428.         ld b,a
  429.         asmgetchar
  430.         SKIPSPACES_BEFORECOMMA
  431.         MATCH ','
  432.         SKIPSPACES_AFTERCOMMA
  433.         call matchrb_ora
  434.         jr nz,asmcmd_anycbshift_noreg;asmcmd_bitresset_noreg
  435.         asmputbyte 0xcb
  436.         bit 4,c
  437.         jp z,asmcmd_putcand7plusb ;bit #
  438.         ret ;nz (error) ;hx/lx/hy/ly
  439.  
  440. asmcmd_su_
  441.         asmnextchar ;eat
  442.         asmgetchar
  443.         MATCH 'b'
  444.         ld b,0x90 ;sub base
  445.         jp asmcmd_ALU
  446. asmcmd_sb_
  447.         asmnextchar ;eat
  448.         asmgetchar
  449.         MATCH 'c'
  450.         MATCHSPACES
  451.         cp 'a'
  452.         ld b,0x98 ;sbc a base
  453.         jp z,asmcmd_aluop_a
  454.         ld b,0x42 ;sbc hl,rp base
  455.         jr asmcmd_adcsbc_hl
  456.  
  457. asmcmd_a
  458. ;add/adc/and
  459.         asmnextchar ;eat
  460.         asmgetchar
  461.         cp 'd'
  462.         jr z,asmcmd_ad_
  463.         MATCH 'n'
  464.         MATCH 'd'
  465.         ld b,0xa0 ;and base
  466.         jp asmcmd_ALU ;b=ALUop base
  467. asmcmd_add_i
  468.         asmnextchar ;eat
  469.         asmgetchar
  470.        ld c,a
  471.         MATCHXY_PUTDDFD_NOEAT
  472.         asmnextchar ;eat
  473.         asmgetchar
  474.         SKIPSPACES_BEFORECOMMA
  475.         MATCH ','
  476.         SKIPSPACES_AFTERCOMMA
  477. ;add iz,rp/iz
  478.         cp 'i'
  479.         jr z,asmcmd_add_iz_comma_i
  480.         call matchrp_orsp
  481.         ret nz
  482.         ld a,c
  483.         cp 0x20 ;h
  484.         jr nz,asmcmd_add_hl_rp
  485.         or a ;nz (error)
  486.         ret
  487. asmcmd_add_iz_comma_i
  488.         asmnextchar ;eat
  489.         asmgetchar
  490.        cp c
  491.         ret nz ;nz (error)
  492.         asmputbyte 0x29 ;add hl,hl
  493.         ASMNEXTCHAR_LAST;asmnextchar
  494.         ASMGETCHAR_LAST;asmgetchar
  495.         ASMCMD_MATCHENDWORD
  496. asmcmd_ad_
  497.         asmnextchar ;eat
  498.         asmgetchar
  499.         cp 'd'
  500.         jr z,asmcmd_add
  501.         MATCH 'c'
  502.         MATCHSPACES
  503.         cp 'a'
  504.         ld b,0x88 ;adc a base
  505.         jr z,asmcmd_aluop_a
  506.         ld b,0x4a ;adc hl,rp base
  507. asmcmd_adcsbc_hl
  508.         MATCH 'h'
  509.         MATCH 'l'
  510.         SKIPSPACES_BEFORECOMMA
  511.         MATCH ','
  512.         SKIPSPACES_AFTERCOMMA
  513.         call matchrp_orsp ;c=0/0x10/0x20/0x30 (bc/de/hl/sp)
  514.         asmputbyte 0xed
  515. asmcmd_putbplusc
  516.         ld a,b
  517. asmcmd_putaplusc
  518.         add a,c ;0/0x10/0x20/0x30
  519.         asmputbyte_a
  520.         cp a ;Z
  521.         ret
  522. asmcmd_add
  523.         asmnextchar ;eat
  524.         asmgetchar
  525.         SKIPSPACES
  526.         cp 'a'
  527.         ld b,0x80 ;add a base
  528.         jr z,asmcmd_aluop_a
  529. ;add hl/iz
  530.         cp 'i'
  531.         jr z,asmcmd_add_i
  532.         MATCH 'h'
  533.         MATCH 'l'
  534.         SKIPSPACES_BEFORECOMMA
  535.         MATCH ','
  536.         SKIPSPACES_AFTERCOMMA
  537.         call matchrp_orsp ;c=0/0x10/0x20/0x30 (bc/de/hl/sp)
  538. asmcmd_add_hl_rp
  539.         ld a,0x09 ;add hl,rp
  540.         jp asmcmd_putaplusc
  541.  
  542. asmcmd_aluop_a
  543.         asmnextchar ;eat
  544.         asmgetchar
  545.         SKIPSPACES_BEFORECOMMA
  546.         MATCH ','
  547.         SKIPSPACES_AFTERCOMMA
  548.         jp asmcmd_ALU_nospaces ;b=ALUop base
  549.  
  550. asmcmd_out_bracket_c
  551.         asmnextchar ;eat
  552.         asmgetchar
  553.         call matchendword_back1
  554.         jr nz,asmcmd_out_expr
  555.         MATCHCLOSEBRACKET
  556.         MATCH ','
  557.         asmputbyte 0xed
  558.         cp '0'
  559.         jr z,asmcmd_out_c_0
  560.         call matchrb_ora        
  561.         ld a,c ;reg
  562.         add a,a
  563.         add a,a
  564.         add a,a
  565.         ret m ;nz: индексный регистр - error
  566.         add a,0x41 ;out (c),r
  567.         asmputbyte_a
  568.         cp a ;Z
  569.         ret
  570.        
  571. asmcmd_out_c_0
  572.         asmputbyte 0x71 ;out (c),0
  573.         ASMNEXTCHAR_LAST;asmnextchar
  574.         ASMGETCHAR_LAST;asmgetchar
  575.         ASMCMD_MATCHENDWORD
  576. asmcmd_ou_
  577.         asmnextchar ;eat
  578.         asmgetchar
  579.         MATCH 't'
  580.         cp 'i'
  581.         jr z,asmcmd_outi
  582.         cp 'd'
  583.         jr z,asmcmd_outd
  584.         MATCHSPACES
  585. ;out (c),r/0/out (n),a
  586.         MATCHOPENBRACKET
  587.         cp 'c'
  588.         jr z,asmcmd_out_bracket_c
  589. asmcmd_out_expr
  590.         call matchexpr
  591.         ret nz
  592.         MATCHCLOSEBRACKET
  593.         SKIPSPACES_BEFORECOMMA
  594.         MATCH ','
  595.         SKIPSPACES_AFTERCOMMA
  596.         MATCH_NOEAT 'a'
  597.         asmputbyte 0xd3 ;out (n),a
  598.         asmputbyte_c
  599.         ASMNEXTCHAR_LAST;asmnextchar
  600.         ASMGETCHAR_LAST;asmgetchar
  601.         ASMCMD_MATCHENDWORD
  602.        
  603. asmcmd_outd
  604.         asmputbyte 0xed
  605.         asmputbyte 0xab ;outd
  606.         ASMNEXTCHAR_LAST;asmnextchar
  607.         ASMGETCHAR_LAST;asmgetchar
  608.         ASMCMD_MATCHENDWORD
  609. asmcmd_outi
  610.         asmputbyte 0xed
  611.         asmputbyte 0xa3 ;outi
  612.         ASMNEXTCHAR_LAST;asmnextchar
  613.         ASMGETCHAR_LAST;asmgetchar
  614.         ASMCMD_MATCHENDWORD
  615.  
  616. asmcmd_o
  617. ;or/out*/ot*
  618.         asmnextchar ;eat
  619.         asmgetchar
  620.         cp 'r'
  621.         jr z,asmcmd_or
  622.         cp 'u'
  623.         jr z,asmcmd_ou_
  624.         MATCH 't'
  625.         asmputbyte 0xed
  626.         cp 'i'
  627.         jr z,asmcmd_oti_
  628.         MATCH 'd'
  629.         MATCH_NOEAT 'r'
  630.         asmputbyte 0xbb ;otdr
  631.         ASMNEXTCHAR_LAST;asmnextchar
  632.         ASMGETCHAR_LAST;asmgetchar
  633.         ASMCMD_MATCHENDWORD
  634. asmcmd_oti_
  635.         asmnextchar ;eat
  636.         asmgetchar
  637.         MATCH_NOEAT 'r'
  638.         asmputbyte 0xb3 ;otir
  639.         ASMNEXTCHAR_LAST;asmnextchar
  640.         ASMGETCHAR_LAST;asmgetchar
  641.         ASMCMD_MATCHENDWORD
  642.  
  643. asmcmd_or
  644.         ld b,0xb0 ;or base
  645.         asmnextchar ;eat
  646.         asmgetchar
  647.         jr asmcmd_ALU ;b=ALUop base
  648.  
  649. asmcmd_x
  650. ;xor
  651.         asmnextchar ;eat
  652.         asmgetchar
  653.         MATCH 'o'
  654.         MATCH 'r'
  655.         ld b,0xa8 ;xor base
  656.         jr asmcmd_ALU ;b=ALUop base
  657.  
  658. asmcmd_cp_
  659.         asmnextchar ;eat
  660.         asmgetchar
  661.         cp 'i'
  662.         jr z,asmcmd_cpi_
  663.         cp 'd'
  664.         jr z,asmcmd_cpd_
  665. ;cp r/i8/(hl)/(iz+)
  666.         ld b,0xb8 ;cp base
  667. asmcmd_ALU ;b=ALUop base
  668.         MATCHSPACES
  669. asmcmd_ALU_nospaces
  670. ;cp(ALUop) r/i8/(hl)/(iz+)
  671.         call matchrb_ora
  672.         jr nz,asmcmd_cp_noreg
  673.         ld a,c ;reg
  674.         cp 8
  675.         jr c,asmcmd_putaplusb
  676.         or 0xdd
  677.         asmputbyte_a
  678. asmcmd_putcand7plusb
  679.         ld a,c ;reg(4/5)+0x50/0x70
  680.         and 7
  681. asmcmd_putaplusb
  682.         add a,b ;ALUop base
  683.         asmputbyte_a
  684.         cp a ;Z
  685.         ret
  686. asmcmd_cp_noreg
  687.         ;cp '('
  688.         ;jp z,asmcmd_ld_reg_bracket;asmcmd_cp_bracket
  689.         ;cp '['|OR20FORBRACKETS
  690.         ;jp z,asmcmd_ld_reg_bracket;asmcmd_cp_bracket
  691.         CPOPENBRACKET_JP asmcmd_ld_reg_bracket
  692.         ;ld c,a
  693.         ld a,b
  694.         add a,0xfe-0xb8
  695.         asmputbyte_a ;cp i8
  696.         asmgetchar;ld a,c
  697.         jp asmmatchexpr_putc
  698. asmcmd_cpi_
  699.         asmnextchar ;eat
  700.         asmgetchar
  701.         asmputbyte 0xed
  702.         cp 'r'
  703.         jr z,asmcmd_cpir
  704.         asmputbyte 0xa1 ;cpi
  705.         ASMCMD_MATCHENDWORD
  706. asmcmd_cpir
  707.         asmputbyte 0xb1 ;cpir
  708.         ASMNEXTCHAR_LAST;asmnextchar
  709.         ASMGETCHAR_LAST;asmgetchar
  710.         ASMCMD_MATCHENDWORD
  711. asmcmd_cpd_
  712.         asmnextchar ;eat
  713.         asmgetchar
  714.         asmputbyte 0xed
  715.         cp 'r'
  716.         jr z,asmcmd_cpdr
  717.         asmputbyte 0xa9 ;cpd
  718.         ASMCMD_MATCHENDWORD
  719. asmcmd_cpdr
  720.         asmputbyte 0xb9 ;cpdr
  721.         ASMNEXTCHAR_LAST;asmnextchar
  722.         ASMGETCHAR_LAST;asmgetchar
  723.         ASMCMD_MATCHENDWORD
  724.  
  725. asmcmd_c
  726. ;call/cp/ccf/cpi*/cpd*
  727.         asmnextchar ;eat
  728.         asmgetchar
  729.         cp 'a'
  730.         jr z,asmcmd_ca_
  731.         cp 'p'
  732.         jr z,asmcmd_cp_
  733.         MATCH 'c'
  734.         MATCH_NOEAT 'f'
  735.         asmputbyte 0x3f ;ccf
  736.         ASMNEXTCHAR_LAST;asmnextchar
  737.         ASMGETCHAR_LAST;asmgetchar
  738.         ASMCMD_MATCHENDWORD
  739. asmcmd_ca_
  740.         asmnextchar ;eat
  741.         asmgetchar
  742.         MATCH 'l'
  743.         cp 'l'
  744.         ret nz
  745.         ld bc,256*(0xc4-0x20)+0xcd ;call base
  746. ;asmcmd_jpcall
  747.         asmnextchar ;eat
  748.         asmgetchar
  749.         MATCHSPACES
  750. asmcmd_jpcall
  751.         call matchcc
  752.         jr z,asmcmd_callcc
  753.         asmputbyte_c ;0xcd ;call
  754.         jp asmmatchexpr_emitword_bc        
  755. asmcmd_callcc
  756.         SKIPSPACES_BEFORECOMMA
  757.         cp ','
  758.         ret nz
  759.         ld a,c ;0x20+cc*8
  760.         add a,b ;0xc4-0x20
  761.         ;add a,0xc4-0x20-0xcd
  762.         asmputbyte_a ;call cc
  763.         asmnextchar ;eat
  764.         asmgetchar
  765.         SKIPSPACES_AFTERCOMMA
  766.         jp asmmatchexpr_emitword_bc        
  767.        
  768. asmcmd_ini_
  769.         asmnextchar ;eat
  770.         asmgetchar
  771.         asmputbyte 0xed
  772.         cp 'r'
  773.         jr z,asmcmd_inir
  774.         asmputbyte 0xa2 ;ini
  775.         ASMCMD_MATCHENDWORD
  776. asmcmd_inir
  777.         asmputbyte 0xb2 ;inir
  778.         ASMNEXTCHAR_LAST;asmnextchar
  779.         ASMGETCHAR_LAST;asmgetchar
  780.         ASMCMD_MATCHENDWORD
  781. asmcmd_ind_
  782.         asmnextchar ;eat
  783.         asmgetchar
  784.         asmputbyte 0xed
  785.         cp 'r'
  786.         jr z,asmcmd_indr
  787.         asmputbyte 0xaa ;ind
  788.         ASMCMD_MATCHENDWORD
  789. asmcmd_indr
  790.         asmputbyte 0xba ;indr
  791.         ASMNEXTCHAR_LAST;asmnextchar
  792.         ASMGETCHAR_LAST;asmgetchar
  793.         ASMCMD_MATCHENDWORD
  794. asmcmd_i
  795. ;inc/in/ini*/ind*/im
  796.         asmnextchar ;eat
  797.         asmgetchar
  798.         cp 'n'
  799.         jr z,asmcmd_in_
  800.         MATCH 'm'
  801.         MATCHSPACES
  802.         call matchexpr
  803.         ret nz
  804.         asmputbyte 0xed
  805.         ld a,2
  806.         sub c
  807.         ret c ;nz
  808.         dec a
  809.         ld a,0x56
  810.         jr z,asmcmd_im1
  811.         ld a,0x5e
  812.         jp m,asmcmd_im2
  813.         ld a,0x46
  814. asmcmd_im1
  815. asmcmd_im2
  816.         asmputbyte_a
  817.         cp a ;Z
  818.         ret
  819. asmcmd_inf
  820.         asmputbyte 0xed
  821.         asmputbyte 0x70 ;inf
  822.         ASMNEXTCHAR_LAST;asmnextchar
  823.         ASMGETCHAR_LAST;asmgetchar
  824.         ASMCMD_MATCHENDWORD
  825. asmcmd_in_
  826.         asmnextchar ;eat
  827.         asmgetchar
  828.         cp 'c'
  829.         jr z,asmcmd_inc
  830.         cp 'i'
  831.         jr z,asmcmd_ini_
  832.         cp 'd'
  833.         jr z,asmcmd_ind_
  834.         cp 'f'
  835.         jr z,asmcmd_inf
  836. ;in r,(c)/in a,(i8)
  837.         MATCHSPACES
  838.         call matchrb_ora
  839.         SKIPSPACES_BEFORECOMMA
  840.         MATCH ','
  841.         SKIPSPACES_AFTERCOMMA
  842.         MATCHOPENBRACKET
  843.         cp 'c'
  844.         jr z,asmcmd_in_bracket_c
  845. asmcmd_in_expr
  846.         ;ld b,a
  847.         ld a,c
  848.         cp 7
  849.         ret nz
  850.         asmgetchar;ld a,b
  851.         call matchexpr
  852.         ret nz
  853.         MATCHCLOSEBRACKET_NOGET
  854.         asmputbyte 0xdb ;in a,(n)
  855.         asmputbyte_c
  856.         cp a ;Z
  857.         ret
  858. asmcmd_in_bracket_c
  859.         asmnextchar ;eat
  860.         asmgetchar
  861.         call matchendword_back1
  862.         jr nz,asmcmd_in_expr
  863.         MATCHCLOSEBRACKET_NOGET
  864.         asmputbyte 0xed
  865.         ld a,c ;reg
  866.         add a,a
  867.         add a,a
  868.         add a,a
  869.         ret m ;nz: индексный регистр - error
  870.         add a,0x40
  871.         asmputbyte_a ;in r,(c)
  872.         cp a ;Z
  873.         ret
  874. asmcmd_inc
  875.         asmnextchar ;eat
  876.         asmgetchar
  877.         ld b,0x34-6 ;b=reg*8+0x40 (к нему прибавляется 6, получается код команды)
  878.         jr asmcmd_dec
  879.        
  880. asmcmd_dec_hz
  881. ;a=reg*4
  882.         ld b,a
  883.         ld a,c
  884.         or 0xdd
  885.         asmputbyte_a
  886.         ld a,b
  887.         add a,a ;(4..5)*8 + (0x50..0x70)*8
  888.         add a,0x85-(0x35-6) ;dec h/l
  889.         asmputbyte_a
  890.         cp a ;Z
  891.         ret
  892. asmcmd_dec_rb
  893. ;dec r/hx/hy/lx/ly
  894.         ld a,c ;reg
  895.         add a,a
  896.         add a,a
  897.         jr c,asmcmd_dec_hz
  898.         add a,a
  899.         add a,0x05-(0x35-6) ;dec r
  900.         jp asmcmd_putaplusb ;0x34-6=0x2e(inc)/0x35-6=0x2f(dec)
  901. asmcmd_d
  902. ;dec/di/daa/djnz
  903.         asmnextchar ;eat
  904.         asmgetchar
  905.         cp 'e'
  906.         jr z,asmcmd_de
  907.         cp 'j'
  908.         jr z,asmcmd_djnz
  909.         cp 'i'
  910.         jr z,asmcmd_di
  911.         MATCH 'a'
  912.         MATCH 'a'
  913.         asmputbyteOK 0x27 ;daa
  914.         ;cp a ;Z
  915.         ret
  916. asmcmd_djnz
  917.         asmnextchar ;eat
  918.         asmgetchar
  919.         MATCH 'n'
  920.         cp 'z'
  921.         ret nz
  922.         asmputbyte 0x10 ;djnz
  923.         asmnextchar ;eat
  924.         asmgetchar
  925.         MATCHSPACES
  926. asmcmd_jrs
  927.         call matchexpr
  928.         ret nz
  929.         push hl
  930.         ld hl,(asmcmdaddr)
  931.         inc hl
  932.         inc hl
  933.         ld a,c
  934.         sub l
  935.         ld c,a
  936.         ld a,b
  937.         sbc a,h
  938.         ld b,a
  939.         pop hl
  940.         ld a,c
  941.         rla
  942.         sbc a,a
  943.         cp b
  944.         ret nz ;jr overflow!!!
  945.         asmputbyte_c ;shift
  946.         cp a ;Z
  947.         ret
  948. asmcmd_di
  949.         asmputbyte 0xf3 ;di
  950.         ASMNEXTCHAR_LAST;asmnextchar
  951.         ASMGETCHAR_LAST;asmgetchar
  952.         ASMCMD_MATCHENDWORD
  953. asmcmd_de
  954.         asmnextchar ;eat
  955.         asmgetchar
  956.         MATCH 'c'
  957.         ld b,0x35-6 ;b=reg*8+0x40 (к нему прибавляется 6, получается код команды)
  958. asmcmd_dec
  959.         MATCHSPACES
  960.         cp 'i'
  961.         jr z,asmcmd_dec_i
  962.         ;cp '('
  963.         ;jr z,asmcmd_ld_reg_bracket;asmcmd_dec_bracket
  964.         ;cp '['|OR20FORBRACKETS
  965.         ;jr z,asmcmd_ld_reg_bracket;asmcmd_dec_bracket
  966.         CPOPENBRACKET_JR asmcmd_ld_reg_bracket
  967. ;dec r/rp
  968.         call matchrb_ora
  969.         jr z,asmcmd_dec_rb
  970.         call matchrp_orsp
  971.         ret nz
  972.         ld a,0x03
  973.         bit 0,b ;0x34-6=0x2e(inc)/0x35-6=0x2f(dec)
  974.         jp z,asmcmd_putaplusc
  975.         ld a,0x0b ;a=0x03(inc rp)/0x0b(dec rp)
  976.         jp asmcmd_putaplusc
  977. asmcmd_dec_i
  978. ;dec ix/iy
  979.         asmnextchar ;eat
  980.         asmgetchar
  981.         MATCHXY_PUTDDFD_NOEAT
  982.         asmnextchar ;eat
  983.         asmgetchar
  984.         ld a,0x23
  985.         bit 0,b ;0x34-6=0x2e(inc)/0x35-6=0x2f(dec)
  986.         jr z,$+4
  987.         ld a,0x2b ;a=0x23(inc)/0x2b(dec)
  988.         asmputbyte_a;0x2b ;dec hl
  989.         ;ASMCMD_MATCHENDWORD
  990.         cp a ;Z
  991.         ret
  992.  
  993. asmcmd_ld_reg_bracket_i
  994. ;b=reg*8+0x40
  995.         asmnextchar ;eat
  996.         asmgetchar
  997.         MATCHXY_PUTDDFD_NOEAT
  998. ;ld r,[iz+]
  999.         ld a,b ;reg*8+0x40
  1000.         add a,6 ;ld r,[hl]
  1001.         asmputbyte_a
  1002.         jp asmcmd_anycmd_bracket_iz_bracket
  1003.  
  1004. asmcmd_ldi_
  1005. ;ldi/ldir
  1006.         asmnextchar ;eat
  1007.         asmgetchar
  1008.         asmputbyte 0xed
  1009.         cp 'r'
  1010.         jr z,asmcmd_ldir
  1011.         asmputbyte 0xa0 ;ldi
  1012.         ASMCMD_MATCHENDWORD
  1013. asmcmd_ldir
  1014.         asmputbyte 0xb0 ;ldir
  1015.         ASMNEXTCHAR_LAST;asmnextchar
  1016.         ASMGETCHAR_LAST;asmgetchar
  1017.         ASMCMD_MATCHENDWORD
  1018. asmcmd_ldd_
  1019. ;ldd/lddr
  1020.         asmnextchar ;eat
  1021.         asmgetchar
  1022.         asmputbyte 0xed
  1023.         cp 'r'
  1024.         jr z,asmcmd_lddr
  1025.         asmputbyte 0xa8 ;ldd
  1026.         ASMCMD_MATCHENDWORD
  1027.  
  1028. asmcmd_ld_reg_bracket
  1029. ;b=reg*8+0x40
  1030. ;ld r,[hl]/[iz+]
  1031.         asmnextchar ;eat
  1032.         asmgetchar
  1033.         cp 'i'
  1034.         jr z,asmcmd_ld_reg_bracket_i
  1035. ;ld r,[hl]
  1036.         MATCH 'h'
  1037.         MATCH 'l'
  1038.         MATCHCLOSEBRACKET_NOGET
  1039.         ld a,6 ;ld r,[hl]
  1040.         jp asmcmd_putaplusb
  1041.  
  1042. asmcmd_lddr
  1043.         asmputbyte 0xb8 ;lddr
  1044.         ASMNEXTCHAR_LAST;asmnextchar
  1045.         ASMGETCHAR_LAST;asmgetchar
  1046.         ASMCMD_MATCHENDWORD
  1047.  
  1048. asmcmd_l
  1049.         asmnextchar ;eat
  1050.         asmgetchar
  1051.         MATCH 'd'
  1052.         cp 'i'
  1053.         jr z,asmcmd_ldi_
  1054.         cp 'd'
  1055.         jr z,asmcmd_ldd_
  1056.         MATCHSPACES
  1057.         cp 'a'
  1058.         jp z,asmcmd_ld_a
  1059.         ;cp '('
  1060.         ;jp z,asmcmd_ld_bracket
  1061.         ;cp '['|OR20FORBRACKETS
  1062.         ;jp z,asmcmd_ld_bracket
  1063.         CPOPENBRACKET_JP asmcmd_ld_bracket
  1064.         cp 'h'
  1065.         jr z,asmcmd_ld_h
  1066.         cp 'd'
  1067.         jr z,asmcmd_ld_d
  1068.         cp 'b'
  1069.         jr z,asmcmd_ld_b
  1070.         cp 'l'
  1071.         jp z,asmcmd_ld_l
  1072.         cp 'c'
  1073.         jr z,asmcmd_ld_c
  1074.         cp 'i'
  1075.         jp z,asmcmd_ld_i
  1076.         cp 's'
  1077.         jp z,asmcmd_ld_s
  1078.         cp 'r'
  1079.         jp z,asmcmd_ld_r
  1080.         cp 'e'
  1081.         ld b,0x58;'e'
  1082.         jr z,asmcmd_ld_reg
  1083.         ret ;nz (error)
  1084. asmcmd_ld_c
  1085.         ld b,0x48;'c'
  1086. asmcmd_ld_reg
  1087.         asmnextchar ;eat
  1088.         asmgetchar
  1089. asmcmd_ld_reg_gotnextchar
  1090.         SKIPSPACES_BEFORECOMMA
  1091.         MATCH ','
  1092.         SKIPSPACES_AFTERCOMMA
  1093.         ;cp '('
  1094.         ;jp z,asmcmd_ld_reg_bracket
  1095.         ;cp '['|OR20FORBRACKETS
  1096.         ;jp z,asmcmd_ld_reg_bracket
  1097.         CPOPENBRACKET_JP asmcmd_ld_reg_bracket
  1098.         call matchrb_ora
  1099.         jr nz,asmcmd_ld_reg_noreg
  1100.         ld a,c ;reg2
  1101.         cp 8
  1102.         jp c,asmcmd_putaplusb
  1103.         or 0xdd ;c было 0x54/55(hx/lx)/74/75(hy/ly)
  1104.         asmputbyte_a
  1105.         ld a,b
  1106.         cp 0x1f+0x40 ;b нельзя 'h','l','(hl)','a' - a тут не попадёт
  1107.         jp c,asmcmd_putcand7plusb
  1108.         ret ;nz (error)
  1109. asmcmd_ld_reg_noreg
  1110.         ld a,b ;reg1*8+0x40
  1111.         add a,6-0x40
  1112.         asmputbyte_a ;ld r8,i8
  1113.         asmgetchar
  1114.         jp asmmatchexpr_putc
  1115.  
  1116. asmcmd_ld_b
  1117. ;b/bc
  1118.         asmnextchar ;eat
  1119.         asmgetchar
  1120.         cp 'c'
  1121.         ld b,0x40;'b'
  1122.         jr nz,asmcmd_ld_reg_gotnextchar
  1123.         ld bc,0x4b01 ;ld bc,(mm), ld bc,nn
  1124.         jr asmcmd_ld_rp_nn_bmm_cnn
  1125. asmcmd_ld_d
  1126. ;d/de
  1127.         asmnextchar ;eat
  1128.         asmgetchar
  1129.         cp 'e'
  1130.         ld b,0x50;'d'
  1131.         jr nz,asmcmd_ld_reg_gotnextchar
  1132.         ld bc,0x5b11 ;ld de,(mm), ld de,nn
  1133.         jr asmcmd_ld_rp_nn_bmm_cnn
  1134. asmcmd_ld_h
  1135. ;h/hl/hx/hy
  1136.         asmnextchar ;eat
  1137.         asmgetchar
  1138.         cp 'l'
  1139.         jp z,asmcmd_ld_hl
  1140.         ld b,0x60;'h'
  1141.         cp 'y'
  1142.         jr z,asmcmd_ld_hy
  1143.         cp 'x'
  1144.         jr nz,asmcmd_ld_reg_gotnextchar
  1145. asmcmd_ld_hx
  1146. ;ld hx,reg/n (reg!=h,l,hy,ly)
  1147.         asmputbyte 0xdd
  1148.         asmnextchar ;eat
  1149.         asmgetchar
  1150.         SKIPSPACES_BEFORECOMMA
  1151.         MATCH ','
  1152.         SKIPSPACES_AFTERCOMMA
  1153.         call matchrb_ora
  1154.         jr nz,asmcmd_ld_reg_noreg;asmcmd_ld_hx_noreg
  1155.         ld a,c
  1156.         cp IYADD ;+4/5 = hy/ly
  1157.         jr c,asmcmd_ld_hz_reg
  1158.         ret ;nz (error)
  1159. asmcmd_ld_l
  1160. ;l/lx/ly
  1161.         asmnextchar ;eat
  1162.         asmgetchar
  1163.         ld b,0x68;'l'
  1164.         cp 'x'
  1165.         jr z,asmcmd_ld_hx;lx
  1166.         cp 'y'
  1167.         jp nz,asmcmd_ld_reg_gotnextchar
  1168.         ;jr z,asmcmd_ld_hy;ly
  1169. asmcmd_ld_hy
  1170. ;ld hy,reg/n (reg!=h,l,hx,lx)
  1171.         asmputbyte 0xfd
  1172.         asmnextchar ;eat
  1173.         asmgetchar
  1174.         SKIPSPACES_BEFORECOMMA
  1175.         MATCH ','
  1176.         SKIPSPACES_AFTERCOMMA
  1177.         call matchrb_ora
  1178.         jr nz,asmcmd_ld_reg_noreg;asmcmd_ld_hx_noreg
  1179.         ld a,c
  1180.         and 0b00100111 ;hx,lx -> h,l
  1181. asmcmd_ld_hz_reg
  1182.         sub 4 ;4,5 = h,l
  1183.         cp 2
  1184.         jp nc,asmcmd_putcand7plusb
  1185.         ret ;nz (error)
  1186.  
  1187. asmcmd_ld_s
  1188.         asmnextchar ;eat
  1189.         asmgetchar
  1190.         cp 'p'
  1191.         ret nz
  1192.         ld bc,0x7b31 ;ld sp,(mm), ld sp,nn
  1193. asmcmd_ld_rp_nn_bmm_cnn
  1194.         asmnextchar ;eat
  1195.         asmgetchar
  1196.         SKIPSPACES_BEFORECOMMA
  1197.         MATCH ','
  1198.         SKIPSPACES_AFTERCOMMA
  1199.         ;cp '('
  1200.         ;jr z,asmcmd_ld_rp_bracket
  1201.         ;cp '['|OR20FORBRACKETS
  1202.         ;jr z,asmcmd_ld_rp_bracket
  1203.         CPOPENBRACKET_JR asmcmd_ld_rp_bracket
  1204.         asmputbyte_c; 0x31 ;ld sp,nn
  1205.         jr asmmatchexpr_emitword_bc
  1206. asmcmd_ld_rp_bracket
  1207.         asmputbyte 0xed
  1208.         asmputbyte_b; 0x7b ;ld sp,(mm)
  1209.         jr asmmatchexpr_bracket_emitword_bc ;eats
  1210.  
  1211. asmcmd_ld_i
  1212.         asmnextchar ;eat
  1213.         asmgetchar
  1214.         SKIPSPACES_BEFORECOMMA
  1215.         cp ','
  1216.         jp z,asmcmd_ld_i_comma
  1217.         MATCHXY_PUTDDFD_NOEAT
  1218. asmcmd_ld_hl
  1219. ;ld hl,nn/(mm)
  1220.         asmnextchar ;eat
  1221.         asmgetchar
  1222.         SKIPSPACES_BEFORECOMMA
  1223.         MATCH ','
  1224.         SKIPSPACES_AFTERCOMMA
  1225.         ;cp '('
  1226.         ;jr z,asmcmd_ld_hl_bracket
  1227.         ;cp '['|OR20FORBRACKETS
  1228.         ;jr z,asmcmd_ld_hl_bracket
  1229.         CPOPENBRACKET_JR asmcmd_ld_hl_bracket
  1230.         asmputbyte 0x21 ;ld hl,nn
  1231. asmmatchexpr_emitword_bc
  1232.         call matchexpr
  1233.         ret nz ;nz (error)
  1234. asmputbc
  1235.         asmputbyte_c
  1236.         asmputbyte_b
  1237.         cp a ;Z
  1238.         ret
  1239. asmcmd_ld_hl_bracket
  1240.         asmputbyte 0x2a ;ld hl,(mm)
  1241. asmmatchexpr_bracket_emitword_bc
  1242.         asmnextchar ;eat (
  1243.         asmgetchar
  1244. asmmatchexpr_bracket_emitword_bc_noeatopenbracket
  1245.         call matchexpr
  1246.         ret nz ;error
  1247.         MATCHCLOSEBRACKET_NOGET
  1248.         jr asmputbc
  1249.  
  1250. asmcmd_ld_bracket
  1251. ;ld (rp),a/ld (hl),r/ld (iz+),r/ld (mm),a/rp/iz
  1252.         asmnextchar ;eat
  1253.         asmgetchar
  1254.         cp 'i'
  1255.         jr z,asmcmd_ld_bracket_i
  1256.         call matchrp
  1257.         jr z,asmcmd_ld_bracket_rp
  1258. asmcmd_ld_bracket_matchexpr
  1259. ;ld (mm),a/hl/ix/iy/rp
  1260.         call matchexpr
  1261.         ret nz
  1262.         MATCHCLOSEBRACKET
  1263.         SKIPSPACES_BEFORECOMMA
  1264.         MATCH ','
  1265.         SKIPSPACES_AFTERCOMMA
  1266.         cp 'a'
  1267.         jr z,asmcmd_ld_bracket_mm_bracket_comma_a
  1268.         cp 'i'
  1269.         jr z,asmcmd_ld_bracket_mm_bracket_comma_i
  1270.        push bc
  1271.         call matchrp      
  1272.         jr z,asmcmd_ld_bracket_mm_bracket_comma_rp
  1273.        pop bc
  1274.         ret ;nz (error)
  1275. asmcmd_ld_bracket_mm_bracket_comma_rp
  1276. ;ld (mm),rp
  1277.         ld a,c
  1278.        pop bc
  1279.         cp 0x20
  1280.         jr z,asmcmd_ld_bracket_mm_bracket_comma_hl
  1281.         asmputbyte 0xed
  1282.         add a,0x43
  1283.         asmputbyte_a ;ld (),rp
  1284.         jr asmputbc
  1285. asmcmd_ld_bracket_mm_bracket_comma_hl
  1286.         asmputbyte 0x22 ;ld (),hl
  1287.         jr asmputbc
  1288. asmcmd_ld_bracket_mm_bracket_comma_i
  1289. ;ld (mm),iz
  1290.         asmnextchar ;eat
  1291.         asmgetchar
  1292.         MATCHXY_PUTDDFD_NOEAT
  1293.         asmputbyte 0x22 ;ld (),hl
  1294.         jr asmeat_putbc
  1295. asmcmd_ld_bracket_mm_bracket_comma_a
  1296.         asmputbyte 0x32 ;ld (),a
  1297. asmeat_putbc
  1298.         asmnextchar ;eat
  1299.         ;asmgetchar
  1300.         jr asmputbc
  1301. asmcmd_ld_bracket_i
  1302. ;ld (iz+),r/return to ld (mm),a/rp/iz
  1303.         asmnextchar ;eat
  1304.         asmgetchar
  1305.         cp 'x'
  1306.         jr z,asmcmd_ld_bracket_ix
  1307.         cp 'y'
  1308.         jr z,asmcmd_ld_bracket_iy
  1309.         asmbackchar
  1310.         jr asmcmd_ld_bracket_matchexpr
  1311. asmcmd_ld_bracket_rp
  1312. ;ld (rp),a/ld (hl),r ;c=rp*0x10
  1313.         MATCHCLOSEBRACKET
  1314.         bit 5,c ;0x20
  1315.         jr nz,asmcmd_ld_bracket_hl_bracket
  1316.         SKIPSPACES_BEFORECOMMA
  1317.         MATCH ','
  1318.         SKIPSPACES_AFTERCOMMA
  1319.         MATCH_NOEAT 'a'
  1320.         ASMNEXTCHAR_LAST;asmnextchar
  1321.         ASMGETCHAR_LAST;asmgetchar
  1322.         ld a,0x02 ;ld (rp),a
  1323.         jp asmcmd_putaplusc
  1324. asmcmd_ld_bracket_hl_bracket
  1325.         SKIPSPACES_BEFORECOMMA
  1326.         MATCH ','
  1327.         SKIPSPACES_AFTERCOMMA
  1328.         call matchrb_ora
  1329.         jr nz,asmcmd_ld_bracket_hl_bracket_comma_noreg
  1330.         ld a,c
  1331.         ;cp 8
  1332.         ;ret c ;nz (error)
  1333.         add a,0x70
  1334.         ret m ;nz (error)
  1335.         asmputbyte_a ;ld (hl),r
  1336.         cp a ;Z
  1337.         ret
  1338. asmcmd_ld_bracket_hl_bracket_comma_noreg
  1339.         asmputbyte 0x36 ;ld (hl),i8
  1340. asmmatchexpr_putc
  1341.         call matchexpr
  1342.         ret nz
  1343.         asmputbyte_c
  1344.         cp a ;Z
  1345.         ret
  1346. asmcmd_ld_bracket_ix
  1347.         asmputbyte 0xdd
  1348.         jr asmcmd_ld_bracket_iz
  1349. asmcmd_ld_bracket_iy
  1350.         asmputbyte 0xfd
  1351. asmcmd_ld_bracket_iz
  1352.         EAT_MATCHBRACKET_OR_i8BRACKET
  1353.         SKIPSPACES_BEFORECOMMA
  1354.         MATCH ','
  1355.         SKIPSPACES_AFTERCOMMA
  1356.         ld b,c
  1357.         call matchrb_ora
  1358.         jr nz,asmcmd_ld_bracket_iz_bracket_noreg
  1359.         ld a,c
  1360.         add a,0x70
  1361.         ret m ;nz (error)
  1362.         asmputbyte_a ;ld (hl),r
  1363.         asmputbyte_b ;shift
  1364.         cp a ;Z
  1365.         ret
  1366. asmcmd_ld_bracket_iz_bracket_noreg
  1367.         asmputbyte 0x36 ;ld (hl),i8
  1368.         asmputbyte_b ;shift
  1369.         jr asmmatchexpr_putc
  1370.  
  1371. asmcmd_ld_r
  1372.         asmnextchar ;eat
  1373.         asmgetchar
  1374.         SKIPSPACES_BEFORECOMMA
  1375.         MATCH ','
  1376.         SKIPSPACES_AFTERCOMMA
  1377.         MATCH_NOEAT 'a'
  1378.         asmputbyte 0xed
  1379.         asmputbyte 0x4f ;ld r,a
  1380.         ASMNEXTCHAR_LAST;asmnextchar
  1381.         ASMGETCHAR_LAST;asmgetchar
  1382.         ASMCMD_MATCHENDWORD
  1383.  
  1384. asmcmd_ld_a
  1385. ;ld a,i/r/n/(/reg
  1386.         asmnextchar ;eat
  1387.         asmgetchar
  1388.         SKIPSPACES_BEFORECOMMA
  1389.         MATCH ','
  1390.         SKIPSPACES_AFTERCOMMA
  1391.         ;cp '('
  1392.         ;jr z,asmcmd_ld_a_bracket
  1393.         ;cp '['|OR20FORBRACKETS
  1394.         ;jr z,asmcmd_ld_a_bracket
  1395.         CPOPENBRACKET_JR asmcmd_ld_a_bracket
  1396.         cp 'i'
  1397.         jr z,asmcmd_ld_a_i
  1398.         cp 'r'
  1399.         jr z,asmcmd_ld_a_r
  1400. ;ld a,reg/i8
  1401.         call matchrb_ora
  1402.         ld b,0x78
  1403.         jp z,asmcmd_putbplusc
  1404.         asmputbyte 0x3e ;ld a,i8
  1405.         jp asmmatchexpr_putc
  1406.  
  1407. asmcmd_ld_a_bracket
  1408. ;ld a,(mm)/(rp)/(iz+)
  1409.         asmnextchar ;eat
  1410.         asmgetchar
  1411.         SKIPSPACES
  1412.         cp 'i'
  1413.         jr z,asmcmd_ld_a_bracket_i
  1414. ;ld a,(mm)/(rp)
  1415.         call matchrp ;c=rp*0x10
  1416.         jr nz,asmcmd_ld_a_bracket_norp
  1417.         ld a,c
  1418.         add a,0x0a
  1419.         cp 0x20 ;'hl'
  1420.         jr c,$+4
  1421.          ld a,0x7e
  1422.         asmputbyte_a ;ld a,(rp)
  1423.         cp a ;Z
  1424.         ret
  1425. asmcmd_ld_a_bracket_norp
  1426. ;ld a,(mm)
  1427.         asmputbyte 0x3a ;ld a,(nn)
  1428.         jp asmmatchexpr_bracket_emitword_bc_noeatopenbracket
  1429. asmcmd_ld_a_bracket_i
  1430.         asmnextchar ;eat
  1431.         asmgetchar
  1432.         cp 'x'
  1433.         jr z,asmcmd_ld_a_bracket_ix
  1434.         cp 'y'
  1435.         jr z,asmcmd_ld_a_bracket_iy ;надо тут, т.к. expr не откатить
  1436. asmcmd_ld_a_bracket_i_expr
  1437.         call matchexpr
  1438.         ret nz
  1439.         asmputbyte 0x3a ;ld a,()
  1440.         asmputbyte_c
  1441.         asmputbyte_b
  1442.         ret
  1443. asmcmd_ld_a_bracket_ix
  1444.         asmputbyte 0xdd
  1445.         jr asmcmd_ld_a_bracket_iz
  1446. asmcmd_ld_a_bracket_iy
  1447.         asmputbyte 0xfd
  1448. asmcmd_ld_a_bracket_iz
  1449. ;ld a,(ix/iy+/-/)
  1450.         asmputbyte 0x7e ;ld a,(hl)
  1451. asmcmd_anycmd_bracket_iz_bracket
  1452.         asmnextchar ;eat
  1453.         asmgetchar
  1454.         ld c,0
  1455.         CPCLOSEBRACKET_JR 1f
  1456.         cp '+'
  1457.         jr z,$+6
  1458.          cp '-'
  1459.          jr nz,asmcmd_ld_a_bracket_i_expr
  1460.         call matchexpr
  1461.         ret nz
  1462.         MATCHCLOSEBRACKET_NOEAT
  1463. 1
  1464.         asmnextchar ;eat
  1465.         asmputbyte_c
  1466.         cp a ;Z
  1467.         ret
  1468.  
  1469. asmcmd_ld_a_i
  1470.         ld c,0x57 ;ld a,i
  1471.         jr asmcmd_eat_put_ed_c
  1472. asmcmd_ld_a_r
  1473.         ld c,0x5f ;ld a,r
  1474. asmcmd_eat_put_ed_c
  1475.         asmputbyte 0xed
  1476.         asmputbyte_c ;0x5f ;ld a,r
  1477.         ASMNEXTCHAR_LAST;asmnextchar
  1478.         ASMGETCHAR_LAST;asmgetchar
  1479.         ASMCMD_MATCHENDWORD
  1480.  
  1481. asmcmd_ld_i_comma
  1482.         asmnextchar ;eat
  1483.         asmgetchar
  1484.         MATCH_NOEAT 'a'
  1485.         asmputbyte 0xed
  1486.         asmputbyte 0x47 ;ld i,a
  1487.         ASMNEXTCHAR_LAST;asmnextchar
  1488.         ASMGETCHAR_LAST;asmgetchar
  1489.         ASMCMD_MATCHENDWORD
  1490.