
PAGE 01    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

002                         ORG   :D8FB
003                 *
004                 *
005                 *
006                 *  ===================
007                 *** INTERRUPT HANDLER ***
008                 *  ===================
009                 *
010                 *
011                 *******************************
012                 * INITIALISE INTERRUPT SYSTEM *
013                 *******************************
014                 *
015                 * Initialises the interrupt system of the machine.
016                 *
017                 * Entry: No conditions.
018                 * Exit:  All registers corrupted.
019                 *
020 D8FB 21F8FF     INTINI  LXI   H,:FFF8   Address int.mask register
021 D8FE 3E04               MVI   A,:04
022 D900 77                 MOV   M,A       Only stack interrupt
023 D901 325F00             STA   :005F     Remember int. mask
024 D904 2EF4               MVI   L,:F4
025 D906 3E0C               MVI   A,:0C
026 D908 77                 MOV   M,A       Select ext.int. and INTA
027 D909 3C                 INR   A
028 D90A 77                 MOV   M,A       Reset
029 D90B 3E0C               MVI   A,:0C
030 D90D 32C001             STA   :01C0     Init. cursor timer
031 D910 3E02               MVI   A,:02
032 D912 32C101             STA   :01C1     Init. keyboard scan counter
033 D915 CDA3D9             CALL  :D9A3     Reload sound timer
034 D918 CD9DD9             CALL  :D99D     Reload keyboard timer
035 D91B CD49D9             CALL  :D949     Set up int. entry points
036                             
037                 * Set-up interrupt vectors (also entry from utility)
038                             
039 D91E 21A9D9     INTSU   LXI   H,:D9A9
040 D921 227000             SHLD  :0070     Clock int. vector (7)
041 D924 2178D5             LXI   H,:D578
042 D927 226E00             SHLD  :006E     Keyboard int. vector (6)
043 D92A 21FDC6             LXI   H,:C6FD
044 D92D 226C00             SHLD  :006C     Screen restart vector (5)
045 D930 21C0C6             LXI   H,:C6C0
046 D933 226A00             SHLD  :006A     Math. restart vector (4)
047 D936 2155D7             LXI   H,:D755
048 D939 226800             SHLD  :0068     Sound int. vector (3)
049 D93C 21E2D9             LXI   H,:D9E2
050 D93F 226600             SHLD  :0066     Stack int. vector (2)
051 D942 210EC7             LXI   H,:C70E
052 D945 226400             SHLD  :0064     Utility/encode vector (1)
053 D948 C9                 RET 
054                 *
055                 * SET UP INTERRUPT VECTOR AREA:
056                 *
057                 * Sets up the vector area 0000-003F.
058                 *
059                 * Entry: No conditions.
060                 * Exit:  All registers corrupted.
061                 *
062 D949 010000     VECSU   LXI   B,:0000   Start at zero
063 D94C 116BD9     VCS10   LXI   D,:D96B   Startaddr. int. routine

PAGE 02    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

