
PAGE 01    DAI FIRMWARE C614-C7FA  V1.1

002                         ORG   :C614
003                 *
004                 *
005                 *
006                 ****************************
007                 * INPUT HEX NUMBER TO MACC *
008                 ****************************
009                 *
010                 * Reads a sequence of hex digits and converts
011                 * them into MACC.
012                 *
013                 * Entry: C points to input.
014                 * Exit:  CY=1: There was a digit.
015                 *        CY=0: No digit.
016                 *        C points to next input.
017                 *        ABDEHL preserved.
018                 *
019 C614 37         HCB     STC 
020 C615 F5                 PUSH  PSW
021 C616 D5                 PUSH  D
022 C617 E5                 PUSH  H
023 C618 CD98C5             CALL  :C598     Clear MACC and 00E3-E6
024 C61B CD73C0     LC120   CALL  :C073     Get digit from line
025 C61E D630               SUI   :30       )
026 C620 DA90C5             JC    :C590     )
027 C623 FE0A               CPI   :0A       ) Check if hex number
028 C625 DA34C6             JC    :C634     )
029 C628 D607               SUI   :07       ) Abort via C590 if not
030 C62A FE0A               CPI   :0A       )
031 C62C DA90C5             JC    :C590     )
032 C62F FE10               CPI   :10       )
033 C631 D290C5             JNC   :C590     )
034 C634 213DC6     LC121   LXI   H,:C63D   Addr INT(4)
035 C637 CD41C6             CALL  :C641     Insert digit at low end
036                                         MACC
037 C63A C31BC6             JMP   :C61B     Get next digit
038                 *
039                 * DATA:
040                 *
041 C63D 00         I4      DATA  :00       INT (4)
042 C63E 00                 DATA  :00
043 C63F 00                 DATA  :00
044 C640 04                 DATA  :04
045                 *
046                 * ENTER HEX DIGIT AT LOW END MACC:
047                 *
048                 * Entry: HL points to a 4-byte number.
049                 *        A  contains a digit.
050                 * Exit:  HL = 00E3.
051                 *        C is incremented, D decremented.
052                 *        ABE preserved.
053                 *
054 C641 F5         LC122   PUSH  PSW
055 C642 C5                 PUSH  B
056 C643 D5                 PUSH  D
057 C644 E7                 RST   4         Copy MACC to reg A,B,C,D
058 C645 15                 DATA  :15
059 C646 E6F0               ANI   :F0       Check if value too high
060 C648 C44BC0             CNZ   :C04B     Then overflow error
061 C64B D1                 POP   D
062 C64C C1                 POP   B
063 C64D F1                 POP   PSW

PAGE 02    DAI FIRMWARE C614-C7FA  V1.1

