PAGE 01 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 002 ORG :EDF9 003 * 004 * 005 * 006 ******************************** 007 * PRINT CONTENTS CPU SAVE AREA * 008 ******************************** 009 * 010 * Entry: HL: Points to register save area. 011 * msb A = 0: 1 byte to be printed. 012 * msb A = 1: 2 bytes to be printed. 013 * Exit: msb A = 0: AFC corrupted, BDEHL preserved. 014 * msb A = 1: AFCDE corrupted, BHL preserved. 015 * 016 EDF9 B7 L3E227 ORA A Test flags 017 EDFA 7E MOV A,M Get contents save area 018 EDFB F21DED JP :ED1D 1 byte: print it in ASCII 019 020 * If 2 bytes: 021 022 EDFE 5E MOV E,M Get contents in E 023 EDFF 23 INX H Next addr 024 EE00 56 MOV D,M Its contents in D 025 EE01 2B DCX H Restore HL 026 EE02 E5 PUSH H Save it on stack 027 EE03 EB XCHG Contents addr in HL 028 EE04 CD18ED CALL :ED18 Print 2 bytes in ASCII 029 EE07 E1 POP H Restore HL 030 EE08 C9 RET 031 * 032 **************************************** 033 * V+X: PRINT ROUTINE IF REGISTER GIVEN * 034 **************************************** 035 * 036 * Entry: HL: Startaddress symbol table. 037 * DE: Startaddress CPU save area. 038 * A : Last input character. 039 * Exit: All registers corrupted. 040 * 041 EE09 47 L3E228 MOV B,A Last input in B 042 EE0A CD01ED CALL :ED01 Print space 043 EE0D 7E L3E229 MOV A,M Get symbol from table 044 EE0E E67F ANI :7F Skip bit 7 045 EE10 CA62EA JZ :EA62 Error if symbol=0 046 EE13 B8 CMP B Compare input with symbol 047 EE14 CA22EE JZ :EE22 Jump if identical 048 EE17 7E MOV A,M Get symbol 049 EE18 07 RLC Check for msb set 050 EE19 23 INX H Next symbol 051 EE1A 13 INX D Next memory area 052 EE1B D20DEE JNC :EE0D Try next symbol 053 EE1E 13 INX D Next mem. area for '2 byte' 054 symbols 055 EE1F C30DEE JMP :EE0D Try again 056 057 * If symbol found: 058 059 EE22 D5 L3E230 PUSH D Save addr in mem.area 060 EE23 7E L3E231 MOV A,M Get symbol 061 EE24 E3 XTHL HL: addr mem.area; 062 stack: addr symbol 063 EE25 F5 PUSH PSW Save symbol PAGE 02 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 064 EE26 CDF9ED CALL :EDF9 Print contents mem.area 065 EE29 F1 POP PSW Retrieve symbol 066 EE2A CD6AEE CALL :EE6A Exchange mem.contents, 067 go to next one 068 EE2D DA37EE JC :EE37 Jump if 'ESC' 069 EE30 E3 XTHL HL: addr symbol, 070 stack: next mem.area 071 EE31 23 INX H addr next symbol 072 EE32 7E MOV A,M Get symbol 073 EE33 B7 ORA A Set flags 074 EE34 C223EE JNZ :EE23 Not all symbols done 075 * 076 EE37 D1 L3E232 POP D Retrieve next mem.area 077 EE38 C9 RET 078 * 079 ************************ 080 * V+X: DISPLAY ROUTINE * 081 ************************ 082 * 083 * Displays registers at succesive memory locations. 084 * 085 * Entry: DE: startaddress memory area to be 086 * displayed. 087 * HL: Startaddress symbol table. 088 * Exit: All registers corrupted. 089 * 090 EE39 CD06ED L3E233 CALL :ED06 Scan keyb, print char 091 EE3C FE0D CPI :0D 'CR' ? 092 EE3E C209EE JNZ :EE09 Jump if also byte given 093 094 * If only 'V' or 'X': 095 096 EE41 00 NOP 097 EE42 00 NOP 098 EE43 00 NOP 099 EE44 D5 L3E234 PUSH D Save startaddr mem area 100 EE45 4E MOV C,M Get symbol in C 101 EE46 CDB4EE CALL :EEB4 Print symbol 102 EE49 0E3D MVI C,:3D 103 EE4B CDB4EE CALL :EEB4 Print '=' 104 EE4E 7E MOV A,M Get symbol in A 105 EE4F B7 ORA A Check flags 106 EE50 E3 XTHL HL: startaddr mem.area 107 stack: startaddr symboltable 108 EE51 F5 PUSH PSW Save symbol + flags 109 EE52 CDF9ED CALL :EDF9 Print contents mem.area 110 EE55 F1 POP PSW Retrieve symbol and flags 111 EE56 23 INX H 112 EE57 F25BEE JP :EE5B Jump if '1 byte' symbol 113 114 * If 2-byte symbol: 115 116 EE5A 23 INX H 117 EE5B 00 L3E235 NOP 118 EE5C 00 NOP 119 EE5D 00 NOP 120 EE5E E3 XTHL HL: addr symbol 121 stack: addr next mem.area 122 EE5F 23 INX H Next symbol 123 EE60 D1 POP D Get addr next mem.area 124 EE61 7E MOV A,M Get symbol 125 EE62 B7 ORA A PAGE 03 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 126 EE63 C8 RZ Quit if ready 127 EE64 CD01ED CALL :ED01 Print space 128 EE67 C344EE JMP :EE44 Next one 129 * 130 ***************************** 131 * V+X: EVT. MODIFY CONTENTS * 132 ***************************** 133 * 134 * Entry: HL: Memory address. 135 * A : Symbol. 136 * 137 EE6A B7 L3E326 ORA A Set flags on symbol 138 EE6B F5 PUSH PSW and save it 139 EE6C 0E2D MVI C,:2D 140 EE6E CDB4EE CALL :EEB4 Print '-' 141 EE71 E5 PUSH H Save addr mem.area 142 EE72 0E01 MVI C,:01 Nr of datablocks allowed 143 EE74 CD07EB CALL :EB07 Get input on stack; last 144 byte typed in in B 145 EE77 0D DCR C 146 EE78 CA87EE JZ :EE87 Jump if incorrect input 147 EE7B D1 POP D Data typed in in DE 148 EE7C E1 POP H Get addr mem.area 149 EE7D F1 POP PSW Get symbol and flags 150 EE7E 73 MOV M,E Change memory contents 151 EE7F F28DEE JP :EE8D Jump if '1 byte' symbol 152 153 * If 2-byte symbol: 154 155 EE82 23 INX H 156 EE83 72 MOV M,D Change 2nd byte 157 EE84 C38DEE JMP :EE8D 158 * 159 EE87 E1 L3E327 POP H Retrieve addr mem.area 160 EE88 F1 POP PSW Retrieve symbol + flags 161 EE89 F28DEE JP :EE8D If '1 byte' symbol 162 EE8C 23 INX H Add. INX H if 2-byte symbol 163 EE8D 23 L3E328 INX H Next mem.area 164 EE8E 78 MOV A,B Get last input 165 EE8F FE0D CPI :0D 166 EE91 C8 RZ Ready if 'CR' 167 EE92 FE20 CPI :20 168 EE94 C8 RZ Ready if 'SP' 169 EE95 FE12 CPI :12 170 EE97 37 STC Abort with CY=1 if 'ESC' 171 EE98 C8 RZ 172 EE99 C362EA JMP :EA62 Else: wrong input: Error 173 * 174 **************************** 175 * SYMBOL TABLE EXAMINE (X) * 176 **************************** 177 * 178 * The msb is '1' for symbols of two-byte 179 * registers. 180 * 181 EE9C C9 L3E405 DATA :C9 I (addr current instr) 182 EE9D 41 DATA :41 A 183 EE9E 46 DATA :46 F (flags) 184 EE9F 42 DATA :42 B 185 EEA0 43 DATA :43 C 186 EEA1 44 DATA :44 D 187 EEA2 45 DATA :45 E PAGE 04 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 188 EEA3 48 DATA :48 H 189 EEA4 4C DATA :4C L 190 EEA5 D3 DATA :D3 S (stackpointer) 191 EEA6 D0 DATA :D0 P (program counter) 192 EEA7 00 DATA :00 193 * 194 ******************************* 195 * SYMBOL TABLE VECTOR EXAMINE * 196 ******************************* 197 * 198 * The msb is '1' for symbols of two-byte 199 * registers. 200 * 201 EEA8 4D L3E406 DATA :4D M (TICC int mask) 202 EEA9 54 DATA :54 T (TICC cmd + comm.reg) 203 EEAA 47 DATA :47 G (GIC cmd word) 204 EEAB B0 DATA :B0 0 ) 205 EEAC B1 DATA :B1 1 ) 206 EEAD B2 DATA :B2 2 ) 207 EEAE B3 DATA :B3 3 ) Interrupt vectors 208 EEAF B4 DATA :B4 4 ) addresses 209 EEB0 B5 DATA :B5 5 ) 210 EEB1 B6 DATA :B6 6 ) 211 EEB2 B7 DATA :B7 7 ) 212 EEB3 00 DATA :00 213 * 214 ******************* 215 * PRINT CHARACTER * 216 ******************* 217 * 218 * Entry: C: Character to be printed. 219 * Exit: AF corrupted, BCDEHL preserved. 220 * 221 EEB4 79 CO MOV A,C Char in A 222 EEB5 C360DD JMP :DD60 Print char 223 * 224 ******************************* 225 * SCAN KEYBOARD; IGNORE BREAK * 226 ******************************* 227 * 228 * Exit: Character in A. 229 * BCDEHL preserved. 230 * 231 EEB8 CD83EF CI CALL :EF83 Scan keyboard 232 EEBB DAB8EE JC :EEB8 Ignore break 233 EEBE CAB8EE JZ :EEB8 Wait for input 234 EEC1 C9 RET 235 * 236 *********************************** 237 * SCAN KEYBOARD FOR BREAK PRESSED * 238 *********************************** 239 * 240 * Exit: CY=0: No break. 241 * CY=1: Break pressed. 242 * A corrupted, BCDEHL preserved. 243 * 244 EEC2 CDA5D6 BREAK CALL :D6A5 Scan keyb for new inputs 245 EEC5 D0 RNC abort if Break not pressed 246 EEC6 C36AEA JMP :EA6A Restore SP, wait for 247 new inputs 248 * 249 * PAGE 05 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 250 ********************* 251 * CASSETTE ROUTINES * 252 ********************* 253 * 254 EEC9 C3C502 L3E335 JMP :02C5 WOPEN 255 * 256 EECC FF DATA :FF 257 EECD FF DATA :FF 258 EECE FF DATA :FF 259 * 260 EECF C3C802 L3E336 JMP :02C8 WBLK 261 * 262 EED2 FF DATA :FF 263 EED3 FF DATA :FF 264 EED4 FF DATA :FF 265 * 266 EED5 C3CB02 L3E337 JMP :02CB WCLOSE 267 * 268 EED8 C3CE02 L3E338 JMP :02CE ROPEN 269 * 270 EEDB FF DATA :FF 271 EEDC FF DATA :FF 272 EEDD FF DATA :FF 273 * 274 EEDE C3D102 L3E339 JMP :02D1 RBLK 275 * 276 EEE1 C3D402 L3E340 JMP :02D4 RCLOSE 277 * 278 ************* 279 * W - WRITE * 280 ************* 281 * 282 * Requires 2 address fields + evt. name. 283 * Filetype is '1'. Writes startaddress of datablock 284 * + data + trailer on tape. 285 * 286 EEE4 0E02 L3E341 MVI C,:02 Nr of addr allowed 287 EEE6 CDDEEA CALL :EADE Scan keyb, addr on stack 288 EEE9 0D DCR C 2 addr given ? 289 EEEA F262EA JP :EA62 Error if not 290 EEED CD48EF CALL :EF48 Evt. name in input buffer 291 EEF0 3E31 MVI A,:31 File type byte 292 EEF2 00 NOP 293 EEF3 00 NOP 294 EEF4 00 NOP 295 EEF5 00 NOP 296 EEF6 00 NOP 297 EEF7 00 NOP 298 EEF8 CDC9EE CALL :EEC9 Write file header on tape 299 EEFB D1 POP D Get haddr from stack 300 EEFC 13 INX D Incr it 301 EEFD E1 POP H Get laddr from stack 302 EEFE CD63EF CALL :EF63 Write startaddr on tape 303 EF01 7B MOV A,E ) 304 EF02 95 SUB L ) 305 EF03 5F MOV E,A ) Calc length of data 306 EF04 7A MOV A,D ) block, result in DE 307 EF05 9C SBB H ) 308 EF06 57 MOV D,A ) 309 EF07 00 NOP 310 EF08 CDCFEE CALL :EECF Write datablock on tape 311 EF0B CDD5EE CALL :EED5 Write file trailer PAGE 06 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 312 EF0E C9 RET 313 * 314 ************ 315 * R - READ * 316 ************ 317 * 318 * One address is allowed. An evt. name is stored 319 * in the EBUF. Reads header, startaddress and data 320 * from tape. Errorcheck only on data. 321 * 322 * Exit: HL: 1st address above file loaded. 323 * BC: Evt. offset. 324 * AFDE corrupted. 325 * 326 EF0F 0E01 RHEXK MVI C,:01 Nr of addr allowed 327 EF11 CDDEEA CALL :EADE Scan keyb; addr on stack 328 EF14 CD48EF CALL :EF48 Evt name in input buffer 329 EF17 0631 MVI B,:31 File type byte 330 EF19 00 NOP 331 EF1A 00 NOP 332 EF1B 00 NOP 333 EF1C 0E00 MVI C,:00 334 EF1E CDD8EE CALL :EED8 Read file header 335 EF21 1100F9 LXI D,:F900 Max addr to write data into 336 EF24 C1 POP B Get evt offset from stack 337 EF25 CD74EF CALL :EF74 Read startaddr from tape 338 EF28 09 DAD B Add offset 339 EF29 CD8AEF CALL :EF8A Read data block + trailer 340 EF2C D262EA JNC :EA62 Print 'error' if reading 341 error 342 EF2F C9 RET 343 * 344 *************************************** 345 * RST 0: POINTER TO 'LOOK'-FLAG IN HL * 346 *************************************** 347 * 348 * Part of 3EC21. 349 * 350 * Exit: A=0, BCDE preserved. 351 * 352 EF30 AF L3E343 XRA A 353 EF31 215000 LXI H,:0050 354 EF34 C9 RET 355 * 356 ******************** 357 * INITIALISE RST 0 * 358 ******************** 359 * 360 * Entry: On stack: Returnaddress #EA42. 361 * 362 EF35 3EFB L3E344 MVI A,:FB Instr code for EI in A 363 EF37 324700 STA :0047 Save it 364 EF3A D1 POP D Get EA42 in DE 365 EF3B C3E2EB JMP :EBE2 Into RST 0 366 * 367 ********************** 368 * SET INTERRUPT MASK * 369 ********************** 370 * 371 * Part of RST0 (3EC05). 372 * 373 * Entry: A: Value for TICC interrupt mask. PAGE 07 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 374 * Exit: A=0, F corrupted, BCDEHL preserved. 375 * 376 EF3E 32F8FF L3E345 STA :FFF8 Set TICC int mask 377 EF41 AF XRA A A=0 378 EF42 C9 RET 379 * 380 EF43 FF DATA :FF 381 * 382 ************************* 383 * part of RST 0 (3EC3B) * 384 ************************* 385 * 386 EF44 2B L3E346 DCX H 387 EF45 C319EC JMP :EC19 Into RST 0 388 * 389 ***************************** 390 * W+R: NAME IN INPUT BUFFER * 391 ***************************** 392 * 393 * Names >126 characters destroy BASIC pointers. 394 * 395 * Entry: Last character typed in, in B. 396 * Exit: BCD preserved. HL points to EBUF. 397 * A= 0: No file name given. 398 * A<>0: File name given. 399 * 400 EF48 213E01 L3E347 LXI H,:013E Startaddr EBUF 401 EF4B 1EFF MVI E,:FF 402 EF4D 78 MOV A,B Last char in A 403 EF4E D60D SUI :0D 'CR' ? 404 EF50 77 MOV M,A (13E) is 0 if CR 405 EF51 C8 RZ Quit if no name given 406 407 * If name given: 408 409 EF52 E5 PUSH H Save startaddr EBUF 410 EF53 2C L3E356 INR L Points to next loc 411 EF54 1C INR E Calc length 412 EF55 CD06ED CALL :ED06 Scan keyb, print char 413 EF58 77 MOV M,A Char into EBUF 414 EF59 FE0D CPI :0D 415 EF5B C253EF JNZ :EF53 Next char if not 'CR' 416 EF5E E1 POP H Retrieve startaddr EBUF 417 EF5F 73 MOV M,E Store length name in 013E 418 EF60 C9 RET 419 * 420 ************** 421 * (Not used) * 422 ************** 423 * 424 EF61 E1 L3E348 POP H 425 EF62 C9 RET 426 * 427 ****************************** 428 * WRITE STARTADDRESS ON TAPE * 429 ****************************** 430 * 431 * Entry: HL: Startaddress. 432 * Exit: AF corrupted, BCDEHL preserved. 433 * 434 EF63 D5 L3E349 PUSH D 435 EF64 E5 PUSH H PAGE 08 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 436 EF65 223E01 SHLD :013E Startaddr in EBUF 437 EF68 213E01 LXI H,:013E Startaddr to write from 438 EF6B 110200 LXI D,:0002 Length 439 EF6E CDCFEE CALL :EECF Write addr on tape 440 EF71 E1 POP H 441 EF72 D1 POP D 442 EF73 C9 RET 443 * 444 ******************************* 445 * READ STARTADDRESS FROM TAPE * 446 ******************************* 447 * 448 * Exit: HL: Startaddress. 449 * CY=1: No reading error. 450 * CY=0: Reading error, errorcode in A. 451 * BCDE preserved. 452 * 453 EF74 D5 L3E350 PUSH D 454 EF75 213E01 LXI H,:013E Addr EBUF 455 EF78 114101 LXI D,:0141 Addr after addr in EBUF 456 EF7B CDDEEE CALL :EEDE Read block from tape 457 EF7E D1 POP D 458 EF7F 2A3E01 LHLD :013E Startaddr in HL 459 EF82 C9 RET 460 * 461 ***************** 462 * SCAN KEYBOARD * 463 ***************** 464 * 465 * Part of 3EEB8. Scans keyboard. Returns 466 * any key received. 467 * 468 * Exit: A: Key received. 469 * BCDEHL preserved. 470 * CY=1: Break pressed. 471 * 472 EF83 AF L3E351 XRA A 473 EF84 32B902 STA :02B9 Enable complete keyb scan 474 EF87 C3BED6 JMP :D6BE Scan keyboard 475 * 476 *********************** 477 * READ DATA FROM TAPE * 478 *********************** 479 * 480 * Part of READ (3EF29). 481 * 482 EF8A CDDEEE L3E352 CALL :EEDE Read block from tape 483 EF8D C3E1EE JMP :EEE1 Stop reading 484 * 485 ****************************** 486 * DCE INITIALISATION ROUTINE * 487 ****************************** 488 * 489 * Part of RESET (C719). Bootstrap for disc drive. 490 * Sets GIC in initialisation status. Checks if any 491 * input is received from the DCE-bus and performs 492 * the received instructions. 493 * 494 * Exit: A=#EE if no DCE-inputs available. 495 * 496 EF90 3E98 L3E353 MVI A,:98 497 EF92 3203FE STA :FE03 PA+PCH in, PB+PCL out PAGE 09 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 498 EF95 3E07 MVI A,:07 499 EF97 3203FE STA :FE03 PC3=1 500 EF9A 3E01 MVI A,:01 501 EF9C 3201FE STA :FE01 Output PB: 01 502 EF9F 3E01 MVI A,:01 503 EFA1 3203FE STA :FE03 PC0=1 504 EFA4 010010 LXI B,:1000 505 EFA7 3A02FE L3E355 LDA :FE02 Get input from PCH 506 EFAA E620 ANI :20 Bit 5 only 507 EFAC C2B8EF JNZ :EFB8 Jump if inputs received 508 509 * If no inputs: 510 511 EFAF 0B DCX B ) 512 EFB0 78 MOV A,B ) Wait loop until C=#10 513 EFB1 B1 ORA C ) 514 EFB2 C2A7EF JNZ :EFA7 ) 515 EFB5 3EEE MVI A,:EE A=EE if no inputs 516 EFB7 C9 RET 517 * 518 * DCE BOOTSTRAP INPUT ROUTINE: 519 * 520 * Loads MLP inputs from the DCE-bus into the 521 * stackbottom and goes to it. 522 * 523 EFB8 1100F8 L3E354 LXI D,:F800 Addr stackbottom 524 EFBB 3E05 L3E357 MVI A,:05 525 EFBD 3203FE STA :FE03 PC2=1 526 EFC0 3A02FE L3E358 LDA :FE02 Get input from PC 527 EFC3 E680 ANI :80 Bit 7 only 528 EFC5 CAC0EF JZ :EFC0 Wait for change to high 529 EFC8 3A00FE LDA :FE00 Get input from FA 530 EFCB 12 STAX D Save input in stack area 531 EFCC 13 INX D Point to next loc 532 EFCD 3E04 MVI A,:04 533 EFCF 3203FE STA :FE03 PC2=0 534 EFD2 3A02FE L3E359 LDA :FE02 Get input from PC 535 EFD5 E680 ANI :80 Bit 7 only 536 EFD7 C2D2EF JNZ :EFD2 Wait for change to low 537 EFDA 3A02FE LDA :FE02 Get input from FC 538 EFDD E620 ANI :20 Bit 5 only 539 EFDF C2BBEF JNZ :EFBB Again if high 540 EFE2 3E06 MVI A,:06 541 EFE4 323EFE STA :FE3E (FE3E hardwarewise read as 542 FE02). PC=06 543 EFE7 3A02FE L3E360 LDA :FE02 Get input from FC 544 EFEA E620 ANI :20 Bit 5 only 545 EFEC CAE7EF JZ :EFE7 Wait for change to high 546 EFEF C300F8 JMP :F800 Go to stackbottom 547 * 548 EFF2 FF DATA :FF 549 EFF3 FF DATA :FF 550 * 551 ********************* 552 * SCAN 'DINC' INPUT * 553 ********************* 554 * 555 * Part of 3E935. Default 'DINC' is RS232 input. 556 * 557 EFF4 CDB4DD L3E361 CALL :DDB4 Get input from DINC 558 EFF7 CA35E9 JZ :E935 Scan keyb if no DINC input 559 PAGE 10 DAI FIRMWARE 3EDF9-3EFFF V1.0 Rev.1 560 * If inputs from DINC: 561 562 EFFA 3E01 MVI A,:01 563 EFFC 329602 STA :0296 Set INSW for DINC input 564 EFFF C9 RET 565 * 566 * 567 * 568 F000 END *************************** * S Y M B O L T A B L E * *************************** BREAK EEC2 CI EEB8 CO EEB4 L3E227 EDF9 L3E228 EE09 L3E229 EE0D L3E230 EE22 L3E231 EE23 L3E232 EE37 L3E233 EE39 L3E234 EE44 L3E235 EE5B L3E326 EE6A L3E327 EE87 L3E328 EE8D L3E335 EEC9 L3E336 EECF L3E337 EED5 L3E338 EED8 L3E339 EEDE L3E340 EEE1 L3E341 EEE4 L3E343 EF30 L3E344 EF35 L3E345 EF3E L3E346 EF44 L3E347 EF48 L3E348 EF61 L3E349 EF63 L3E350 EF74 L3E351 EF83 L3E352 EF8A L3E353 EF90 L3E354 EFB8 L3E355 EFA7 L3E356 EF53 L3E357 EFBB L3E358 EFC0 L3E359 EFD2 L3E360 EFE7 L3E361 EFF4 L3E405 EE9C L3E406 EEA8 RHEXK EF0F