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