
PAGE 01    DAI FIRMWARE 3E859-3E9FF  V1.1

002                         ORG   :E859
003                 *
004                 *
005                 *
006                 ******************************
007                 * CHECK STATEMENT TERMINATOR *
008                 ******************************
009                 *
010                 * Get character from line and checks if it is
011                 * a correct terminator (':' or car.ret).
012                 *
013                 * Exit: Z=1: correct terminator.
014                 *       Z=0: incorrect.
015                 *       BCDEHL preserved. A corrupted.
016                 *
017 E859 CDD2DD     TSEOC   CALL  :DDD2     Get char from line, neglect
018                                         tab + space
019 E85C FE3A               CPI   :3A       Is it ':' ?
020 E85E C8                 RZ  
021 E85F FE0D               CPI   :0D       Is it 'CR' ?
022 E861 C9                 RET 
023                 *
024                 **********************************
025                 * CHECK IF NEXT CHARACTER IS ',' *
026                 **********************************
027                 *
028                 * Exit: C updated, AF corrupted, BDEHL preserved.
029                 *
030 E862 CD67E8     L3E131  CALL  :E867     Check if next char is ','
031 E865 2C                 DATA  :2C
032 E866 C9                 RET 
033                 *
034                 ************************
035                 * CHECK NEXT CHARACTER *
036                 ************************
037                 *
038                 * Routine finds next valid character in input. If
039                 * it is not the character expected: syntax error.
040                 *
041                 * Entry: C : Points to input.
042                 *        ASCII-value of character to compare with
043                 *        on stack.
044                 * Exit:  If correct: C updated, AF corrupted,
045                 *        BDEHL preserved.
046                 *
047 E867 E3         ECHRI   XTHL            HL pnts to expected char
048 E868 CDD2DD             CALL  :DDD2     Get char from line, neglect
049                                         tab + space
050 E86B BE                 CMP   M         Is it expected one ?
051 E86C C20BDA             JNZ   :DA0B     Run 'SYNTAX ERROR' if not
052 E86F 0C                 INR   C         Pnts to next input
053 E870 23                 INX   H         )
054 E871 E3                 XTHL            ) Update SP
055 E872 C9                 RET 
056                 *
057                 *******************************
058                 * ENCODE 'ERASE' - (not used) *
059                 *******************************
060                 *
061                 * The BASIC command 'ERASE' is cancelled.
062                 *
063 E873 1178E6     L3E133  LXI   D,:E678   Addr routine encode array

PAGE 02    DAI FIRMWARE 3E859-3E9FF  V1.1

064                                         without arguments
065 E876 C32AE1             JMP   :E12A     Encode
066                 *
067                 ******************************
068                 * INPUT FPT NUMBER INTO MACC *
069                 ******************************
070                 *
071                 * Entry: Z=1: Change sign too.
072                 * Exit:  C updated, ABDEHL preserved.
073                 *        CY=0: Error.
074                 *
075 E879 CD1EC0     L3E134  CALL  :C01E     Input FPT number to MACC
076 E87C C0                 RNZ             Ready if Z=0
077 E87D E7                 RST   4         Else change sign MACC
078 E87E 1B                 DATA  :1B
079 E87F C9                 RET 
080                 *
081                 *******************************
082                 * STORE QUOTED TEXT INTO EBUF *
083                 *******************************
084                 *
085                 * Entry: C points to 1st '"'.
086                 *
087 E880 0C         L3E135  INR   C
088 E881 C39CE6             JMP   :E69C     Store text in EBUF
089                 *
090                 ********************************
091                 * STORE A HEX NUMBER INTO EBUF *
092                 ********************************
093                 *
094                 * Entry: C points to '#' of hex number.
095                 *
096 E884 0C         EHEX    INR   C
097 E885 C390E5             JMP   :E590     Hex nr into EBUF
098                 *
099                 **********************************
100                 * ENCODE AN INT NUMBER INTO EBUF *
101                 **********************************
102                 *
103 E888 CDAFE8     L3E137  CALL  :E8AF     #14 into EBUF
104 E88B FE23               CPI   :23       '#' ?
105 E88D CA99E8             JZ    :E899     Then jump
106 E890 CD7BE5             CALL  :E57B     INT nr into EBUF
107 E893 D2B7E8     L3E139  JNC   :E8B7     Evt run 'SYNTAX ERROR'
108 E896 C35CE1             JMP   :E15C     Quit
109                             
110                 * If hex number:
111                             
112 E899 CD84E8     L3E138  CALL  :E884     Hex nr into EBUF
113 E89C C393E8             JMP   :E893
114                 *
115 E89F FF                 DATA  :FF
116 E8A0 FF                 DATA  :FF
117 E8A1 FF                 DATA  :FF
118                 *
119                 *****************
120                 * ENCODE 'DATA' *
121                 *****************
122                 *
123 E8A2 7D         EDATA   MOV   A,L
124 E8A3 FE42               CPI   :42
125 E8A5 C20BDA             JNZ   :DA0B     Run 'SYNTAX ERROR' if not

