
PAGE 01    DAI FIRMWARE 3E6FD-3E858  V1.1

002                         ORG   :E6FD
003                 *
004                 *
005                 *
006                 *******************************
007                 * FIND VARIABLE NAME IN INPUT *
008                 *******************************
009                 *
010                 * Checks if 1st character is a upper case one.
011                 * Reads the input (starting with character after
012                 * C) till it finds a non-alphanumeric character
013                 * (number or upper case). On a carry CALL, it also
014                 * accepts %, ! or $ at the end. Blanks are not
015                 * ignored and not accepted.
016                 *
017                 * Entry: C :  Input position.
018                 * Exit:  B :  Entry C.
019                 *        C :  Points to 1st character not accepted.
020                 *        D :  Count of 1st character not accepted.
021                 *             (1st character read has count 1).
022                 *        A,E: 1st non-alphanumeric character read.
023                 *        HL preserved. F corrupted.
024                 *
025 E6FD F5         RDID    PUSH  PSW       Preserve CY-flag
026 E6FE 41                 MOV   B,C
027 E6FF 1600               MVI   D,:00     Init count
028 E701 14         L3E110  INR   D         Count +1
029 E702 0C                 INR   C         Line pos +1
030 E703 7A                 MOV   A,D       Count in A
031 E704 FE0F               CPI   :0F       Max 14 char for a name
032 E706 DA0AE7             JC    :E70A
033 E709 15                 DCR   D         Skip last char if > 14
034 E70A CDE0DD     L3E111  CALL  :DDE0     Get char from line
035 E70D CD09DE             CALL  :DE09     Check if nr or upper case
036 E710 DA01E7             JC    :E701     Get next char if O.K.
037 E713 CDE0DD             CALL  :DDE0     Get 1st non-alphanum.char
038                                         from line
039 E716 5F                 MOV   E,A       Store it in E
040 E717 F1                 POP   PSW       Get CY-flag back
041 E718 7B                 MOV   A,E       Get char back in A
042 E719 D0                 RNC             Abort if non-carry CALL
043                             
044                 * On carry CALL only: accept !,%,$:
045                             
046 E71A FE25               CPI   :25
047 E71C CA27E7             JZ    :E727     Jump if char is '%'
048 E71F FE21               CPI   :21
049 E721 CA27E7             JZ    :E727     Jump if char is '!'
050 E724 FE24               CPI   :24
051 E726 C0                 RNZ             Abort if char is not '$'
052 E727 0C         L3E112  INR   C         Update line pos
053 E728 14                 INR   D         Update count
054 E729 C9                 RET 
055                 *
056                 *******************
057                 * GET LINE NUMBER *
058                 *******************
059                 *
060                 * Exit: C,HL: Updated.
061                 *       B preserved, AFDE corrupted.
062                 *       'SYNTAX ERROR' if no linenr given.
063                 *

PAGE 02    DAI FIRMWARE 3E6FD-3E858  V1.1

