
PAGE 01    DAI FIRMWARE 3E859-3E9FF  V1.0  Rev.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.0  Rev.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.0  Rev.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 OF ENCODE INT NR INTO EBUF (3E888) *
148                 *************************************************
149                 *
150 E8B7 2A3201     L3E142  LHLD  :0132     Get EFEPT
151 E8BA 11FCFF             LXI   D,:FFFC
152 E8BD 19                 DAD   D         Set back linepntr
153 E8BE 220001             SHLD  :0100     Store start current line
154 E8C1 C30BDA             JMP   :DA0B     Run 'SYNTAX ERROR'
155                 *
156 E8C4 FF                 DATA  :FF
157                 *
158                 **************************************
159                 * ASCII TABLE UPPER CASE (UNSHIFTED) *
160                 **************************************
161                 *
162 E8C5 30         KEYTU   DATA  :30       0
163 E8C6 31                 DATA  :31       1
164 E8C7 32                 DATA  :32       2
165 E8C8 33                 DATA  :33       3
166 E8C9 34                 DATA  :34       4
167 E8CA 35                 DATA  :35       5
168 E8CB 36                 DATA  :36       6
169 E8CC 37                 DATA  :37       7
170 E8CD 38                 DATA  :38       8
171 E8CE 39                 DATA  :39       9
172 E8CF 3A                 DATA  :3A       :
173 E8D0 3B                 DATA  :3B       ;
174 E8D1 2C                 DATA  :2C       ,
175 E8D2 2D                 DATA  :2D       -
176 E8D3 2E                 DATA  :2E       .
177 E8D4 2F                 DATA  :2F       /
178 E8D5 0D                 DATA  :0D       car ret
179 E8D6 41                 DATA  :41       A
180 E8D7 42                 DATA  :42       B
181 E8D8 43                 DATA  :43       C
182 E8D9 44                 DATA  :44       D
183 E8DA 45                 DATA  :45       E
184 E8DB 46                 DATA  :46       F
185 E8DC 47                 DATA  :47       G
186 E8DD 48                 DATA  :48       H
187 E8DE 49                 DATA  :49       I

PAGE 04    DAI FIRMWARE 3E859-3E9FF  V1.0  Rev.1

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

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

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

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

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

***************************
* 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   L3E142 E8B7   
L3E143 E935   L3E145 E95D   L3E146 E96C   L3E147 E98D   
L3E148 E98E   L3E149 E992   TSEOC  E859