PAGE 03    DAI FIRMWARE 3E859-3E9FF  V1.1

126 E8A8 C366E3             JMP   :E366     Encode text
127                 *
128                 ********************************
129                 * part of END ENCODING (3E6B5) *
130                 ********************************
131                 *
132 E8AB 1C         L3E140  INR   E
133 E8AC C3C8E6             JMP   :E6C8
134                 *
135                 *********************************
136                 * CODE FOR INT NUMBER INTO EBUF *
137                 *********************************
138                 *
139                 * Gets also next character to encode.
140                 *
141 E8AF 3614       L3E141  MVI   M,:14     INT code (#14) in EBUF
142 E8B1 CD18E0             CALL  :E018     Update EBUF pointer
143 E8B4 C3D2DD             JMP   :DDD2     Get char from line, neglect
144                                         tab + space
145                 *
146                 ****************************************
147                 * ERROR EXIT 'ENCODE INT NR INTO EBUF' *
148                 ****************************************
149                 *
150 E8B7 219FE3             LXI   H,:E39F   ] (0) Addr routine 'STORE
151                                         DATA'
152 E8BA E5                 PUSH  H         ] Preserve it as returnaddr
153 E8BB 3A4000             LDA   :0040     ] Get POROM
154 E8BE E63F               ANI   :3F       ] Select bank 0
155 E8C0 F5                 PUSH  PSW       ]
156 E8C1 C3E6C6             JMP   :C6E6     ] Bank return
157                 *
158 E8C4 FF                 DATA  :FF
159                 *
160                 **************************************
161                 * ASCII TABLE UPPER CASE (UNSHIFTED) *
162                 **************************************
163                 *
164 E8C5 30         KEYTU   DATA  :30       0
165 E8C6 31                 DATA  :31       1
166 E8C7 32                 DATA  :32       2
167 E8C8 33                 DATA  :33       3
168 E8C9 34                 DATA  :34       4
169 E8CA 35                 DATA  :35       5
170 E8CB 36                 DATA  :36       6
171 E8CC 37                 DATA  :37       7
172 E8CD 38                 DATA  :38       8
173 E8CE 39                 DATA  :39       9
174 E8CF 3A                 DATA  :3A       :
175 E8D0 3B                 DATA  :3B       ;
176 E8D1 2C                 DATA  :2C       ,
177 E8D2 2D                 DATA  :2D       -
178 E8D3 2E                 DATA  :2E       .
179 E8D4 2F                 DATA  :2F       /
180 E8D5 0D                 DATA  :0D       car ret
181 E8D6 41                 DATA  :41       A
182 E8D7 42                 DATA  :42       B
183 E8D8 43                 DATA  :43       C
184 E8D9 44                 DATA  :44       D
185 E8DA 45                 DATA  :45       E
186 E8DB 46                 DATA  :46       F
187 E8DC 47                 DATA  :47       G

PAGE 04    DAI FIRMWARE 3E859-3E9FF  V1.1