064 D94F 2173D9             LXI   H,:D973   Endaddress
065 D952 CD4FDE             CALL  :DE4F     Transfer int. routine
066 D955 79                 MOV   A,C
067 D956 FE40               CPI   :40       8 routines done?
068 D958 C24CD9             JNZ   :D94C     Next one if not ready
069 D95B 213B00             LXI   H,:003B   Addr. highest int.vector
070 D95E 01F8FF             LXI   B,:FFF8
071 D961 1670               MVI   D,:70
072 D963 72         VCS20   MOV   M,D       Load vector addr.
073 D964 15                 DCR   D
074 D965 15                 DCR   D
075 D966 09                 DAD   B         Calculate next addr
076 D967 DA63D9             JC    :D963     Next one if not ready
077 D96A C9                 RET 
078                 *
079                 * INTERRUPT VECTOR ROUTINE:
080                 *
081                 * During initialisation loaded into RAM on the
082                 * Restart routine locations of the CPU.
083                 * The address after LHLD is later changed into
084                 * the appropriate vector address by #D8FB.
085                 *
086 D96B 00         ITMPL   NOP 
087 D96C E5                 PUSH  H
088 D96D 2A7000             LHLD  :0070
089 D970 E9                 PCHL
090 D971 00                 NOP 
091 D972 00                 NOP 
092                 *
093                 *******************************
094                 * DISABLE KEYBOARD INTERRUPTS *
095                 *******************************
096                 *
097                 * Disables keyboard interrupts only.
098                 *
099                 * Entry can be different. From INTCH common part
100                 * to disable/enable sound, clock and keyboard
101                 * interrupts.
102                 *
103                 * Entry: None.
104                 * Exit:  All registers preserved.
105                 *
106 D973 C5         KBDI    PUSH  B
107 D974 0100BF             LXI   B,:BF00   Disable keyboard interrupts
108                 *
109 D977 F5         INTCH   PUSH  PSW
110 D978 F3                 DI              Disable interrupts
111 D979 3A5F00             LDA   :005F     Get current int.mask
112 D97C A0                 ANA   B         ) Calculate new one
113 D97D B1                 ORA   C         )
114 D97E 325F00             STA   :005F     Remember new mask
115 D981 32F8FF             STA   :FFF8     and set mask
116 D984 FB                 EI              Enable interrupts again
117 D985 F1                 POP   PSW
118 D986 C1                 POP   B
119 D987 C9                 RET 
120                 *
121                 ******************************
122                 * ENABLE KEYBOARD INTERRUPTS *
123                 ******************************
124                 *
125                 * Enables keyboard interrupts only.

PAGE 03    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

126                 *
127 D988 C5         KBEI    PUSH  B
128 D989 0140FF             LXI   B,:FF40   Enable keyboard interrupts
129 D98C C377D9             JMP   :D977     Update int. mask
130                 *
131                 ****************************
132                 * DISABLE SOUND INTERRUPTS *
133                 ****************************
134                 *
135                 * Disables sound interrupts only.
136                 *
137 D98F C5         SNDDI   PUSH  B
138 D990 0100F7             LXI   B,:F700   Disable sound interrupts
139 D993 C377D9             JMP   :D977     Update int. mask
140                 *
141                 ***************************
142                 * ENABLE SOUND INTERRUPTS *
143                 ***************************
144                 *
145                 * Enables sound interrupts only.
146                 *
147 D996 C5         SNDEI   PUSH  B
148 D997 0108FF             LXI   B,:FF08   Enable sound interrupts
149 D99A C377D9             JMP   :D977     Update int. mask
150                 *
151                 ***********************
152                 * LOAD KEYBOARD TIMER *
153                 ***********************
154                 *
155                 * Starts a keyboard interrupt.
156                 *
157 D99D 3EFF       KBIS    MVI   A,:FF     Init. 16.32 msec
158 D99F 32FCFF             STA   :FFFC     Load timer 4 (keyboard)
159 D9A2 C9                 RET 
160                 *
161                 ********************
162                 * LOAD SOUND TIMER *
163                 ********************
164                 *
165                 * Starts a sound interrupt.
166                 *
167 D9A3 3E50       SNDIS   MVI   A,:50     Init. 5.12 msec
168 D9A5 32FBFF             STA   :FFFB     Load timer 3 (sound)
169 D9A8 C9                 RET 
170                 *
171                 ***************************
172                 * CLOCK INTERRUPT (RST 7) *
173                 ***************************
174                 *
175                 * Triggered every 20 msec by the TV page
176                 * blanking signal.
177                 * Decrements timer 01BE/BF until 0. Checks also
178                 * the contents of cursor clock timer 01C0. It is
179                 * decremented, if it becomes 0, the timer is re-
180                 * loaded and the cursor is flashed.
181                 *
182                 * Exit: All registers preserved.
183                 *
184 D9A9 F5         CLKINT  PUSH  PSW
185 D9AA C5                 PUSH  B
186 D9AB D5                 PUSH  D
187 D9AC 3A5F00             LDA   :005F     Get current int. mask

