PAGE 01 DAI FIRMWARE D8FB-DAD3 V1.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.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.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.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.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.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 ' 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.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 ' 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.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 459 * If wait: 460 * As old routine, but HL replaced by DE. 461 462 DACC 1B RTK20 DCX D ] 463 DACD 7A MOV A,D ] 464 DACE B3 ORA E ] 465 DACF C2CCDA JNZ :DACC ] Wait for DE=0 466 DAD2 C9 RET ] 467 DAD3 FF DATA :FF ] 468 * 469 * 470 * 474 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