064 C64E E7                 RST   4         Shift left
065 C64F 6F                 DATA  :6F
066 C650 C3A7C5             JMP   :C5A7     Add digit to MACC
067                 *
068                 ****************************************
069                 * CONVERT HEX MACC TO ASCII FOR OUTPUT *
070                 ****************************************
071                 *
072                 * Converts a HEX number in MACC into its ASCII
073                 * representation into the output buffer.
074                 * Not significant leading zeroes are cancelled.
075                 *
076                 * Exit: BCDEHL preserved. AF corrupted.
077                 *       Length output string in 00E3.
078                 *       Output string in 00E4-00EB.
079                 *
080 C653 C5         HBC     PUSH  B
081 C654 D5                 PUSH  D
082 C655 E5                 PUSH  H
083 C656 CD8DC6             CALL  :C68D     Get startaddr DECBUF in HL
084 C659 E7                 RST   4         Copy MACC to reg A,B,C,D
085 C65A 15                 DATA  :15
086 C65B CD6AC6             CALL  :C66A     Convert A,B to ASCII
087                                         into DECBUF
088 C65E 79                 MOV   A,C
089 C65F 42                 MOV   B,D
090 C660 CD6AC6             CALL  :C66A     Idem for C,D
091 C663 CD91C6             CALL  :C691     Get string length in 00E3
092 C666 E1                 POP   H
093 C667 D1                 POP   D
094 C668 C1                 POP   B
095 C669 C9                 RET 
096                             
097                 * Convert 2 hex digits:
098                             
099 C66A CD6EC6     LC123   CALL  :C66E     Convert 1st digit
100 C66D 78                 MOV   A,B       Get 2nd one
101 C66E F5         LC124   PUSH  PSW
102 C66F 1F                 RAR 
103 C670 1F                 RAR 
104 C671 1F                 RAR 
105 C672 1F                 RAR             Shift high nibble in low
106 C673 CD77C6             CALL  :C677     Convert it to ASCII
107 C676 F1                 POP   PSW       Restore both nibbles
108 C677 E60F       LC125   ANI   :0F       Low nibble only
109 C679 FE0A               CPI   :0A
110 C67B DA80C6             JC    :C680     If 0 < digit < 9
111 C67E C607               ADI   :07       Add 7 for A < digit < F
112 C680 C630       LC126   ADI   :30       Convert to ASCII
113 C682 77                 MOV   M,A       Into DECBUF
114 C683 23                 INX   H         Incr pointer
115 C684 FE30               CPI   :30
116 C686 C0                 RNZ             Abort if digit <> 0
117                             
118                 * If 1st digit is zero:
119                             
120 C687 7D                 MOV   A,L       Get lsbyte buffer pointer
121 C688 FEE5               CPI   :E5       1st digit in buffer?
122 C68A C0                 RNZ             Abort if not
123 C68B 2B                 DCX   H         Else: cancel non-sign. 0's
124 C68C C9                 RET 
125                             

PAGE 03    DAI FIRMWARE C614-C7FA  V1.1

126                 * Get startaddress output buffer:
127                             
128 C68D 21E400     LC127   LXI   H,:00E4   Startaddr in HL
129 C690 C9                 RET 
130                 *
131                 * CALCULATE LENGTH OF STRING IN OUTPUT BUFFER:
132                 *
133                 * Entry: L: lobyte of address last digit in buffer.
134                 * Exit:  BCDEHL preserved. AF corrupted.
135                 *        Length is stored in 00E3.
136                 *
137 C691 7D         LC128   MOV   A,L       Get lobyte addr last digit
138 C692 D6E4               SUI   :E4       Minus beginaddr
139 C694 FE01               CPI   :01
140 C696 CE00               ACI   :00       Length min. 1
141 C698 32E300             STA   :00E3     Store length in DECBUF
142 C69B C9                 RET 
143                 *
144                 *****************************************
145                 * RESTORE A, ADD '.' AFTER DIGIT STRING *
146                 *****************************************
147                 *
148                 * Part of PRTY (C486).
149                 *
150 C69C 90         LC129   SUB   B         Restore A
151 C69D C331C5             JMP   :C531     Move string left 1 pos,
152                                         insert '.'
153                 *
154                 **************************************
155                 * PRINT CHARACTER, INPUT A TEXT LINE *
156                 **************************************
157                 *
158                 * Part of Run 'INPUT' (0E3D6).
159                 *
160                 * Entry: Character in A.
161                 * Exit:  BC preserved.
162                 *
163 C6A0 C5         PINPLN  PUSH  B
164 C6A1 CD1FDD             CALL  :DD1F     Print char; input textline
165 C6A4 C1                 POP   B
166 C6A5 C9                 RET 
167                 *
168 C6A6 FF                 DATA  :FF
169 C6A7 FF                 DATA  :FF
170                 *
171                 *********************
172                 * DATA FOR 'RANDOM' *
173                 *********************
174                 *
175 C6A8 00         RNDA    DATA  :00       Random number constant A
176 C6A9 00                 DATA  :00
177 C6AA 00                 DATA  :00
178 C6AB 3B                 DATA  :3B
179                 *
180 C6AC 07         RNDB    DATA  :07       Random number constant B
181 C6AD 73                 DATA  :73
182 C6AE 59                 DATA  :59
183 C6AF 41                 DATA  :41
184                 *
185 C6B0 01         IROR    DATA  :01       OR mask  (FPT (1))
186 C6B1 80                 DATA  :80
187 C6B2 00                 DATA  :00

