?login_element?

Subversion Repositories NedoOS

Rev

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

  1. OR20FORBRACKETS=0;0x20
  2. IXADD=0x50;0x80
  3. IYADD=0x70;0xa0
  4.  
  5.        macro MATCH_NOEAT s1
  6.         cp s1
  7.         ret nz
  8.        endm
  9.        macro MATCH_NOGET s1
  10.         cp s1
  11.         ret nz
  12.         asmnextchar ;eat
  13.        endm
  14.        macro MATCH s1
  15.         MATCH_NOGET s1
  16.         asmgetchar
  17.        endm
  18.  
  19.        macro MATCHOPENBRACKET
  20.         cp '('
  21.         jr z,$+5
  22.          cp '['|OR20FORBRACKETS
  23.          ret nz
  24.         asmnextchar ;eat
  25.         asmgetchar
  26.        endm
  27.        macro CPOPENBRACKET_JR addr
  28.         cp '('
  29.         jr z,addr
  30.         cp '['|OR20FORBRACKETS
  31.         jr z,addr
  32.        endm
  33.        macro CPOPENBRACKET_JP addr
  34.         cp '('
  35.         jp z,addr
  36.         cp '['|OR20FORBRACKETS
  37.         jp z,addr
  38.        endm
  39.  
  40.        macro CPCLOSEBRACKET
  41.         cp ')'
  42.         jr z,$+4
  43.         cp ']'|OR20FORBRACKETS
  44.        endm
  45.        macro CPCLOSEBRACKET_JR addr
  46.         cp ')'
  47.         jr z,addr
  48.         cp ']'|OR20FORBRACKETS
  49.         jr z,addr
  50.        endm
  51.        macro MATCHCLOSEBRACKET_NOEAT
  52.         cp ')'
  53.         jr z,$+5
  54.         cp ']'|OR20FORBRACKETS
  55.         ret nz
  56.        endm
  57.        macro MATCHCLOSEBRACKET_NOGET
  58.         MATCHCLOSEBRACKET_NOEAT
  59.         asmnextchar ;eat
  60.        endm
  61.        macro MATCHCLOSEBRACKET
  62.         MATCHCLOSEBRACKET_NOGET
  63.         asmgetchar
  64.        endm
  65.        macro EAT_MATCHBRACKET_OR_i8BRACKET
  66.         asmnextchar ;eat
  67.         asmgetchar
  68.         ld c,0
  69.         CPCLOSEBRACKET_JR 1f
  70.         call matchexpr
  71.         ret nz
  72.         MATCHCLOSEBRACKET_NOEAT
  73. 1;asmcmd_ld_bracket_iz_noshift
  74.         asmnextchar ;eat
  75.         asmgetchar
  76.        endm
  77.  
  78.        macro SKIPSPACES ;ret nz (error) if eol ;остаётся на первом непробеле и его возвращает в a
  79.         call asmskipspaces
  80.         ret nz
  81.        endm
  82.  
  83.        macro SKIPSPACES_BEFORECOMMA
  84.         ;SKIPSPACES
  85.        endm
  86.  
  87.        macro SKIPSPACES_AFTERCOMMA
  88.         ;SKIPSPACES
  89.        endm
  90.  
  91.        macro MATCHSPACES ;ret nz (error) if not spaces or if eol ;остаётся на первом непробеле и его возвращает в a
  92.         ;cp ' '
  93.         ;jr z,$+4
  94.         ; cp 9 ;tab
  95.         ;call z,asmskipspaces_next
  96.         call matchspaces
  97.         ret nz
  98.        endm
  99.  
  100.        macro MATCHXY_PUTDDFD_NOEAT
  101.         cp 'x'
  102.         jr z,1f;asmcmd_ld_bracket_mm_bracket_comma_ix
  103.         cp 'y'
  104.         ret nz
  105.         asmputbyte 0xfd
  106.         jr 2f;asmcmd_ld_bracket_mm_bracket_comma_iz
  107. 1;asmcmd_ld_bracket_mm_bracket_comma_ix
  108.         asmputbyte 0xdd
  109. 2;asmcmd_ld_bracket_mm_bracket_comma_iz
  110.        endm
  111.  
  112.        macro JPMATCHENDWORD_BACK1
  113.         jp matchendword_back1
  114.        endm
  115.  
  116.        macro JPMATCHENDWORD_BACK2
  117.         jp matchendword_back2
  118.        endm
  119.  
  120. matchexpr
  121. ;a=char (двигает курсор до первого символа, не годящегося для вычисления выражения, возвращает его в a)
  122. ;out: bc=result
  123.         call matchval
  124.         ret nz ;error
  125. ;TODO +/-
  126.         ret
  127.  
  128. matchval_plus
  129.         asmnextchar ;eat
  130.         asmgetchar
  131. matchval
  132. ;TODO labels
  133.         cp '-'
  134.         jr z,matchval_minus
  135.         cp '('
  136.         jr z,matchval_bracket
  137.         cp '#'
  138.         jr z,matchval_hex
  139.         cp '+'
  140.         jr z,matchval_plus
  141.         sub '0'
  142.         cp 10
  143.         jr nc,matchval_nodigit
  144.         push hl
  145.         ld bc,0
  146.         ld h,b
  147.         ld l,c
  148. matchval_dec0 ;bc=hl
  149.         add hl,hl ;*2
  150.         add hl,hl ;*4
  151.         add hl,bc ;*5
  152.         add hl,hl ;*10
  153.         add a,l
  154.         ld l,a
  155.         jr nc,$+3
  156.          inc h
  157.         ld b,h
  158.         ld c,l
  159.         asmnextchar ;eat
  160.         asmgetchar
  161.         sub '0'
  162.         cp 10
  163.         jr c,matchval_dec0
  164.         pop hl
  165.         ;add a,'0' ;как было
  166.         asmgetchar        
  167.         cp a ;z
  168.         ret
  169. matchval_nodigit
  170.         ;ld c,'0'
  171.         ;add a,c ;как было (для следующих match)
  172.         ;dec c ;nz (error)
  173.         or a ;nz (error)
  174.         asmgetchar        
  175.         ret
  176.  
  177. matchval_hex
  178.         asmnextchar ;eat
  179.         asmgetchar
  180.         ld bc,0
  181. matchval_hex0
  182.         sub '0'+10
  183.         cp -10
  184.         jr c,matchval_hex_nodigit
  185. matchval_hex_add
  186.         add a,10
  187.        dup 4
  188.         sla c
  189.         rl b
  190.        edup
  191.         or c
  192.         ld c,a
  193.         asmnextchar ;eat
  194.         asmgetchar
  195.         jr matchval_hex0
  196. matchval_hex_nodigit
  197.         sub 'a'-('0'+10)
  198.         cp 6
  199.         jr c,matchval_hex_add
  200.         sub 'A'-'a'
  201.         cp 6
  202.         jr c,matchval_hex_add
  203.         ;sub -'A' ;как было
  204.         asmgetchar
  205.         cp a ;z
  206.         ret
  207.  
  208. matchval_minus
  209.         asmnextchar ;eat
  210.         asmgetchar
  211.         call matchval
  212.         ret nz
  213.        ;push af
  214.         xor a
  215.         sub c
  216.         ld c,a
  217.         sbc a,b
  218.         sub c
  219.         ld b,a
  220.        ;pop af
  221.         asmgetchar
  222.         cp a ;z
  223.         ret
  224.  
  225. matchval_bracket
  226.         asmnextchar ;eat
  227.         asmgetchar
  228.         call matchexpr
  229.         ret nz
  230.         MATCH ')'
  231.         ret
  232.  
  233. matchcc
  234. ;a=first char ;съедает слово! если error, то откатывает как было
  235. ;NZ=error
  236. ;out: c=0x20+0,8..0x38 for 'nz'/'z'/'nc'/'c'/'po'/'pe'/'p'/'m'
  237.         cp 'p'
  238.         jr z,matchcc_p
  239.         cp 'm'
  240.         jr z,matchcc_m
  241. matchcc_forjr
  242.         cp 'n'
  243.         jr z,matchcc_n
  244.         cp 'c'
  245.         jr z,matchcc_c
  246.         cp 'z'
  247.         ;jr z,matchcc_z
  248.         ret nz
  249. ;matchcc_z
  250.         asmnextchar ;eat
  251.         asmgetchar
  252.         ld c,0x20+0x08
  253.         JPMATCHENDWORD_BACK1
  254. matchcc_m
  255.         asmnextchar ;eat
  256.         asmgetchar
  257.         ld c,0x20+0x38
  258.         JPMATCHENDWORD_BACK1
  259. matchcc_p
  260.         asmnextchar ;eat
  261.         asmgetchar
  262.         cp 'o'
  263.         jr z,matchcc_po
  264.         cp 'e'
  265.         jr z,matchcc_pe
  266.         ld c,0x20+0x30
  267.         JPMATCHENDWORD_BACK1
  268. matchcc_po
  269.         asmnextchar ;eat
  270.         asmgetchar
  271.         ld c,0x20+0x20
  272.         JPMATCHENDWORD_BACK2
  273. matchcc_pe
  274.         asmnextchar ;eat
  275.         asmgetchar
  276.         ld c,0x20+0x28
  277.         JPMATCHENDWORD_BACK2
  278. matchcc_c
  279.         asmnextchar ;eat
  280.         asmgetchar
  281.         ld c,0x20+0x18
  282.         JPMATCHENDWORD_BACK1
  283. matchcc_n
  284.         asmnextchar ;eat
  285.         asmgetchar
  286.         cp 'z'
  287.         jr z,matchcc_nz
  288.         cp 'c'
  289.         jp nz,asm_backchar
  290.         asmnextchar ;eat
  291.         asmgetchar
  292.         ld c,0x20+0x10
  293.         JPMATCHENDWORD_BACK2
  294. matchcc_nz
  295.         asmnextchar ;eat
  296.         asmgetchar
  297.         ld c,0x20+0x00
  298.         JPMATCHENDWORD_BACK2
  299.  
  300. matchrb_ora
  301.         cp 'a'
  302.         jr z,matchrb_a
  303. ;matchrb
  304. ;a=first char ;съедает слово! если error, то откатывает как было
  305. ;в команде ld уже проверено 'a', 'i' для первого и второго параметра
  306. ;опознаёт b/c/d/e/h/l/hx/lx/hy/ly
  307. ;NZ=error
  308. ;out: a=0..7 for 'b'/'c'/'d'/'e'/'h'/'l'
  309.         cp 'c'
  310.         jr z,matchrb_c
  311.         cp 'e'
  312.         jr z,matchrb_e
  313.         cp 'l'
  314.         jr z,matchrb_l
  315.         cp 'h'
  316.         jr z,matchrb_h
  317.         cp 'b'
  318.         jr z,matchrb_b
  319.         cp 'd'
  320.         ;jr z,matchrb_d
  321.         ret nz ;z/nz
  322. ;matchrb_d
  323.         asmnextchar ;eat
  324.         asmgetchar
  325.         ld c,2
  326.         JPMATCHENDWORD_BACK1
  327. matchrb_e
  328.         asmnextchar ;eat
  329.         asmgetchar
  330.         ld c,3
  331.         JPMATCHENDWORD_BACK1
  332. matchrb_b
  333.         asmnextchar ;eat
  334.         asmgetchar
  335.         ld c,0
  336.         JPMATCHENDWORD_BACK1
  337. matchrb_c
  338.         asmnextchar ;eat
  339.         asmgetchar
  340.         ld c,1
  341.         JPMATCHENDWORD_BACK1
  342. matchrb_a
  343.         asmnextchar ;eat
  344.         asmgetchar
  345.         ld c,7
  346.         JPMATCHENDWORD_BACK1
  347. matchrb_l
  348. ;l/lx/ly
  349.         asmnextchar ;eat
  350.         asmgetchar
  351.         cp 'x'
  352.         jr z,matchrb_lx
  353.         cp 'y'
  354.         jr z,matchrb_ly
  355.         ld c,5 ;'l'
  356.         JPMATCHENDWORD_BACK1
  357. matchrb_h
  358. ;h/hx/hy
  359.         asmnextchar ;eat
  360.         asmgetchar
  361.         cp 'x'
  362.         jr z,matchrb_hx
  363.         cp 'y'
  364.         jr z,matchrb_hy
  365.         ld c,4 ;'h'
  366.         JPMATCHENDWORD_BACK1
  367. matchrb_hx
  368.         asmnextchar ;eat
  369.         asmgetchar
  370.         ld c,4+IXADD ;'h'
  371.         JPMATCHENDWORD_BACK2
  372. matchrb_hy
  373.         asmnextchar ;eat
  374.         asmgetchar
  375.         ld c,4+IYADD ;'h'
  376.         JPMATCHENDWORD_BACK2
  377. matchrb_lx
  378.         asmnextchar ;eat
  379.         asmgetchar
  380.         ld c,5+IXADD ;'l'
  381.         JPMATCHENDWORD_BACK2
  382. matchrb_ly
  383.         asmnextchar ;eat
  384.         asmgetchar
  385.         ld c,5+IYADD ;'l'
  386.         JPMATCHENDWORD_BACK2
  387.  
  388. matchrp_orsp
  389.         cp 's'
  390.         jr z,matchrp_s
  391. matchrp
  392. ;a=first char
  393. ;out: c=0/0x10/0x20 (bc/de/hl)
  394.         cp 'h'
  395.         jr z,matchrp_h
  396.         cp 'b'
  397.         jr z,matchrp_b
  398.         cp 'd'
  399.         ;jr z,matchrp_d
  400.         ret nz ;z/nz
  401. ;matchrp_d
  402.         asmnextchar ;eat
  403.         asmgetchar
  404.         cp 'e'
  405.         jr nz,asm_backchar
  406.         asmnextchar ;eat
  407.         asmgetchar
  408.         ld c,0x10
  409.         JPMATCHENDWORD_BACK2
  410. matchrp_h
  411.         asmnextchar ;eat
  412.         asmgetchar
  413.         cp 'l'
  414.         jr nz,asm_backchar
  415.         asmnextchar ;eat
  416.         asmgetchar
  417.         ld c,0x20
  418.         JPMATCHENDWORD_BACK2
  419. matchrp_b
  420.         asmnextchar ;eat
  421.         asmgetchar
  422.         cp 'c'
  423.         jr nz,asm_backchar
  424.         asmnextchar ;eat
  425.         asmgetchar
  426.         ld c,0
  427.         JPMATCHENDWORD_BACK2
  428. matchrp_s
  429.         asmnextchar ;eat
  430.         asmgetchar
  431.         cp 'p'
  432.         jr nz,asm_backchar
  433.         asmnextchar ;eat
  434.         asmgetchar
  435.         ld c,0x30
  436.         JPMATCHENDWORD_BACK2
  437.  
  438. matchendword
  439. ;a=char
  440. ;Z=конец слова, NZ=не конец
  441.         cp ' '+1
  442.         jr c,matchendword_ok
  443.         cp ')'
  444.         ret z
  445.         cp ']'|OR20FORBRACKETS
  446.         ret z
  447.         cp ','
  448.         ret ;z/nz
  449. matchendword_ok
  450.         cp a
  451.         ret
  452.  
  453. matchendword_back1
  454. ;a=char
  455. ;Z=конец слова, NZ=не конец (откручиваем назад)
  456.         cp ' '+1
  457.         jr c,matchendword_ok
  458.         cp ')'
  459.         ret z
  460.         cp ']'|OR20FORBRACKETS
  461.         ret z
  462.         cp ','
  463.         ret z
  464. asm_backchar
  465.         asmbackchar ;!=0
  466. ora
  467.         or a
  468.         ret ;nz
  469.  
  470. matchendword_back2
  471. ;a=char
  472. ;Z=конец слова, NZ=не конец (откручиваем назад)
  473.         cp ' '+1
  474.         jr c,matchendword_ok
  475.         cp ')'
  476.         ret z
  477.         cp ']'|OR20FORBRACKETS
  478.         ret z
  479.         cp ','
  480.         ret z
  481.         asmback2chars ;!=0
  482.         or a
  483.         ret ;nz
  484.  
  485. matchspaces
  486.         cp ' '
  487.         jr z,$+5
  488.          cp 9 ;tab
  489.          ret nz ;call z,asmskipspaces_next
  490. ;out: nz (error) if eol ;остаётся на первом непробеле и его возвращает в a
  491. asmskipspaces_next
  492.         asmnextchar
  493.         asmgetchar
  494. asmskipspaces
  495.         cp 9 ;tab
  496.         jr z,asmskipspaces_next
  497.         cp ' '
  498.         jr z,asmskipspaces_next
  499.         ret c ;error (nz)
  500.         cp a ;z
  501.         ret
  502.