PAGE 04    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

188 D9AF F5                 PUSH  PSW       and remember it
189 D9B0 3E04               MVI   A,:04
190 D9B2 32F8FF             STA   :FFF8     Set stack interrupt only
191 D9B5 FB                 EI  
192 D9B6 2ABE01             LHLD  :01BE     Get timer contents
193 D9B9 7C                 MOV   A,H
194 D9BA B5                 ORA   L
195 D9BB CAC2D9             JZ    :D9C2     If timer = 0
196 D9BE 2B                 DCX   H         Else:
197 D9BF 22BE01             SHLD  :01BE     decrement timer
198 D9C2 21C001     CKI10   LXI   H,:01C0   Addr. cursor clock
199 D9C5 35                 DCR   M         Decr. clock
200 D9C6 C2CDD9             JNZ   :D9CD     Return if <>0
201 D9C9 360F               MVI   M,:0F     Load 20 ms flash time
202 D9CB EF                 RST   5         Flash cursor
203 D9CC 12                 DATA  :12
204                 *
205                 * GENERAL INTERRUPT RETURN:
206                 *
207                 * Restores interrupt mask and all registers.
208                 *
209                 * Entry: Interrupt mask and all registers on stack.
210                 *
211 D9CD F1         INTRM   POP   PSW       Get old int. mask
212 D9CE F3                 DI  
213 D9CF 32F8FF             STA   :FFF8     Restore int. mask
214 D9D2 325F00             STA   :005F     and remember it.
215 D9D5 FB                 EI  
216 D9D6 D1                 POP   D
217 D9D7 C1                 POP   B
218 D9D8 F1                 POP   PSW
219 D9D9 E1                 POP   H
220 D9DA C9                 RET 
221                 *
222                 **************************
223                 * ENABLE CLOCK INTERRUPT *
224                 **************************
225                 *
226 D9DB C5         CLKEI   PUSH  B
227 D9DC 0180FF             LXI   B,:FF80   Enable clock interrupt
228 D9DF C377D9             JMP   :D977     Update int.mask
229                 *
230                 **************************
231                 * STACK INTERRUPT (RST2) *
232                 **************************
233                 *
234                 * This routine handles an interrupt caused by the
235                 * stack overflow hardware logic.
236                 *
237 D9E2 3100F9     SPINT   LXI   SP,:F900  Reset stackpointer
238 D9E5 AF                 XRA   A
239 D9E6 321701             STA   :0117     No running inputs
240 D9E9 322201             STA   :0122     No encoding of stored line
241 D9EC CD43D7             CALL  :D743     Input from keyboard, reload
242                                         timers sound/keyb
243 D9EF FB                 EI  
244 D9F0 3E16               MVI   A,:16
245 D9F2 C3F5D9             JMP   :D9F5     Run error 'STACK OVERFLOW'
246                 *
247                 *
248                 *
249                 *

PAGE 05    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