188 E8DD 48                 DATA  :48       H
189 E8DE 49                 DATA  :49       I
190 E8DF 4A                 DATA  :4A       J
191 E8E0 4B                 DATA  :4B       K
192 E8E1 4C                 DATA  :4C       L
193 E8E2 4D                 DATA  :4D       M
194 E8E3 4E                 DATA  :4E       N
195 E8E4 4F                 DATA  :4F       O
196 E8E5 50                 DATA  :50       P
197 E8E6 51                 DATA  :51       Q
198 E8E7 52                 DATA  :52       R
199 E8E8 53                 DATA  :53       S
200 E8E9 54                 DATA  :54       T
201 E8EA 55                 DATA  :55       U
202 E8EB 56                 DATA  :56       V
203 E8EC 57                 DATA  :57       W
204 E8ED 58                 DATA  :58       X
205 E8EE 59                 DATA  :59       Y
206 E8EF 5A                 DATA  :5A       Z
207 E8F0 5B                 DATA  :5B       [
208 E8F1 5E                 DATA  :5E       ^
209 E8F2 20                 DATA  :20       space
210 E8F3 00                 DATA  :00       (rept)
211 E8F4 08                 DATA  :08       char del
212 E8F5 10                 DATA  :10       cursor up
213 E8F6 11                 DATA  :11       cursor down
214 E8F7 12                 DATA  :12       cursor left
215 E8F8 13                 DATA  :13       cursor right
216 E8F9 09                 DATA  :09       tab
217 E8FA 80                 DATA  :80       ctrl
218 E8FB 00                 DATA  :00       (break)
219 E8FC 00                 DATA  :00       (shift)
220                 *
221                 ************************************
222                 * ASCII TABLE LOWER CASE (SHIFTED) *
223                 ************************************
224                 *
225 E8FD 30         KEYTS   DATA  :30       0
226 E8FE 21                 DATA  :21       !
227 E8FF 22                 DATA  :22       "
228 E900 23                 DATA  :23       #
229 E901 24                 DATA  :24       $
230 E902 25                 DATA  :25       %
231 E903 26                 DATA  :26       &
232 E904 27                 DATA  :27       '
233 E905 28                 DATA  :28       (
234 E906 29                 DATA  :29       )
235 E907 2A                 DATA  :2A       *
236 E908 2B                 DATA  :2B       +
237 E909 3C                 DATA  :3C       <
238 E90A 3D                 DATA  :3D       =
239 E90B 3E                 DATA  :3E       >
240 E90C 3F                 DATA  :3F       ?
241 E90D 0D                 DATA  :0D       car ret
242 E90E 61                 DATA  :61       a
243 E90F 62                 DATA  :62       b
244 E910 63                 DATA  :63       c
245 E911 64                 DATA  :64       d
246 E912 65                 DATA  :65       e
247 E913 66                 DATA  :66       f
248 E914 67                 DATA  :67       g
249 E915 68                 DATA  :68       h

PAGE 05    DAI FIRMWARE 3E859-3E9FF  V1.1

250 E916 69                 DATA  :69       i
251 E917 6A                 DATA  :6A       j
252 E918 6B                 DATA  :6B       k
253 E919 6C                 DATA  :6C       l
254 E91A 6D                 DATA  :6D       m
255 E91B 6E                 DATA  :6E       n
256 E91C 6F                 DATA  :6F       o
257 E91D 70                 DATA  :70       p
258 E91E 71                 DATA  :71       q
259 E91F 72                 DATA  :72       r
260 E920 73                 DATA  :73       s
261 E921 74                 DATA  :74       t
262 E922 75                 DATA  :75       u
263 E923 76                 DATA  :76       v
264 E924 77                 DATA  :77       w
265 E925 78                 DATA  :78       x
266 E926 79                 DATA  :79       y
267 E927 7A                 DATA  :7A       z
268 E928 5D                 DATA  :5D       ]
269 E929 7E                 DATA  :7E       ~
270 E92A 20                 DATA  :20       space
271 E92B 00                 DATA  :00       (rept)
272 E92C 08                 DATA  :08       char del
273 E92D 14                 DATA  :14       window up
274 E92E 15                 DATA  :15       window down
275 E92F 16                 DATA  :16       window left
276 E930 17                 DATA  :17       window right
277 E931 09                 DATA  :09       tab
278 E932 80                 DATA  :80       ctrl
279 E933 00                 DATA  :00       (break)
280 E934 00                 DATA  :00       (shift)
281                 *
282                 ************************************
283                 * GET INPUTS FROM KEYBOARD OR DINC *
284                 ************************************
285                 *
286                 * Part of RESET (C719). Determines input source
287                 * depending on 1st input done.
288                 *
289 E935 CDBBD6     L3E143  CALL  :D6BB     Scan keyb; char in A
290 E938 D8                 RC              Ready if break pressed
291 E939 C0                 RNZ             Ready if key input done
292 E93A C3F4EF             JMP   :EFF4     Else: Get input from DINC
293                 *
294 E93D FF                 DATA  :FF
295 E93E FF                 DATA  :FF
296                 *
297                 **********************************************
298                 * LOAD ASCII VALUE FOR KEY PRESSED IN BUFFER *
299                 **********************************************
300                 *
301                 * From the key pressed, the offset to the start-
302                 * address of the ASCII table is calculated. The
303                 * ASCII value for the pressed key is stored in
304                 * the circular buffer KLIND.
305                 *
306                 * Entry: B : Column number.
307                 *        C : Row number.
308                 * Exit:  All registers preserved.
309                 *
310 E93F F5         INKEY   PUSH  PSW
311 E940 C5                 PUSH  B

