PAGE 01 DAI FIRMWARE 3E000-3E1F5 V1.1 002 ORG :E000 003 * 004 * 005 * 006 * =========================== 007 *** ENCODING / UTILITY PACKAGES *** 008 * =========================== 009 * 010 * Called by RST 1; DATA XX. XX indicates the 011 * offset of E000 for the different entrypoints. 012 * 013 * Contains also the key encoding routines and the 014 * Heap organisation routines. 015 * 016 *************** 017 * ENTRYPOINTS * 018 *************** 019 * 020 E000 C324E0 ELINE JMP :E024 Encode a BASIC line 021 E003 C32AE7 ELN JMP :E72A Encode a linenr 022 E006 C345E1 ETCON JMP :E145 Encode a constant 023 E009 C374EA USTART JMP :EA74 Start Utility package 024 E00C C390EF DBOOT JMP :EF90 Disc bootstrap 025 E00F C39CE9 MHREQ JMP :E99C Heap request 026 E012 C33FE9 MINKEY JMP :E93F Encode a key input 027 E015 C335E9 L3E394 JMP :E935 Get inputs from keyb 028 or DINC 029 * 030 * ================ 031 *** ENCODING PACKAGE *** 032 * ================ 033 * 034 * Generally in the encoding routines, HL points to 035 * the first free location in the EBUF. C points to 036 * the input text line. 037 * 038 *********************** 039 * UPDATE EBUF POINTER * 040 *********************** 041 * 042 * Increments the input pointer and checks if the 043 * encoded input buffer (EBUF) is full. 044 * 045 * Entry: HL: input pointer EBUF. 046 * Exit: HL: updated pointer. 047 * Other registers preserved. 048 * 049 E018 23 INXCH INX H Incr pointer 050 E019 F5 PUSH PSW 051 E01A 7D MOV A,L Get lobyte in A 052 E01B FEBE CPI :BE Max value reached? 053 E01D 3E1A MVI A,:1A Buffer full ? 054 E01F D2F5D9 JNC :D9F5 Then run error 'LINE TOO 055 COMPLEX' 056 E022 F1 POP PSW 057 E023 C9 RET 058 * 059 ************************** 060 * ENCODE A BASIC COMMAND * 061 ************************** 062 * 063 * Looks for a match between input on line and the PAGE 02 DAI FIRMWARE 3E000-3E1F5 V1.1 064 * BASIC command table #CBBF. Error exit 'COMMAND 065 * INVALID' if the 2 high order bits of the code in 066 * the table don't match the mask in D. Else the 067 * code (#80 + low order 6 bits from code in table) 068 * are stored in EBUF. 069 * 070 * Entry: HL: 1st free position in EBUF. 071 * D : Mask for direct command (#80) or 072 * program input (#40). 073 * C : Position on current line. 074 * Exit: HL: Updated. 075 * C : Points to 1st not used input in line. 076 * E : Code just stored. 077 * BD preserved, AF corrupted. 078 * Exit with jump to address found in table. 079 * #E04F is on stack as next returnaddress, 080 * entry DE is next on stack. 081 * 082 E024 D5 L3E2 PUSH D 083 E025 E5 PUSH H 084 E026 214FE0 LXI H,:E04F Returnaddr after finishing 085 encoding 086 E029 E3 XTHL Save it on stack 087 E02A E5 PUSH H Save HL again 088 E02B 1E02 MVI E,:02 Addit. offset for finding 089 instruction in table 090 E02D 21BFCB LXI H,:CBBF Startaddr table with strings 091 Basiccommands 092 E030 D5 PUSH D 093 E031 CD34CA CALL :CA34 Find instr in table 094 E034 D1 POP D Get mask for direct/program 095 E035 7E MOV A,M Get instr code from table 096 E036 E6C0 ANI :C0 ) Check if it 097 E038 A2 ANA D ) is a valid command 098 E039 3E18 MVI A,:18 If not: Run error 099 E03B CAF5D9 JZ :D9F5 'COMMAND INVALID' 100 E03E 7E MOV A,M Get instr code from table 101 E03F 23 INX H 102 E040 E63F ANI :3F ) Make it a token 103 E042 F680 ORI :80 ) 104 E044 5F MOV E,A Store token in E 105 E045 7E MOV A,M ) 106 E046 23 INX H ) Get addr of encoding 107 E047 66 MOV H,M ) instruction in HL 108 E048 6F MOV L,A ) 109 E049 E3 XTHL and save it on stack 110 E04A 73 MOV M,E Store token in EBUF 111 E04B CD18E0 CALL :E018 Update EBUF pointer 112 E04E C9 RET Go to encoding instruction 113 return afterwards to E04F 114 * 115 * End of encoding of an input line (after running 116 * the command specific processing). 117 * Checks if character after BASIC command is CR or 118 * ';'. 119 * 120 * Entry: C : points to position on current line. 121 * On stack: Original DE. 122 * 123 E04F D1 L3E3 POP D Get type of command in D 124 E050 CDD2DD CALL :DDD2 Get char from line, neglect 125 tab + space PAGE 03 DAI FIRMWARE 3E000-3E1F5 V1.1 126 E053 0C INR C Pntr to next char 127 E054 FE3A CPI :3A ':' ? 128 E056 CA24E0 JZ :E024 Then encode next instr 129 E059 FE0D CPI :0D 'CR' ? 130 E05B C20BDA JNZ :DA0B Run 'SYNTAX ERROR' if not 131 E05E C9 RET 132 * 133 ****************************** 134 * ENCODE 'FOR - TO - (STEP)' * 135 ****************************** 136 * 137 * Valid for all specific encoding routines: 138 * HL points to 1st free EBUF location. 139 * 140 E05F CDFEE0 EFOR CALL :E0FE Encode 'LET' 141 E062 FE20 CPI :20 String type ? 142 E064 CA1ADA JZ :DA1A Then run error 'TYPE 143 MISMATCH' 144 E067 FE10 CPI :10 INT type ? 145 E069 1188E0 LXI D,:E088 Addr 'TO' table 146 E06C C39AE0 JMP :E09A Get addr encoding instr and 147 go to it 148 149 * Encode 'TO': 150 151 E06F CC6DE3 L3E5 CZ :E36D Encode a INT expr 152 E072 C476E3 CNZ :E376 Encode a FPT expr 153 E075 1190E0 LXI D,:E090 Addr 'STEP' table 154 E078 C39AE0 JMP :E09A Get addr encoding instr and 155 go to it 156 157 * Encode 'STEP': 158 159 E07B CC6DE3 L3E6 CZ :E36D Encode a INT expr 160 E07E C476E3 CNZ :E376 Encode a FPT expr 161 E081 C9 RET 162 163 * End encoding: 164 165 E082 36FF L3E363 MVI M,:FF FF in EBUF as separator 166 E084 CD18E0 CALL :E018 Update EBUF pointer 167 E087 C9 RET 168 169 * Table: 170 171 E088 02 L3E395 DATA :02 172 E089 54 DATA :54 T 173 E08A 4F DATA :4F O 174 E08B 6FE0 DBL :E06F Addr encode 'TO' 175 * 176 E08D 00 DATA :00 'TO' not found: 177 E08E 0BDA DBL :DA0B Run 'SYNTAX ERROR' 178 * 179 E090 04 L3E396 DATA :04 180 E091 53 DATA :53 S 181 E092 54 DATA :54 T 182 E093 45 DATA :45 E 183 E094 50 DATA :50 P 184 E095 7BE0 DBL :E07B Addr encode 'STEP' 185 * 186 E097 00 DATA :00 'STEP' not found: 187 E098 82E0 DBL :E082 End command PAGE 04 DAI FIRMWARE 3E000-3E1F5 V1.1 188 * 189 ************************************************* 190 * GET ADDRESS ENCODING INSTRUCTION AND GO TO IT * 191 ************************************************* 192 * 193 * Entry: DE : Points to table of format: 194 * < length name / name / jumpaddr > or 195 * < 00 / jumpaddr >. 196 * C : Points to input. 197 * Exit: C : Updated. 198 * AFBHL preserved. D=0, E=1. 199 * 200 E09A E5 L3E7 PUSH H 201 E09B F5 PUSH PSW 202 E09C EB XCHG Addr table in HL 203 E09D 1E01 MVI E,:01 204 E09F CD34CA CALL :CA34 Find instruction in table. 205 On exit, HL points to addr 206 of encoding routine 207 E0A2 7E MOV A,M ) 208 E0A3 23 INX H ) Get addr encoding instr 209 E0A4 66 MOV H,M ) in HL 210 E0A5 6F MOV L,A ) 211 E0A6 F1 POP PSW 212 E0A7 E3 XTHL Addr encoding instr on stack 213 E0A8 C9 RET Go to it 214 * 215 *************************************** 216 * ENCODE 'NEXT' AND 'NEXT ' * 217 *************************************** 218 * 219 E0A9 CD59E8 ENEXT CALL :E859 Next char ':' or 'CR' ? 220 E0AC C8 RZ Then ready 221 222 * If NEXT : 223 224 E0AD 2B DCX H 225 E0AE 34 INR M Token +1 (#AC) 226 E0AF 23 INX H 227 E0B0 CDBCE5 CALL :E5BC Encode variable or array ref 228 E0B3 3A3601 LDA :0136 Get type latest expression 229 E0B6 FE20 CPI :20 String type ? 230 E0B8 CA1ADA JZ :DA1A Then run error 'TYPE 231 MISMATCH' 232 E0BB C9 RET 233 * 234 ************************************** 235 * ENCODE 'IF - THEN' AND 'IF - GOTO' * 236 ************************************** 237 * 238 E0BC E5 EIF PUSH H 239 E0BD D5 PUSH D 240 E0BE CD9CE3 CALL :E39C Encode boolean expr (type 241 #30) 242 E0C1 11EDE0 LXI D,:E0ED Addr 'THEN' table 243 E0C4 C39AE0 JMP :E09A Get addr encoding instr 244 and go to it 245 246 * Encode 'THEN': 247 248 E0C7 CD31E7 L3E10 CALL :E731 Read a linenr into EBUF 249 E0CA D1 POP D PAGE 05 DAI FIRMWARE 3E000-3E1F5 V1.1 250 E0CB D2D4E0 JNC :E0D4 Jump if no linenr given 251 252 * If linenr: 253 254 E0CE E3 XTHL 255 E0CF 2B DCX H 256 E0D0 34 INR M 257 E0D1 34 INR M Token +2 (#A8) 258 E0D2 E1 POP H 259 E0D3 C9 RET 260 261 * If statement: 262 263 E0D4 F1 L3E11 POP PSW 264 E0D5 E5 PUSH H Preserve EBUF pntr 265 E0D6 CD18E0 CALL :E018 Update EBUF pointer 266 E0D9 CD24E0 CALL :E024 Encode BASIC command 267 E0DC 7D MOV A,L Lobyte new EBUF pntr in A 268 E0DD E3 XTHL Old EBUF pntr in HL 269 E0DE 95 SUB L 270 E0DF 3D DCR A 271 E0E0 77 MOV M,A Length string in EBUF entry 272 E0E1 E1 POP H 273 E0E2 0D DCR C 274 E0E3 C9 RET 275 276 * Encode 'GOTO': 277 278 E0E4 F1 L3E12 POP PSW 279 E0E5 E3 XTHL 280 E0E6 2B DCX H 281 E0E7 34 INR M Token +1 (#A7) 282 E0E8 E1 POP H 283 E0E9 CD2AE7 CALL :E72A Get linenr 284 E0EC C9 RET 285 286 * Table: 287 288 E0ED 04 L3E397 DATA :04 289 E0EE 54 DATA :54 T 290 E0EF 48 DATA :48 H 291 E0F0 45 DATA :45 E 292 E0F1 4E DATA :4E N 293 E0F2 C7E0 DBL :E0C7 Addr encode 'THEN' 294 * 295 E0F4 04 DATA :04 296 E0F5 47 DATA :47 G 297 E0F6 4F DATA :4F O 298 E0F7 54 DATA :54 T 299 E0F8 4F DATA :4F O 300 E0F9 E4E0 DBL :E0E4 Addr encode 'GOTO' 301 * 302 E0FB 00 DATA :00 If no 'THEN' or 'GOTO' found 303 E0FC 0BDA DBL :DA0B Run 'SYNTAX ERROR' 304 * 305 **************** 306 * ENCODE 'LET' * 307 **************** 308 * 309 * Encodes a variable or array with arguments. Then 310 * finds '=' in input (error if not). Then encodes 311 * an expression, depending on variable type (error PAGE 06 DAI FIRMWARE 3E000-3E1F5 V1.1 312 * if type non-existing). 313 * 314 * Exit: DE: Offset of left-side variable. 315 * A and B: Left-side type. 316 * C, HL updated. F corrupted. 317 * 318 E0FE CDBCE5 ELET CALL :E5BC Encode var or array ref 319 E101 CD67E8 CALL :E867 Check next char is '=' 320 E104 3D DATA :3D 321 E105 3A3601 LDA :0136 Get type latest expression 322 E108 FE00 CPI :00 FPT ? 323 E10A CA76E3 JZ :E376 Then encode FPT expr 324 E10D FE10 CPI :10 INT ? 325 E10F CA6DE3 JZ :E36D Then encode INT expr 326 E112 C3A1E3 JMP :E3A1 Else encode STR expr 327 * 328 *************************************** 329 * ENCODE 'INPUT' AND 'INPUT ' * 330 *************************************** 331 * 332 E115 CDD2DD EINPUT CALL :DDD2 Get char from line, neglect 333 tab + space 334 E118 FE22 CPI :22 '"' ? 335 E11A C227E1 JNZ :E127 Encode 'READ' if no string 336 in INPUT statement 337 338 * If 'INPUT ': 339 340 E11D 2B DCX H 341 E11E 34 INR M Token +1 (#A1) 342 E11F 23 INX H 343 E120 CDA1E3 CALL :E3A1 Encode STR expr 344 E123 CD67E8 CALL :E867 Check if next char is ';' 345 E126 3B DATA :3B 346 Into EREAD 347 * 348 ***************** 349 * ENCODE 'READ' * 350 ***************** 351 * 352 * From L3E16 used by several routines, with another 353 * address in LXI D, ...., pointing to various kinds 354 * of encoding/get routines. 355 * 356 E127 11BCE5 EREAD LXI D,:E5BC Addr routine encode variable 357 or array reference 358 * 359 E12A E5 L3E16 PUSH H 360 E12B 3600 MVI M,:00 00 into EBUF (count) 361 E12D CD18E0 CALL :E018 Update EBUF pointer 362 E130 D5 L3E17 PUSH D 363 E131 CD64E1 CALL :E164 Go to encoding routine 364 365 * Return here after encoding: 366 367 E134 D1 POP D 368 E135 E3 XTHL 369 E136 34 INR M Count in EBUF +1 370 E137 E3 XTHL 371 E138 CDD2DD CALL :DDD2 Get char from line, neglect 372 tab + space 373 E13B 0C INR C Points to next char on line PAGE 07 DAI FIRMWARE 3E000-3E1F5 V1.1 374 E13C FE2C CPI :2C ',' ? 375 E13E CA30E1 JZ :E130 Again if more items 376 E141 0D DCR C Correct line pointer 377 E142 33 INX SP 378 E143 33 INX SP SP to returnaddr 379 E144 C9 RET 380 * 381 ************************************** 382 * ENCODE A NUMBER OR STRING CONSTANT * 383 ************************************** 384 * 385 * Entry: A: Type. 386 * 387 E145 F5 L3E18 PUSH PSW Preserve type 388 E146 B7 ORA A 389 E147 CA5EE1 JZ :E15E Jump if FPT type 390 E14A FE10 CPI :10 391 E14C CA88E8 JZ :E888 Jump if INT type 392 393 * If STR type: 394 395 E14F CDD2DD CALL :DDD2 Get char from line, neglect 396 tab + space 397 E152 FE22 CPI :22 '"' (quoted string) ? 398 E154 F5 PUSH PSW 399 E155 CC80E8 CZ :E880 Then store quoted string 400 in EBUF 401 E158 F1 POP PSW 402 E159 C4A6E6 CNZ :E6A6 Else store unquoted string 403 in EBUF 404 E15C F1 L3E19 POP PSW 405 E15D C9 RET 406 407 * If FPT type: 408 409 E15E CD01E5 L3E20 CALL :E501 Encode FPT nr into EBUF 410 E161 C393E8 JMP :E893 Quit with evt 'SYNTAX ERROR' 411 * 412 ************************* 413 * part of EREAD (3E12A) * 414 ************************* 415 * 416 E164 D5 L3E21 PUSH D Addr encoding routine on 417 stack 418 E165 C9 RET Go to it 419 * 420 **************** 421 * ENCODE 'DIM' * 422 **************** 423 * 424 E166 116CE1 EDIM LXI D,:E16C Addr routine 'encoding array 425 reference' 426 E169 C32AE1 JMP :E12A Continu encoding 427 * 428 ***************************** 429 * ENCODE AN ARRAY REFERENCE * 430 ***************************** 431 * 432 E16C CDBCE5 L3E23 CALL :E5BC Encode var or array ref 433 E16F 78 MOV A,B Type in A 434 E170 E640 ANI :40 Array type ? 435 E172 CA29DA JZ :DA29 Run 'SUBSCRIPT ERROR' if not PAGE 08 DAI FIRMWARE 3E000-3E1F5 V1.1 436 E175 C9 RET 437 * 438 *************************************** 439 * ENCODE 'ON - GOTO' AND 'ON - GOSUB' * 440 *************************************** 441 * 442 E176 E5 EON PUSH H 443 E177 CD6DE3 CALL :E36D Encode INT expr 444 E17A 118DE1 LXI D,:E18D Addr table 445 E17D C39AE0 JMP :E09A Get addr encoding instr 446 and go to it 447 448 * Encode linenr in GOSUB (L3E25) and GOTO (L3E411): 449 450 E180 E3 L3E25 XTHL 451 E181 2B DCX H 452 E182 34 INR M Token +1 (#AF) 453 E183 23 INX H 454 E184 E3 XTHL 455 E185 E3 L3E411 XTHL 456 E186 E1 POP H 457 E187 112AE7 LXI D,:E72A Addr routine 'get linenr' 458 E18A C32AE1 JMP :E12A Continu encoding 459 460 * Table: 461 462 E18D 04 L3E399 DATA :04 463 E18E 47 DATA :47 G 464 E18F 4F DATA :4F O 465 E190 54 DATA :54 T 466 E191 4F DATA :4F O 467 E192 85E1 DBL :E185 Addr encode 'GOTO' 468 * 469 E194 05 DATA :05 470 E195 47 DATA :47 G 471 E196 4F DATA :4F O 472 E197 53 DATA :53 S 473 E198 55 DATA :55 U 474 E199 42 DATA :42 B 475 E19A 80E1 DBL :E180 Addr encode 'GOSUB' 476 * 477 E19C 00 DATA :00 If no GOTO or GOSUB found: 478 E19D 0BDA DBL :DA0B Run 'SYNTAX ERROR' 479 * 480 ****************** 481 * ENCODE 'PRINT' * 482 ****************** 483 * 484 E19F E5 EPRINT PUSH H 485 E1A0 3600 MVI M,:00 00 into EBUF (init length) 486 E1A2 CD59E8 CALL :E859 Next char ':' or 'CR' ? 487 E1A5 CACBE1 JZ :E1CB Then ready 488 489 * If statement after PRINT: 490 491 E1A8 CD18E0 L3E27 CALL :E018 Update EBUF pointer 492 E1AB E3 XTHL 493 E1AC 34 INR M Length +1 494 E1AD E3 XTHL 495 E1AE CDB2E3 CALL :E3B2 Encode non-boolean expr 496 preceeded by its type 497 E1B1 36FF MVI M,:FF FF into EBUF PAGE 09 DAI FIRMWARE 3E000-3E1F5 V1.1 498 E1B3 CD59E8 CALL :E859 Next char ':' or 'CR' ? 499 E1B6 CACBE1 JZ :E1CB Then ready 500 501 * If more statements: 502 503 E1B9 77 MOV M,A Char into EBUF 504 E1BA FE2C CPI :2C ',' ? 505 E1BC CAC4E1 JZ :E1C4 Then continu 506 E1BF FE3B CPI :3B ';' ? 507 E1C1 C20BDA JNZ :DA0B Run 'SYNTAX ERROR' if not 508 E1C4 0C L3E28 INR C Update line pntr 509 E1C5 CD59E8 CALL :E859 Next char ':' or 'CR' ? 510 E1C8 C2A8E1 JNZ :E1A8 Continu if not 511 * 512 E1CB E3 L3E29 XTHL 513 E1CC E1 POP H 514 E1CD CD18E0 CALL :E018 Update EBUF pointer 515 E1D0 C9 RET 516 * 517 ***************** 518 * ENCODE 'MODE' * 519 ***************** 520 * 521 E1D1 16FF EMODE MVI D,:FF Default mode 0 522 E1D3 CDD2DD CALL :DDD2 Get char from line, neglect 523 tab + space 524 E1D6 0C INR C Points to next char 525 E1D7 D630 SUI :30 526 E1D9 CAF1E1 JZ :E1F1 If char is '0': FF in EBUF 527 E1DC DA0BDA JC :DA0B Run 'SYNTAX ERROR' if not 528 number or printable char 529 E1DF FE07 CPI :07 Between 0 and 7? 530 E1E1 D215DA JNC :DA15 Run error 'NUMBER OUT OF 531 RANGE' if not 532 E1E4 3D DCR A ) 533 E1E5 87 ADD A ) Calc code for mode 534 E1E6 57 MOV D,A in D 535 E1E7 CDE0DD CALL :DDE0 Get next char from line 536 E1EA FE41 CPI :41 'A' ? 537 E1EC C2F1E1 JNZ :E1F1 Jump if not 538 E1EF 0C INR C Points to next char 539 E1F0 14 INR D Set D for A-mode 540 E1F1 72 L3E31 MOV M,D Mode code in EBUF 541 E1F2 CD18E0 CALL :E018 Update EBUF pointer 542 E1F5 C9 RET 543 * 544 * 545 * 546 E1F6 END *************************** * S Y M B O L T A B L E * *************************** DBOOT E00C EDIM E166 EFOR E05F EIF E0BC EINPUT E115 ELET E0FE ELINE E000 ELN E003 EMODE E1D1 ENEXT E0A9 EON E176 EPRINT E19F EREAD E127 ETCON E006 INXCH E018 L3E10 E0C7 L3E11 E0D4 L3E12 E0E4 L3E16 E12A L3E17 E130 L3E18 E145 L3E19 E15C L3E2 E024 L3E20 E15E L3E21 E164 L3E23 E16C L3E25 E180 L3E27 E1A8 L3E28 E1C4 L3E29 E1CB L3E3 E04F L3E31 E1F1 PAGE 10 DAI FIRMWARE 3E000-3E1F5 V1.1 L3E363 E082 L3E394 E015 L3E395 E088 L3E396 E090 L3E397 E0ED L3E399 E18D L3E411 E185 L3E5 E06F L3E6 E07B L3E7 E09A MHREQ E00F MINKEY E012 USTART E009