
PAGE 01    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

002                         ORG   :E79D
003                 *
004                 *
005                 *
006                 *******************************************
007                 * EVALUATE ARGUMENTS IN STRING EXPRESSION *
008                 *******************************************
009                 *
010                 * Only '+' or compare with logical result is
011                 * allowed. The right-hand side of a string expres-
012                 * sion is evaluated. If it is not status 02, it is
013                 * moved into the Heap. The stringpointer is saved
014                 * at the varptr location.
015                 * If the variable had already an old value on the
016                 * heap, it is cleared, see further exit conditions.
017                 *
018                 * Entry: (BC): 1.....  Expr. begins with operator.
019                 *              01....  Variable reference.
020                 *              001...  Function call.
021                 *              else    Constant.
022                 * Exit:  BC updated, DEHL corrupted.
023                 *        A: Type (#20).
024                 *
025 E79D 0A         REXPS   LDAX  B         get 1st byte
026 E79E 07                 RLC 
027 E79F DABDE7             JC    :E7BD     Jump if 1st byte is operator
028 E7A2 07                 RLC 
029 E7A3 DAB3E7             JC    :E7B3     Jump if string variable
030 E7A6 07                 RLC 
031 E7A7 DAD9E9             JC    :E9D9     Jump if string function
032                             
033                 * If string constant:
034                             
035 E7AA 1E00               MVI   E,:00     Status: constant
036 E7AC 03                 INX   B
037 E7AD 0A                 LDAX  B         Get string length
038 E7AE 60                 MOV   H,B       ) Stringpntr in HL
039 E7AF 69                 MOV   L,C       )
040 E7B0 C390E1             JMP   :E190     Abort with BC pnts after STR
041                             
042                 * If string variable:
043                             
044 E7B3 CD63E9     RXS10   CALL  :E963     Get varptr in HL, T/L in A
045 E7B6 5E                 MOV   E,M       )
046 E7B7 23                 INX   H         ) Stringaddr in DE
047 E7B8 56                 MOV   D,M       )
048 E7B9 EB                 XCHG            and in HL
049 E7BA 1E01               MVI   E,:01     Status: variable
050 E7BC C9                 RET 
051                             
052                 * If string operation:
053                             
054 E7BD 0A         ROSTR   LDAX  B         Get 1st byte
055 E7BE 03                 INX   B
056 E7BF F5                 PUSH  PSW
057 E7C0 D5                 PUSH  D
058 E7C1 CD9DE7             CALL  :E79D     Evaluate string expression
059 E7C4 F1                 POP   PSW
060 E7C5 57                 MOV   D,A
061 E7C6 F1                 POP   PSW
062 E7C7 E5                 PUSH  H         Remember it
063 E7C8 53                 MOV   D,E       Type in D

PAGE 02    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