250                 *  ===============
251                 *** ERROR HANDLER ***
252                 *  ===============
253                 *
254                 *
255                 ******************
256                 * ERROR HANDLING *
257                 ******************
258                 *
259                 * Produces an error message and other information
260                 * about errors.
261                 *
262                 * Entry: A:  Error message number.
263                 *        BC: Latest position in EBUF or textbuffer.
264                 * Exit:  If during input: Restart input statement.
265                 *        If during encoding: Back to ELINA (C93C)
266                 *                            for handling.
267                 *        Else: Restart Basic (direct mode).
268                 *
269 D9F5 47         ERROR   MOV   B,A       Save error pointer
270 D9F6 AF                 XRA   A
271 D9F7 323101             STA   :0131     Set output screen/RS232
272 D9FA CDE4CE             CALL  :CEE4     Select ROM bank 0
273 D9FD 0000               DBL   :0000
274 D9FF 00                 NOP 
275 DA00 00                 NOP 
276 DA01 3A1801             LDA   :0118     Get RUNF
277 DA04 B7                 ORA   A
278 DA05 C23DDA             JNZ   :DA3D     If run-time error
279 DA08 C364DA             JMP   :DA64     If compile-time error
280                 *
281                 * ENTRYPOINTS TO ERROR ROUTINES:
282                 *
283 DA0B 3E17       ERRSN   MVI   A,:17
284 DA0D C3F5D9             JMP   :D9F5     Run 'SYNTAX ERROR'
285                 *
286 DA10 3E13       ERROM   MVI   A,:13
287 DA12 C3F5D9             JMP   :D9F5     Run 'OUT OF MEMORY'
288                 *
289 DA15 3E09       ERRRA   MVI   A,:09
290 DA17 C3F5D9             JMP   :D9F5     Run 'NUMBER OUT OF RANGE'
291                 *
292 DA1A 3E14       ERRTM   MVI   A,:14
293 DA1C C3F5D9             JMP   :D9F5     Run 'TYPE MISMATCH'
294                 *
295 DA1F 3E03       ERROV   MVI   A,:03
296 DA21 C3F5D9             JMP   :D9F5     Run 'OVERFLOW'
297                 *
298 DA24 3E06       ERRD0   MVI   A,:06
299 DA26 C3F5D9             JMP   :D9F5     Run 'DIVISION BY ZERO'
300                 *
301 DA29 3E05       ERRBS   MVI   A,:05
302 DA2B C3F5D9             JMP   :D9F5     Run 'SUBSCRIPT ERROR'
303                 *
304 DA2E 3E00       ERRNF   MVI   A,:00
305 DA30 C3F5D9             JMP   :D9F5     Run 'NEXT WITHOUT FOR'
306                 *
307 DA33 3E12       ERREL   MVI   A,:12
308 DA35 C3F5D9             JMP   :D9F5     Run 'ERROR LINE RUN'
309                 *
310 DA38 3E08       ERRLS   MVI   A,:08
311 DA3A C3F5D9             JMP   :D9F5     Run 'STRING TOO LONG'

PAGE 06    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

312                 *
313                 ******************
314                 * RUN-TIME ERROR *
315                 ******************
316                 *
317 DA3D CD50DA     ERRRU   CALL  :DA50     Print error message
318 DA40 3A1701             LDA   :0117     Get RDIPL
319 DA43 B7                 ORA   A
320 DA44 C24DDA             JNZ   :DA4D     Jump if running inputs
321 DA47 CD75DA             CALL  :DA75     else: Print 'IN LINE <nr>'
322 DA4A C314C8             JMP   :C814     Re-enter BASIC
323                             
324                 * If error in input:
325                             
326 DA4D C350E3     ERT10   JMP   :E350     (0) Back to restart input
327                 *
328                 ***********************
329                 * PRINT ERROR MESSAGE *
330                 ***********************
331                 *
332                 * Entry: B: Error message number.
333                 * Exit:  BC preserved, AFDEHL corrupted.
334                 *
335 DA50 CD55DD     ERRMS   CALL  :DD55     Cursor to begin (next) line
336 DA53 78                 MOV   A,B       Get error number
337 DA54 2194DA             LXI   H,:DA94   Base of list error messages
338 DA57 87                 ADD   A         Multiply error nr *2
339 DA58 5F                 MOV   E,A       and save offset
340 DA59 1600               MVI   D,:00
341 DA5B 19                 DAD   D         Calculate table addr.
342 DA5C 5E                 MOV   E,M       ) Get addr of message
343 DA5D 23                 INX   H         ) in DE
344 DA5E 56                 MOV   D,M       )
345 DA5F EB                 XCHG            and in HL
346 DA60 CDD4DA             CALL  :DAD4     Print error message
347 DA63 C9                 RET 
348                 *
349                 **********************
350                 * COMPILE-TIME ERROR *
351                 **********************
352                 *
353                 * Handles errors in direct mode. Only an error
354                 * message is printed. Control is passed back to
355                 * ELINA (C93C) except if it is an error during
356                 * encoding of a stored line.
357                 *
358                 * Entry: A: Error number.
359                 *        C: Points to last read character on
360                 *           input line.
361                 * Exit:  To Basic interpreter.
362                 *
363 DA64 3A2201     ERRCO   LDA   :0122     Get ERSFL
364 DA67 FE01               CPI   :01       Error during encoding?
365 DA69 CA57C9             JZ    :C957     Then handle error
366                             
367                 * Error in direct command:
368                             
369 DA6C CD50DA             CALL  :DA50     Print error message
370 DA6F CD5EDD             CALL  :DD5E     Print car.ret
371 DA72 C323C8             JMP   :C823     Restart interpreter
372                 *
373                             