PAGE 04    DAI FIRMWARE C614-C7FA  V1.1

188 C6B3 00                 DATA  :00
189                 *
190                 *****************************
191                 * part of READ BLOCK (D340) *
192                 *****************************
193                 *
194                 * Exit if no loading errors.
195                 *
196 C6B4 E3         MPT26   XTHL
197 C6B5 37                 STC             CY=1: no error
198 C6B6 E1         LBK30   POP   H
199 C6B7 D1                 POP   D
200 C6B8 C1                 POP   B
201 C6B9 C9                 RET 
202                 *
203                 *****************
204                 * part of 2E8DE *
205                 *****************
206                 *
207 C6BA CD91CE     SPT02   CALL  :CE91     Go and set screen bits for
208                                         mode 1
209 C6BD C338E1             JMP   :E138     (2) Pop all, ret.
210                 *
211                 *
212                 *  ================
213                 *** BANK SWITCHING ***
214                 *  ================
215                 *
216                 *
217                 *************************
218                 * MATH. RESTART (RST 4) *
219                 *************************
220                 *
221                 * This, and the following routines, switch the
222                 * paged banks of ROM. They are entered via
223                 * RST x; DATA xx instructions.
224                 *
225 C6C0 E1         MARST   POP   H
226 C6C1 F3                 DI  
227 C6C2 224300             SHLD  :0043     Save HL
228 C6C5 F5                 PUSH  PSW
229 C6C6 E1                 POP   H
230 C6C7 224100             SHLD  :0041     Save PSW
231 C6CA 2640               MVI   H,:40     ROM bank 1 select bits
232 C6CC 3AD400             LDA   :00D4     Offset of start HW/SW vector
233                 *
234                 * ROM BANK SWITCHING:
235                 *
236                 * This routine is generally used by all Restarts
237                 * using ROM bank switching.
238                 *
239 C6CF E3         MRS10   XTHL
240 C6D0 86                 ADD   M         Add entry number
241 C6D1 23                 INX   H
242 C6D2 E3                 XTHL
243 C6D3 6F                 MOV   L,A       Complete entry point address
244 C6D4 3A4000             LDA   :0040     Old bank select port status
245 C6D7 F5                 PUSH  PSW       Save it
246 C6D8 E63F               ANI   :3F       Keep other bits
247 C6DA B4                 ORA   H         Add new select bits
248 C6DB 324000             STA   :0040     Update memory
249 C6DE 3206FD             STA   :FD06     Update port

PAGE 05    DAI FIRMWARE C614-C7FA  V1.1

250 C6E1 26E0               MVI   H,:E0
251 C6E3 CDF2C6             CALL  :C6F2     Restore HL, PSW; switch bank
252                             
253                 * Return from switched bank:
254                             
255 C6E6 E3                 XTHL            Return to old bank
256 C6E7 F5                 PUSH  PSW
257 C6E8 7C                 MOV   A,H       Get old bank
258 C6E9 324000             STA   :0040     Reinstate memory
259 C6EC 3206FD             STA   :FD06     Re-instate port
260 C6EF F1                 POP   PSW
261 C6F0 E1                 POP   H
262 C6F1 C9                 RET             Return to caller
263                 *
264                 * SWITCH TO ROM BANK:
265                 *
266                 * HL and PSW are restored. On exit, the
267                 * program switches to the selected ROM bank.
268                 * After return from this bank, the program
269                 * continues on C6E6.
270                 *
271 C6F2 E5         MRDCL   PUSH  H
272 C6F3 2A4100             LHLD  :0041
273 C6F6 E5                 PUSH  H
274 C6F7 F1                 POP   PSW       Restore A,F
275 C6F8 2A4300             LHLD  :0043     Restore H,L
276 C6FB FB                 EI  
277 C6FC C9                 RET             Switch to selected bank
278                 *
279                 **************************
280                 * SCREEN RESTART (RST 5) *
281                 **************************
282                 *
283                 * From SRS10 also used by RST 1.
284                 *
285 C6FD E1         SCRST   POP   H
286 C6FE F3                 DI  
287 C6FF 224300             SHLD  :0043     Save HL
288 C702 F5                 PUSH  PSW
289 C703 3E80               MVI   A,:80     ROM bank 2 select bits
290 C705 E1         SRS10   POP   H
291 C706 224100             SHLD  :0041     Save PSW
292 C709 67                 MOV   H,A
293 C70A AF                 XRA   A
294 C70B C3CFC6             JMP   :C6CF     Switch to new bank
295                 *
296                 **************************
297                 * UTILITY/ENCODE (RST 1) *
298                 **************************
299                 *
300 C70E E1         UTRST   POP   H
301 C70F F3                 DI  
302 C710 224300             SHLD  :0043     Save HL
303 C713 F5                 PUSH  PSW
304 C714 3EC0               MVI   A,:C0     ROM bank 3 select bits
305 C716 C305C7             JMP   :C705     Switch to ROM bank 3
306                 *
307                 *
308                 *  ===============
309                 *** BASIC HANDLER ***
310                 *  ===============
311                 *