064 E7C9 F5                 PUSH  PSW
065 E7CA D5                 PUSH  D
066 E7CB CD9DE7             CALL  :E79D     Eval 2nd string expr
067 E7CE F1                 POP   PSW
068 E7CF 57                 MOV   D,A
069 E7D0 F1                 POP   PSW
070 E7D1 C5                 PUSH  B         Save it
071 E7D2 44                 MOV   B,H
072 E7D3 4D                 MOV   C,L
073 E7D4 E1                 POP   H
074 E7D5 E3                 XTHL            Save program pointer
075 E7D6 C5                 PUSH  B         )
076 E7D7 42                 MOV   B,D       )
077 E7D8 4B                 MOV   C,E       ) Re-arrange registers
078 E7D9 EB                 XCHG            )
079 E7DA E1                 POP   H         )
080 E7DB FEC0               CPI   :C0       Operator is '+'?
081 E7DD CAEBE7             JZ    :E7EB     Then append 2 strings
082                             
083                 * If string compare:
084                             
085 E7E0 CD21D1             CALL  :D121     Compare 2 strings
086 E7E3 CDF8E7             CALL  :E7F8     Returns operands if temp
087 E7E6 C1                 POP   B         restore
088 E7E7 5F                 MOV   E,A       Opcode in E
089 E7E8 C333E9             JMP   :E933     Evaluate the compare
090                             
091                 * If operator is '+':
092                             
093 E7EB E5         ROS10   PUSH  H
094 E7EC CD06D1             CALL  :D106     Make 1 string out of 2
095 E7EF E3                 XTHL            Save pntr to result/store
096                                         pntr to operand
097 E7F0 CDF8E7             CALL  :E7F8     Clean up heap
098 E7F3 E1                 POP   H         Pntr to result in HL
099 E7F4 C1                 POP   B         Program pntr in BC
100 E7F5 1E02               MVI   E,:02     Status: temporary
101 E7F7 C9                 RET 
102                 *
103                 * CLEAR UP HEAP AFTER STRING OPERATION:
104                 *
105                 * Entry: B,C: Code for 1st resp. 2nd operand.
106                 *             (0=const, 1=var, 2=temp).
107                 *        DE:  Points to 1st operand.
108                 *        HL:  Points to 2nd operand.
109                 * Exit:  DEHL corrupted, AFBC preserved.
110                 *
111 E7F8 F5         DROPS   PUSH  PSW
112 E7F9 79                 MOV   A,C       Get code 2nd operand
113 E7FA FE02               CPI   :02       Temporary?
114 E7FC CC87D1             CZ    :D187     Then clear string in heap
115 E7FF EB                 XCHG
116 E800 78                 MOV   A,B       Get code 1st operand
117 E801 FE02               CPI   :02       Temporary?
118 E803 CC87D1             CZ    :D187     Then clear string in heap
119 E806 F1                 POP   PSW
120 E807 C9                 RET 
121                 *
122                 *********************************
123                 * EVALUATE A NUMERIC EXPRESSION *
124                 *********************************
125                 *

PAGE 03    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

126                 * Entry: BC: Points to a numeric function argument
127                 *            or a numeric expression in program.
128                 * Exit:  BC updated, AFDEHL preserved.
129                 *        Result in MACC.
130                 *
131 E808 F5         REXNA   PUSH  PSW
132 E809 D5                 PUSH  D
133 E80A E5                 PUSH  H
134 E80B CD19E8             CALL  :E819     Eval arguments in num expr
135 E80E 7C                 MOV   A,H
136 E80F B5                 ORA   L
137 E810 CA15E8             JZ    :E815     Abort if result in MACC
138 E813 E7                 RST   4         Else: copy operand to MACC
139 E814 0C                 DATA  :0C
140 E815 E1         L0E146  POP   H
141 E816 D1                 POP   D
142 E817 F1                 POP   PSW
143 E818 C9                 RET 
144                 *
145                 ********************************************
146                 * EVALUATE ARGUMENTS IN NUMERIC EXPRESSION *
147                 ********************************************
148                 *
149                 * Checks for constants, functions, variables and
150                 * operators. The right-hand side of the expression
151                 * is therefore evaluated. The value of the variable
152                 * is stored at its varptr location.
153                 *
154                 * Entry: BC:   Points to expression in program.
155                 *        (BC): 1.... Expr begins with operator.
156                 *              01... Variable reference.
157                 *              001.. Function call.
158                 *              Else  Constant.
159                 *        D<>0: MACC must be preserved.
160                 *
161 E819 1600       REXPN   MVI   D,:00     Set MACC free
162                             
163                 * Called by lower levels:
164                             
165 E81B 0A         RXN10   LDAX  B         Get 1st byte
166 E81C 07                 RLC 
167 E81D DA50E8             JC    :E850     Jump if expr starts with
168                                         operator
169 E820 07                 RLC 
170 E821 DA6BE9             JC    :E96B     Jump if var reference
171 E824 07                 RLC 
172 E825 DA30E8             JC    :E830     Jump if function call
173                             
174                 * If numeric constant:
175                             
176 E828 03                 INX   B         Past flag byte
177 E829 60                 MOV   H,B       ) HL pnts to constant
178 E82A 69                 MOV   L,C       )
179 E82B 03                 INX   B
180 E82C 03                 INX   B
181 E82D 03                 INX   B
182 E82E 03                 INX   B         Program pntr pnts beyond
183 E82F C9                 RET 
184                             
185                 * If numeric function:
186                             
187 E830 D5         RFUNN   PUSH  D

