
PAGE 01    DAI FIRMWARE 3E3F1-3E5BB  V1.1

002                         ORG   :E3F1
003                 *
004                 *
005                 *
006                 **************************************************
007                 * ENCODE A TERM WITH A POSSIBLE UNITARY OPERATOR *
008                 **************************************************
009                 *
010                 * L3E381: First operand may be preceeded by unitary
011                 *         operator +, - or INOT.
012                 *         Then code byte preceeding 1st operand is:
013                 *                       +    -  INOT
014                 *               INT:   BC   BD   BE
015                 *               FPT:   9C   9D    *
016                 *
017                 * L3E382: Encodes a sequence of higher priority
018                 *         operations and their operands.
019                 *         Encodes all terms after OLDOP in input
020                 *         which form a succession of higher priority
021                 *         operators until next lower or equal
022                 *         operator is found. This will be in RGTOP.
023                 *         The type of this collection will be in
024                 *         TYPE.
025                 *
026                 * Exit: C,HL updated. BE corrupted. CY=0.
027                 *       A: bits 5,6,7 OLDOP; D: bits 5,6,7 new RGTOP
028                 *
029 E3F1 CDF6E6     L3E381  CALL  :E6F6     Find unitary operator
030                                         in table
031 E3F4 B7                 ORA   A
032 E3F5 C244E4             JNZ   :E444     Jump if found
033                 *
034 E3F8 223901     L3E382  SHLD  :0139     Set pntr place for operator
035 E3FB CD55E4             CALL  :E455     Encode 1st operand
036 E3FE CDEAE6     L3E383  CALL  :E6EA     Find binary or unitary
037                                         operator in table
038 E401 323701             STA   :0137     Store latest prio operator
039 E404 3A3701     L3E384  LDA   :0137     Get latest prio operator
040 E407 E6E0               ANI   :E0       Prio in bits 5,6,7
041 E409 57                 MOV   D,A       RGTOP in D
042 E40A 3A3801             LDA   :0138     Get old prio operator
043 E40D E6E0               ANI   :E0       Prio only
044 E40F BA                 CMP   D         Compare both operators
045 E410 D0                 RNC             Ready if RGTOP <= OLDOP
046                             
047                 * RGTOP > OLDOP:
048                             
049 E411 EB                 XCHG
050 E412 2A3601             LHLD  :0136     Get type latest expression
051 E415 E5                 PUSH  H         Preserve type left operand
052                                         and RGTOP
053 E416 3A3801             LDA   :0138     Get old prio operator
054 E419 F5                 PUSH  PSW       Preserve it
055 E41A D5                 PUSH  D         Preserve EBUF pntr
056 E41B 2A3901             LHLD  :0139     Get pntr place for operator
057 E41E E5                 PUSH  H         Preserve HOPPT
058 E41F EB                 XCHG            New EBUF pntr in HL
059 E420 3A3701             LDA   :0137     Get latest prio operator
060 E423 323801             STA   :0138     and store it as old one
061 E426 CDF8E3             CALL  :E3F8     Encode right hand operand
062                                         until higher prio operators
063 E429 EB                 XCHG

PAGE 02    DAI FIRMWARE 3E3F1-3E5BB  V1.1