PAGE 07    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

374                 ********************************************
375                 * PRINT LINE NUMBER IN WHICH ERROR OCCURED *
376                 ********************************************
377                 *
378                 * Prints car.ret if current line is a direct command
379                 * Else, prints 'IN LINE <linenr>' and car.ret.
380                 *
381                 * Entry: None.
382                 * Exit:  ABCDEHL preserved. F corrupted.
383                 *        Z=1: direct command.
384                 *
385 DA75 E5         MSGIL   PUSH  H
386 DA76 F5                 PUSH  PSW
387 DA77 2A0001             LHLD  :0100     Get start current line
388 DA7A 7C                 MOV   A,H
389 DA7B B5                 ORA   L         Check if 0
390 DA7C F5                 PUSH  PSW
391 DA7D CA8CDA             JZ    :DA8C     If direct, print car.ret
392 DA80 CDFFDA             CALL  :DAFF     Else, print 'IN LINE'
393 DA83 7FDB               DBL   :DB7F
394 DA85 7E                 MOV   A,M       ) Get line nr in HL
395 DA86 23                 INX   H         )
396 DA87 6E                 MOV   L,M       )
397 DA88 67                 MOV   H,A       )
398 DA89 CDB4EF             CALL  :EFB4     (0) Print line number
399 DA8C CD5EDD     MIL10   CALL  :DD5E     Print car.ret
400 DA8F F1                 POP   PSW
401 DA90 E1                 POP   H
402 DA91 7C                 MOV   A,H
403 DA92 E1                 POP   H
404 DA93 C9                 RET 
405                 *
406                 ************************************
407                 * ERROR MESSAGES INDIRECTION TABLE *
408                 ************************************
409                 *
410                 * The address points to the location where the
411                 * string with the error messages can be found.
412                 * Between brackets the error number.
413                 *
414                 * Run-time errors:
415                 *ERITB
416 DA94 1CDC       E?NF    DBL   :DC1C     (00) NEXT WITHOUT FOR
417 DA96 2CDC       E?RG    DBL   :DC2C     (01) RETURN WITHOUT GOSUB
418 DA98 33DC       E?OD    DBL   :DC33     (02) OUT OF DATA
419 DA9A 3EDC       E?OV    DBL   :DC3E     (03) OVERFLOW
420 DA9C 50DC       E?US    DBL   :DC50     (04) UNDEFINED LINE NUMBER
421 DA9E 5CDC       E?BS    DBL   :DC5C     (05) SUBSCRIPT ERROR
422 DAA0 68DC       E?D0    DBL   :DC68     (06) DIVISION BY ZERO
423 DAA2 95DC       E?OS    DBL   :DC95     (07) OUT OF STRING SPACE
424 DAA4 9DDC       E?LS    DBL   :DC9D     (08) STRING TOO LONG
425 DAA6 D8DC       E?RA    DBL   :DCD8     (09) NUMBER OUT OF RANGE
426 DAA8 B2DC       E?IN    DBL   :DCB2     (0A) INVALID NUMBER
427 DAAA FADC       E?LO0   DBL   :DCFA     (0B) LOADING ERROR 0
428 DAAC FEDC       E?LO1   DBL   :DCFE     (0C) LOADING ERROR 1
429 DAAE 02DD       E?LO2   DBL   :DD02     (0D) LOADING ERROR 2
430 DAB0 06DD       E?LO3   DBL   :DD06     (0E) LOADING ERROR 3
431 DAB2 F1DC       E?UA    DBL   :DCF1     (0F) UNDEFINED ARRAY
432 DAB4 C2DC       E?NC    DBL   :DCC2     (10) COLOUR NOT AVAILABLE
433 DAB6 B7DC       E?OF    DBL   :DCB7     (11) OFF SCREEN
434 DAB8 12DD       E?EL    DBL   :DD12     (12) ERROR LINE RUN
435                             