PAGE 06    DAI FIRMWARE 3E859-3E9FF  V1.1

312 E941 E5                 PUSH  H
313 E942 3E07               MVI   A,:07     )
314 E944 90                 SUB   B         )
315 E945 87                 ADD   A         ) Calc offset of startaddr
316 E946 87                 ADD   A         ) for key pressed.
317 E947 87                 ADD   A         )   Store it in C
318 E948 81                 ADD   C         )
319 E949 4F                 MOV   C,A       )
320 E94A 2AA702             LHLD  :02A7     Get startaddr ASCII table
321 E94D 0600               MVI   B,:00
322 E94F FE11               CPI   :11       )
323 E951 DA5DE9             JC    :E95D     ) Check if key is a char
324 E954 FE2B               CPI   :2B       ) A-Z
325 E956 D25DE9             JNC   :E95D     )
326 E959 3AC302             LDA   :02C3     Get shift lock value
327 E95C 47                 MOV   B,A       in B
328 E95D 3AB002     L3E145  LDA   :02B0     Get 'shift' byte
329 E960 A8                 XRA   B         Take CTRL into account
330 E961 E640               ANI   :40       A=#40 if shift, 00 when not
331 E963 CA6CE9             JZ    :E96C     Jump if no shift
332 E966 D5                 PUSH  D
333 E967 113800             LXI   D,:0038   Add. offset for lower case
334                                         table
335 E96A 19                 DAD   D         Startaddr lower case table
336                                         now in HL
337 E96B D1                 POP   D
338 E96C 0600       L3E146  MVI   B,:00
339 E96E 09                 DAD   B         Add offset to startaddr
340 E96F 7E                 MOV   A,M       Get ASCII value from table
341 E970 B7                 ORA   A         Check if Break, Rept, Shift
342 E971 CA8EE9             JZ    :E98E     Then Pop, ret
343 E974 FE80               CPI   :80       Check if CTRL
344 E976 CA92E9             JZ    :E992     Then update CTRL flag
345 E979 47                 MOV   B,A       Store ASCII value in B
346 E97A 2ABE02             LHLD  :02BE     Get addr next pos in KLIND
347 E97D E5                 PUSH  H         Store KLIIN on stack
348 E97E CD9CD6             CALL  :D69C     Update KLIND pointer
349 E981 3AC002             LDA   :02C0     Get lsbyte next output pos
350                                         of KLIND
351 E984 BD                 CMP   L         Compare with KLIIN
352 E985 CA8DE9             JZ    :E98D     Abort if buffer full
353 E988 22BE02             SHLD  :02BE     Update KLIIN
354 E98B E3                 XTHL            Get old KLIIN from stack
355 E98C 70                 MOV   M,B       Store ASCII char in KLIND
356 E98D E1         L3E147  POP   H
357 E98E E1         L3E148  POP   H
358 E98F C1                 POP   B
359 E990 F1                 POP   PSW
360 E991 C9                 RET 
361                             
362                 * Update CTRL flag:
363                             
364 E992 3AC302     L3E149  LDA   :02C3     Get shiftlock value
365 E995 2F                 CMA             Invert it
366 E996 32C302             STA   :02C3     And store it again
367 E999 C38EE9             JMP   :E98E     Pop, ret
368                 *
369                 ****************
370                 * HEAP REQUEST *
371                 ****************
372                 *
373                 * The routine checks the heap for free areas. Evt.

