PAGE 01 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 002 ORG :E1F6 003 * 004 * 005 * 006 ********************* 007 * ENCODE 'ENVELOPE' * 008 ********************* 009 * 010 * Encodes (,;) , or 011 * (,;) . 012 * 013 * Exit: HL points beyond expression in EBUF. 014 * AFBCDE corrupted. 015 * 016 E1F6 CD6DE3 EENV CALL :E36D Encode ENV nr 017 E1F9 E5 PUSH H Preserve EBUF pntr 018 E1FA CD18E0 CALL :E018 Update EBUF pointer 019 E1FD 1600 MVI D,:00 Init length 020 E1FF CD22E2 L3E33 CALL :E222 Encode 021 E202 CD59E8 CALL :E859 Next char ':' or 'CR' ? 022 E205 CA1EE2 JZ :E21E Then ready 023 E208 CD62E8 CALL :E862 Check if next char is ',' 024 run error if not 025 E20B CD22E2 CALL :E222 Encode 026 E20E CD67E8 CALL :E867 Check if next char is ';' 027 E211 3B DATA :3B 028 E212 14 INR D Length +1 029 E213 36FF MVI M,:FF FF into EBUF 030 E215 CD59E8 CALL :E859 Next char ':' or 'CR' ? 031 E218 C2FFE1 JNZ :E1FF Again if not 032 E21B CD18E0 CALL :E018 Update EBUF pointer 033 E21E E3 L3E34 XTHL 034 E21F 72 MOV M,D Length in EBUF after token 035 E220 E1 POP H 036 E221 C9 RET 037 * 038 * ENCODE A OR ELEMENT: 039 * 040 * Exit: DE preserved. 041 * 042 E222 D5 L3E35 PUSH D 043 E223 CD6DE3 CALL :E36D Encode INT expr 044 E226 D1 POP D 045 E227 C9 RET 046 * 047 **************************** 048 * ENCODE 'LIST' AND 'EDIT' * 049 **************************** 050 * 051 * Checks the expression after the token and updates 052 * the token on it. 053 * On exit, the token is: 054 * EDIT LIST 055 * Without linenr: B6 93 056 * One line: B7 94 057 * Part of program: B8 95 058 * 059 * Entry: HL : Points after token in EBUF. 060 * Exit: C, HL: Updated. 061 * D : Token. 062 * AF corrupted, BE preserved. 063 * PAGE 02 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 064 *ELIST 065 E228 2B EEDIT DCX H Pnts to token 066 E229 56 MOV D,M Token in D 067 E22A E5 PUSH H Preserve EBUF pntr 068 E22B 23 INX H 069 E22C CD59E8 CALL :E859 Next char ':' or 'CR' ? 070 E22F CA44E2 JZ :E244 Then ready 071 E232 CD48E2 CALL :E248 Read linenr into EBUF 072 E235 14 INR D Token +1 073 E236 CD59E8 CALL :E859 Next char ':' or 'CR' ? 074 E239 CA44E2 JZ :E244 Then ready 075 E23C CD67E8 CALL :E867 Next char '-' ? 076 E23F 2D DATA :2D 077 E240 CD48E2 CALL :E248 Read linenr into EBUF 078 E243 14 INR D Again token +1 079 E244 E3 L3E37 XTHL 080 E245 72 MOV M,D Token into EBUF 081 E246 E1 POP H 082 E247 C9 RET 083 * 084 * READ LINENUMBER INTO EBUF: 085 * 086 * Reads a linenumber from the input line into 087 * the EBUF. If no linenumber is given, 0000 is 088 * inserted. 089 * 090 * Entry: HL: Points to 1st free location in EBUF. 091 * C : Points to input line. 092 * Exit: C, HL: Updated. 093 * AF corrupted, BDE preserved. 094 * 095 E248 D5 L3E38 PUSH D 096 E249 CD31E7 CALL :E731 Read linenr into EBUF 097 E24C D1 POP D 098 E24D D8 RC Ready if nr given 099 E24E 3600 MVI M,:00 00 into EBUF 100 E250 CD18E0 CALL :E018 Update EBUF pointer 101 E253 3600 MVI M,:00 00 into EBUF 102 E255 CD18E0 CALL :E018 Update EBUF pointer 103 E258 C9 RET 104 * 105 ********************************************* 106 * ENCODE 'WAIT', 'WAIT TIME' AND 'WAIT MEM' * 107 ********************************************* 108 * 109 E259 115FE2 EWAIT LXI D,:E25F Addr table 110 E25C C39AE0 JMP :E09A Get addr encoding instr 111 and go to it 112 113 * Table: 114 115 E25F 04 L3E401 DATA :04 116 E260 54 DATA :54 T 117 E261 49 DATA :49 I 118 E262 4D DATA :4D M 119 E263 45 DATA :45 E 120 E264 85E2 DBL :E285 Addr encode 'TIME' 121 * 122 E266 03 DATA :03 123 E267 4D DATA :4D M 124 E268 45 DATA :45 E 125 E269 4D DATA :4D M PAGE 03 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 126 E26A 6FE2 DBL :E26F Addr encode 'MEM' 127 * 128 E26C 00 DATA :00 129 E26D 72E2 DBL :E272 Addr encode 'port' 130 131 * Encode 'MEM': 132 133 E26F 2B L3E40 DCX H 134 E270 34 INR M Token +1 (#91) 135 E271 23 INX H 136 E272 CD02E3 L3E412 CALL :E302 Encode , 137 E275 36FF MVI M,:FF FF into EBUF 138 E277 CD18E0 CALL :E018 Update EBUF pointer 139 E27A CDD2DD CALL :DDD2 Get char from line, neglect 140 tab + space 141 E27D FE2C CPI :2C ',' ? 142 E27F C0 RNZ Ready if not 143 E280 2B DCX H 144 E281 03 INX B 145 E282 C36DE3 JMP :E36D Encode INT expr 146 147 * Encode 'TIME': 148 149 E285 2B L3E41 DCX H 150 E286 34 INR M 151 E287 34 INR M Token +2 (#92) 152 E288 23 INX H 153 E289 C36DE3 JMP :E36D Encode INT expr 154 * 155 ******************************** 156 * ENCODE 'DRAW', 'FILL', 'DOT' * 157 ******************************** 158 * 159 *EFILL 160 E28C CD02E3 EDRAW CALL :E302 Encode , 161 162 * Entry for encode 'DOT': 163 164 E28F CD02E3 EDOT CALL :E302 Idem 165 E292 C314E3 JMP :E314 Encode INT expr 166 * 167 *********************************** 168 * ENCODE 'RUN' AND 'RUN ' * 169 *********************************** 170 * 171 E295 CD59E8 ERUN CALL :E859 Next char ':' or 'CR' ? 172 E298 C8 RZ Then ready 173 174 * If 'RUN ': 175 176 E299 2B DCX H 177 E29A 34 INR M Token +1 (#88) 178 E29B 23 INX H 179 E29C C32AE7 JMP :E72A Get linenr into EBUF 180 * 181 **************** 182 * ENCODE 'IMP' * 183 **************** 184 * 185 * Note: This command is not encoded, but has 186 * immediate effect. 187 * PAGE 04 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 188 E29F E5 EIMP PUSH H 189 E2A0 21F1E2 LXI H,:E2F1 Startaddr table var.types 190 E2A3 1E00 MVI E,:00 1 info byte 191 E2A5 CD34CA CALL :CA34 Find type in table 192 E2A8 7E MOV A,M Get IMP type from table 193 E2A9 B7 ORA A 194 E2AA FA0BDA JM :DA0B 'SYNTAX ERROR' if not found 195 E2AD F5 PUSH PSW Preserve IMP type 196 E2AE FE20 CPI :20 STR type ? 197 E2B0 CAB9E2 JZ :E2B9 Then jump 198 E2B3 CD59E8 CALL :E859 IMP INT/FPT alone ? 199 E2B6 CAD9E2 JZ :E2D9 Then ready 200 E2B9 CDE6E2 EIM10 CALL :E2E6 Get char from line; check if 201 upper case; INR C 202 E2BC F5 PUSH PSW Save char in IMP instruction 203 E2BD CD67E8 CALL :E867 Next char is '-' ? 204 E2C0 2D DATA :2D 205 E2C1 CDE6E2 CALL :E2E6 Get next char from line; 206 check if upper case; INR C 207 E2C4 213402 LXI H,:0234 Base addr IMP table 208 E2C7 54 MOV D,H ) into DE 209 E2C8 5D MOV E,L ) 210 E2C9 CD30DE CALL :DE30 Calc offset end addr in HL 211 E2CC 23 INX H +1 212 E2CD EB XCHG In DE 213 E2CE F1 POP PSW Get char 214 E2CF CD30DE CALL :DE30 Calc offset begin addr 215 E2D2 EB XCHG 216 E2D3 F1 POP PSW Get IMP type 217 E2D4 CD7CDE EIM20 CALL :DE7C Load given range with IMP 218 type 219 E2D7 E1 POP H Re-instate 'encoded' pntr 220 E2D8 C9 RET 221 222 * If no range given: 223 224 E2D9 F1 L3E47 POP PSW Get IMP type 225 E2DA 328F02 STA :028F Store default number type 226 E2DD 117502 LXI D,:0275 Startaddr impl. type table 227 E2E0 218F02 LXI H,:028F Addr after end table 228 E2E3 C3D4E2 JMP :E2D4 Fill A-Z with reqd type 229 230 * Get character from line and check if it is a 231 * upper case character: 232 233 E2E6 CDD2DD EALPHA CALL :DDD2 Get char from line, neglect 234 tab + space 235 E2E9 CD02DE CALL :DE02 Check if upper case char 236 E2EC D20BDA JNC :DA0B Run 'SYNTAX ERROR' if not 237 E2EF 0C INR C Update textline pntr 238 E2F0 C9 RET 239 * 240 * STRINGS VARIABLE TYPES TABLE: 241 * 242 * The first byte is a length byte. The byte 243 * after the string is the variable type byte. 244 * 245 E2F1 03 IMPTT DATA :03 246 E2F2 46 DATA :46 F 247 E2F3 50 DATA :50 P 248 E2F4 54 DATA :54 T 249 E2F5 00 DATA :00 type is #00 PAGE 05 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 250 * 251 E2F6 03 DATA :03 252 E2F7 49 DATA :49 I 253 E2F8 4E DATA :4E N 254 E2F9 54 DATA :54 T 255 E2FA 10 DATA :10 type is #10 256 * 257 E2FB 03 DATA :03 258 E2FC 53 DATA :53 S 259 E2FD 54 DATA :54 T 260 E2FE 52 DATA :52 R 261 E2FF 20 DATA :20 type is #20 262 * 263 E300 00 DATA :00 End of table 264 E301 80 DATA :80 265 * 266 ********************************** 267 * ENCODE 'POKE', 'OUT', 'CURSOR' * 268 ********************************** 269 * 270 * Also used by: Encode 'DRAW' and 'FILL'. 271 * 272 *EPOKE 273 *EOUT 274 *ECURS 275 E302 CD6DE3 ENC3 CALL :E36D Encode INT expr 276 E305 CD62E8 CALL :E862 Check if next char is ','; 277 run error if not 278 E308 C36DE3 JMP :E36D Encode INT expression 279 * 280 ***************************** 281 * ENCODE 'COLORG', 'COLORT' * 282 ***************************** 283 * 284 * Partly also used to encode 'CLEAR' and 'TALK'. 285 * 286 * Exit: C, HL: updated. 287 * AFDE preserved, B corrupted. 288 * 289 *ECOLT 290 E30B CD6DE3 ECOLG CALL :E36D Encode INT expr 291 E30E CD6DE3 CALL :E36D Idem 292 E311 CD6DE3 ENC6 CALL :E36D Idem 293 294 * Entry for encode CLEAR/TALK: 295 296 *ETALK 297 E314 C36DE3 ECLEAR JMP :E36D Idem 298 * 299 ************************************** 300 * ENCODE 'SOUND' WITH POSSIBLE 'OFF' * 301 ************************************** 302 * 303 * Encodes SOUND , or 304 * SOUND OFF or SOUND OFF. 305 * 306 * Exit: C, HL: Updated. 307 * A preserved, B corrupted, D=0, E=1. 308 * CY=1: Sound off. 309 * 310 E317 CD2CE3 ESOUND CALL :E32C Encode a possible 'OFF' 311 E31A D8 RC Ready if 'OFF' given PAGE 06 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 312 E31B CD6DE3 CALL :E36D Encode 313 E31E CD25E3 CALL :E325 Encode 'OFF' or 314 E321 D8 RC Ready if 'OFF' given 315 E322 C311E3 JMP :E311 Encode 316 * 317 ************************************** 318 * ENCODE 'NOISE' WITH POSSIBLE 'OFF' * 319 ************************************** 320 * 321 * Encodes NOISE or NOISE OFF. 322 * 323 * Exit: C, HL: Updated. 324 * CY=1 : Noise off. 325 * A preserved, B corrupted, D=0, E=1. 326 * 327 E325 CD2CE3 ENOISE CALL :E32C Encode possible 'OFF' 328 E328 D411E3 CNC :E311 Encode if no 329 'OFF' given 330 E32B C9 RET 331 * 332 *************************** 333 * ENCODE A POSSIBLE 'OFF' * 334 *************************** 335 * 336 * Exit: CY=1: 'OFF' in input; FF in EBUF. 337 * CY=0: No 'OFF' given. 338 * C, HL: Updated. 339 * AB preserved, D=0, E=1. 340 * 341 E32C 1132E3 L3E55 LXI D,:E332 Startaddr table 342 E32F C39AE0 JMP :E09A Get addr encoding instr 343 and go to it 344 345 * Table: 346 347 E332 03 L3E404 DATA :03 348 E333 4F DATA :4F O 349 E334 46 DATA :46 F 350 E335 46 DATA :46 F 351 E336 3BE3 DBL :E33B addr encode 'OFF' 352 * 353 E338 00 DATA :00 354 E339 42E3 DBL :E342 encoding addr if no 'OFF' 355 356 * Encode 'OFF': 357 358 E33B 36FF L3E365 MVI M,:FF FF into EBUF 359 E33D CD18E0 CALL :E018 Update EBUF pointer 360 E340 37 STC CY=1 361 E341 C9 RET 362 363 * If no 'OFF': 364 365 E342 B7 L3E366 ORA A CY=0 366 E343 C9 RET 367 * 368 ****************** 369 * ENCODE 'CALLM' * 370 ****************** 371 * 372 E344 CD6DE3 ECALM CALL :E36D Encode memory addr (INT) 373 E347 36FF MVI M,:FF FF into EBUF PAGE 07 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 374 E349 23 INX H 375 E34A CD59E8 CALL :E859 Next char ':' or 'CR' ? 376 E34D C8 RZ Then ready 377 E34E 2B DCX H 378 E34F CD62E8 CALL :E862 Check if next char is ','; 379 run error if not 380 E352 C3BCE5 JMP :E5BC Encode var.pntr 381 * 382 ************************* 383 * ENCODE 'SAVE', 'LOAD' * 384 ************************* 385 * 386 * Checks if a name is given after 'SAVE/LOAD', 387 * then encodes a string. Else #19,#00 (empty 388 * unquoted string) is added to code. 389 * 390 * Exit: C,HL updated, AFB corrupted, DE preserved. 391 * 392 *ELOAD 393 E355 CD59E8 ESAVE CALL :E859 Next char ':' or 'CR' ? 394 E358 C2A1E3 JNZ :E3A1 Encode string if not 395 E35B 3619 MVI M,:19 #19 in next loc EBUF 396 E35D CD18E0 CALL :E018 Update EBUF pointer 397 E360 3600 MVI M,:00 #00 in next loc EBUF 398 E362 CD18E0 CALL :E018 Update EBUF pointer 399 E365 C9 RET 400 * 401 ********************************** 402 * ENCODE 'REM' AND '***' (ERROR) * 403 ********************************** 404 * 405 *EERR 406 E366 C3B0E6 EREM JMP :E6B0 Encode text 407 * 408 ************************** 409 * ENCODE SINGLE ROUTINES * 410 ************************** 411 * 412 *EREST 413 *EEND 414 *ENEW 415 *ERET 416 *ECHECK 417 *ECONT 418 *ESTEP 419 *ETROF 420 *ESTOP 421 *ETRON 422 E369 C9 EUT RET No further handling 423 * 424 ************************** 425 * ENCODE 'GOTO', 'GOSUB' * 426 ************************** 427 * 428 *EGOTO 429 E36A C32AE7 EGOSUB JMP :E72A Get linenr 430 * 431 ************************************************ 432 * ENCODE AN EXPRESSION IF VARIABLE TYPE IS INT * 433 ************************************************ 434 * 435 E36D D5 L3E371 PUSH D PAGE 08 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 436 E36E 110001 LXI D,:0100 Set D=#01 (conversion) and 437 E=#00 (FPT var type) 438 E371 0610 MVI B,:10 Reqd type is INT 439 E373 C37CE3 JMP :E37C Encode expression 440 * 441 ************************************************ 442 * ENCODE AN EXPRESSION IF VARIABLE TYPE IS FPT * 443 ************************************************ 444 * 445 E376 D5 L3E372 PUSH D 446 E377 111002 LXI D,:0210 Set D for evt conversion 447 and E=#10 (INT var type) 448 E37A 0600 MVI B,:00 Reqd type is FPT 449 E37C F5 L3E373 PUSH PSW 450 E37D 78 MOV A,B 451 E37E 329002 STA :0290 Set reqd number type 452 E381 E5 PUSH H 453 E382 D5 PUSH D 454 E383 CDC9E3 CALL :E3C9 Encode expr 455 E386 D1 POP D 456 E387 3A3601 LDA :0136 Get type latest expression 457 E38A B8 CMP B Was it as reqd ? 458 E38B CA98E3 JZ :E398 Then ready 459 460 * Type not as expected: 461 462 E38E BB CMP E Was it alternative type 463 E38F C21ADA JNZ :DA1A Run error 'TYPE MISMATCH' 464 if not 465 E392 7A MOV A,D Get conversion byte in A 466 E393 D1 POP D 467 E394 D5 PUSH D 468 E395 CD70E7 CALL :E770 Add conversion byte to expr 469 E398 D1 L3E374 POP D 470 E399 F1 L3E375 POP PSW 471 E39A D1 POP D 472 E39B C9 RET 473 * 474 ******************************* 475 * ENCODE A BOOLEAN EXPRESSION * 476 ******************************* 477 * 478 * Variable type is #30. 479 * 480 E39C 0630 L3E376 MVI B,:30 Var type is #30 481 E39E C3A3E3 JMP :E3A3 Encode expression 482 * 483 ****************************** 484 * ENCODE A STRING EXPRESSION * 485 ****************************** 486 * 487 * Variable type is #20. 488 * 489 E3A1 0620 L3E377 MVI B,:20 Var type is #20 490 491 * Entry for 'encode Boolean expression': 492 493 E3A3 D5 L3E378 PUSH D 494 E3A4 F5 PUSH PSW 495 E3A5 CDC9E3 CALL :E3C9 Encode expr 496 E3A8 3A3601 LDA :0136 Get type latest expression 497 E3AB B8 CMP B Compare with reqd type PAGE 09 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 498 E3AC C21ADA JNZ :DA1A Run error 'TYPE MISMATCH' 499 if not identical 500 E3AF C399E3 JMP :E399 Quit 501 * 502 *********************************** 503 * ENCODE A NON-BOOLEAN EXPRESSION * 504 *********************************** 505 * 506 * Encodes an entire expression, preceeded by its 507 * type, into the EBUF. 'TYPE MISMATCH' error occurs 508 * if expression is boolean. 509 * 510 * Exit: C,HL updated; B preserved. 511 * A: Type. Type in TYPE. 512 * D: Orig. B OLDOP,RGTPT,HOPPT preserved. 513 * E: OLDOP. 514 * 515 E3B2 E5 EEXPI PUSH H 516 E3B3 CD18E0 CALL :E018 Update EBUF pointer 517 E3B6 AF XRA A 518 E3B7 329002 STA :0290 Req. number type is #00 519 E3BA CDC9E3 CALL :E3C9 Encode expr 520 E3BD 3A3601 LDA :0136 Get type latest expression 521 E3C0 FE30 CPI :30 Boolean ? 522 E3C2 CA1ADA JZ :DA1A Then run error 'TYPE 523 MISMATCH' 524 E3C5 E3 XTHL Get old EBUF pntr 525 E3C6 77 MOV M,A Type into EBUF 526 E3C7 E1 POP H New EBUF pntr 527 E3C8 C9 RET 528 * 529 ************************ 530 * ENCODE AN EXPRESSION * 531 ************************ 532 * 533 * Routine encodes an entire expression until no 534 * operator (or INOT) is found. The expression may 535 * begin with an unitary operator (highest priority). 536 * 537 * Exit: C,HL updated, B preserved. 538 * A,E: OLDOP; D: Entry B. 539 * OLDOP, RGTPT, HOPPT preserved. 540 * Type of expr in TYPE. 541 * RGTOP: #00 or #1E. 542 * 543 E3C9 EB L3E380 XCHG Save HL in DE 544 E3CA 60 MOV H,B Var type in H 545 E3CB 3A3801 LDA :0138 Get old priority operator 546 E3CE 6F MOV L,A in L 547 E3CF E5 PUSH H Save it on stack 548 E3D0 2A3901 LHLD :0139 Get pntr place for operator 549 E3D3 E5 PUSH H Save it on stack 550 E3D4 2A3B01 LHLD :013B Get pntr to RGT operand of 551 last operator 552 E3D7 E5 PUSH H Save it on stack 553 E3D8 EB XCHG 554 E3D9 AF XRA A 555 E3DA 323801 STA :0138 Reset old prio operator 556 E3DD CDF1E3 CALL :E3F1 Encode a term with possible 557 unitary operator 558 E3E0 EB XCHG 559 E3E1 E1 POP H PAGE 10 DAI FIRMWARE 3E1F6-3E3F0 V1.0 Rev.1 560 E3E2 223B01 SHLD :013B Restore RGTPT 561 E3E5 E1 POP H 562 E3E6 223901 SHLD :0139 Restore HOPPT 563 E3E9 E1 POP H 564 E3EA 44 MOV B,H Restore B 565 E3EB 7D MOV A,L 566 E3EC 323801 STA :0138 Restore OLDOP 567 E3EF EB XCHG 568 E3F0 C9 RET 569 * 570 * 571 * 594 E3F1 END *************************** * S Y M B O L T A B L E * *************************** EALPHA E2E6 ECALM E344 ECHECK E369 ECLEAR E314 ECOLG E30B ECOLT E30B ECONT E369 ECURS E302 EDOT E28F EDRAW E28C EEDIT E228 EEND E369 EENV E1F6 EERR E366 EEXPI E3B2 EFILL E28C EGOSUB E36A EGOTO E36A EIM10 E2B9 EIM20 E2D4 EIMP E29F ELIST E228 ELOAD E355 ENC3 E302 ENC6 E311 ENEW E369 ENOISE E325 EOUT E302 EPOKE E302 EREM E366 EREST E369 ERET E369 ERUN E295 ESAVE E355 ESOUND E317 ESTEP E369 ESTOP E369 ETALK E314 ETROF E369 ETRON E369 EUT E369 EWAIT E259 IMPTT E2F1 L3E33 E1FF L3E34 E21E L3E35 E222 L3E365 E33B L3E366 E342 L3E37 E244 L3E371 E36D L3E372 E376 L3E373 E37C L3E374 E398 L3E375 E399 L3E376 E39C L3E377 E3A1 L3E378 E3A3 L3E38 E248 L3E380 E3C9 L3E40 E26F L3E401 E25F L3E404 E332 L3E41 E285 L3E412 E272 L3E47 E2D9 L3E55 E32C