PAGE 06    DAI FIRMWARE C614-C7FA  V1.1

312                 *
313                 *********
314                 * RESET *
315                 *********
316                 *
317                 * BASIC entry point. Entry via hardware reset by
318                 * means of a bootstrap on the addresslines to C000.
319                 *
320                 * This section is responsible for all 'once only'
321                 * initialisation of the hardware and the software
322                 * environment. It initialises pointers to all RAM
323                 * areas required, the interrupt system and the
324                 * software modules.
325                 *
326                 *INIT
327 C719 3100F9     RESET   LXI   SP,:F900  Init. stackpointer
328 C71C 3E30               MVI   A,:30     ) cassette motors off;
329 C71E 324000             STA   :0040     ) paddle enable off;
330 C721 3206FD             STA   :FD06     ) select ROM bank 0
331 C724 CDFBD8             CALL  :D8FB     Init. interrupt system
332 C727 210000             LXI   H,:0000
333 C72A 22A302             SHLD  :02A3     Set for no Basic
334 C72D AF                 XRA   A
335 C72E 329302             STA   :0293     RNDLY=0
336 C731 00                 NOP 
337 C732 00                 NOP 
338                             
339                 * Init. math.package:
340                             
341 C733 11F2C7             LXI   D,:C7F2   Addr table error vectors
342 C736 21E0DD             LXI   H,:DDE0   Addr routine get char/line
343 C739 CD03C0             CALL  :C003     Package initialisation
344                             
345                 * Init. screen RAM:
346                             
347 C73C CDFBC7             CALL  :C7FB     Check available RAM space
348 C73F 2B                 DCX   H         Highest RAM address
349 C740 11E0C7             LXI   D,:C7E0   Addr screen default data
350 C743 EF                 RST   5
351 C744 00                 DATA  :00       Init. screen RAM
352                             
353                 * Init. I/O:
354                             
355 C745 AF                 XRA   A
356 C746 CD8DEE             CALL  :EE8D     (0) Init. I/O switching
357                                         (input keyb; output screen
358                                         + RS232)
359 C749 323501             STA   :0135     Input from keyboard for
360                                         encoding
361 C74C 3EC0               MVI   A,:C0
362 C74E 32F5FF             STA   :FFF5     Init. TICC baud rate
363                             
364                 * Init. screen:
365                             
366 C751 CDFFDA             CALL  :DAFF     Print 'DAI PERSONAL
367 C754 A8C7               DBL   :C7A8     COMPUTER'
368 C756 2AA502             LHLD  :02A5     Get bottom screen RAM
369 C759 117B09             LXI   D,:097B
370 C75C 19                 DAD   D         Get line mode byte of line
371                                         with 'DAI pC'
372 C75D 365F               MVI   M,:5F     Set for medium resolution
373 C75F 11D0FF             LXI   D,:FFD0