PAGE 04    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

188 E831 7A                 MOV   A,D
189 E832 B7                 ORA   A
190 E833 CA46E8             JZ    :E846     Jump if MACC free
191 E836 CD18C0             CALL  :C018     Save MACC on stack
192 E839 CDD9E9             CALL  :E9D9     Evaluate function call
193                                         result in MACC
194 E83C 212901             LXI   H,:0129   Addr WORKE
195 E83F E7                 RST   4         Copy result to WORKE
196 E840 0F                 DATA  :0F
197 E841 CD1BC0             CALL  :C01B     Restore MACC from stack
198 E844 D1                 POP   D
199 E845 C9                 RET 
200 E846 CDD9E9     RFN10   CALL  :E9D9     Evaluate function call,
201                                         result in MACC
202 E849 D1                 POP   D
203 E84A 16FF               MVI   D,:FF     Set MACC to be preserved
204 E84C 210000             LXI   H,:0000   Flag 'result in MACC'
205 E84F C9                 RET 
206                             
207                 * If expr begins with numeric operator:
208                             
209 E850 0A         RONUM   LDAX  B         Get operator
210 E851 E67F               ANI   :7F       Clip operator bit
211 E853 03                 INX   B
212 E854 FE1A               CPI   :1A       Bracket?
213 E856 CA1BE8             JZ    :E81B     Then ignore it
214 E859 15                 DCR   D
215 E85A 14                 INR   D         Check if D<>0
216 E85B C418C0             CNZ   :C018     Then save MACC on stack
217 E85E D5                 PUSH  D
218 E85F 5F                 MOV   E,A       Opcode in E
219 E860 21DCE8             LXI   H,:E8DC
220 E863 E5                 PUSH  H         Returnaddr on stack
221 E864 CD19E8             CALL  :E819     Get 1st operand
222 E867 7B                 MOV   A,E       Opcode in A
223 E868 E61F               ANI   :1F
224 E86A FE1C               CPI   :1C
225 E86C D29FE8             JNC   :E89F     Jump if unitary operation
226                             
227                 * If boolean operator:
228                             
229 E86F E5                 PUSH  H         Save pntr to 1st operand
230 E870 CD1BE8             CALL  :E81B     Get 2nd operand
231 E873 7C                 MOV   A,H
232 E874 B5                 ORA   L
233 E875 C27DE8             JNZ   :E87D     Jump if HL pnts to WORKE
234 E878 212901             LXI   H,:0129   Addr WORKE
235 E87B E7                 RST   4         Copy 2nd operand to WORKE
236 E87C 0F                 DATA  :0F
237 E87D E3         RON10   XTHL
238 E87E 7C                 MOV   A,H
239 E87F B5                 ORA   L
240 E880 CA85E8             JZ    :E885     Jump if 1st operand in MACC
241 E883 E7                 RST   4         Else copy it from WORKE
242 E884 0C                 DATA  :0C       to MACC
243 E885 7B         L0E153  MOV   A,E       Get opcode
244 E886 E61F               ANI   :1F
245 E888 FE10               CPI   :10
246 E88A D2C9E8             JNC   :E8C9     If relational operation
247                             
248                 * If arithmetic operation:
249                             

PAGE 05    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