064 E72A CD31E7     ELN     CALL  :E731     Read linenr into EBUF
065 E72D D20BDA             JNC   :DA0B     Run 'SYNTAX ERROR' if no
066                                         number given
067 E730 C9                 RET 
068                 *
069                 ******************************
070                 * READ LINE NUMBER INTO EBUF *
071                 ******************************
072                 *
073                 * Exit: CY=0: No linenumber given. Error exit if
074                 *             linenumber is 0 or > #FFFF.
075                 *       CY=1: O.K.
076                 *       C,HL: Updated.
077                 *       B preserved, AFDE corrupted.
078                 *
079 E731 CDD2DD     L3E114  CALL  :DDD2     Get char from line, neglect
080                                         tab + space
081 E734 CD24C0             CALL  :C024     Input INT number to MACC
082 E737 D0                 RNC             Abort if no linenr given
083 E738 C5                 PUSH  B
084 E739 E7                 RST   4         Copy MACC into reg ABCD
085 E73A 15                 DATA  :15
086 E73B B0                 ORA   B
087 E73C C251E7             JNZ   :E751     Error exit if > #FFFF
088 E73F B1                 ORA   C
089 E740 B2                 ORA   D
090 E741 CA51E7             JZ    :E751     Error exit if nr = 0
091 E744 5A                 MOV   E,D       ) Linenr in DE
092 E745 51                 MOV   D,C       )
093 E746 72                 MOV   M,D       Hibyte linenr into EBUF
094 E747 CD18E0             CALL  :E018     Update EBUF pointer
095 E74A 73                 MOV   M,E       Lobyte linenr into EBUF
096 E74B CD18E0             CALL  :E018     Update EBUF pointer
097 E74E C1                 POP   B
098 E74F 37                 STC             CY=1 (O.K.)
099 E750 C9                 RET 
100                             
101                 * Error exit:
102                             
103 E751 C1         L3E115  POP   B
104 E752 3E15               MVI   A,:15
105 E754 C3F5D9             JMP   :D9F5     Run error 'NUMBER OUT OF
106                                         RANGE'
107                 *
108                 *************************************
109                 * ENCODE BINARY OPERATION INTO EBUF *
110                 *************************************
111                 *
112                 * Entry: A : Result of 3E7CF:
113                 *            1xx xxxxx : compute type / opcode.
114                 *        E : Table code byte.
115                 *        HL: 1st free location EBUF.
116                 *
117 E757 F5         L3E116  PUSH  PSW
118 E758 7B                 MOV   A,E       Get conversion code byte
119 E759 EB                 XCHG
120 E75A 2A3B01             LHLD  :013B     Get addr last operator in
121                                         EBUF
122 E75D EB                 XCHG            in DE
123 E75E CD70E7             CALL  :E770     Add conversion byte for
124                                         2nd operand
125 E761 0F                 RRC 

PAGE 03    DAI FIRMWARE 3E6FD-3E858  V1.1

126 E762 0F                 RRC 
127 E763 EB                 XCHG
128 E764 2A3901             LHLD  :0139     Get addr in EBUF for next
129                                         operator
130 E767 EB                 XCHG
131 E768 CD70E7             CALL  :E770     Add conversion byte for
132                                         1st operand
133 E76B F1                 POP   PSW       Restore compute/opcode in A
134 E76C CD83E7             CALL  :E783     Insert it into EBUF
135 E76F C9                 RET 
136                 *
137                 *********************************************
138                 * ADD INT/FPT CONVERSION BYTE TO EXPRESSION *
139                 *********************************************
140                 *
141                 * Entry: A : Conversion byte:
142                 *            #01: Convert FPT to INT.
143                 *            #02: Convert INT to FPT.
144                 *
145 E770 F5         L3E117  PUSH  PSW
146 E771 E603               ANI   :03       Conversion only
147 E773 CA81E7             JZ    :E781     Jump if no conversion reqd
148 E776 1F                 RAR             CY=1 if FPT to INT
149 E777 3E9F               MVI   A,:9F     Conv.byte FPT to INT
150 E779 DA7EE7             JC    :E77E
151 E77C 3EBF               MVI   A,:BF     Conv.byte INT to FPT
152 E77E CD83E7     L3E118  CALL  :E783     Insert conv.byte into EBUF
153 E781 F1         L3E119  POP   PSW
154 E782 C9                 RET 
155                 *
156                 *************************
157                 * INSERT BYTE INTO EBUF *
158                 *************************
159                 *
160                 * Data is moved 1 byte to create space for byte
161                 * to be inserted.
162                 *
163                 * Entry: A : Byte to be inserted.
164                 *        DE: Startaddress source bank.
165                 *        HL: Endaddress source bank +1.
166                 * Exit:  HL= HL + 1.
167                 *        ABCDE preserved.
168                 *
169 E783 C5         L3E120  PUSH  B
170 E784 42                 MOV   B,D       ) Start source in BC
171 E785 4B                 MOV   C,E       )
172 E786 03                 INX   B         Destination 1 byte higher
173 E787 F5                 PUSH  PSW
174 E788 D5                 PUSH  D
175 E789 CD18E0             CALL  :E018     Update EBUF pointer
176 E78C E5                 PUSH  H
177 E78D 2B                 DCX   H
178 E78E CD4FDE             CALL  :DE4F     Move EBUF contents 1 byte
179 E791 E1                 POP   H
180 E792 D1                 POP   D
181 E793 F1                 POP   PSW
182 E794 12                 STAX  D         Store byte into EBUF
183 E795 C1                 POP   B
184 E796 C9                 RET 
185                 *
186                 *
187                 *

