PAGE 01 DAI FIRMWARE C614-C7FA V1.0 Rev.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.0 Rev.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.0 Rev.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.0 Rev.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.0 Rev.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.0 Rev.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.0 Rev.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 CDB5DE CALL :DEB5 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 C789 3E00 MVI A,:00 397 C78B 328F02 STA :028F Default number type FPT 398 C78E 117502 LXI D,:0275 Begin IMPTAB 399 C791 218F02 LXI H,:028F End IMPTAB 400 C794 CD7CDE CALL :DE7C Init. implicit type table 401 with 0 (= FPT) 402 C797 FB EI 403 C798 CF RST 1 Wait for input keyboard 404 C799 15 DATA :15 or RS232 405 C79A 00 NOP 406 C79B 21EEC7 LXI H,:C7EE Ptr. to mode 0 colours 407 C79E EF RST 5 Set text colours 408 C79F 06 DATA :06 409 410 * Entry from utility: 411 412 C7A0 CDE4CE RINIT CALL :CEE4 Select ROM bank 0 and print 413 C7A3 D3C7 DBL :C7D3 'BASIC V1.0' 414 C7A5 C318C8 JMP :C818 Into BASIC monitor 415 * 416 * INITIALISATION SCREEN DATA: 417 * 418 C7A8 0D MSGHDR DATA :0D Frigged screen header 419 C7A9 0D DATA :0D 420 C7AA 0D DATA :0D 421 C7AB 0D DATA :0D 422 C7AC 0D DATA :0D 423 C7AD 0D DATA :0D 424 C7AE 20 DATA :20 425 C7AF 44 DATA :44 D 426 C7B0 41 DATA :41 A 427 C7B1 49 DATA :49 I 428 C7B2 20 DATA :20 429 C7B3 50 DATA :50 P 430 C7B4 45 DATA :45 E 431 C7B5 52 DATA :52 R 432 C7B6 53 DATA :53 S 433 C7B7 4F DATA :4F O 434 C7B8 4E DATA :4E N 435 C7B9 41 DATA :41 A PAGE 08 DAI FIRMWARE C614-C7FA V1.0 Rev.1 436 C7BA 4C DATA :4C L 437 C7BB 20 DATA :20 438 C7BC 20 DATA :20 439 C7BD 20 DATA :20 440 C7BE 20 DATA :20 441 C7BF 20 DATA :20 442 C7C0 20 DATA :20 443 C7C1 20 DATA :20 444 C7C2 20 DATA :20 445 C7C3 20 DATA :20 446 C7C4 20 DATA :20 447 C7C5 20 DATA :20 448 C7C6 20 DATA :20 449 C7C7 20 DATA :20 450 C7C8 20 DATA :20 451 C7C9 43 DATA :43 C 452 C7CA 4F DATA :4F O 453 C7CB 4D DATA :4D M 454 C7CC 50 DATA :50 P 455 C7CD 55 DATA :55 U 456 C7CE 54 DATA :54 T 457 C7CF 45 DATA :45 E 458 C7D0 52 DATA :52 R 459 C7D1 0D DATA :0D 460 C7D2 00 DATA :00 461 * 462 C7D3 0C MSGIN DATA :0C 463 C7D4 42 DATA :42 B 464 C7D5 41 DATA :41 A 465 C7D6 53 DATA :53 S 466 C7D7 49 DATA :49 I 467 C7D8 43 DATA :43 C 468 C7D9 20 DATA :20 469 C7DA 56 DATA :56 V 470 C7DB 31 DATA :31 1 471 C7DC 2E DATA :2E . 472 C7DD 30 DATA :30 0 473 C7DE 0D DATA :0D 474 C7DF 00 DATA :00 475 * 476 * SCREEN INITIALISATION PARAMETERS: 477 * 478 C7E0 01 SIPAR DATA :01 Default cursor type 479 C7E1 5F DATA :5F Default cursor ASCII value 480 * 481 C7E2 05 DATA :05 ) 482 C7E3 0F DATA :0F ) Colours COLORT 483 C7E4 0F DATA :0F ) during Reset 484 C7E5 05 DATA :05 ) 485 * 486 C7E6 00 DATA :00 ) 487 C7E7 05 DATA :05 ) Default colours 488 C7E8 0A DATA :0A ) COLORG 489 C7E9 0F DATA :0F ) 490 * 491 C7EA 01CA DBL :CA01 Addr. memory management 492 routine 493 C7EC 25CA DBL :CA25 Addr. emergency stop routine 494 * 495 C7EE 08 STCOL DATA :08 ) 496 C7EF 00 DATA :00 ) Default colours 497 C7F0 00 DATA :00 ) COLORT PAGE 09 DAI FIRMWARE C614-C7FA V1.0 Rev.1 498 C7F1 08 DATA :08 ) 499 * 500 * MATH. ERROR ROUTINE VECTORS: 501 * 502 C7F2 1FDA MEVEC DBL :DA1F Addr. Overflow error routine 503 C7F4 15DA DBL :DA15 Addr. Number out of range 504 error routine 505 C7F6 FAC7 DBL :C7FA Addr. Return 506 C7F8 24DA DBL :DA24 Addr. Error routine Division 507 by zero 508 * 509 C7FA C9 MERET RET Return 510 * 511 * 512 * 516 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