PAGE 07    DAI FIRMWARE C614-C7FA  V1.1

374 C762 19                 DAD   D         Create new line mode byte
375                                         for line with 'COMPUTER'
376 C763 CDF9CE             CALL  :CEF9     Place 'COMPUTER' on new line
377 C766 160F               MVI   D,:0F     Nr of blanking lines
378 C768 CDCFCE     HD10    CALL  :CECF     Blank next 15 lines
379 C76B 15                 DCR   D
380 C76C C268C7             JNZ   :C768     Next line
381                             
382                 * Prepare BASIC:
383                             
384 C76F CD2DD7             CALL  :D72D     Init. Soundgen/DCEbus/
385                                         transfer cassette data/
386                                         set start HEAP/get evt.
387                                         DCE-inputs
388 C772 210001             LXI   H,:0100
389 C775 229D02             SHLD  :029D     HEAP size default value
390 C778 CDB8DE             CALL  :DEB8     Run 'NEW'!
391 C77B 3E10               MVI   A,:10
392 C77D 323D01             STA   :013D     Select cassette port 1
393 C780 21C5E8             LXI   H,:E8C5   (3) Ptr. to ASCII table
394 C783 CD60D5             CALL  :D560     Init keyboard pointers
395 C786 CD01D1             CALL  :D101     Init string handler
396                 *
397                 *********
398                 * RESET *
399                 *********
400                 *
401                 * - Now switches off the volume of sound channel 2
402                 *   during initialisation. This seems useless,
403                 *   because in C76C all sound is already switched
404                 *   off.
405                 * - The header is changed to 'BASIC V1.1'
406                 *
407 C789 32E401             STA   :01E4     ] Volume SCB2 = 0
408 C78C 328F02             STA   :028F
409 C78F 117502             LXI   D,:0275
410 C792 218F02             LXI   H,:028F
411 C795 CD7CDE             CALL  :DE7C
412 C798 FB                 EI  
413 C799 CF                 RST   1
414 C79A 15                 DATA  :15
415                 *
416 C79B 21EEC7             LXI   H,:C7EE   Ptr. to mode 0 colours
417 C79E EF                 RST   5         Set text colours
418 C79F 06                 DATA  :06
419                             
420                 * Entry from utility:
421                             
422 C7A0 CDE4CE     RINIT   CALL  :CEE4     Select ROM bank 0 and print
423 C7A3 D3C7               DBL   :C7D3     'BASIC V1.0'
424 C7A5 C318C8             JMP   :C818     Into BASIC monitor
425                 *
426                 * INITIALISATION SCREEN DATA:
427                 *
428 C7A8 0D         MSGHDR  DATA  :0D       Frigged screen header
429 C7A9 0D                 DATA  :0D
430 C7AA 0D                 DATA  :0D
431 C7AB 0D                 DATA  :0D
432 C7AC 0D                 DATA  :0D
433 C7AD 0D                 DATA  :0D
434 C7AE 20                 DATA  :20
435 C7AF 44                 DATA  :44       D

PAGE 08    DAI FIRMWARE C614-C7FA  V1.1