PAGE 04    DAI FIRMWARE 3E6FD-3E858  V1.1

188                 *****************************************
189                 * ENCODE AN UNITARY OPERATOR FOR A TERM *
190                 *****************************************
191                 *
192                 * Entry: A : Code according to table CFD8.
193                 * Exit:  BCHL preserved. DE corrupted.
194                 *        A : Code byte:
195                 *                  +    -   INOT
196                 *            INT   BC   BD   BE
197                 *            FPT   9C   9D   *
198                 *
199 E797 E5         L3E121  PUSH  H
200 E798 213601             LXI   H,:0136   Addr type last expression
201 E79B E61F               ANI   :1F       Opcode only
202 E79D FE00               CPI   :00       '+' ?
203 E79F 161C               MVI   D,:1C
204 E7A1 CABAE7             JZ    :E7BA     Then jump
205 E7A4 FE01               CPI   :01       '-' ?
206 E7A6 161D               MVI   D,:1D
207 E7A8 CABAE7             JZ    :E7BA     Then jump
208 E7AB FE1E               CPI   :1E       'INOT' ?
209 E7AD C20BDA             JNZ   :DA0B     Run 'SYNTAX ERROR' if not
210                             
211                 * If 'INOT':
212                             
213 E7B0 7E                 MOV   A,M       Get type last expression
214 E7B1 FE10               CPI   :10       Must be INT
215 E7B3 C21ADA             JNZ   :DA1A     Run error 'TYPE MISMATCH'
216                                         if not
217 E7B6 3EBE               MVI   A,:BE     Code 'INOT' in A
218 E7B8 E1         L3E122  POP   H
219 E7B9 C9                 RET 
220                             
221                 * If '+' or '-':
222                             
223 E7BA 7E         L3E123  MOV   A,M       Get type last expression
224 E7BB FE10               CPI   :10
225 E7BD 1EA0               MVI   E,:A0
226 E7BF CACAE7             JZ    :E7CA     Jump if INT
227 E7C2 7E                 MOV   A,M       Get type last expression
228 E7C3 FE00               CPI   :00
229 E7C5 1E80               MVI   E,:80
230 E7C7 C21ADA             JNZ   :DA1A     Run error 'TYPE MISMATCH'
231                                         if not FPT
232 E7CA 7A         L3E124  MOV   A,D       ) Set up code in A
233 E7CB B3                 ORA   E         )
234 E7CC C3B8E7             JMP   :E7B8
235                 *
236                 *****************************************
237                 * OBTAIN TYPE INFO FOR BINARY OPERATION *
238                 *****************************************
239                 *
240                 * Entry: A : Code for binary operation (lower 5
241                 *            bits).
242                 *        E : Type 1st operand.
243                 *      TYPE: Type 2nd operand.
244                 *
245                 * Routine compares both types. If different, one
246                 * must be INT and the other FPT, else type mismatch
247                 * error.
248                 * Type conversion and operation type are obtained
249                 * from table on 3E835. Type mismatch if illegal

PAGE 05    DAI FIRMWARE 3E6FD-3E858  V1.1