250 E88D BB                 CMP   E
251 E88E 21FDE8             LXI   H,:E8FD   Addr table INT routines
252 E891 C297E8             JNZ   :E897     Jump if INT
253 E894 21EEE8             LXI   H,:E8EE   Addr table FPT routines
254 E897 1600       RON20   MVI   D,:00     Set MACC free
255 E899 5F                 MOV   E,A       Opcode in E
256 E89A 19                 DAD   D
257 E89B 19                 DAD   D
258 E89C 19                 DAD   D         Find routine in table
259 E89D E3                 XTHL            Addr routine on stack; pntr
260                                         to 2nd operand in HL
261 E89E C9                 RET             Perform routine
262                 *
263                 * If an unitary operation:
264                 *
265                 * Entry: HL: Points to operand (0 if in MACC).
266                 *        E:  Full opcode.
267                 *        A:  Lower 5 bits opcode.
268                 *        Returnaddr on stack (E8DC).
269                 * Exit:  Result in MACC.
270                 *        ABCDEHL preserved
271                 *
272 E89F F5         RON40   PUSH  PSW
273 E8A0 7C                 MOV   A,H
274 E8A1 B5                 ORA   L
275 E8A2 CAA7E8             JZ    :E8A7     If operand in MACC
276 E8A5 E7                 RST   4         Else: operand in MACC
277 E8A6 0C                 DATA  :0C
278 E8A7 F1         L0E156  POP   PSW
279 E8A8 C8                 RZ              Ready if unitary '+'
280 E8A9 BB                 CMP   E         Bits 6,7 opcode 0?
281 E8AA CABEE8             JZ    :E8BE     Then change MACC to INT
282 E8AD FE1E               CPI   :1E       INOT?
283 E8AF DABBE8             JC    :E8BB     Then change sign MACC (INT)
284 E8B2 C2B8E8             JNZ   :E8B8     Then convert MACC to FPT
285 E8B5 E7                 RST   4         Perform INOT
286 E8B6 6C                 DATA  :6C
287 E8B7 C9                 RET 
288                 *
289 E8B8 E7         L0E157  RST   4         Convert MACC to FPT
290 E8B9 4B                 DATA  :4B
291 E8BA C9                 RET 
292                 *
293 E8BB E7         RON44   RST   4         Change sign MACC (INT)
294 E8BC 60                 DATA  :60
295 E8BD C9                 RET 
296                 *
297 E8BE FE1D       RON45   CPI   :1D
298 E8C0 CAC6E8             JZ    :E8C6     Then change sign MACC (FPT)
299 E8C3 E7                 RST   4         Convert MACC to INT
300 E8C4 48                 DATA  :48
301 E8C5 C9                 RET 
302                 *
303 E8C6 E7         RON49   RST   4         Change sign MACC (FPT)
304 E8C7 1B                 DATA  :1B
305 E8C8 C9                 RET 
306                 *
307                 * If relational numeric operation:
308                 *
309                 * Entry: 1st operand in MACC, 2nd operand on stack.
310                 *        E: Full opcode.
311                 *        A: Lowest 5 bits opcode.

PAGE 06    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

