PAGE 01 DAI FIRMWARE D790-D8FA V1.0 Rev.1 002 ORG :D790 003 * 004 * 005 * 006 ************************ 007 * CHECK FREE RAM SPACE * 008 ************************ 009 * 010 * Entry: DE: Startaddress. 011 * HL: 1st not useable address. 012 * Exit: HL: Useable RAM space. 013 * ABCDE preserved. 014 * 015 D790 CD1ADE MPT25 CALL :DE1A Calculate free space 016 D793 2B DCX H 017 D794 C9 RET 018 * 019 ********************************** 020 * TRANSFER DATA/CASSETTE VECTORS * 021 ********************************** 022 * 023 * Transfer data/cassette switching vectors from 024 * ROM to RAM vector area. 025 * 026 * Exit: AFBC preserved. DEHL corrupted. 027 * 028 *MPT01 029 D795 C5 CASIN PUSH B 030 D796 21CBD7 LXI H,:D7CB Highest source address 031 D799 11A4D7 LXI D,:D7A4 Lowest source address 032 D79C 01C502 LXI B,:02C5 Lowest destination address 033 D79F CD4FDE CALL :DE4F Transfer cassette vectors 034 D7A2 C1 POP B 035 D7A3 C9 RET 036 * 037 *********************************** 038 * DATA/CASSETTE SWITCHING VECTORS * 039 *********************************** 040 * 041 * This data block is moved into the RAM area 042 * #02C5-#02EB during system initialisation. 043 * 044 D7A4 C3B8D2 CINTB JMP :D2B8 WOPEN 045 D7A7 C3F1D2 JMP :D2F1 WBLK 046 D7AA C327D4 JMP :D427 WCLOSE 047 D7AD C325D3 JMP :D325 ROPEN 048 D7B0 C340D3 JMP :D340 RBLK 049 D7B3 C345D4 JMP :D445 RCLOSE 050 D7B6 C3A2D3 JMP :D3A2 MBLK 051 D7B9 C9 RET RESET 052 D7BA 00 NOP 053 D7BB 00 NOP 054 D7BC C9 RET DOUTC 055 D7BD 00 NOP 056 D7BE 00 NOP 057 D7BF C3B4DD JMP :DDB4 DINC 058 D7C2 C9 RET 059 D7C3 00 NOP 060 D7C4 00 NOP 061 D7C5 2424 DATA :24,:24 TAPSL 062 D7C7 243C DATA :24,:3C TAPSD 063 D7C9 2418 DATA :24,:18 TAPST PAGE 02 DAI FIRMWARE D790-D8FA V1.0 Rev.1 064 * 065 ************************************ 066 * WAIT FOR SPACEBAR, PRINT CAR.RET * 067 ************************************ 068 * 069 * Exit: BCDEHL preserved. 070 * CY=1: Break pressed. 071 * 072 *CINTE 073 D7CB CDDAD6 WPT CALL :D6DA Wait for spacebar 074 D7CE DA0CC8 JC :C80C If BREAK pressed: into 075 Basic monitor 076 D7D1 C35EDD JMP :DD5E Print car.ret; ret 077 * 078 D7D4 FF DATA :FF 079 D7D5 FF DATA :FF 080 D7D6 FF DATA :FF 081 D7D7 FF DATA :FF 082 * 083 ********************************* 084 * WRITE BLOCK + TRAILER ON TAPE * 085 ********************************* 086 * 087 * Entry: DE: Length block. 088 * HL: Startaddress block. 089 * Exit: A=0, BCDE preserved. 090 * HL points past block written. 091 * 092 D7D8 CDC802 MPT10 CALL :02C8 Write block 093 D7DB C3CB02 JMP :02CB Write trailer 094 * 095 ************************ 096 * FAILURE DURING ROPEN * 097 ************************ 098 * 099 D7DE 0D RPN20 DCR C 100 D7DF 0C INR C Load during program ? 101 D7E0 C45EDD CNZ :DD5E Print car.ret if not 102 D7E3 C329D3 JMP :D329 Back to read file leader 103 * 104 ************************** 105 * CHECK FILE OF ANY TYPE * 106 ************************** 107 * 108 *MPT12 109 D7E6 3E00 AMBLK MVI A,:00 File type correct 110 D7E8 C3D702 JMP :02D7 Read and check program name 111 * 112 ***************************************** 113 * WRITE BYTE ON CURSOR POSITION ADDRESS * 114 * AND UPDATE CURSOR POSITION. * 115 ***************************************** 116 * 117 * This routine is a fast printing routine: 118 * the data byte is poked directly into the 119 * screen RAM. 120 * 121 * Entry: Byte to be written on screen in A. 122 * Exit: All registers preserved. 123 * 124 D7EB E5 LD95 PUSH H 125 D7EC 00 NOP PAGE 03 DAI FIRMWARE D790-D8FA V1.0 Rev.1 126 D7ED 2A7200 LHLD :0072 Get cursor position address 127 D7F0 77 MOV M,A Write byte on screen 128 D7F1 2B DCX H ) Update cursor addr 129 D7F2 2B DCX H ) 130 D7F3 227200 SHLD :0072 Save new cursor address 131 D7F6 E1 POP H 132 D7F7 C9 RET 133 * 134 *************************** 135 * SAVE: WRITE NAME LENGTH * 136 *************************** 137 * 138 * Entry: HL: Addr. length byte of name. 139 * Exit: DE: Length of name. 140 * HL: Points past string. 141 * BC: Preserved. 142 * A: Checksum on string. 143 * 144 D7F8 5E MPT22 MOV E,M Get name length 145 D7F9 1600 MVI D,:00 146 D7FB 23 INX H HL to 1st byte of name 147 D7FC C3F1D2 JMP :D2F1 Write name length 148 * 149 ******************************** 150 * INITIALISE LOADING FROM TAPE * 151 ******************************** 152 * 153 * Entry: HL: Points to length byte of name requested 154 * Exit: DE: Length requested name. 155 * HL: Points to first byte of name. 156 * AFBC preserved. 157 * 158 D7FF 5E MPT23 MOV E,M Get length requested name 159 D800 1600 MVI D,:00 in DE 160 D802 23 INX H HL points to 1st byte name 161 D803 C32ED4 JMP :D42E Cassette motors on; ret 162 * 163 ********************* 164 * UPDATE POROM/PORO * 165 ********************* 166 * 167 * Entry: MPT52: Byte for ROM/cassette select in A. 168 * MPT53: New POROM byte. 169 * 170 D806 E6F0 MPT52 ANI :F0 Enable ROM/cassette select 171 D808 324000 MPT53 STA :0040 Load POROM 172 D80B 3206FD STA :FD06 and PORO 173 D80E C9 RET 174 * 175 ***************** 176 * part of 2EAC1 * 177 ***************** 178 * 179 * If pointer is off top visible screen: 180 * 181 D80F 7A PCK40 MOV A,D 182 D810 FED0 CPI :D0 183 D812 DAEFEA JC :EAEF (2) if <= CF (no overflow 184 below 0) 185 D815 E5 PUSH H ) if > CF: 186 D816 C5 PUSH B ) Exchange BC and HL 187 D817 E1 POP H ) PAGE 04 DAI FIRMWARE D790-D8FA V1.0 Rev.1 188 D818 C1 POP B ) 189 D819 C3EFEA JMP :EAEF (2) 190 * 191 D81C FF DATA :FF 192 * 193 ********************** 194 * RUN basiccmd SAVEA * 195 ********************** 196 * 197 D81D CD3BD8 RSAVA CALL :D83B Evaluate array type to be 198 saved 199 D820 F5 PUSH PSW Save type array 200 D821 C226D8 JNZ :D826 Jump if INT/FPT array 201 D824 E7 RST 4 Move stringarray into one 202 D825 75 DATA :75 string in free RAM 203 D826 F1 LD99 POP PSW Get type array 204 D827 E5 PUSH H 205 D828 D5 PUSH D 206 D829 F5 PUSH PSW 207 D82A CD91E7 CALL :E791 (0) Evaluate program name 208 D82D 3E32 MVI A,:32 File type byte '2' 209 D82F CDC502 CALL :02C5 WOPEN 210 D832 F1 POP PSW Get type array 211 D833 213E01 LXI H,:013E Startaddr EBUF 212 D836 77 MOV M,A Type into EBUF 213 D837 C368D6 JMP :D668 Write 2 blocks + trailer 214 * 215 D83A 00 NOP 216 * 217 ****************************************** 218 * EVALUATE ARRAY TYPE TO BE SAVED/LOADED * 219 ****************************************** 220 * 221 * Exit: A: Array type. 222 * DE: Length all array elements. 223 * HL: Beginaddr. 1st array element. 224 * Z=1: String array. 225 * Z=0: INT/FPT array. 226 * 227 D83B CD5AE9 RLSAS CALL :E95A (0) Get array addr in HL 228 D83E E630 ANI :30 Allow any type array 229 D840 F5 PUSH PSW Save type 230 D841 5E MOV E,M ) 231 D842 23 INX H ) Get array pntr in DE 232 D843 56 MOV D,M ) 233 D844 7B MOV A,E 234 D845 B2 ORA D 235 D846 CA90E9 JZ :E990 (0) Undef. array if no addr 236 D849 EB XCHG Pointer to array in HL 237 D84A 2B DCX H 238 D84B 2B DCX H 239 D84C 56 MOV D,M Get 1st length byte 240 D84D 23 INX H 241 D84E 7E MOV A,M Get 2nd length byte 242 D84F 23 INX H 243 D850 96 SUB M Minus nr of dim. bytes 244 D851 5F MOV E,A 245 D852 7A MOV A,D 246 D853 DE00 SBI :00 Update hibyte if borrow 247 D855 57 MOV D,A 248 D856 1B DCX D DE is length all array elem. 249 D857 CD39DE CALL :DE39 HL is beginaddr 1st element PAGE 05 DAI FIRMWARE D790-D8FA V1.0 Rev.1 250 D85A F1 POP PSW Get type in A 251 D85B FE20 CPI :20 Set Z-flag on type 252 D85D C9 RET 253 * 254 ********************** 255 * RUN basiccmd LOADA * 256 ********************** 257 * 258 D85E CD3BD8 RLODA CALL :D83B Evaluate array type to be 259 loaded 260 D861 E5 PUSH H Save startaddr array elem. 261 D862 F5 PUSH PSW Save type 262 D863 CD78D6 CALL :D678 Evaluate requested program 263 name; prep. select ROM bank 264 D866 CD08D8 CALL :D808 Select ROM bank 1 265 D869 F1 POP PSW Get type 266 D86A C30FEE JMP :EE0F (1) Read block from tape and 267 store it in array 268 * 269 ************************************ 270 * INITIALISE 'EDIT': EMPTY HEAP, * 271 * CLEAR SYMBOL TABLE, MOVE PROGRAM * 272 ************************************ 273 * 274 * Part of 'Init. EDIT' (0E265). 275 * 276 * Entry: CY=1: Not sufficient memory available. 277 * 278 D86D DA10DA MPT33 JC :DA10 Evt. run error 'OUT OF 279 MEMORY' 280 D870 C323CB JMP :CB23 Empty heap, move 281 program, clear symtab 282 * 283 ****************************************** 284 * LIST CURRENT LINE IF LINENR IS CORRECT * 285 ****************************************** 286 * 287 * Part of 'run LIST ' (0E1B6). 288 * 289 * Entry: CY=0 if linenr. <= 0 or > FFFF. 290 * 291 D873 D215DA MPT3A JNC :DA15 Evt. run error 'NUMBER 292 OUT OF RANGE' 293 D876 C3ABEC JMP :ECAB (0) List current line 294 * 295 ************************** 296 * INPUT FROM EDIT BUFFER * 297 ************************** 298 * 299 * Part of 'restart interpreter' (C823). 300 * 301 D879 E5 MPT05 PUSH H 302 D87A CD91E2 CALL :E291 (0) Input from editbuffer 303 D87D E1 POP H 304 D87E C9 RET 305 * 306 ******************************* 307 * part of RUN 'CLEAR' (0E6B5) * 308 ******************************* 309 * 310 * Checks for heap too big. 311 * PAGE 06 DAI FIRMWARE D790-D8FA V1.0 Rev.1 312 D87F CDF8E6 MPT42 CALL :E6F8 (0) Get space req. in HL 313 D882 7C MOV A,H 314 D883 B7 ORA A Set flags on hibyte 315 D884 37 STC CY=1 if > 32K 316 D885 C9 RET 317 * 318 ************************************ 319 * EVT. INITIALISE 4 COLOUR ANIMATE * 320 ************************************ 321 * 322 * Part of 2E9C3. 323 * 324 D886 FE14 SPT04 CPI :14 325 D888 D0 RNC Abort if A >= 14 326 D889 32C100 STA :00C1 Set for 4-colour animate 327 D88C C9 RET 328 * 329 ******** 330 * DATA * 331 ******** 332 * 333 D88D 20 LD221 DATA :20 Space 334 D88E 8C72 DATA :8C,:72 Pntr. to 'MODE' 335 D890 00 DATA :00 336 * 337 ****************************** 338 * part of 1EE0B - (not used) * 339 ****************************** 340 * 341 D891 F5 LD105 PUSH PSW 342 D892 CD91E7 CALL :E791 (1) 343 D895 F1 POP PSW 344 D896 C9 RET 345 * 346 ******************************************* 347 * READ BLOCK FROM TAPE, EVT. ERROR REPORT * 348 ******************************************* 349 * 350 * Part of LOADA (1EE0F). 351 * 352 D897 CDD102 MPT19 CALL :02D1 Read block from tape 353 D89A D2B3D2 JNC :D2B3 Evt. run 'LOADING ERROR' 354 D89D C9 RET 355 * 356 ************************************** 357 * LIST ARRAY NAME, SPACE, EXPRESSION * 358 ************************************** 359 * 360 * Used in listing 'Savea/Loada' textlines. 361 * 362 D89E CDF7EE SCN30 CALL :EEF7 (0) List array name 363 D8A1 C365ED JMP :ED65 (0) List space, expression 364 * 365 D8A4 FF DATA :FF 366 D8A5 FF DATA :FF 367 * 368 ****************************** 369 * INITIALISE SOUND GENERATOR * 370 ****************************** 371 * 372 * All sound channels are switched off. 373 * PAGE 07 DAI FIRMWARE D790-D8FA V1.0 Rev.1 374 * Exit: AB preserved, CDEHLF corrupted. 375 * 376 D8A6 2106FC SNDINI LXI H,:FC06 377 D8A9 3636 MVI M,:36 ) Load 3 timers 378 D8AB 3676 MVI M,:76 ) 379 D8AD 36B6 MVI M,:B6 ) 380 D8AF 210000 LXI H,:0000 381 D8B2 2204FD SHLD :FD04 Volume 4 channels off 382 D8B5 229402 SHLD :0294 and remember it 383 D8B8 21C201 LXI H,:01C2 Start 1st SCB 384 D8BB 110E00 LXI D,:000E Length SCB 385 D8BE 0E04 MVI C,:04 4 blocks (3 SCB, 1 NCB) 386 D8C0 36FF SNI10 MVI M,:FF FF in 1st byte SCB (= off) 387 D8C2 19 DAD D Calc start next block 388 D8C3 0D DCR C 389 D8C4 C2C0D8 JNZ :D8C0 Next block if not ready 390 D8C7 C9 RET 391 * 392 ********************* 393 * OUTPUT TO DCE-BUS * 394 ********************* 395 * 396 * 'Real World' output. Writes a byte to a given 397 * Real World address. 398 * 399 * Entry: D: Busaddress. 400 * E: Data for output. 401 * 402 D8C8 F5 RWOP PUSH PSW 403 D8C9 E5 PUSH H 404 D8CA 2103FE LXI H,:FE03 GIC control address 405 D8CD 3680 MVI M,:80 All ports output 406 D8CF 2B DCX H Port C addr. in HL 407 D8D0 36FE MVI M,:FE Clear bus expand signal 408 D8D2 EB XCHG Data in L, busaddr. in H 409 D8D3 2200FE SHLD :FE00 Data in PA, busaddr. in PB 410 D8D6 EB XCHG Address PC in HL 411 D8D7 34 INR M Set bus expand signal 412 D8D8 36FD MVI M,:FD Set write strobe true 413 (Now data exchange done) 414 D8DA 36FF MVI M,:FF Reset strobe 415 D8DC 35 DCR M Clear bus expand signal 416 D8DD E1 POP H 417 D8DE F1 POP PSW 418 D8DF C9 RET 419 * 420 ********************** 421 * INPUT FROM DCE-BUS * 422 ********************** 423 * 424 * 'Real World' input. Reads a byte from a given 425 * Real World address. 426 * 427 * Entry: D: Busaddress. 428 * Exit: E: Data received. 429 * 430 D8E0 F5 RWIP PUSH PSW 431 D8E1 E5 PUSH H 432 D8E2 2103FE LXI H,:FE03 GIC control addr. in HL 433 D8E5 3690 MVI M,:90 PA input, rest output 434 D8E7 2B DCX H Address PC in HL 435 D8E8 36FE MVI M,:FE Clear bus expand signal PAGE 08 DAI FIRMWARE D790-D8FA V1.0 Rev.1 436 D8EA 7A MOV A,D Busaddress in A 437 D8EB 3201FE STA :FE01 Store busaddress in PB 438 D8EE 34 INR M Set bus expand signal 439 D8EF 36FB MVI M,:FB Set read strobe true 440 (Now data exchange) 441 D8F1 3A00FE LDA :FE00 Data to A 442 D8F4 5F MOV E,A Data in E 443 D8F5 36FF MVI M,:FF Reset strobe 444 D8F7 35 DCR M 445 D8F8 E1 POP H 446 D8F9 F1 POP PSW 447 D8FA C9 RET 448 * 449 * 450 * 456 D8FB END *************************** * S Y M B O L T A B L E * *************************** AMBLK D7E6 CASIN D795 CINTB D7A4 CINTE D7CB LD105 D891 LD221 D88D LD95 D7EB LD99 D826 MPT01 D795 MPT05 D879 MPT10 D7D8 MPT12 D7E6 MPT19 D897 MPT22 D7F8 MPT23 D7FF MPT25 D790 MPT33 D86D MPT3A D873 MPT42 D87F MPT52 D806 MPT53 D808 PCK40 D80F RLODA D85E RLSAS D83B RPN20 D7DE RSAVA D81D RWIP D8E0 RWOP D8C8 SCN30 D89E SNDINI D8A6 SNI10 D8C0 SPT04 D886 WPT D7CB