PAGE 07    DAI FIRMWARE 3E859-3E9FF  V1.1

374                 * consecutive free areas are consolidated. If this
375                 * procedure finds a free area min. 2 bytes larger
376                 * than requested, then it is reserved by setting
377                 * the length bytes (msb=0). An evt. resting free
378                 * area is set with length bytes and msb=1 (this
379                 * area must be >= 2 bytes).
380                 * The heap contents is never moved to obtain one
381                 * large consolidated area of free bytes!!
382                 *
383                 * Entry: DE: Length requested heap space.
384                 * Exit:  AFBCDE preserved.
385                 *        HL: Points to a 2-byte length of the re-
386                 *            quested gap. If no space available,
387                 *            it points to an error routine.
388                 *
389 E99C F5         HREQ    PUSH  PSW
390 E99D C5                 PUSH  B
391 E99E D5                 PUSH  D
392 E99F 42                 MOV   B,D       ) Reqd length in BC
393 E9A0 4B                 MOV   C,E       )
394 E9A1 2A9B02             LHLD  :029B     Get startaddr Heap
395 E9A4 56         HRQ10   MOV   D,M       )
396 E9A5 23                 INX   H         ) Contents 1st 2 bytes of
397 E9A6 5E                 MOV   E,M       ) Heap in DE (length)
398 E9A7 23                 INX   H         )
399 E9A8 7A                 MOV   A,D       1st byte in A
400 E9A9 E67F               ANI   :7F       Mask bit 'free/used'
401 E9AB BA                 CMP   D
402 E9AC 57                 MOV   D,A       D is length without msb
403 E9AD CA27D2             JZ    :D227     If area not free: check if
404                                         end of heap reached. JMP
405                                         #E9FA if not
406                             
407                 * If free area found: Check all next heap entries
408                 * and accumulate all free areas in succession:
409                             
410 E9B0 E5         HRQ20   PUSH  H         Save startaddr area +2
411 E9B1 19                 DAD   D         Begin next area in HL
412 E9B2 7E                 MOV   A,M
413 E9B3 B7                 ORA   A         Check msb of this area
414 E9B4 F2C7E9             JP    :E9C7     Jump if area occupied
415 E9B7 23                 INX   H
416 E9B8 7B                 MOV   A,E
417 E9B9 86                 ADD   M         Add lobyte length next area
418                                         length previous area
419 E9BA 5F                 MOV   E,A
420 E9BB 7A                 MOV   A,D
421 E9BC 2B                 DCX   H
422 E9BD 8E                 ADC   M         Add hibyte length next area
423                                         length previous area
424 E9BE E67F               ANI   :7F       Skip bit 'free/occupied'
425 E9C0 57                 MOV   D,A
426 E9C1 13                 INX   D
427 E9C2 13                 INX   D         Add 2 extra bytes
428 E9C3 E1                 POP   H         Restore start free area +2
429 E9C4 C3B0E9             JMP   :E9B0     Check next area
430                             
431                 * Next area is not free:
432                             
433 E9C7 E1         HRQ30   POP   H         Restore start free area +2
434 E9C8 E5                 PUSH  H
435 E9C9 2B                 DCX   H

