PAGE 01 DAI FIRMWARE 0EC16-0EE08 V1.1 002 ORG :EC16 003 * 004 * 005 * 006 ************************** 007 * RUN basicfunction PEEK * 008 ************************** 009 * 010 * Returns the contents of a memory location 011 * with an address given as INT argument. 012 * 013 EC16 CDF8E6 RPEEK CALL :E6F8 Get addr in HL 014 EC19 7E MOV A,M Get its contents 015 EC1A C37CEB JMP :EB7C Move it into MACC 016 * 017 ************************ 018 * RUN basicfunction PI * 019 ************************ 020 * 021 * Returns a value of 3.14159. 022 * 023 EC1D 21F5D0 RPI LXI H,:D0F5 Addr FPT (PI) 024 EC20 E7 RST 4 FPT (PI) into MACC 025 EC21 0C DATA :0C 026 EC22 C9 RET 027 * 028 ********************* 029 * DATA - (not used) * 030 ********************* 031 * 032 EC23 02 L0E252 DATA :02 FPT (PI) 033 EC24 C9 DATA :C9 034 EC25 0F DATA :0F 035 EC26 DB DATA :DB 036 * 037 ************************* 038 * RUN basicfunction RND * 039 ************************* 040 * 041 * Returns a random or pseudo-random number. 042 * If argument > 0: Returns a pseudo-random number 043 * in the range 0 <= R < argument. 044 * If argument = 0: Returns a hardware random number 045 * 0 < R < 1. 046 * If argument < 0: Number replaces the kernel for 047 * calculating further pseudo- 048 * random numbers. 049 * 050 EC27 CD8AEC RRND CALL :EC8A Test if arg is 0 051 EC2A CA0CE4 JZ :E40C Then hardware random 052 EC2D 212D01 LXI H,:012D Addr random number kernel 053 EC30 F235EC JP :EC35 If pseudo random number 054 EC33 E7 RST 4 Copy MACC to kernel 055 EC34 0F DATA :0F 056 EC35 EB XCHG 057 EC36 212901 LXI H,:0129 Addr scratch area WORKE 058 EC39 E7 RST 4 Copy MACC to WORKE 059 EC3A 0F DATA :0F 060 EC3B E5 PUSH H Saveaddr WORKE 061 EC3C EB XCHG 062 EC3D E5 PUSH H Save addr RNUM 063 EC3E 3601 MVI M,:01 Limit range 1-2 PAGE 02 DAI FIRMWARE 0EC16-0EE08 V1.1 064 EC40 E7 RST 4 Copy last nr from RNUM 065 EC41 0C DATA :0C into MACC 066 EC42 1605 MVI D,:05 067 EC44 21A8C6 RRD10 LXI H,:C6A8 Addr RNDA 068 EC47 E7 RST 4 Multiply RO*RNDA 069 EC48 54 DATA :54 070 EC49 21ACC6 LXI H,:C6AC Addr RNDB 071 EC4C E7 RST 4 Add RNDB to RO*RNDA 072 EC4D 4E DATA :4E 073 EC4E 00 NOP 074 EC4F 00 NOP 075 EC50 00 NOP 076 EC51 00 NOP 077 EC52 00 NOP 078 EC53 21FDD0 LXI H,:D0FD Addr AND mask 079 EC56 E7 RST 4 IAND: pick out mantissa 080 EC57 63 DATA :63 081 EC58 21B0C6 LXI H,:C6B0 Addr OR mask 082 EC5B E7 RST 4 IOR: set mantissa top 083 EC5C 66 DATA :66 bit, + range 1-2 084 EC5D 15 DCR D 085 EC5E C244EC JNZ :EC44 Again if D<>0 086 EC61 E1 POP H Get addr RNUM 087 EC62 E7 RST 4 Copy MACC to RNUM 088 EC63 0F DATA :0F 089 EC64 21F1D0 LXI H,:D0F1 Addr FPT (-1) 090 EC67 E7 RST 4 Add -1 to MACC (range 091 EC68 00 DATA :00 0-1) 092 EC69 E1 POP H Get addr WORKE 093 EC6A E7 RST 4 Frig range: multiply 094 EC6B 06 DATA :06 MACC*(WORKE) 095 EC6C C9 RET 096 * 097 *************************** 098 * part of RUN TALK (CD64) * 099 *************************** 100 * 101 * Entry: Z=1: Code = 0C (delay). 102 * Z=0: Code = 0D (ML call) 103 * 104 EC6D 5E MPT46 MOV E,M ) 105 EC6E 23 INX H ) Wait-time/ML address 106 EC6F 56 MOV D,M ) in HL 107 EC70 23 INX H ) 108 * 109 ******************** 110 * part of RUN TALK * 111 ******************** 112 * 113 * A bug is removed, caused by XCHG in #EC71. The 114 * return from #EC78 (JMP CD67) could not be executed 115 * correctly, because of a wrong address stored in 116 * the HL-registers. This problem existed only for 117 * the 'TALK'-codes #0C (wait) and #0D (ML call). 118 * 119 * Entry: DE: Wait time or address ML-routine. 120 * 121 EC71 CCCCDA CZ :DACC ] If to be waited 122 EC74 C462CD CNZ :CD62 ] Goto MLP address 123 EC77 C367CD JMP :CD67 Handle next code 124 EC7A FF DATA :FF 125 * PAGE 03 DAI FIRMWARE 0EC16-0EE08 V1.1 126 ************************* 127 * RUN basicfunction SGN * 128 ************************* 129 * 130 * Takes a FPT value and returns: 131 * +1 if value is positive. 132 * 0 if value is zero. 133 * -1 if value is negative. 134 * 135 EC7B CD8AEC RSGN CALL :EC8A Test if variable is zero 136 EC7E C8 RZ Then ready 137 EC7F 21F1D0 LXI H,:D0F1 Addr FPT(-1) 138 EC82 E7 RST 4 Copy -1 into MACC 139 EC83 0C DATA :0C 140 EC84 FA89EC JM :EC89 Ready if already negative 141 EC87 E7 RST 4 Else change sign MACC 142 EC88 1B DATA :1B (make MACC +1) 143 EC89 C9 L0E257 RET 144 * 145 *********************** 146 * TEST A FPT VARIABLE * 147 *********************** 148 * 149 * Entry: Variable in MACC. 150 * Exit: Z=1: Variable is zero. 151 * Z=0: Other flags set on exponent byte 152 * of variable. 153 * ABCDEHL preserved. 154 * 155 EC8A C5 FTEST PUSH B 156 EC8B D5 PUSH D 157 EC8C F5 PUSH PSW 158 EC8D E7 RST 4 Copy MACC to reg A,B,C,D 159 EC8E 15 DATA :15 160 EC8F 5F MOV E,A Exp byte in E 161 EC90 B0 ORA B ) 162 * 163 *********************** 164 * TEST A FPT VARIABLE * 165 *********************** 166 * 167 * The old routine tested all bytes of the FPT nr. 168 * Now only the exponent byte and the hibyte of the 169 * mantissa is tested. In this way, very small FPT 170 * numbers are considered to be zero. 171 * 172 EC91 CA98EC JZ :EC98 ] Abort if A and B are 0 173 EC94 7B MOV A,E ] Exp byte in A 174 EC95 F601 ORI :01 ] Clear CY-flag 175 EC97 00 NOP ] 176 EC98 D1 FTS10 POP D 177 EC99 7A MOV A,D 178 EC9A D1 POP D 179 EC9B C1 POP B 180 EC9C C9 RET 181 * 182 ************************** 183 * RUN basicfunction SCRN * 184 ************************** 185 * 186 EC9D CDF3E5 RSCRN CALL :E5F3 Eval given coord 187 ECA0 C5 PUSH B PAGE 04 DAI FIRMWARE 0EC16-0EE08 V1.1 188 ECA1 4F MOV C,A Y-coord in C 189 ECA2 EF RST 5 Ask colour of dot on screen 190 ECA3 27 DATA :27 + size graphics screen 191 ECA4 C1 POP B 192 ECA5 DA02E6 JC :E602 Evt run screen error 193 ECA8 C37CEB JMP :EB7C Contents screen loc in MACC 194 * 195 * 196 * ============== 197 *** LIST HANDLER *** 198 * ============== 199 * 200 * This module lists a program from the textbuffer 201 * onto the screen (or into other required direction) 202 * 203 *********************** 204 * LIST A PROGRAM LINE * 205 *********************** 206 * 207 * Entry: BC: Points to start of textline. 208 * Exit: BC: Points to start of next line. 209 * DEHL preserved, AF corrupted. 210 * 211 ECAB D5 SLINE PUSH D 212 ECAC E5 PUSH H 213 ECAD 03 INX B Pnts to line nr 214 ECAE CDAEEF CALL :EFAE List line nr 215 ECB1 3E08 MVI A,:08 216 ECB3 CD2ADB CALL :DB2A Cursor to tab 8 217 ECB6 CDCCEC L0E262 CALL :ECCC List statement 218 ECB9 0A LDAX B Get next byte 219 ECBA B7 ORA A 220 ECBB F2C5EC JP :ECC5 If no more statements 221 ECBE CDF5EF CALL :EFF5 Else: print ':' 222 ECC1 3A DATA :3A 223 ECC2 C3B6EC JMP :ECB6 List next statement 224 ECC5 CDF5EF L0E263 CALL :EFF5 print car.ret 225 ECC8 0D DATA :0D 226 ECC9 E1 POP H 227 ECCA D1 POP D 228 ECCB C9 RET 229 * 230 ******************** 231 * LIST A STATEMENT * 232 ******************** 233 * 234 * Based on the token in the textbuffer, a particular 235 * statement will be printed. 236 * At first, the Basiccommand will be printed. The 237 * pointers to the particular strings are in a table 238 * starting at CD8B. The base for the table is CC08; 239 * the offset is calculated by TOKEN *3. 240 * 241 * The databyte after the stringaddress pointer 242 * indicates which list-routine has to be used for 243 * the rest of the statement. This byte is a offset 244 * for table ECF8. 245 * 246 * Entry: BC: Points to token. 247 * Exit: BC: Points to next statement. 248 * AFDEHL corrupted. 249 * On stack: Returnaddress from this sub- PAGE 05 DAI FIRMWARE 0EC16-0EE08 V1.1 250 * routine. 251 * 252 ECCC 0A SCOM LDAX B Get token 253 ECCD 03 INX B Update pointer 254 ECCE 5F MOV E,A token in E 255 ECCF 1600 MVI D,:00 256 ECD1 2108CC LXI H,:CC08 Startaddr stringtable 257 ECD4 19 DAD D ) Add 3* token 258 ECD5 19 DAD D ) 259 ECD6 19 DAD D ) 260 ECD7 5E MOV E,M Get lobyte stringaddr 261 ECD8 23 INX H 262 ECD9 56 MOV D,M Get hibyte stringaddr 263 ECDA 23 INX H Point to data after addr 264 ECDB EB XCHG Stringaddr in HL 265 ECDC 7E MOV A,M Get length byte of string 266 ECDD B7 ORA A Length=0? 267 ECDE CD32DB CALL :DB32 List Basiccmd string 268 ECE1 1A LDAX D Get data byte after string- 269 address 270 ECE2 CAEAEC JZ :ECEA If length string =0 271 ECE5 FE00 CPI :00 272 ECE7 C46BCE CNZ :CE6B Print space if byte after 273 stringaddr <>0 274 ECEA 1A SCM10 LDAX D Get data byte (= offset) 275 ECEB 87 ADD A Offset *2 276 ECEC 5F MOV E,A in E 277 ECED 1600 MVI D,:00 278 ECEF 21F8EC LXI H,:ECF8 Startaddr table Listroutines 279 ECF2 19 DAD D Add offset 280 ECF3 5E MOV E,M Get addr in DE 281 ECF4 23 INX H 282 ECF5 56 MOV D,M 283 ECF6 EB XCHG Addr routine in HL 284 ECF7 E9 PCHL Go to this adress 285 * 286 *********************************** 287 * POINTERS LIST HANDLING ROUTINES * 288 *********************************** 289 * 290 * Table with addresses of listroutines for the 291 * part of a statement after a token. 292 * 293 * Startaddress table is ECF8. The offset (given 294 * between brackets) is identical to the data 295 * byte after the addresses in the table on CD8B. 296 * 297 ECF8 3AED L0E355 DBL :ED3A (00) nothing more 298 ECFA 41ED DBL :ED41 (01) linenr 299 ECFC 3BED DBL :ED3B (02) linenr linenr 300 (not used) 301 ECFE 44ED DBL :ED44 (03) unquoted string 302 ED00 4DED DBL :ED4D (04) E (E=expr) 303 ED02 47ED DBL :ED47 (05) E,E 304 ED04 56ED DBL :ED56 (06) E E 305 ED06 62ED DBL :ED62 (07) E,E E 306 ED08 5CED DBL :ED5C (08) E,E E,E E 307 ED0A 50ED DBL :ED50 (09) E E E E 308 ED0C 6BED DBL :ED6B (0A) E 309 ED0E 7AED DBL :ED7A (0B) liner-linenr 310 ED10 84ED DBL :ED84 (0C) sound 311 ED12 9BED DBL :ED9B (0D) noise PAGE 06 DAI FIRMWARE 0EC16-0EE08 V1.1 312 ED14 A4ED DBL :EDA4 (0E) envelope 313 ED16 C1ED DBL :EDC1 (0F) mode 314 ED18 D9ED DBL :EDD9 (10) input 315 ED1A E0ED DBL :EDE0 (11) input/read/dim 316 ED1C F0ED DBL :EDF0 (12) (not used [*]) 317 ED1E FFED DBL :EDFF (13) let 318 ED20 09EE DBL :EE09 (14) if then 319 ED22 1AEE DBL :EE1A (15) if goto 320 ED24 25EE DBL :EE25 (16) if then 321 ED26 30EE DBL :EE30 (17) for to step 322 ED28 4FEE DBL :EE4F (18) next 323 ED2A 52EE DBL :EE52 (19) print 324 ED2C 66EE DBL :EE66 (1A) on goto 325 ED2E 71EE DBL :EE71 (1B) on gosub 326 ED30 87EE DBL :EE87 (1C) callm 327 ED32 94EE DBL :EE94 (1D) (not used [*]) 328 ED34 9ED8 DBL :D89E (1E) savea/loada 329 * 330 * The vectors marked with [*] are no pointers to 331 * LIST routines. 332 * 333 ED36 FF DATA :FF 334 ED37 FF DATA :FF 335 ED38 FF DATA :FF 336 ED39 FF DATA :FF 337 * 338 ******************************* 339 * LIST NO FURTHER EXPRESSIONS * 340 ******************************* 341 * 342 ED3A C9 SCN1 RET 343 * 344 *************************** 345 * LIST 1 OR 2 LINENUMBERS * 346 *************************** 347 * 348 * SCN2: List 1 line number. 349 * SCN3: List 2 line numbers, separated by space. 350 * (This last entry is not used). 351 * 352 * Exit: BC updated, DE preserved, AFHL corrupted. 353 * 354 ED3B CDAEEF SCN3 CALL :EFAE List linenr 355 ED3E CD6BCE CALL :CE6B Print space 356 ED41 C3AEEF SCN2 JMP :EFAE List linenr 357 * 358 ************************ 359 * LIST UNQUOTED STRING * 360 ************************ 361 * 362 ED44 C3EDEF SCN5 JMP :EFED List unquoted string 363 * 364 ********************** 365 * LIST , * 366 ********************** 367 * 368 * Exit: BC updated, DE preserved, AFHL corrupted. 369 * 370 ED47 CDA2EE SCN7 CALL :EEA2 List 371 ED4A CD70CE SCOEX CALL :CE70 Print ',' 372 ED4D C3A2EE SCN6 JMP :EEA2 List 373 * PAGE 07 DAI FIRMWARE 0EC16-0EE08 V1.1 374 ************************************ 375 * LIST * 376 ************************************ 377 * 378 * Exit: BC updated, DE preserved, AFHL corrupted. 379 * 380 ED50 CDFCEF SCN11 CALL :EFFC List ; print space 381 ED53 CDFCEF S3EXP CALL :EFFC Idem 382 ED56 CDFCEF SCN8 CALL :EFFC Idem 383 ED59 C3A2EE JMP :EEA2 List 384 * 385 ******************************************* 386 * LIST , , * 387 ******************************************* 388 * 389 * Exit: BC updated, DE preserved, AFHL corrupted. 390 * 391 ED5C CD47ED SCN10 CALL :ED47 List , 392 ED5F CD6BCE CALL :CE6B Print space 393 ED62 CD47ED SCN9 CALL :ED47 List , 394 ED65 CD6BCE SCSEX CALL :CE6B Print space 395 ED68 C3A2EE L0E343 JMP :EEA2 List 396 * 397 ******************************* 398 * LIST ,(,) * 399 ******************************* 400 * 401 ED6B CD47ED SCN12 CALL :ED47 List , 402 ED6E 0A S1210 LDAX B Get next byte 403 ED6F FEFF CPI :FF Terminator? 404 ED71 03 INX B 405 ED72 C8 RZ Then abort 406 ED73 0B DCX B 407 ED74 CD70CE CALL :CE70 Print ',' 408 ED77 C3A2EE JMP :EEA2 List 409 * 410 ************************** 411 * LIST - * 412 ************************** 413 * 414 * Exit: BC updated, DE preserved, AFHL corrupted. 415 * 416 ED7A CDAEEF SCN13 CALL :EFAE List linenr 417 ED7D CDF5EF CALL :EFF5 Print '-' 418 ED80 2D DATA :2D 419 ED81 C3AEEF JMP :EFAE List linenr 420 * 421 ********************************* 422 * LIST EXPRESSION AFTER 'SOUND' * 423 ********************************* 424 * 425 * Exit: BC updated, AFHL corrupted. 426 * DE: preserved if ON, corrupted if OFF. 427 * 428 ED84 0A SCN14 LDAX B Get byte 429 ED85 FEFF CPI :FF OFF sign? 430 ED87 C4FCEF CNZ :EFFC If not: List , print 431 space 432 ED8A 0A LDAX B Get next byte 433 ED8B FEFF CPI :FF OFF sign? 434 ED8D C250ED JNZ :ED50 If not: List 435 ; abort PAGE 08 DAI FIRMWARE 0EC16-0EE08 V1.1 436 ED90 CD78CE S1410 CALL :CE78 Else: print 'OFF' 437 ED93 97ED DBL :ED97 438 ED95 03 INX B 439 ED96 C9 RET 440 * 441 * DATA: 442 * 443 ED97 03 L0E354 DATA :03 444 ED98 4F DATA :4F O 445 ED99 46 DATA :46 F 446 ED9A 46 DATA :46 F 447 * 448 ********************************* 449 * LIST EXPRESSION AFTER 'NOISE' * 450 ********************************* 451 * 452 * Exit: BC updated, E preserved, AFDHL corrupted. 453 * 454 ED9B 0A SC14A LDAX B Get 1st byte NCB 455 ED9C FEFF CPI :FF OFF sign? 456 ED9E CA90ED JZ :ED90 Then print 'OFF', abort 457 EDA1 C356ED JMP :ED56 Else: List 458 * 459 ************************************ 460 * LIST EXPRESSION AFTER 'ENVELOPE' * 461 ************************************ 462 * 463 * Exit: BC updated, E preserved, AFDHL corrupted. 464 * 465 EDA4 CDFCEF SCN15 CALL :EFFC List , print 466 space 467 EDA7 0A LDAX B Get length of expr 468 EDA8 03 INX B 469 EDA9 57 MOV D,A into D 470 EDAA 15 S1510 DCR D 471 EDAB FAB8ED JM :EDB8 If ready 472 EDAE CD47ED CALL :ED47 List , 473 EDB1 CDF5EF CALL :EFF5 Print ';' 474 EDB4 3B DATA :3B 475 EDB5 C3AAED JMP :EDAA Next , 476 EDB8 0A S1520 LDAX B Get last byte of expr 477 EDB9 03 INX B 478 EDBA FEFF CPI :FF Terminator? 479 EDBC C8 RZ Then abort 480 EDBD 0B DCX B 481 EDBE C3A2EE JMP :EEA2 List 482 * 483 ******************************** 484 * LIST EXPRESSION AFTER 'MODE' * 485 ******************************** 486 * 487 EDC1 0A SCN16 LDAX B Get mode byte 488 EDC2 03 INX B 489 EDC3 1630 MVI D,:30 490 EDC5 B7 ORA A Mode 0 (FF) ? 491 EDC6 FAD4ED JM :EDD4 Then print '0' 492 EDC9 1F RAR CY=1 if A-mode 493 EDCA 3C RSA10 INR A 494 EDCB F5 PUSH PSW 495 EDCC 82 ADD D Convert to ASCII 496 EDCD CD60DD CALL :DD60 Print modenr 497 EDD0 F1 POP PSW PAGE 09 DAI FIRMWARE 0EC16-0EE08 V1.1 498 EDD1 3F CMC 499 EDD2 1641 MVI D,:41 Prepare print 'A' 500 EDD4 7A S1610 MOV A,D 501 EDD5 D460DD CNC :DD60 Print 'A' if A-mode 502 EDD8 C9 RET 503 * 504 ********************************************** 505 * LIST EXPRESSION AFTER 'INPUT'-'READ'-'DIM' * 506 ********************************************** 507 * 508 * Input with string: 509 510 EDD9 CDA2EE SCN17 CALL :EEA2 List string 511 EDDC CDF5EF CALL :EFF5 Print ';' 512 EDDF 3B DATA :3B 513 514 * Rest: 515 516 EDE0 0A SCN18 LDAX B Get nr of variables 517 EDE1 03 INX B 518 EDE2 57 MOV D,A into D 519 EDE3 D5 S1810 PUSH D 520 EDE4 CDFCEE CALL :EEFC List variable reference 521 EDE7 D1 POP D 522 EDE8 15 DCR D Decr nr of variables 523 EDE9 C8 RZ Abort if ready 524 EDEA CD70CE CALL :CE70 Print ',' 525 EDED C3E3ED JMP :EDE3 List next variable 526 * 527 **************************************** 528 * part of RUN 'DIM': CALC. REQD. SPACE * 529 **************************************** 530 * 531 EDF0 C28FDE RDM40 JNZ :DE8F If length element <= 254: 532 then HL=HL*A 533 EDF3 7C MOV A,H Else: 534 EDF4 B7 ORA A Set flags on hibyte 535 EDF5 65 MOV H,L 536 EDF6 2E00 MVI L,:00 537 EDF8 C8 RZ Abort if H=0 538 EDF9 37 STC Else: CY=1, L into H 539 EDFA C9 RET 540 * 541 ************************ 542 * RUBBISH - (not used) * 543 ************************ 544 * 545 EDFB CE L0E352 DATA :CE 546 EDFC C3 DATA :C3 547 EDFD F4 DATA :F4 548 EDFE ED DATA :ED 549 * 550 ******************************* 551 * LIST EXPRESSION AFTER 'LET' * 552 ******************************* 553 * 554 * Entry: BC: Points to assign statement. 555 * Exit: BC updated, AFDEHL corrupted. 556 * 557 EDFF CDFCEE SCN20 CALL :EEFC List lefthand variable 558 reference 559 EE02 CDF5EF CALL :EFF5 Print '=' PAGE 10 DAI FIRMWARE 0EC16-0EE08 V1.1 560 EE05 3D DATA :3D 561 EE06 C3A2EE JMP :EEA2 List righthand expr 562 * 563 EE09 END *************************** * S Y M B O L T A B L E * *************************** FTEST EC8A FTS10 EC98 L0E252 EC23 L0E257 EC89 L0E262 ECB6 L0E263 ECC5 L0E343 ED68 L0E352 EDFB L0E354 ED97 L0E355 ECF8 MPT46 EC6D RDM40 EDF0 RPEEK EC16 RPI EC1D RRD10 EC44 RRND EC27 RSA10 EDCA RSCRN EC9D RSGN EC7B S1210 ED6E S1410 ED90 S1510 EDAA S1520 EDB8 S1610 EDD4 S1810 EDE3 S3EXP ED53 SC14A ED9B SCM10 ECEA SCN1 ED3A SCN10 ED5C SCN11 ED50 SCN12 ED6B SCN13 ED7A SCN14 ED84 SCN15 EDA4 SCN16 EDC1 SCN17 EDD9 SCN18 EDE0 SCN2 ED41 SCN20 EDFF SCN3 ED3B SCN5 ED44 SCN6 ED4D SCN7 ED47 SCN8 ED56 SCN9 ED62 SCOEX ED4A SCOM ECCC SCSEX ED65 SLINE ECAB