more code
[bz80asm.git] / parser.zas
blobecafeb30fe3e5547330d157b441d56f004a605ba
1 ; returns current char in A
2 ; sets zero flag on EOL
3 skipBlanks:
4   ld    a,(iy)
5   or    a
6   ret   z
7   cp    13
8   ret   z
9   cp    10
10   ret   z
11   inc   iy
12   cp    33
13   jr    c,skipBlanks
14   dec   iy
15   ret
18 ;EXPR - VARIABLE-TYPE EXPRESSION EVALUATION
19 ;     Expression type is returned in A'F':
20 ;        Numeric - A' bit 7=0, F' sign bit cleared.
21 ;         String - A' bit 7=1, F' sign bit set.
22 ;Floating-point or integer result returned in HLH'L'C
23 ; Integer result denoted by C=0 and HLH'L' non-zero.
24 ;String result returned in string accumulator, DE set.
25 ;  DE addresses byte after last (E=length).
27 ;Hierarchy is: (1) Variables, functions,
28 ;                  constants, bracketed expressions.
29 ;              (2) ^
30 ;              (3) * / MOD DIV
31 ;              (4) + -
32 ;              (5) = <> <= >= > <
33 ;              (6) AND
34 ;              (7) EOR OR
37 ;ITEM - VARIABLE TYPE NUMERIC OR STRING ITEM.
38 ;Item type is returned in A:  Bit 7=0 numeric.
39 ;                             Bit 7=1 string.
40 ;Numeric item returned in HLH'L'C.
41 ;String item returned in string accumulator,
42 ;  DE addresses byte after last (E=length).
44 ;ITEM:   CALL    CHECK
47 ; parse integer expression
48 ;   Output: Integer in HLH'L', C=0
49 ; Destroys: A,C,H,L,A',B',C',H',L',F,F'
50 EXPRI:
51   call  skipBlanks
52   jp    z,error_integer_expected
53   ld    c,0
54   cp    '-'
55   jr    nz,.notneg
56   inc   c
57   inc   iy
58   jr    .ccnum
59 .notneg:
60   cp    '+'
61   jr    nz,.ccnum
62   inc   iy
63 .ccnum:
64   ld    a,(iy)
65   cp    '0'
66   jp    c,error_integer_expected
67   cp    '9'+1
68   jp    nc,error_integer_expected
69   ld    hl,0
70 .numloop:
71   ld    a,(iy)
72   sub   '0'
73   jr    c,.numdone
74   cp    10
75   jr    nc,.numdone
76   ; hl = hl*10
77   add   hl,hl
78   ld    de,hl
79   add   hl,hl
80   add   hl,hl
81   add   hl,de
82   ld    e,a
83   ld    d,0
84   add   hl,de
85   inc   iy
86   jr    .numloop
87 .numdone:
88   ld    a,c
89   or    a
90   jr    z,.noneg
91   ; net hl
92   ld    de,0
93   ex    de,hl
94   sbc   hl,de
95 .noneg:
96   call  skipBlanks
97   exx
98   ld    c,0
99   ret
102 ; parse string expression
103 ;String result returned in string accumulator, DE set.
104 ;  DE addresses byte after last (E=length).
105 EXPRS:
106   call  skipBlanks
107   jp    z,error_string_expected
108   cp    34
109   jr    z,.strok
110   cp    39
111   jp    nz,error_string_expected
112 .strok:
113   ld    c,a  ; terminator
114   inc   iy
115   ld    de,ACCS
116 .strloop:
117   ld    a,(iy)
118   or    a
119   jp    z,error_string_expected
120   inc   iy
121   cp    c
122   jr    z,.strdone
123   ld    (de),a
124   inc   de
125   jr    .strloop
126 .strdone:
127   ret
130 errmsg_integer_expected:
131   defx  "integer expected"
132 errmsg_out_of_range:
133   defx  "out of range"
134 errmsg_string_expected:
135   defx  "string expected"
136 errmsg_syntax:
137   defx  "syntax error"
139 error_integer_expected:
140   ld    hl,errmsg_integer_expected
141   jp    error_common
142 error_out_of_range:
143   ld    hl,errmsg_out_of_range
144   jp    error_common
145 error_string_expected:
146   ld    hl,errmsg_string_expected
147   jp    error_common
148 eror_syntax:
149   ld    hl,errmsg_syntax
150   jp    error_common
152 error_common:
153   dec   hl
154 .loop:
155   inc   hl
156   ld    a,(hl)
157   and   #7f
158   rst   #10
159   bit   7,(hl)
160   jr    z,.loop
162   ld    a,13
163   rst   #10
165   ld    a,2
166   out   (#fe),a
167   jr    $