250                 * type.
251                 * Type of result is stored in TYPE.
252                 *
253                 * Exit: E : Type code from table.
254                 *       A : Code for EBUF:  1xx xxxxx:
255                 *           bits 5,6: type of compute required:
256                 *                     0 : FPT
257                 *                     1 : INT
258                 *                     2 : STR
259                 *                     3 : Boolean
260                 *           bits 0-4: Opcode.
261                 *       BCDHL preserved.
262                 *
263 E7CF E5         L3E125  PUSH  H
264 E7D0 D5                 PUSH  D
265 E7D1 E61F               ANI   :1F       Opcode only
266 E7D3 F5                 PUSH  PSW
267 E7D4 CD1FE8             CALL  :E81F     Set D according to opcode
268 E7D7 3A3601             LDA   :0136     Get type latest expression
269 E7DA BB                 CMP   E         Compare both types
270 E7DB C209E8             JNZ   :E809     Jump if not identical
271 E7DE 07                 RLC             )
272 E7DF 07                 RLC             ) Type code from TYPE in
273 E7E0 07                 RLC             ) lonibble
274 E7E1 07                 RLC             )
275 E7E2 E603               ANI   :03       Only lower 2 bits
276 E7E4 6F                 MOV   L,A       in L
277 E7E5 7A         L3E126  MOV   A,D       Get opcode group (0-5)
278 E7E6 87                 ADD   A         *2
279 E7E7 57                 MOV   D,A       in D
280 E7E8 87                 ADD   A         *4
281 E7E9 82                 ADD   D         *6 (find group in table)
282 E7EA 85                 ADD   L         Find pos in grouptable
283 E7EB 2135E8             LXI   H,:E835   Startaddr result table
284 E7EE CD30DE             CALL  :DE30     Find addr resultcode in
285                                         table
286 E7F1 7E                 MOV   A,M       Get resultcode
287 E7F2 3C                 INR   A         Check if code is FF
288 E7F3 CA1ADA             JZ    :DA1A     Then run error 'TYPE
289                                         MISMATCH'
290 E7F6 3D                 DCR   A
291 E7F7 E630               ANI   :30       Get type of result only
292 E7F9 323601             STA   :0136     Store type latest expression
293 E7FC D1                 POP   D         Get code for binary
294                                         operation in D
295 E7FD 5E                 MOV   E,M       ) Get resultcode from table
296 E7FE 7E                 MOV   A,M       ) in E and in A
297 E7FF 1F                 RAR 
298 E800 E660               ANI   :60       Reqd computing in bits 5,6
299 E802 B2                 ORA   D         Add opcode in bits 0-4
300 E803 F680               ORI   :80       Set bit 7
301 E805 E1                 POP   H
302 E806 54                 MOV   D,H       Restore D
303 E807 E1                 POP   H
304 E808 C9                 RET 
305                             
306                 * If both types not identical:
307                             
308 E809 2E04       L3E127  MVI   L,:04
309 E80B FE00               CPI   :00       TYPE is FPT ?
310 E80D CA16E8             JZ    :E816     Then jump
311 E810 2C                 INR   L

PAGE 06    DAI FIRMWARE 3E6FD-3E858  V1.1