436 C7B0 41                 DATA  :41       A
437 C7B1 49                 DATA  :49       I
438 C7B2 20                 DATA  :20
439 C7B3 50                 DATA  :50       P
440 C7B4 45                 DATA  :45       E
441 C7B5 52                 DATA  :52       R
442 C7B6 53                 DATA  :53       S
443 C7B7 4F                 DATA  :4F       O
444 C7B8 4E                 DATA  :4E       N
445 C7B9 41                 DATA  :41       A
446 C7BA 4C                 DATA  :4C       L
447 C7BB 20                 DATA  :20
448 C7BC 20                 DATA  :20
449 C7BD 20                 DATA  :20
450 C7BE 20                 DATA  :20
451 C7BF 20                 DATA  :20
452 C7C0 20                 DATA  :20
453 C7C1 20                 DATA  :20
454 C7C2 20                 DATA  :20
455 C7C3 20                 DATA  :20
456 C7C4 20                 DATA  :20
457 C7C5 20                 DATA  :20
458 C7C6 20                 DATA  :20
459 C7C7 20                 DATA  :20
460 C7C8 20                 DATA  :20
461 C7C9 43                 DATA  :43       C
462 C7CA 4F                 DATA  :4F       O
463 C7CB 4D                 DATA  :4D       M
464 C7CC 50                 DATA  :50       P
465 C7CD 55                 DATA  :55       U
466 C7CE 54                 DATA  :54       T
467 C7CF 45                 DATA  :45       E
468 C7D0 52                 DATA  :52       R
469 C7D1 0D                 DATA  :0D
470 C7D2 00                 DATA  :00
471                 *
472 C7D3 0C         MSGIN   DATA  :0C
473 C7D4 42                 DATA  :42       B
474 C7D5 41                 DATA  :41       A
475 C7D6 53                 DATA  :53       S
476 C7D7 49                 DATA  :49       I
477 C7D8 43                 DATA  :43       C
478 C7D9 20                 DATA  :20
479 C7DA 56                 DATA  :56       V
480 C7DB 31                 DATA  :31       1
481 C7DC 2E                 DATA  :2E       .
482 C7DD 31                 DATA  :31       ] Header changed to V1.1
483 C7DE 0D                 DATA  :0D
484 C7DF 00                 DATA  :00
485                 *
486                 * SCREEN INITIALISATION PARAMETERS:
487                 *
488 C7E0 01         SIPAR   DATA  :01       Default cursor type
489 C7E1 5F                 DATA  :5F       Default cursor ASCII value
490                 *
491 C7E2 05                 DATA  :05       )
492 C7E3 0F                 DATA  :0F       ) Colours COLORT
493 C7E4 0F                 DATA  :0F       ) during Reset
494 C7E5 05                 DATA  :05       )
495                 *
496 C7E6 00                 DATA  :00       )
497 C7E7 05                 DATA  :05       ) Default colours

PAGE 09    DAI FIRMWARE C614-C7FA  V1.1

498 C7E8 0A                 DATA  :0A       ) COLORG
499 C7E9 0F                 DATA  :0F       )
500                 *
501 C7EA 01CA               DBL   :CA01     Addr. memory management
502                                         routine
503 C7EC 25CA               DBL   :CA25     Addr. emergency stop routine
504                 *
505 C7EE 08         STCOL   DATA  :08       )
506 C7EF 00                 DATA  :00       ) Default colours
507 C7F0 00                 DATA  :00       ) COLORT
508 C7F1 08                 DATA  :08       )
509                 *
510                 * MATH. ERROR ROUTINE VECTORS:
511                 *
512 C7F2 1FDA       MEVEC   DBL   :DA1F     Addr. Overflow error routine
513 C7F4 15DA               DBL   :DA15     Addr. Number out of range
514                                         error routine
515 C7F6 FAC7               DBL   :C7FA     Addr. Return
516 C7F8 24DA               DBL   :DA24     Addr. Error routine Division
517                                         by zero
518                 *
519 C7FA C9         MERET   RET             Return
520                 *
521                 *
522                 *
526 C7FB                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
HBC    C653   HCB    C614   HD10   C768   I4     C63D   
INIT   C719   IROR   C6B0   LBK30  C6B6   LC120  C61B   
LC121  C634   LC122  C641   LC123  C66A   LC124  C66E   
LC125  C677   LC126  C680   LC127  C68D   LC128  C691   
LC129  C69C   MARST  C6C0   MERET  C7FA   MEVEC  C7F2   
MPT26  C6B4   MRDCL  C6F2   MRS10  C6CF   MSGHDR C7A8   
MSGIN  C7D3   PINPLN C6A0   RESET  C719   RINIT  C7A0   
RNDA   C6A8   RNDB   C6AC   SCRST  C6FD   SIPAR  C7E0   
SPT02  C6BA   SRS10  C705   STCOL  C7EE   UTRST  C70E