064 E42A E1                 POP   H
065 E42B 223901             SHLD  :0139     Restore HOPPT
066 E42E E1                 POP   H
067 E42F 223B01             SHLD  :013B     Restore RGTPT
068 E432 F1                 POP   PSW
069 E433 323801             STA   :0138     Restore OLDOP
070 E436 EB                 XCHG            New EBUF pntr in HL
071 E437 D1                 POP   D         Restore type left operand
072                                         (E) and orig RGTOP (D)
073 E438 7A                 MOV   A,D       Old RGTOP in A
074 E439 E61F               ANI   :1F       Op.code only
075 E43B CDCFE7             CALL  :E7CF     Obtain type info for
076                                         binary operation
077 E43E CD57E7             CALL  :E757     Encode binary operation
078                                         into EBUF
079 E441 C304E4             JMP   :E404     Check again if prios correct
080                             
081                 * Unitary operator:
082                             
083 E444 223901     L3E56   SHLD  :0139     Set pntr place for operator
084 E447 E5                 PUSH  H
085 E448 CD55E4             CALL  :E455     Encode a term
086 E44B CD97E7             CALL  :E797     Encode unitary operator
087                                         for a term
088 E44E D1                 POP   D
089 E44F CD83E7             CALL  :E783     Byte in A into EBUF
090 E452 C3FEE3             JMP   :E3FE     Encode sequence with prio's
091                 *
092                 * ENCODE A TERM:
093                 *
094                 * Non-error exit: C,HL: updated.
095                 *                 BCDE corrupted, AF preserved.
096                 *
097 E455 F5         L3E57   PUSH  PSW
098 E456 CDD2DD             CALL  :DDD2     Get char from line, neglect
099                                         tab + space
100 E459 FE22               CPI   :22
101 E45B CA9BE4             JZ    :E49B     Jump if char is '"'
102 E45E FE28               CPI   :28
103 E460 CA86E4             JZ    :E486     Jump if char is '('
104 E463 CD02DE             CALL  :DE02     Check if char is upper case
105 E466 DA77E4             JC    :E477     Then jump
106 E469 FE2D               CPI   :2D
107 E46B CA0BDA             JZ    :DA0B     Run 'SYNTAX ERROR' if '-'
108 E46E CDC8E4             CALL  :E4C8     Encode a number
109 E471 D20BDA             JNC   :DA0B     Evt run 'SYNTAX ERROR'
110 E474 C3A4E4             JMP   :E4A4     Store type and quit
111                             
112                 * If upper case character:
113                             
114 E477 CD22E5     L3E58   CALL  :E522     Encode function
115 E47A DAA4E4             JC    :E4A4     If ready: store type (#30)
116                                         and quit
117 E47D 48                 MOV   C,B
118 E47E 1600               MVI   D,:00
119 E480 CDBCE5             CALL  :E5BC     Encode var/array reference
120 E483 C3A7E4             JMP   :E4A7     Quit
121                             
122                 * If opening bracket:
123                             
124 E486 369A       L3E59   MVI   M,:9A     Load #9A in EBUF
125 E488 CD18E0             CALL  :E018     Update EBUF pointer

PAGE 03    DAI FIRMWARE 3E3F1-3E5BB  V1.1

126 E48B 0C                 INR   C         Next pos in textline
127 E48C CDC9E3             CALL  :E3C9     Encode expression
128 E48F CDE0DD             CALL  :DDE0     Get char from line
129 E492 FE29               CPI   :29
130 E494 C20BDA             JNZ   :DA0B     'SYNTAX ERROR' if not ')'
131 E497 0C                 INR   C         Next pos in textline
132 E498 C3A7E4             JMP   :E4A7     Quit
133                             
134                 * If opening '"':
135                             
136 E49B 00         L3E60   NOP 
137 E49C CD80E8             CALL  :E880     Store quoted text in EBUF
138 E49F 3E20               MVI   A,:20     Type is STR
139 E4A1 C3A4E4             JMP   :E4A4     Store type and quit
140                             
141                 * Ready:
142                             
143 E4A4 323601     L3E61   STA   :0136     Set type latest expression
144 E4A7 F1         L3E62   POP   PSW
145 E4A8 C9                 RET 
146                 *
147                 ***************************
148                 * ENCODE 'SAVEA', 'LOADA' *
149                 ***************************
150                 *
151                 *ELODA
152 E4A9 CD78E6     ESAVA   CALL  :E678     Enc. array without arguments
153 E4AC C355E3             JMP   :E355     Into encode 'SAVE/LOAD'
154                 *
155 E4AF FF                 DATA  :FF
156 E4B0 FF                 DATA  :FF
157 E4B1 FF                 DATA  :FF
158 E4B2 FF                 DATA  :FF
159 E4B3 FF                 DATA  :FF
160 E4B4 FF                 DATA  :FF
161 E4B5 FF                 DATA  :FF
162 E4B6 FF                 DATA  :FF
163 E4B7 FF                 DATA  :FF
164 E4B8 FF                 DATA  :FF
165 E4B9 FF                 DATA  :FF
166 E4BA FF                 DATA  :FF
167 E4BB FF                 DATA  :FF
168 E4BC FF                 DATA  :FF
169 E4BD FF                 DATA  :FF
170 E4BE FF                 DATA  :FF
171 E4BF FF                 DATA  :FF
172 E4C0 FF                 DATA  :FF
173 E4C1 FF                 DATA  :FF
174 E4C2 FF                 DATA  :FF
175 E4C3 FF                 DATA  :FF
176 E4C4 FF                 DATA  :FF
177 E4C5 FF                 DATA  :FF
178 E4C6 FF                 DATA  :FF
179 E4C7 FF                 DATA  :FF
180                 *
181                 *******************
182                 * ENCODE A NUMBER *
183                 *******************
184                 *
185                 * Encodes a INT or a FPT number.
186                 *
187                 * Entry: C : Offset of start of number.

PAGE 04    DAI FIRMWARE 3E3F1-3E5BB  V1.1

188                 *        HL: Points to EBUF.
189                 *
190                 * On exit: In A:     #00 FPT;  #10 INT;  #10 HEX.
191                 *          In EBUF:  #10 FPT;  #14 INT;  #15 HEX.
192                 *
193                 * On exit, non-hex numbers will only be INT if reqd
194                 * type or IMP type is INT, and there is no '.' or
195                 * 'E' in the input string.
196                 *
197                 * Non-error exit: CY=1: C,HL updated, B preserved.
198                 *                       A: Type-code, DE: entry BC.
199                 * Error exit:     CY=0, BCDEHL preserved.
200                 *
201 E4C8 C5         ENUM    PUSH  B
202 E4C9 E5                 PUSH  H
203 E4CA CDD2DD             CALL  :DDD2     Get char from line, neglect
204                                         tab + space
205 E4CD FE23               CPI   :23
206 E4CF CA13E5             JZ    :E513     Hex if char is '#'
207 E4D2 3A9002             LDA   :0290     Get required number type
208 E4D5 B7                 ORA   A
209 E4D6 C2DCE4             JNZ   :E4DC     Jump if reqd type is not FPT
210 E4D9 3A8F02             LDA   :028F     Get default number type
211 E4DC FE00       ENM03   CPI   :00
212 E4DE CAFFE4             JZ    :E4FF     Jump if type is not FPT
213                             
214                 * If INT:
215                             
216 E4E1 3614               MVI   M,:14     Load #14 in EBUF
217 E4E3 CD18E0             CALL  :E018     Update EBUF pointer
218 E4E6 CD7BE5             CALL  :E57B     INT nr into EBUF
219 E4E9 D2FFE4             JNC   :E4FF     Then handle as FPT
220 E4EC CDE0DD             CALL  :DDE0     Get char from line
221 E4EF FE2E               CPI   :2E
222 E4F1 CAFFE4             JZ    :E4FF     Try FPT if no digits before
223                                         the '.'
224 E4F4 FE45               CPI   :45
225 E4F6 CAFFE4             JZ    :E4FF     Handle as FPT if 'E'
226 E4F9 3E10       ENM05   MVI   A,:10     Type is INT
227 E4FB D1         ENM10   POP   D
228 E4FC D1                 POP   D
229 E4FD 37                 STC             CY=1
230 E4FE C9                 RET 
231                             
232                 * If FPT:
233                             
234 E4FF E1         ENM20   POP   H
235 E500 C1                 POP   B
236                             
237                 * Entry from ETCON:
238                             
239 E501 C5         ENM25   PUSH  B         ) Save pointers
240 E502 E5                 PUSH  H         )
241 E503 3610               MVI   M,:10     Load #10 in EBUF
242 E505 CD18E0             CALL  :E018     Update EBUF pointer
243 E508 CD96E5             CALL  :E596     FPT nr into EBUF
244 E50B 3E00               MVI   A,:00     Type is FPT
245 E50D DAFBE4             JC    :E4FB     Jump if no errors
246 E510 E1                 POP   H
247 E511 C1                 POP   B
248 E512 C9                 RET             Error exit (no number)
249                             