312 E811 FE10               CPI   :10       TYPE is INT ?
313 E813 C21ADA             JNZ   :DA1A     Run error 'TYPE MISMATCH'
314                                         if not
315 E816 83         L3E128  ADD   E         Add other type
316 E817 FE10               CPI   :10       Result must be #10
317 E819 C21ADA             JNZ   :DA1A     Run error 'TYPE MISMATCH'
318                                         if not
319 E81C C3E5E7             JMP   :E7E5     Calc conversion
320                 *
321                 * SET D DEPENDING ON OPCODE BINARY OPERATOR:
322                 *
323                 * Entry: A : Opcode binary operator (table #CF91).
324                 * Exit: ABCEHL preserved.
325                 *
326 E81F 1600       L3E129  MVI   D,:00     D=0
327 E821 FE01               CPI   :01
328 E823 D8                 RC              Ready if opcode is 0 (+)
329 E824 14                 INR   D         D=1
330 E825 FE04               CPI   :04
331 E827 D8                 RC              Ready if opcode is 1,2 or
332                                         3 (-,/,*)
333 E828 1602               MVI   D,:02     D=2
334 E82A C8                 RZ              Ready if opcode is 4 (^)
335 E82B 14                 INR   D         D=3
336 E82C FE10               CPI   :10
337 E82E D8                 RC              Ready if opcode is 5-F
338                                         (IOR,IAND,IXOR,SHL,SHR,MOD)
339 E82F 14                 INR   D         D=4
340 E830 FE18               CPI   :18
341 E832 D8                 RC              Ready if opcode is 10-17
342                                         (>=, <=, >, <, =, <>)
343 E833 14                 INR   D         D=5
344 E834 C9                 RET             If opcode >= 18 (AND,OR)
345                 *
346                 * TABLE WITH TYPE RESULTS:
347                 *
348                 * The table gives the relation between input
349                 * operands, the binary operator and the result
350                 * for different groups of binary operations.
351                 * The groupnumber is calculated in 3E81F.
352                 *
353                 * Format each group: 6 bytes. Sequence:
354                 *             FPT/FPT
355                 *             INT/INT
356                 *             STR/STR
357                 *             LOGIC/LOGIC
358                 *             INT/FPT
359                 *             FPT/INT
360                 * Format each byte:
361                 *       bit 7,6: type arithmetic ) 0: FPT  1: INT
362                 *       bit 5,4: Type result     ) 2: STR  3: logic
363                 *       bit 3,2: Conversion left operand.
364                 *       bit 1,0: Conversion right operand.
365                 *                0 : No conversion.
366                 *                1 : Convert to INT.
367                 *                2 : Convert to FPT.
368                 *       FF : Not possible.
369                 *
370 E835 00         L3E385  DATA  :00       Group D=0:
371 E836 50                 DATA  :50       +
372 E837 A0                 DATA  :A0
373 E838 FF                 DATA  :FF

PAGE 07    DAI FIRMWARE 3E6FD-3E858  V1.1

374 E839 08                 DATA  :08
375 E83A 02                 DATA  :02
376                 *
377 E83B 00                 DATA  :00       Group D=1:
378 E83C 50                 DATA  :50       -,/,*
379 E83D FF                 DATA  :FF
380 E83E FF                 DATA  :FF
381 E83F 08                 DATA  :08
382 E840 02                 DATA  :02
383                 *
384 E841 00                 DATA  :00       Group D=2:
385 E842 0A                 DATA  :0A       ^
386 E843 FF                 DATA  :FF
387 E844 FF                 DATA  :FF
388 E845 08                 DATA  :08
389 E846 02                 DATA  :02
390                 *
391 E847 55                 DATA  :55       Group D=3:
392 E848 50                 DATA  :50       IAND,IOR,IXOR,MOD,SHL,SHR
393 E849 FF                 DATA  :FF
394 E84A FF                 DATA  :FF
395 E84B 51                 DATA  :51
396 E84C 54                 DATA  :54
397                 *
398 E84D 30                 DATA  :30       Group D=4:
399 E84E 70                 DATA  :70       <,>,<>,=,<=,>=
400 E84F B0                 DATA  :B0
401 E850 FF                 DATA  :FF
402 E851 38                 DATA  :38
403 E852 32                 DATA  :32
404                 *
405 E853 FF                 DATA  :FF       Group D=5:
406 E854 FF                 DATA  :FF       AND,OR
407 E855 FF                 DATA  :FF
408 E856 F0                 DATA  :F0
409 E857 FF                 DATA  :FF
410 E858 FF                 DATA  :FF
411                 *
412                 *
413                 *
414 E859                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
ELN    E72A   L3E110 E701   L3E111 E70A   L3E112 E727   
L3E114 E731   L3E115 E751   L3E116 E757   L3E117 E770   
L3E118 E77E   L3E119 E781   L3E120 E783   L3E121 E797   
L3E122 E7B8   L3E123 E7BA   L3E124 E7CA   L3E125 E7CF   
L3E126 E7E5   L3E127 E809   L3E128 E816   L3E129 E81F   
L3E385 E835   RDID   E6FD