312                 * Exit:  BC preserved, DEHL corrupted.
313                 *
314 E8C9 E1         RON50   POP   H         Get pntr 2nd operand
315 E8CA BB                 CMP   E
316 E8CB CAD6E8             JZ    :E8D6     Jump if FPT
317 E8CE CD15C0             CALL  :C015     Compare 2 INT numbers
318 E8D1 E1         RON55   POP   H         Kill returnaddr
319 E8D2 E1                 POP   H         Kill saved DE
320 E8D3 C333E9             JMP   :E933     Return logical result
321 E8D6 CD0CC0     RON60   CALL  :C00C     Compare 2 FPT numbers
322 E8D9 C3D1E8             JMP   :E8D1
323                 *
324                 * MOVE OPERAND:
325                 *
326                 * REX.. routines return here after operation.
327                 * Moves operand to proper location after computing.
328                 *
329                 * Entry: DE and returnaddress on stack.
330                 * Exit:  ABC preserved.
331                 *
332 E8DC D1         RON30   POP   D
333 E8DD 15                 DCR   D
334 E8DE 14                 INR   D         Check D=0 (MACC free)
335 E8DF 16FF               MVI   D,:FF
336 E8E1 210000             LXI   H,:0000   Flag 'result in MACC'
337 E8E4 C8                 RZ              Abort if operand in MACC
338 E8E5 212901             LXI   H,:0129   Addr WORKE
339 E8E8 E7                 RST   4         Copy MACC to WORKE
340 E8E9 0F                 DATA  :0F
341 E8EA CD1BC0             CALL  :C01B     Restore old MACC from stack
342 E8ED C9                 RET 
343                 *
344                 * TABLE OF JUMPS TO INT/FPT OPERATOR ROUTINES:
345                 *
346 E8EE E7         ROFTAB  RST   4
347 E8EF 00                 DATA  :00       MFADD; +
348 E8F0 C9                 RET 
349                 *
350 E8F1 E7                 RST   4
351 E8F2 03                 DATA  :03       MFSUB; -
352 E8F3 C9                 RET 
353                 *
354 E8F4 E7                 RST   4
355 E8F5 09                 DATA  :09       MFDIV; /
356 E8F6 C9                 RET 
357                 *
358 E8F7 E7                 RST   4
359 E8F8 06                 DATA  :06       MFMUL; *
360 E8F9 C9                 RET 
361                 *
362 E8FA E7                 RST   4
363 E8FB 24                 DATA  :24       MPWR ; ^
364 E8FC C9                 RET 
365                 *
366 E8FD E7         ROITAB  RST   4
367 E8FE 4E                 DATA  :4E       MIADD; +
368 E8FF C9                 RET 
369                 *
370 E900 E7                 RST   4
371 E901 51                 DATA  :51       MISUB; -
372 E902 C9                 RET 
373                 *

PAGE 07    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

374 E903 E7                 RST   4
375 E904 57                 DATA  :57       MIDIV; /
376 E905 C9                 RET 
377                 *
378 E906 E7                 RST   4
379 E907 54                 DATA  :54       MIMUL; *
380 E908 C9                 RET 
381                 *
382 E909 00                 DATA  :00
383 E90A 00                 DATA  :00
384 E90B 00                 DATA  :00
385 E90C 00                 DATA  :00
386 E90D 00                 DATA  :00
387 E90E 00                 DATA  :00
388 E90F 00                 DATA  :00
389 E910 00                 DATA  :00
390 E911 00                 DATA  :00
391 E912 00                 DATA  :00
392 E913 00                 DATA  :00
393 E914 00                 DATA  :00
394 E915 00                 DATA  :00
395 E916 00                 DATA  :00
396 E917 00                 DATA  :00
397                 *
398 E918 E7                 RST   4         MIAND
399 E919 63                 DATA  :63
400 E91A C9                 RET 
401                 *
402 E91B E7                 RST   4         MIOR
403 E91C 66                 DATA  :66
404 E91D C9                 RET 
405                 *
406 E91E 00                 DATA  :00
407 E91F 00                 DATA  :00
408 E920 00                 DATA  :00
409                 *
410 E921 E7                 RST   4         MIXOR
411 E922 69                 DATA  :69
412 E923 C9                 RET 
413                 *
414 E924 E7                 RST   4         MSHL
415 E925 6F                 DATA  :6F
416 E926 C9                 RET 
417                 *
418 E927 E7                 RST   4         MSHR
419 E928 72                 DATA  :72
420 E929 C9                 RET 
421                 *
422 E92A E7                 RST   4         MIREM
423 E92B 5A                 DATA  :5A
424 E92C C9                 RET 
425                 *
426                 *
427                 *
428 E92D                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
DROPS  E7F8   L0E146 E815   L0E153 E885   L0E156 E8A7   
L0E157 E8B8   REXNA  E808   REXPN  E819   REXPS  E79D   

PAGE 08    DAI FIRMWARE 0E79D-0E92C  V1.0  Rev.1

RFN10  E846   RFUNN  E830   ROFTAB E8EE   ROITAB E8FD   
RON10  E87D   RON20  E897   RON30  E8DC   RON40  E89F   
RON44  E8BB   RON45  E8BE   RON49  E8C6   RON50  E8C9   
RON55  E8D1   RON60  E8D6   RONUM  E850   ROS10  E7EB   
ROSTR  E7BD   RXN10  E81B   RXS10  E7B3