PAGE 05    DAI FIRMWARE 3E3F1-3E5BB  V1.1

250                 * If HEX:
251                             
252 E513 3615       ENM30   MVI   M,:15     Load #15 in EBUF
253 E515 CD18E0             CALL  :E018     Update EBUF pointer
254 E518 00                 NOP 
255 E519 CD84E8             CALL  :E884     Hex nr into EBUF
256 E51C D20BDA             JNC   :DA0B     Run 'SYNTAX ERROR' if no
257                                         digits
258 E51F C3F9E4             JMP   :E4F9     Quit
259                 *
260                 *********************
261                 * ENCODE A FUNCTION *
262                 *********************
263                 *
264                 * Reads a system function (both function and
265                 * arguments) into EBUF. Error exit if syntax or
266                 * type mismatch errors are found.
267                 *
268                 * Entry:   HL: Points to 1st free pos. in EBUF.
269                 *          C : Points to input.
270                 * Exit: If found: CY=1:
271                 *          A:  Type info of result.
272                 *          C,HL updated; BDE corrupted.
273                 *       If not found: CY=0:
274                 *          A:  End of table count.
275                 *          B:  Start of name in input.
276                 *          C:  Points beyond.
277                 *          DE: Points to 0 T/L byte at table end.
278                 *          HL: Points to EBUF.
279                 *
280 E522 E5         EFUN    PUSH  H
281 E523 37                 STC             Set 'include type letter'
282 E524 CDFDE6             CALL  :E6FD     Find variable name in input,
283                                         allow !,%,$.
284 E527 21E6CF             LXI   H,:CFE6   Addr table BASIC functions
285 E52A CD5ACA             CALL  :CA5A     Find function in table
286 E52D 7B                 MOV   A,E       Get serialnr of entry in
287                                         table in A
288 E52E EB                 XCHG
289 E52F E1                 POP   H
290 E530 D27AE5             JNC   :E57A     Abort if not found (CY=0)
291                             
292                 * If found in table:
293                             
294 E533 3620               MVI   M,:20     Load fn.code (#20) in EBUF
295 E535 CD18E0             CALL  :E018     Update EBUF pointer
296 E538 77                 MOV   M,A       Load how manyth function
297                                         in EBUF
298 E539 CD18E0             CALL  :E018     Update EBUF pointer
299 E53C 1A                 LDAX  D         Get T/L byte of function
300 E53D 13                 INX   D
301 E53E F5                 PUSH  PSW       Preserve it
302 E53F E60F               ANI   :0F       Length only
303 E541 CA76E5             JZ    :E576     Jump if no arguments reqd
304                             
305                 * If arguments required:
306                             
307 E544 F5                 PUSH  PSW       Preserve length fuction
308 E545 CD67E8             CALL  :E867     Check if next char is '(',
309 E548 28                 DATA  :28       run 'SYNTAX ERROR' if not
310 E549 EB         L3E72   XCHG
311 E54A 7E                 MOV   A,M       Get T/L byte

PAGE 06    DAI FIRMWARE 3E3F1-3E5BB  V1.1

312 E54B 23                 INX   H
313 E54C EB                 XCHG
314 E54D FE30               CPI   :30       Boolean type ?
315 E54F CCBCE5             CZ    :E5BC     Then encode var/array ref.
316 E552 CA65E5             JZ    :E565     and jump
317 E555 FE20               CPI   :20       STR type ?
318 E557 CCA1E3             CZ    :E3A1     Then encode STR expr
319 E55A CA65E5             JZ    :E565     and jump
320 E55D FE10               CPI   :10       INT type ?
321 E55F CC6DE3             CZ    :E36D     Then encode INT expr
322 E562 C476E3             CNZ   :E376     Else: encode FPT expr
323                 *
324 E565 F1         L3E73   POP   PSW       Get length function
325 E566 3D                 DCR   A         Check if all arguments done
326 E567 CA72E5             JZ    :E572     Jump if ready
327 E56A F5                 PUSH  PSW       Preserve T/L function
328 E56B CD67E8             CALL  :E867     Check if next char is ',',
329 E56E 2C                 DATA  :2C       run 'SYNTAX ERROR' if not
330 E56F C349E5             JMP   :E549     Encode next argument
331 E572 CD67E8     L3E74   CALL  :E867     Check if next char is ')',
332 E575 29                 DATA  :29       run 'SYNTAX ERROR' if not
333 E576 F1         L3E75   POP   PSW       Get T/L function
334 E577 E630               ANI   :30       Type only
335 E579 37                 STC             CY=1
336 E57A C9         L3E76   RET 
337                 *
338                 ************************
339                 * INT NUMBER INTO EBUF *
340                 ************************
341                 *
342                 * Entry: C : Points to input.
343                 *        HL: Points to EBUF.
344                 *
345 E57B CDD2DD     EINT    CALL  :DDD2     Get char from line, neglect
346                                         tab + space
347 E57E FE2D               CPI   :2D
348 E580 C285E5             JNZ   :E585     Jump if char is not '-'
349 E583 0C                 INR   C
350 E584 AF                 XRA   A         Else: clear sign bit
351 E585 CD24C0     L3E78   CALL  :C024     Input INT number to MACC
352 E588 C28DE5             JNZ   :E58D     Jump if nr was >= 0
353 E58B E7                 RST   4         Change sign MACC
354 E58C 60                 DATA  :60
355 E58D C3A3E5     L3E79   JMP   :E5A3     Move MACC into EBUF
356                 *
357                 ************************
358                 * HEX NUMBER INTO EBUF *
359                 ************************
360                 *
361 E590 CD2AC0     L3E80   CALL  :C02A     Input HEX number to MACC
362 E593 C3A3E5             JMP   :E5A3     Move MACC into EBUF
363                 *
364                 ************************
365                 * FPT NUMBER INTO EBUF *
366                 ************************
367                 *
368                 * Entry: C : Points to input.
369                 *        HL: Points to EBUF.
370                 * Non-error exit:  CY=1:
371                 *        C,HL updated. B preserved. A corrupted.
372                 *        DE: Location of number in EBUF.
373                 * Error exit: CY=0:

PAGE 07    DAI FIRMWARE 3E3F1-3E5BB  V1.1

374                 *        BDEHL preserved, A corrupted, C updated.
375                 *
376 E596 CDD2DD     EFPT    CALL  :DDD2     Get char from line, neglect
377                                         tab + space
378 E599 FE2D               CPI   :2D
379 E59B C2A0E5             JNZ   :E5A0     Jump if char is not '-'
380 E59E 0C                 INR   C
381 E59F AF                 XRA   A         Else: clear sign bit
382 E5A0 CD79E8     L3E82   CALL  :E879     FPT nr into MACC, evt
383                                         change sign
384                             
385                 * Entry for HEX/INT numbers:
386                             
387 E5A3 D2BBE5     L3E83   JNC   :E5BB     Abort if there are no digits
388 E5A6 C5                 PUSH  B
389 E5A7 54                 MOV   D,H       Old EBUF pntr in DE
390 E5A8 5D                 MOV   E,L
391 E5A9 CD18E0             CALL  :E018     ) Update EBUF pointer
392 E5AC CD18E0             CALL  :E018     ) to after new input
393 E5AF CD18E0             CALL  :E018     )
394 E5B2 CD18E0             CALL  :E018     )
395 E5B5 EB                 XCHG
396 E5B6 E7                 RST   4         Copy MACC into EBUF
397 E5B7 0F                 DATA  :0F
398 E5B8 EB                 XCHG
399 E5B9 C1                 POP   B
400 E5BA 37                 STC             CY=1
401 E5BB C9         L3E84   RET 
402                 *
403                 *
404                 *
408 E5BC                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
EFPT   E596   EFUN   E522   EINT   E57B   ELODA  E4A9   
ENM03  E4DC   ENM05  E4F9   ENM10  E4FB   ENM20  E4FF   
ENM25  E501   ENM30  E513   ENUM   E4C8   ESAVA  E4A9   
L3E381 E3F1   L3E382 E3F8   L3E383 E3FE   L3E384 E404   
L3E56  E444   L3E57  E455   L3E58  E477   L3E59  E486   
L3E60  E49B   L3E61  E4A4   L3E62  E4A7   L3E72  E549   
L3E73  E565   L3E74  E572   L3E75  E576   L3E76  E57A   
L3E78  E585   L3E79  E58D   L3E80  E590   L3E82  E5A0   
L3E83  E5A3   L3E84  E5BB