PAGE 08    DAI FIRMWARE 3E859-3E9FF  V1.1

436 E9CA 73                 MOV   M,E       )
437 E9CB 2B                 DCX   H         ) Store total free length in
438 E9CC 7A                 MOV   A,D       ) 1st 2 bytes of free area
439 E9CD F680               ORI   :80       )
440 E9CF 77                 MOV   M,A       )
441                                         Space available here: HL pnt
442                                         to start free area +2; DE is
443                                         size free area; BC size reqd
444 E9D0 7B                 MOV   A,E       )
445 E9D1 91                 SUB   C         )
446 E9D2 6F                 MOV   L,A       ) Calc free length - reqd.
447 E9D3 7A                 MOV   A,D       ) length; result in HL
448 E9D4 98                 SBB   B         )
449 E9D5 67                 MOV   H,A       )
450 E9D6 FAF9E9             JM    :E9F9     Space not sufficient: Leave
451                                         consolidated area as free
452 E9D9 C2E4E9             JNZ   :E9E4     Jump if sufficient space
453 E9DC B5                 ORA   L
454 E9DD CAF0E9             JZ    :E9F0     Jump if just enough
455 E9E0 3D                 DCR   A
456 E9E1 CAF9E9             JZ    :E9F9     Not useable if 1 free byte
457                                         left
458                             
459                 * Set not used part of free area to free:
460                             
461 E9E4 EB         HRQ40   XCHG            Addr free area in DE
462 E9E5 1B                 DCX   D
463 E9E6 1B                 DCX   D         Reserve 2 bytes for length
464 E9E7 E1                 POP   H         Restore start free area +2
465 E9E8 E5                 PUSH  H
466 E9E9 09                 DAD   B         Add reqd length to find
467                                         start of resting free area
468 E9EA 7A                 MOV   A,D
469 E9EB F680               ORI   :80       Set free flag
470 E9ED 77                 MOV   M,A       )
471 E9EE 23                 INX   H         ) Length free area into heap
472 E9EF 73                 MOV   M,E       )
473                             
474                 * Reserve area for requested entry:
475                             
476 E9F0 E1         HRQ50   POP   H         Restore start free area +2
477 E9F1 2B                 DCX   H
478 E9F2 71                 MOV   M,C       )
479 E9F3 2B                 DCX   H         ) Reqd length in 1st 2 bytes
480 E9F4 70                 MOV   M,B       )
481 E9F5 D1                 POP   D
482 E9F6 C1                 POP   B
483 E9F7 F1                 POP   PSW
484 E9F8 C9                 RET 
485                             
486                 * Area too small:
487                             
488 E9F9 E1         HRQ70   POP   H         Restore start free area
489 E9FA 19         HRQ75   DAD   D         HL pnts to next area
490 E9FB C3A4E9             JMP   :E9A4     Check next area
491                             
492 E9FE FF                 DATA  :FF
493 E9FF FF                 DATA  :FF
494                 *
495                 *
496                 *
497                 *

PAGE 09    DAI FIRMWARE 3E859-3E9FF  V1.1

498 EA00                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
ECHRI  E867   EDATA  E8A2   EHEX   E884   HREQ   E99C   
HRQ10  E9A4   HRQ20  E9B0   HRQ30  E9C7   HRQ40  E9E4   
HRQ50  E9F0   HRQ70  E9F9   HRQ75  E9FA   INKEY  E93F   
KEYTS  E8FD   KEYTU  E8C5   L3E131 E862   L3E133 E873   
L3E134 E879   L3E135 E880   L3E137 E888   L3E138 E899   
L3E139 E893   L3E140 E8AB   L3E141 E8AF   L3E143 E935   
L3E145 E95D   L3E146 E96C   L3E147 E98D   L3E148 E98E   
L3E149 E992   TSEOC  E859
