PAGE 01 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.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.0 Rev.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 EC71 EB XCHG ) 109 EC72 CCCCDA CZ :DACC If to be waited 110 EC75 C4A9C8 CNZ :C8A9 Else: Run ML routine 111 EC78 C367CD JMP :CD67 Return: Handle next code 112 * 113 ************************* 114 * RUN basicfunction SGN * 115 ************************* 116 * 117 * Takes a FPT value and returns: 118 * +1 if value is positive. 119 * 0 if value is zero. 120 * -1 if value is negative. 121 * 122 EC7B CD8AEC RSGN CALL :EC8A Test if variable is zero 123 EC7E C8 RZ Then ready 124 EC7F 21F1D0 LXI H,:D0F1 Addr FPT(-1) 125 EC82 E7 RST 4 Copy -1 into MACC PAGE 03 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 126 EC83 0C DATA :0C 127 EC84 FA89EC JM :EC89 Ready if already negative 128 EC87 E7 RST 4 Else change sign MACC 129 EC88 1B DATA :1B (make MACC +1) 130 EC89 C9 L0E257 RET 131 * 132 *********************** 133 * TEST A FPT VARIABLE * 134 *********************** 135 * 136 * Entry: Variable in MACC. 137 * Exit: Z=1: Variable is zero. 138 * Z=0: Other flags set on exponent byte 139 * of variable. 140 * ABCDEHL preserved. 141 * 142 EC8A C5 FTEST PUSH B 143 EC8B D5 PUSH D 144 EC8C F5 PUSH PSW 145 EC8D E7 RST 4 Copy MACC to reg A,B,C,D 146 EC8E 15 DATA :15 147 EC8F 5F MOV E,A Exp byte in E 148 EC90 B0 ORA B ) 149 EC91 B1 ORA C ) Check if nr is zero 150 EC92 B2 ORA D ) 151 EC93 CA98EC JZ :EC98 Then quit 152 EC96 7B MOV A,E Get exp byte 153 EC97 B7 ORA A Set flags on it 154 EC98 D1 FTS10 POP D 155 EC99 7A MOV A,D 156 EC9A D1 POP D 157 EC9B C1 POP B 158 EC9C C9 RET 159 * 160 ************************** 161 * RUN basicfunction SCRN * 162 ************************** 163 * 164 EC9D CDF3E5 RSCRN CALL :E5F3 Eval given coord 165 ECA0 C5 PUSH B 166 ECA1 4F MOV C,A Y-coord in C 167 ECA2 EF RST 5 Ask colour of dot on screen 168 ECA3 27 DATA :27 + size graphics screen 169 ECA4 C1 POP B 170 ECA5 DA02E6 JC :E602 Evt run screen error 171 ECA8 C37CEB JMP :EB7C Contents screen loc in MACC 172 * 173 * 174 * ============== 175 *** LIST HANDLER *** 176 * ============== 177 * 178 * This module lists a program from the textbuffer 179 * onto the screen (or into other required direction) 180 * 181 *********************** 182 * LIST A PROGRAM LINE * 183 *********************** 184 * 185 * Entry: BC: Points to start of textline. 186 * Exit: BC: Points to start of next line. 187 * DEHL preserved, AF corrupted. PAGE 04 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 188 * 189 ECAB D5 SLINE PUSH D 190 ECAC E5 PUSH H 191 ECAD 03 INX B Pnts to line nr 192 ECAE CDAEEF CALL :EFAE List line nr 193 ECB1 3E08 MVI A,:08 194 ECB3 CD2ADB CALL :DB2A Cursor to tab 8 195 ECB6 CDCCEC L0E262 CALL :ECCC List statement 196 ECB9 0A LDAX B Get next byte 197 ECBA B7 ORA A 198 ECBB F2C5EC JP :ECC5 If no more statements 199 ECBE CDF5EF CALL :EFF5 Else: print ':' 200 ECC1 3A DATA :3A 201 ECC2 C3B6EC JMP :ECB6 List next statement 202 ECC5 CDF5EF L0E263 CALL :EFF5 print car.ret 203 ECC8 0D DATA :0D 204 ECC9 E1 POP H 205 ECCA D1 POP D 206 ECCB C9 RET 207 * 208 ******************** 209 * LIST A STATEMENT * 210 ******************** 211 * 212 * Based on the token in the textbuffer, a particular 213 * statement will be printed. 214 * At first, the Basiccommand will be printed. The 215 * pointers to the particular strings are in a table 216 * starting at CD8B. The base for the table is CC08; 217 * the offset is calculated by TOKEN *3. 218 * 219 * The databyte after the stringaddress pointer 220 * indicates which list-routine has to be used for 221 * the rest of the statement. This byte is a offset 222 * for table ECF8. 223 * 224 * Entry: BC: Points to token. 225 * Exit: BC: Points to next statement. 226 * AFDEHL corrupted. 227 * On stack: Returnaddress from this sub- 228 * routine. 229 * 230 ECCC 0A SCOM LDAX B Get token 231 ECCD 03 INX B Update pointer 232 ECCE 5F MOV E,A token in E 233 ECCF 1600 MVI D,:00 234 ECD1 2108CC LXI H,:CC08 Startaddr stringtable 235 ECD4 19 DAD D ) Add 3* token 236 ECD5 19 DAD D ) 237 ECD6 19 DAD D ) 238 ECD7 5E MOV E,M Get lobyte stringaddr 239 ECD8 23 INX H 240 ECD9 56 MOV D,M Get hibyte stringaddr 241 ECDA 23 INX H Point to data after addr 242 ECDB EB XCHG Stringaddr in HL 243 ECDC 7E MOV A,M Get length byte of string 244 ECDD B7 ORA A Length=0? 245 ECDE CD32DB CALL :DB32 List Basiccmd string 246 ECE1 1A LDAX D Get data byte after string- 247 address 248 ECE2 CAEAEC JZ :ECEA If length string =0 249 ECE5 FE00 CPI :00 PAGE 05 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 250 ECE7 C46BCE CNZ :CE6B Print space if byte after 251 stringaddr <>0 252 ECEA 1A SCM10 LDAX D Get data byte (= offset) 253 ECEB 87 ADD A Offset *2 254 ECEC 5F MOV E,A in E 255 ECED 1600 MVI D,:00 256 ECEF 21F8EC LXI H,:ECF8 Startaddr table Listroutines 257 ECF2 19 DAD D Add offset 258 ECF3 5E MOV E,M Get addr in DE 259 ECF4 23 INX H 260 ECF5 56 MOV D,M 261 ECF6 EB XCHG Addr routine in HL 262 ECF7 E9 PCHL Go to this adress 263 * 264 *********************************** 265 * POINTERS LIST HANDLING ROUTINES * 266 *********************************** 267 * 268 * Table with addresses of listroutines for the 269 * part of a statement after a token. 270 * 271 * Startaddress table is ECF8. The offset (given 272 * between brackets) is identical to the data 273 * byte after the addresses in the table on CD8B. 274 * 275 ECF8 3AED L0E355 DBL :ED3A (00) nothing more 276 ECFA 41ED DBL :ED41 (01) linenr 277 ECFC 3BED DBL :ED3B (02) linenr linenr 278 (not used) 279 ECFE 44ED DBL :ED44 (03) unquoted string 280 ED00 4DED DBL :ED4D (04) E (E=expr) 281 ED02 47ED DBL :ED47 (05) E,E 282 ED04 56ED DBL :ED56 (06) E E 283 ED06 62ED DBL :ED62 (07) E,E E 284 ED08 5CED DBL :ED5C (08) E,E E,E E 285 ED0A 50ED DBL :ED50 (09) E E E E 286 ED0C 6BED DBL :ED6B (0A) E 287 ED0E 7AED DBL :ED7A (0B) liner-linenr 288 ED10 84ED DBL :ED84 (0C) sound 289 ED12 9BED DBL :ED9B (0D) noise 290 ED14 A4ED DBL :EDA4 (0E) envelope 291 ED16 C1ED DBL :EDC1 (0F) mode 292 ED18 D9ED DBL :EDD9 (10) input 293 ED1A E0ED DBL :EDE0 (11) input/read/dim 294 ED1C F0ED DBL :EDF0 (12) (not used [*]) 295 ED1E FFED DBL :EDFF (13) let 296 ED20 09EE DBL :EE09 (14) if then 297 ED22 1AEE DBL :EE1A (15) if goto 298 ED24 25EE DBL :EE25 (16) if then 299 ED26 30EE DBL :EE30 (17) for to step 300 ED28 4FEE DBL :EE4F (18) next 301 ED2A 52EE DBL :EE52 (19) print 302 ED2C 66EE DBL :EE66 (1A) on goto 303 ED2E 71EE DBL :EE71 (1B) on gosub 304 ED30 87EE DBL :EE87 (1C) callm 305 ED32 94EE DBL :EE94 (1D) (not used [*]) 306 ED34 9ED8 DBL :D89E (1E) savea/loada 307 * 308 * The vectors marked with [*] are no pointers to 309 * LIST routines. 310 * 311 ED36 FF DATA :FF PAGE 06 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 312 ED37 FF DATA :FF 313 ED38 FF DATA :FF 314 ED39 FF DATA :FF 315 * 316 ******************************* 317 * LIST NO FURTHER EXPRESSIONS * 318 ******************************* 319 * 320 ED3A C9 SCN1 RET 321 * 322 *************************** 323 * LIST 1 OR 2 LINENUMBERS * 324 *************************** 325 * 326 * SCN2: List 1 line number. 327 * SCN3: List 2 line numbers, separated by space. 328 * (This last entry is not used). 329 * 330 * Exit: BC updated, DE preserved, AFHL corrupted. 331 * 332 ED3B CDAEEF SCN3 CALL :EFAE List linenr 333 ED3E CD6BCE CALL :CE6B Print space 334 ED41 C3AEEF SCN2 JMP :EFAE List linenr 335 * 336 ************************ 337 * LIST UNQUOTED STRING * 338 ************************ 339 * 340 ED44 C3EDEF SCN5 JMP :EFED List unquoted string 341 * 342 ********************** 343 * LIST , * 344 ********************** 345 * 346 * Exit: BC updated, DE preserved, AFHL corrupted. 347 * 348 ED47 CDA2EE SCN7 CALL :EEA2 List 349 ED4A CD70CE SCOEX CALL :CE70 Print ',' 350 ED4D C3A2EE SCN6 JMP :EEA2 List 351 * 352 ************************************ 353 * LIST * 354 ************************************ 355 * 356 * Exit: BC updated, DE preserved, AFHL corrupted. 357 * 358 ED50 CDFCEF SCN11 CALL :EFFC List ; print space 359 ED53 CDFCEF S3EXP CALL :EFFC Idem 360 ED56 CDFCEF SCN8 CALL :EFFC Idem 361 ED59 C3A2EE JMP :EEA2 List 362 * 363 ******************************************* 364 * LIST , , * 365 ******************************************* 366 * 367 * Exit: BC updated, DE preserved, AFHL corrupted. 368 * 369 ED5C CD47ED SCN10 CALL :ED47 List , 370 ED5F CD6BCE CALL :CE6B Print space 371 ED62 CD47ED SCN9 CALL :ED47 List , 372 ED65 CD6BCE SCSEX CALL :CE6B Print space 373 ED68 C3A2EE L0E343 JMP :EEA2 List PAGE 07 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 374 * 375 ******************************* 376 * LIST ,(,) * 377 ******************************* 378 * 379 ED6B CD47ED SCN12 CALL :ED47 List , 380 ED6E 0A S1210 LDAX B Get next byte 381 ED6F FEFF CPI :FF Terminator? 382 ED71 03 INX B 383 ED72 C8 RZ Then abort 384 ED73 0B DCX B 385 ED74 CD70CE CALL :CE70 Print ',' 386 ED77 C3A2EE JMP :EEA2 List 387 * 388 ************************** 389 * LIST - * 390 ************************** 391 * 392 * Exit: BC updated, DE preserved, AFHL corrupted. 393 * 394 ED7A CDAEEF SCN13 CALL :EFAE List linenr 395 ED7D CDF5EF CALL :EFF5 Print '-' 396 ED80 2D DATA :2D 397 ED81 C3AEEF JMP :EFAE List linenr 398 * 399 ********************************* 400 * LIST EXPRESSION AFTER 'SOUND' * 401 ********************************* 402 * 403 * Exit: BC updated, AFHL corrupted. 404 * DE: preserved if ON, corrupted if OFF. 405 * 406 ED84 0A SCN14 LDAX B Get byte 407 ED85 FEFF CPI :FF OFF sign? 408 ED87 C4FCEF CNZ :EFFC If not: List , print 409 space 410 ED8A 0A LDAX B Get next byte 411 ED8B FEFF CPI :FF OFF sign? 412 ED8D C250ED JNZ :ED50 If not: List 413 ; abort 414 ED90 CD78CE S1410 CALL :CE78 Else: print 'OFF' 415 ED93 97ED DBL :ED97 416 ED95 03 INX B 417 ED96 C9 RET 418 * 419 * DATA: 420 * 421 ED97 03 L0E354 DATA :03 422 ED98 4F DATA :4F O 423 ED99 46 DATA :46 F 424 ED9A 46 DATA :46 F 425 * 426 ********************************* 427 * LIST EXPRESSION AFTER 'NOISE' * 428 ********************************* 429 * 430 * Exit: BC updated, E preserved, AFDHL corrupted. 431 * 432 ED9B 0A SC14A LDAX B Get 1st byte NCB 433 ED9C FEFF CPI :FF OFF sign? 434 ED9E CA90ED JZ :ED90 Then print 'OFF', abort 435 EDA1 C356ED JMP :ED56 Else: List PAGE 08 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 436 * 437 ************************************ 438 * LIST EXPRESSION AFTER 'ENVELOPE' * 439 ************************************ 440 * 441 * Exit: BC updated, E preserved, AFDHL corrupted. 442 * 443 EDA4 CDFCEF SCN15 CALL :EFFC List , print 444 space 445 EDA7 0A LDAX B Get length of expr 446 EDA8 03 INX B 447 EDA9 57 MOV D,A into D 448 EDAA 15 S1510 DCR D 449 EDAB FAB8ED JM :EDB8 If ready 450 EDAE CD47ED CALL :ED47 List , 451 EDB1 CDF5EF CALL :EFF5 Print ';' 452 EDB4 3B DATA :3B 453 EDB5 C3AAED JMP :EDAA Next , 454 EDB8 0A S1520 LDAX B Get last byte of expr 455 EDB9 03 INX B 456 EDBA FEFF CPI :FF Terminator? 457 EDBC C8 RZ Then abort 458 EDBD 0B DCX B 459 EDBE C3A2EE JMP :EEA2 List 460 * 461 ******************************** 462 * LIST EXPRESSION AFTER 'MODE' * 463 ******************************** 464 * 465 EDC1 0A SCN16 LDAX B Get mode byte 466 EDC2 03 INX B 467 EDC3 1630 MVI D,:30 468 EDC5 B7 ORA A Mode 0 (FF) ? 469 EDC6 FAD4ED JM :EDD4 Then print '0' 470 EDC9 1F RAR CY=1 if A-mode 471 EDCA 3C RSA10 INR A 472 EDCB F5 PUSH PSW 473 EDCC 82 ADD D Convert to ASCII 474 EDCD CD60DD CALL :DD60 Print modenr 475 EDD0 F1 POP PSW 476 EDD1 3F CMC 477 EDD2 1641 MVI D,:41 Prepare print 'A' 478 EDD4 7A S1610 MOV A,D 479 EDD5 D460DD CNC :DD60 Print 'A' if A-mode 480 EDD8 C9 RET 481 * 482 ********************************************** 483 * LIST EXPRESSION AFTER 'INPUT'-'READ'-'DIM' * 484 ********************************************** 485 * 486 * Input with string: 487 488 EDD9 CDA2EE SCN17 CALL :EEA2 List string 489 EDDC CDF5EF CALL :EFF5 Print ';' 490 EDDF 3B DATA :3B 491 492 * Rest: 493 494 EDE0 0A SCN18 LDAX B Get nr of variables 495 EDE1 03 INX B 496 EDE2 57 MOV D,A into D 497 EDE3 D5 S1810 PUSH D PAGE 09 DAI FIRMWARE 0EC16-0EE08 V1.0 Rev.1 498 EDE4 CDFCEE CALL :EEFC List variable reference 499 EDE7 D1 POP D 500 EDE8 15 DCR D Decr nr of variables 501 EDE9 C8 RZ Abort if ready 502 EDEA CD70CE CALL :CE70 Print ',' 503 EDED C3E3ED JMP :EDE3 List next variable 504 * 505 **************************************** 506 * part of RUN 'DIM': CALC. REQD. SPACE * 507 **************************************** 508 * 509 EDF0 C28FDE RDM40 JNZ :DE8F If length element <= 254: 510 then HL=HL*A 511 EDF3 7C MOV A,H Else: 512 EDF4 B7 ORA A Set flags on hibyte 513 EDF5 65 MOV H,L 514 EDF6 2E00 MVI L,:00 515 EDF8 C8 RZ Abort if H=0 516 EDF9 37 STC Else: CY=1, L into H 517 EDFA C9 RET 518 * 519 ************************ 520 * RUBBISH - (not used) * 521 ************************ 522 * 523 EDFB CE L0E352 DATA :CE 524 EDFC C3 DATA :C3 525 EDFD F4 DATA :F4 526 EDFE ED DATA :ED 527 * 528 ******************************* 529 * LIST EXPRESSION AFTER 'LET' * 530 ******************************* 531 * 532 * Entry: BC: Points to assign statement. 533 * Exit: BC updated, AFDEHL corrupted. 534 * 535 EDFF CDFCEE SCN20 CALL :EEFC List lefthand variable 536 reference 537 EE02 CDF5EF CALL :EFF5 Print '=' 538 EE05 3D DATA :3D 539 EE06 C3A2EE JMP :EEA2 List righthand expr 540 * 541 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