PAGE 08    DAI FIRMWARE D8FB-DAD3  V1.0  Rev.1

436                 * Compile/Run-time errors:
437                             
438 DABA 47DC       E?OM    DBL   :DC47     (13) OUT OF MEMORY
439 DABC 8ADC       E?TM    DBL   :DC8A     (14) TYPE MISMATCH
440 DABE D6DC       E?LN    DBL   :DCD6     (15) LINE NUMBER OUT OF
441                                         .    RANGE
442 DAC0 38DC       E?SO    DBL   :DC38     (16) STACK OVERFLOW
443                             
444                 * Compile-time errors:
445                             
446 DAC2 23DC       E?SN    DBL   :DC23     (17) SYNTAX ERROR
447 DAC4 79DC       E?ID    DBL   :DC79     (18) COMMAND INVALID
448 DAC6 A9DC       E?CN    DBL   :DCA9     (19) CAN'T CONT
449 DAC8 E3DC       E?TC    DBL   :DCE3     (1A) LINE TOO COMPLEX
450 DACA 47DC       E?ST    DBL   :DC47     (1B) OUT OF MEMORY
451                 *
452                 *******************************
453                 * WAIT; part of RTALK (0EC6D) *
454                 *******************************
455                 *
456                 * Entry: HL: Wait time.
457                 *
458 DACC 2B         RTK20   DCX   H         Wait time -1
459 DACD 7C                 MOV   A,H
460 DACE B5                 ORA   L
461 DACF C2CCDA             JNZ   :DACC     If not ready
462 DAD2 EB                 XCHG            Parameter pntr in HL
463 DAD3 C9                 RET 
464                 *
465                 *
466                 *
470 DAD4                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
CKI10  D9C2   CLKEI  D9DB   CLKINT D9A9   E?BS   DA9E   
E?CN   DAC6   E?D0   DAA0   E?EL   DAB8   E?ID   DAC4   
E?IN   DAA8   E?LN   DABE   E?LO0  DAAA   E?LO1  DAAC   
E?LO2  DAAE   E?LO3  DAB0   E?LS   DAA4   E?NC   DAB4   
E?NF   DA94   E?OD   DA98   E?OF   DAB6   E?OM   DABA   
E?OS   DAA2   E?OV   DA9A   E?RA   DAA6   E?RG   DA96   
E?SN   DAC2   E?SO   DAC0   E?ST   DACA   E?TC   DAC8   
E?TM   DABC   E?UA   DAB2   E?US   DA9C   ERITB  DA94   
ERRBS  DA29   ERRCO  DA64   ERRD0  DA24   ERREL  DA33   
ERRLS  DA38   ERRMS  DA50   ERRNF  DA2E   ERROM  DA10   
ERROR  D9F5   ERROV  DA1F   ERRRA  DA15   ERRRU  DA3D   
ERRSN  DA0B   ERRTM  DA1A   ERT10  DA4D   INTCH  D977   
INTINI D8FB   INTRM  D9CD   INTSU  D91E   ITMPL  D96B   
KBDI   D973   KBEI   D988   KBIS   D99D   MIL10  DA8C   
MSGIL  DA75   RTK20  DACC   SNDDI  D98F   SNDEI  D996   
SNDIS  D9A3   SPINT  D9E2   VCS10  D94C   VCS20  D963   
VECSU  D949
