PAGE 01 DAI FIRMWARE 0E401-0E601 V1.1 002 ORG :E401 003 * 004 * 005 * 006 ************************ 007 * RUN basiccmd RESTORE * 008 ************************ 009 * 010 E401 2A9F02 RREST LHLD :029F Get startaddr. textbuf 011 E404 222401 SHLD :0124 Store it in DATAP 012 E407 AF XRA A 013 E408 3D DCR A 014 E409 C355E4 JMP :E455 Set DATAQ=FF! 015 * 016 ***************** 017 * RUN RANDOMISE * 018 ***************** 019 * 020 * Returns a hardware random number 0 < R < 1. 021 * 022 * Exit: BC preserved. AFDEHL corrupted. 023 * Result in MACC. 024 * 025 E40C C5 RRAND PUSH B 026 E40D 2100FD LXI H,:FD00 Addr PORI 027 E410 CD5FD6 CALL :D65F BC=0, E=0, #40 or #80 028 E413 1601 MVI D,:01 029 * 030 E415 3A9302 RMI10 LDA :0293 Get RNDLY (0 by C72E) 031 E418 CD58D6 CALL :D658 Delay, A=M XOR E 032 E41B 07 RLC 033 E41C 07 RLC 034 035 * Now CY is 0 if E=#40 and CY = bit 6 of FD00 036 * (hardware random) if E=0 or E=#80. 037 038 E41D 7A RMI20 MOV A,D 039 E41E 17 RAL RAL D 040 E41F 57 MOV D,A 041 E420 79 MOV A,C 042 E421 17 RAL RAL C 043 E422 4F MOV C,A 044 E423 78 MOV A,B 045 E424 17 RAL RAL B 046 E425 47 MOV B,A 047 E426 B7 ORA A 048 E427 F215E4 JP :E415 Again if B<#80 (must be 049 normalised FPT nr) 050 051 * Result in MACC: 052 053 E42A 3E01 MVI A,:01 Set exp.byte for 1 < R < 2 054 E42C E7 RST 4 Copy A,B,C,D to MACC 055 E42D 12 DATA :12 056 E42E 21F1D0 LXI H,:D0F1 Addr FPT(-1) 057 E431 E7 RST 4 Add -1 to MACC 058 E432 00 DATA :00 Now: 0 < R < 1 059 E433 C1 POP B 060 E434 B7 ORA A No special action 061 E435 C9 RET 062 * 063 * PAGE 02 DAI FIRMWARE 0E401-0E601 V1.1 064 ****************** 065 * cont. of 0E3DC * 066 ****************** 067 * 068 E436 23 MPT36 INX H 069 E437 7E MOV A,M Get length dataline 070 E438 323401 STA :0134 Store it in EFECT 071 E43B 23 INX H Pnts to start data bytes 072 E43C 223201 SHLD :0132 Startaddr string in EFEPT 073 E43F 00 NOP 074 E440 00 NOP 075 E441 E1 POP H 076 E442 D1 POP D 077 E443 1E00 MVI E,:00 078 E445 F1 POP PSW 079 E446 C9 RET 080 * 081 ************************** 082 * PREPARE GETTING INPUTS * 083 ************************** 084 * 085 * The keyboard pointers are set to their default 086 * values before inputs are asked. This avoids 087 * keybounce. 088 * 089 E447 221D01 SHLD :011D 090 E44A CD63D5 CALL :D563 ] Init keyb pntrs 091 E44D 3EFF MVI A,:FF 092 E44F 321701 STA :0117 093 E452 C3D0E3 JMP :E3D0 094 * 095 ****************** 096 * cont. of 0E401 * 097 ****************** 098 * 099 * Instruction only moved. 100 * 101 E455 322301 STA :0123 102 E458 C9 RET 103 E459 FF DATA :FF 104 * 105 ******************** 106 * RUN basiccmd LET * 107 ******************** 108 * 109 * Valid as direct command or in program. Computes 110 * variable pointer or variable reference and 111 * checks type. 'LET' can be explicitly or 112 * implicitly given. 113 * 114 * Entry: BC: Points to program line. 115 * Exit: BC: Updated. 116 * A: Type of variable. 117 * FDEHL corrupted. 118 * 119 *RLETX 120 E45A CD63E9 RLETI CALL :E963 Get varptr in HL, T/L in A 121 E45D E630 ANI :30 Type only 122 E45F F5 PUSH PSW Save type 123 E460 FE20 CPI :20 String type? 124 E462 C294E4 JNZ :E494 Jump if INT/FPT 125 PAGE 03 DAI FIRMWARE 0E401-0E601 V1.1 126 * If string type: 127 128 E465 E5 RLT10 PUSH H Save varptr 129 E466 7E MOV A,M ) 130 E467 23 INX H ) 131 E468 66 MOV H,M ) Addr string in HL 132 E469 6F MOV L,A 133 E46A E3 XTHL ) Save stringaddr 134 E46B E5 PUSH H ) and varptr 135 E46C CD9DE7 CALL :E79D Get value being assigned 136 E46F 7B MOV A,E Get status 137 E470 FE02 CPI :02 138 E472 CA7FE4 JZ :E47F Jump if temp on heap 139 E475 7E MOV A,M Get string length 140 E476 EB XCHG 141 E477 CD8BD1 CALL :D18B Get place in heap for string 142 E47A E5 PUSH H 143 E47B CD72D1 CALL :D172 Transfer string into heap 144 E47E E1 POP H 145 E47F EB RLT20 XCHG Pntr to string in DE 146 E480 E1 POP H Pntr to variable in HL 147 E481 73 MOV M,E ) Stringpntr in variable 148 E482 23 INX H ) 149 E483 72 MOV M,D ) 150 151 * Entry from scratch: 152 153 E484 2A9F02 RLT25 LHLD :029F Get startaddr. textbuf 154 E487 EB XCHG in DE 155 E488 E1 POP H Get pntr old value 156 E489 7C MOV A,H 157 E48A B5 ORA L 158 E48B C414DE CNZ :DE14 If <>0: Test if on heap 159 E48E DC87D1 CC :D187 Then clear string in heap 160 E491 C3B2E4 JMP :E4B2 Ready 161 162 * If FPT/INT type: 163 164 E494 E5 RLT30 PUSH H 165 E495 CD19E8 CALL :E819 Eval numeric arguments 166 E498 7C MOV A,H 167 E499 B5 ORA L 168 E49A C2A3E4 JNZ :E4A3 Copy num expr if not in MACC 169 E49D E1 POP H 170 E49E E7 RST 4 Copy MACC to variable 171 E49F 0F DATA :0F 172 E4A0 C3B2E4 JMP :E4B2 Ready 173 174 * If just constant or variable: 175 176 E4A3 D1 RLT50 POP D Get pntr to variable 177 E4A4 D5 PUSH D 178 E4A5 C5 PUSH B 179 E4A6 0604 MVI B,:04 Nr of bytes 180 E4A8 7E RLT60 MOV A,M Get byte 181 E4A9 12 STAX D Store it in variable 182 E4AA 23 INX H 183 E4AB 13 INX D 184 E4AC 05 DCR B Decr byte count 185 E4AD C2A8E4 JNZ :E4A8 Next byte if not ready 186 E4B0 C1 POP B 187 E4B1 E1 POP H PAGE 04 DAI FIRMWARE 0E401-0E601 V1.1 188 189 * Ready: 190 191 E4B2 F1 RLT90 POP PSW 192 E4B3 C9 RET 193 194 * Entry from READ/INPUT for FPT/INT: 195 196 E4B4 F5 RLT70 PUSH PSW 197 E4B5 C394E4 JMP :E494 Value to variable 198 199 * Entry from READ/INPUT for STR: 200 201 E4B8 F5 RLT80 PUSH PSW 202 E4B9 C365E4 JMP :E465 Stringvalue to variable 203 * 204 ********************** 205 * RUN basiccmd SOUND * 206 ********************** 207 * 208 * Formats: SOUND . 209 * SOUND OFF. 210 * SOUND OFF. 211 * 212 * Entry: BC: Points to program line. 213 * Exit: BC updated, AFDEHL corrupted. 214 * 215 E4BC 0A RSOUND LDAX B Get 1st expr. 216 E4BD FEFF CPI :FF Is it sound OFF? 217 E4BF CA01E5 JZ :E501 Then turn all sound off 218 E4C2 3E02 MVI A,:02 219 E4C4 CD43E7 CALL :E743 Get channelnr (0,1,2) 220 E4C7 21C201 LXI H,:01C2 Startaddr SCB0 221 E4CA 110E00 LXI D,:000E Length SCB 222 E4CD F5 PUSH PSW Save channelnr 223 E4CE 3D SND10 DCR A 224 E4CF FAD6E4 JM :E4D6 If chan.0 or ready 225 E4D2 19 DAD D Absolute addr SCB in HL 226 E4D3 C3CEE4 JMP :E4CE If chan.2 227 E4D6 D1 SND20 POP D Channelnr in D 228 E4D7 CD1FE5 CALL :E51F Set up SCB 229 E4DA DAFCE4 JC :E4FC If channel to be OFF 230 E4DD 3E03 MVI A,:03 231 E4DF CD43E7 CALL :E743 Get 232 E4E2 F5 PUSH PSW 233 E4E3 E601 ANI :01 Tremoloflag only 234 E4E5 77 MOV M,A Into SCB 235 E4E6 23 INX H 236 E4E7 00 NOP 237 E4E8 00 NOP 238 E4E9 F1 POP PSW Restore 239 E4EA E602 ANI :02 Glissandoflag only 240 E4EC 1F RAR 241 E4ED 3C INR A 242 E4EE 23 INX H 1 free byte 243 E4EF 77 MOV M,A Glissandoflag in SCB 244 E4F0 23 INX H ) 245 E4F1 23 INX H ) Ignore current period 246 E4F2 23 INX H ) 247 E4F3 E5 PUSH H Save pntr to reqd period 248 E4F4 CDF8E6 CALL :E6F8 Get 249 E4F7 EB XCHG in DE PAGE 05 DAI FIRMWARE 0E401-0E601 V1.1 250 E4F8 E1 POP H 251 E4F9 73 MOV M,E ) Reqd period in SCB 252 E4FA 23 INX H ) 253 E4FB 72 MOV M,D ) 254 E4FC CD96D9 SND70 CALL :D996 Enable sound interrupts 255 E4FF B7 ORA A No special action 256 E500 C9 RET 257 258 * If SOUND OFF: 259 260 E501 03 SND80 INX B 261 E502 CD8FD9 CALL :D98F Disable sound interrupts 262 E505 C5 PUSH B 263 E506 CDA6D8 CALL :D8A6 Stop oscillators 264 E509 C1 POP B 265 E50A B7 ORA A No special action 266 E50B C9 RET 267 * 268 ********************** 269 * RUN basiccmd NOISE * 270 ********************** 271 * 272 * Sets up a noise control block. 273 * Formats: NOISE . 274 * NOISE OFF. 275 * 276 * Entry: BC: Points to expression. 277 * Exit: Noise off: BC updated, DE preserved, 278 * AFHL corrupted. 279 * Noise on: BC updated, AFDEHL corrupted. 280 * 281 E50C 21EC01 RNOISE LXI H,:01EC Startaddr NCB 282 E50F 1603 MVI D,:03 Channelnr.3 283 E511 CD1FE5 CALL :E51F Set up NCB 284 E514 DAFCE4 JC :E4FC If channel to be off 285 E517 3600 MVI M,:00 No tremolo 286 E519 23 INX H 287 E51A 3600 MVI M,:00 Current volume = 0 288 E51C C3FCE4 JMP :E4FC Enable sound interrupts 289 * 290 **************** 291 * SET ENVELOPE * 292 **************** 293 * 294 * Sets up a sound or noise control block for 295 * a channel. 296 * 297 * Entry: D: Channelnumber (0,1,2 or 3). 298 * BC: Points to programline. 299 * HL: Points to startaddr SCB/NCB. 300 * Exit: If sound/noise off (CY=1): 301 * FF in 1st byte of SCB/NCB. 302 * HL: points to 1st byte SCB/NCB. 303 * BC: points to 2nd byte SCB/NCB. 304 * DE preserved, AF corrupted. 305 * If sound/noise on (CY=0): 306 * 00 in 1st byte SCB/NCB. 307 * HL: Points after free byte. 308 * DE: Envelopeaddr +1. 309 * BC: Points beyond volume. 310 * AF: corrupted. 311 * PAGE 06 DAI FIRMWARE 0E401-0E601 V1.1 312 E51F CD8FD9 SNGEV CALL :D98F Disable sound interrupts 313 E522 3600 MVI M,:00 00 in 1st byte SCB/NCB 314 E524 0A LDAX B Get 1st byte from progr.line 315 E525 FEFF CPI :FF 316 E527 CA52E5 JZ :E552 Jump if channel to be off 317 318 * If channel on: 319 320 E52A 23 INX H Pntr to next byte of block 321 E52B E5 PUSH H Save pntr 322 E52C 3E01 MVI A,:01 323 E52E CD43E7 CALL :E743 Get envelopenr in A (0,1) 324 E531 21F501 LXI H,:01F5 Addr envelope area 325 E534 0F RRC 326 E535 0F RRC 327 E536 5F MOV E,A DE=64*A 328 E537 1600 MVI D,:00 329 E539 19 DAD D Add offset for env area 330 E53A EB XCHG Pntr to envelope in DE 331 E53B E1 POP H Get input pntr SCB/NCB 332 E53C 73 MOV M,E ) Envelope addr in block 333 E53D 23 INX H ) 334 E53E 72 MOV M,D ) 335 E53F 23 INX H 336 E540 13 INX D 337 E541 73 MOV M,E ) Env addr +1 in block 338 E542 23 INX H ) 339 E543 72 MOV M,D ) 340 E544 23 INX H 341 E545 3E0F MVI A,:0F 342 E547 CD43E7 CALL :E743 Get volume multiplier in 343 A (0-15) 344 E54A 07 RLC ) 345 E54B 07 RLC ) *8 346 E54C 07 RLC ) 347 E54D 77 MOV M,A Vol.*8 in block 348 E54E 23 INX H Pntr to basic volume 349 E54F 23 INX H Pntr to tremoloflag 350 E550 B7 ORA A Return 'channel on' 351 E551 C9 RET 352 353 * If channel to be off: 354 355 E552 03 SNG10 INX B 356 E553 35 DCR M FF in 1st byte SCB/NCB 357 E554 7A MOV A,D Get channelnr 358 E555 FE03 CPI :03 359 E557 CA63E5 JZ :E563 Jump if noisechannel 360 E55A 0F RRC ) Find disable data for 361 E55B 0F RRC ) chan. 0-2 362 E55C F636 ORI :36 ) 363 E55E 3206FC STA :FC06 Load sound cmd word 364 E561 37 STC Return 'channel off' 365 E562 C9 RET 366 367 * If noise to be off: 368 369 E563 3A9502 SNG20 LDA :0295 Get volume osc.2 + noise 370 E566 E60F ANI :0F Vol. noise = 0 371 E568 329502 STA :0295 Update POR1M 372 E56B 3205FD STA :FD05 and POR1 373 E56E 37 STC Return 'channel off' PAGE 07 DAI FIRMWARE 0E401-0E601 V1.1 374 E56F C9 RET 375 * 376 * 377 ************************* 378 * RUN basiccmd ENVELOPE * 379 ************************* 380 * 381 * Load envelope table 0 or 1 with data. 382 * Formats: ENVELOPE (,;) , FF. 383 * ENVELOPE (,;) . 384 * 385 E570 3E01 RENV MVI A,:01 386 E572 CD43E7 CALL :E743 Get envelope number (0,1) 387 E575 0F RRC 388 E576 0F RRC 389 E577 5F MOV E,A ) Offset for env addr 390 E578 1600 MVI D,:00 ) 391 E57A 21F501 LXI H,:01F5 Addr env storage area 392 E57D 19 DAD D Startaddr table in HL 393 E57E 3600 MVI M,:00 00 in 1st field 394 E580 23 INX H 395 E581 0A LDAX B Get length of expr 396 E582 03 INX B 397 E583 3C INR A 398 E584 57 MOV D,A Nr of complete entries in D 399 E585 15 REN10 DCR D 400 E586 CA9DE5 JZ :E59D If all entries done 401 E589 3E10 MVI A,:10 402 E58B CD43E7 CALL :E743 Get volume (0-16) 403 E58E 77 MOV M,A Into env table 404 E58F 23 INX H 405 E590 CD1DE7 CALL :E71D Get time 406 E593 D601 SUI :01 Min. value is 1 407 E595 DA15DA JC :DA15 Run error 'NUMBER OUT OF 408 RANGE' if time=0 409 E598 77 MOV M,A Time into env table 410 E599 23 INX H 411 E59A C385E5 JMP :E585 Next , 412 E59D 36FF REN15 MVI M,:FF FF as last in env table 413 E59F 0A LDAX B Get last expr 414 E5A0 03 INX B 415 E5A1 FEFF CPI :FF End marker? 416 E5A3 CAB0E5 JZ :E5B0 Then quit 417 E5A6 0B DCX B 418 E5A7 3E10 MVI A,:10 419 E5A9 CD43E7 CALL :E743 Get final volume 420 E5AC 77 MOV M,A into env table 421 E5AD 23 INX H 422 E5AE 36FF MVI M,:FF Time = forever 423 E5B0 B7 REN20 ORA A No special action 424 E5B1 C9 RET 425 * 426 *********************** 427 * RUN basiccmd CURSOR * 428 *********************** 429 * 430 E5B2 CDF3E5 RCURS CALL :E5F3 Evaluate coordinate 431 E5B5 67 MOV H,A Y-coord in H 432 E5B6 EF RST 5 Set cursor position 433 E5B7 09 DATA :09 434 E5B8 C3C9E5 JMP :E5C9 Evt run screen error 435 * PAGE 08 DAI FIRMWARE 0E401-0E601 V1.1 436 ********************* 437 * RUN basiccmd MODE * 438 ********************* 439 * 440 * Entry: BC: Points to program line. 441 * 442 E5BB 0A RMODE LDAX B Get reqd mode in A 443 E5BC 03 INX B 444 E5BD C3B5CE JMP :CEB5 Change screen mode 445 * 446 E5C0 C9 L0E99 RET 447 * 448 ******************** 449 * RUN basiccmd DOT * 450 ******************** 451 * 452 E5C1 CDF9E5 RDOT CALL :E5F9 Eval dot addr + colour 453 E5C4 C5 PUSH B 454 E5C5 4B MOV C,E Colour in C 455 E5C6 EF RST 5 Draw dot on screen 456 E5C7 1E DATA :1E 457 E5C8 C1 RDT10 POP B 458 E5C9 DA02E6 RDT20 JC :E602 Jump if screen error 459 E5CC B7 ORA A No special action 460 E5CD C9 RET 461 * 462 ********************* 463 * RUN basiccmd DRAW * 464 ********************* 465 * 466 E5CE CDE0E5 RDRAW CALL :E5E0 Eval begin/end addr + 467 colour 468 E5D1 E3 XTHL 469 E5D2 EF RST 5 Draw a line on screen 470 E5D3 21 DATA :21 471 E5D4 C3C8E5 JMP :E5C8 Evt. run screen error 472 * 473 ********************* 474 * RUN basiccmd FILL * 475 ********************* 476 * 477 E5D7 CDE0E5 RFILL CALL :E5E0 Eval coordinates, colour 478 E5DA E3 XTHL 479 E5DB EF RST 5 Fill a rectangular area 480 E5DC 24 DATA :24 481 E5DD C3C8E5 JMP :E5C8 Evt run screen error 482 * 483 *********************************** 484 * EVALUATE 2 COORDINATES + COLOUR * 485 *********************************** 486 * 487 E5E0 CDF3E5 R2COC CALL :E5F3 Get 1st coordinate 488 E5E3 E3 XTHL X-coord on stack 489 E5E4 E5 PUSH H 490 E5E5 5F MOV E,A Y-coord in E 491 E5E6 CDF3E5 CALL :E5F3 Get 2nd coordinate, 492 x-coord in HL 493 E5E9 57 MOV D,A Y-coord in D 494 E5EA CDFDE5 CALL :E5FD Get colour in A 495 E5ED C5 PUSH B 496 E5EE D5 PUSH D 497 E5EF EB XCHG PAGE 09 DAI FIRMWARE 0E401-0E601 V1.1 498 E5F0 C1 POP B 499 E5F1 E1 POP H 500 E5F2 C9 RET 501 * 502 *********************** 503 * EVALUATE COORDINATE * 504 *********************** 505 * 506 E5F3 CDF8E6 RCOOR CALL :E6F8 Get x-coord in HL 507 E5F6 C31DE7 JMP :E71D Get y-coord in A 508 * 509 ******************************** 510 * EVALUATE COORDINATE + COLOUR * 511 ******************************** 512 * 513 E5F9 CDF3E5 RCOCO CALL :E5F3 Get x-coord in HL 514 E5FC 5F MOV E,A Y-coord in E 515 E5FD 3E17 RCOL MVI A,:17 516 E5FF C343E7 JMP :E743 Get colour (0-23) in A 517 * 518 * 519 * 523 E602 END *************************** * S Y M B O L T A B L E * *************************** L0E99 E5C0 MPT36 E436 R2COC E5E0 RCOCO E5F9 RCOL E5FD RCOOR E5F3 RCURS E5B2 RDOT E5C1 RDRAW E5CE RDT10 E5C8 RDT20 E5C9 REN10 E585 REN15 E59D REN20 E5B0 RENV E570 RFILL E5D7 RLETI E45A RLETX E45A RLT10 E465 RLT20 E47F RLT25 E484 RLT30 E494 RLT50 E4A3 RLT60 E4A8 RLT70 E4B4 RLT80 E4B8 RLT90 E4B2 RMI10 E415 RMI20 E41D RMODE E5BB RNOISE E50C RRAND E40C RREST E401 RSOUND E4BC SND10 E4CE SND20 E4D6 SND70 E4FC SND80 E501 SNG10 E552 SNG20 E563 SNGEV E51F