PAGE 01 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 002 ORG :E602 003 * 004 * 005 * 006 ******************** 007 * RUN SCREEN ERROR * 008 ******************** 009 * 010 * Entry: A: Error code: 01: Off screen. 011 * 02: Colour not available. 012 E602 FE01 SCRER CPI :01 Code is 1? 013 E604 3E11 MVI A,:11 014 E606 CAF5D9 JZ :D9F5 Then run error 'OFF SCREEN' 015 E609 3E10 MVI A,:10 Else: run error 016 E60B C3F5D9 JMP :D9F5 'COLOUR NOT AVAILABLE' 017 * 018 *********************** 019 * RUN basiccmd COLORT * 020 *********************** 021 * 022 E60E CD1CE6 RCOLT CALL :E61C Get colours in scratch area 023 E611 EF RST 5 Set text colours 024 E612 06 DATA :06 025 E613 B7 ORA A No special action 026 E614 C9 RET 027 * 028 *********************** 029 * RUN basiccmd COLORG * 030 *********************** 031 * 032 E615 CD1CE6 RCOLG CALL :E61C Get colours in scratch area 033 E618 EF RST 5 Set graphic colours 034 E619 1B DATA :1B 035 E61A B7 ORA A No special action 036 E61B C9 RET 037 * 038 *********************************** 039 * GET 4 COLOURS INTO SCRATCH AREA * 040 *********************************** 041 * 042 * Colour data from a program line are stored in 043 * scratch area SCOLT/SCOLG (#0119-011C). 044 * 045 * Exit: HL: Points to start scratch area. 046 * 047 E61C 211901 R4COL LXI H,:0119 Startaddr SCOLT/SCOLG area 048 E61F E5 PUSH H 049 E620 3E0F R4C10 MVI A,:0F 050 E622 CD43E7 CALL :E743 Get one colour (0-15) 051 E625 77 MOV M,A Store it in scratch area 052 E626 23 INX H 053 E627 7D MOV A,L 054 E628 FE1D CPI :1D 4 colours done? 055 E62A C220E6 JNZ :E620 Next if not 056 E62D E1 POP H 057 E62E C9 RET 058 * 059 ******************** 060 * RUN basiccmd DIM * 061 ******************** 062 * 063 * Entry: BC: points to program line. PAGE 02 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 064 * 065 E62F 0A RDIM LDAX B Get nr of items 066 E630 03 INX B 067 E631 B7 RDM05 ORA A 068 E632 C8 RZ Abort if no items or ready 069 E633 3D DCR A Item count 070 E634 F5 PUSH PSW Preserve count 071 E635 CD5AE9 CALL :E95A Get pnr to array in HL; 072 type in A 073 E638 E5 PUSH H Preserve pntr 074 E639 CD5CCE CALL :CE5C Erase array if existing 075 E63C E630 ANI :30 Get type only 076 E63E 110400 LXI D,:0004 Length array element if 077 FPT/INT 078 E641 FE20 CPI :20 String type? 079 E643 C248E6 JNZ :E648 Jump if not 080 E646 1E02 MVI E,:02 Length STR array element 081 E648 0A RDM10 LDAX B Get number of elements 082 E649 03 INX B 083 E64A 67 MOV H,A ) In H and in L 084 E64B 6F MOV L,A ) 085 E64C EB XCHG 086 087 * Calculate total required length: 088 089 E64D CD4FE7 RDM20 CALL :E74F Get length next dimension 090 E650 F5 PUSH PSW Remember it 091 E651 3C INR A Length +1 092 E652 CDF0ED CALL :EDF0 Calc reqd space 093 E655 DA15DA JC :DA15 Run error 'NUMBER OUT 094 OF RANGE' if total space 095 > 64K 096 E658 15 DCR D nr of elements -1 097 E659 C24DE6 JNZ :E64D Next element if not ready 098 099 * Find space in heap: 100 101 E65C 25 DCR H 102 E65D 24 INR H 103 E65E FA15DA JM :DA15 Run error 'NUMBER OUT OF 104 RANGE' if > 32K reserved 105 E661 19 DAD D 106 E662 23 INX H Size of space reqd in HL 107 E663 D5 PUSH D 108 E664 EB XCHG 109 E665 CD8BE6 CALL :E68B Get space of size needed 110 E668 D1 POP D 111 E669 73 MOV M,E Store nr of elements 112 E66A 19 DAD D Last element 113 114 * Elements into heap: 115 116 E66B F1 RDM30 POP PSW Get length 1 element 117 E66C 77 MOV M,A Store it in memory 118 E66D 2B DCX H 119 E66E 1D DCR E 120 E66F C26BE6 JNZ :E66B Next element to memory 121 * 122 E672 EB XCHG 123 E673 E1 POP H Get pntr to array 124 E674 73 MOV M,E ) 125 E675 23 INX H ) Set pointer PAGE 03 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 126 E676 72 MOV M,D ) 127 E677 F1 POP PSW Get item count in A 128 E678 C331E6 JMP :E631 Next item 129 * 130 **************************** 131 * part of RUN TALK (0EE94) * 132 **************************** 133 * 134 * Entry: A: Code for osc.channel SHR 1. 135 * 136 E67B 29 MPT47 DAD H 137 E67C 119402 RTK50 LXI D,:0294 Addr volumes osc. 0,1 138 E67F E601 ANI :01 Code SHR 1 only 139 E681 83 ADD E 140 E682 5F MOV E,A DE=#0294 for osc.0,1; 141 DE=#0295 for osc.2,N 142 E683 7C MOV A,H Get mask 143 E684 2F CMA Complement it 144 E685 EB XCHG Mask + vol in DE, addr 145 POR0M/POR1M in HL 146 E686 A6 ANA M Part to be preserved from 147 old POR0M/POR1M 148 E687 B3 ORA E Add new volume 149 E688 C340EA JMP :EA40 Continu 150 * 151 ********************** 152 * REQUEST HEAP SPACE * 153 ********************** 154 * 155 * Part of Run 'DIM' (0E665). 156 * Requests space from Heap and fills it with 157 * zeroes. 158 * 159 * Entry: DE: Size needed. 160 * Exit: HL: Points to data area (after length 161 * bytes). 162 * AFDE corrupted. 163 * 164 E68B 15 ZHREQ DCR D 165 E68C 14 INR D 166 E68D FA15DA JM :DA15 Run error 'NUMBER OUT OF 167 RANGE' if >32K reqd 168 E690 CDC5D1 CALL :D1C5 Run Heap request 169 E693 23 INX H 170 E694 23 INX H HL pnts after length byte 171 E695 E5 PUSH H 172 E696 EB XCHG Start data area in DE 173 E697 19 DAD D End area in HL 174 E698 AF XRA A 175 E699 CD7CDE CALL :DE7C Load bank with '0' 176 E69C E1 POP H 177 E69D C9 RET 178 * 179 ******************* 180 * RUN basiccmd UT * 181 ******************* 182 * 183 * Valid as direct command only. 184 * 185 E69E AF RUT XRA A 186 E69F 32B902 STA :02B9 Enable complete keyb scan 187 E6A2 CF RST 1 Go to utility PAGE 04 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 188 E6A3 09 DATA :09 189 * 190 ********************** 191 * RUN basiccmd CALLM * 192 ********************** 193 * 194 E6A4 21B3E6 RCALM LXI H,:E6B3 Returnaddr from Utility 195 E6A7 E5 PUSH H on stack 196 E6A8 CDF8E6 CALL :E6F8 Get UT addr in HL 197 E6AB E5 PUSH H UT addr on stack 198 E6AC 0A LDAX B Get next expr 199 E6AD FEFF CPI :FF End marker? 200 E6AF C263E9 JNZ :E963 If not: Get varptr of given 201 variable in HL, T/L in A 202 E6B2 03 INX B 203 E6B3 B7 RCM10 ORA A No special action 204 E6B4 C9 RET On entry: Goto UT addr 205 On exit: Back to Basic 206 monitor 207 * 208 ********************** 209 * RUN basiccmd CLEAR * 210 ********************** 211 * 212 E6B5 CD7FD8 RCLEAR CALL :D87F Get space reqd in HL 213 (CY=1 if > 32K) 214 E6B8 CDBBCE CALL :CEBB Must be >=4 bytes, else run 215 error 'NUMBER OUT OF RANGE' 216 E6BB EB XCHG 217 E6BC 229D02 SHLD :029D Set Heap size 218 E6BF 2A9F02 LHLD :029F Get startaddr. textbuf 219 E6C2 E5 PUSH H 220 E6C3 CD23CB CALL :CB23 Empty Heap + symtab 221 E6C6 D5 PUSH D 222 E6C7 CD95D1 CALL :D195 Set Heap to all available 223 E6CA E1 POP H 224 E6CB C314D2 JMP :D214 Continu 225 * 226 ****************************** 227 * Run basiccmds TRON - TROFF * 228 ****************************** 229 * 230 * Sets or resets the trace flag. 231 * 232 * RTRON: Set trace flag. 233 * RTROF: Reset trace flag. 234 * 235 * Entry: none. 236 * Exit: Z=1: Flag reset. 237 * Z=0: Flag set. 238 * 239 E6CE 3EFF RTRON MVI A,:FF 240 E6D0 321501 RTR10 STA :0115 Set trace flag 241 E6D3 B7 ORA A No special action 242 E6D4 C9 RET 243 * 244 E6D5 AF RTROF XRA A 245 E6D6 C3D0E6 JMP :E6D0 Reset trace flag 246 * 247 ******************* 248 * READ LINENUMBER * 249 ******************* PAGE 05 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 250 * 251 * Entry: BC: Points to linenumber. 252 * Exit: Z=0: Linenumber in HL. 253 * Z=1: HL preserved. 254 * BC updated, DE preserved, AF corrupted. 255 * 256 E6D9 E5 RLN PUSH H 257 E6DA 0A LDAX B 258 E6DB 03 INX B 259 E6DC 67 MOV H,A ) 260 E6DD 0A LDAX B ) Get linenr in HL 261 E6DE 03 INX B ) 262 E6DF 6F MOV L,A ) 263 E6E0 B4 ORA H 264 E6E1 CAE5E6 JZ :E6E5 Abort if linenr is 0 265 E6E4 E3 XTHL Linenr on stack 266 E6E5 E1 RLN10 POP H Old HL or linenr in HL 267 E6E6 C9 RET 268 * 269 ********************************************* 270 * READ LINENUMBER AND FIND IT IN TEXTBUFFER * 271 ********************************************* 272 * 273 * Entry: BC: Points to linenumber. 274 * Exit: BC updated, DE preserved, AF corrupted 275 * (RLNF) or preserved (RLNFI). 276 * HL: Points to 1st linenr >= reqd. number. 277 * CY=1: Linenumber found. 278 * CY=0: Not found. 279 * 280 E6E7 CDD9E6 RLNF CALL :E6D9 Get linenr in HL 281 E6EA C3F6CA JMP :CAF6 Find it in textbuffer 282 283 * Idem as RLNF, but with error reporting: 284 285 E6ED F5 RLNFI PUSH PSW 286 E6EE CDE7E6 CALL :E6E7 Read linenr and find it 287 E6F1 3E04 MVI A,:04 288 E6F3 D2F5D9 JNC :D9F5 Run error 'UNDEFINED NUMBER' 289 if not found 290 E6F6 F1 POP PSW 291 E6F7 C9 RET 292 * 293 ******************************************* 294 * RUN A INT EXPRESSION WITH 2-BYTE RESULT * 295 ******************************************* 296 * 297 * Evaluates a 16-bit INT expression (in range 0- 298 * FFFF). The result is in HL. 299 * 300 * Entry: BC: Points to expression. 301 * Exit: HL: Result. 302 * BC updated, AFDE corrupted. 303 * 304 E6F8 F5 REXI2 PUSH PSW 305 E6F9 D5 PUSH D 306 E6FA CD19E8 CALL :E819 Eval arguments in num expr 307 Result in MACC or in WORKE 308 E6FD 7C MOV A,H 309 E6FE B5 ORA L 310 E6FF CA10E7 JZ :E710 Jump if result in MACC 311 PAGE 06 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 312 * If result in WORKE: 313 314 E702 7E MOV A,M ) 315 E703 23 INX H ) Check if > 2 bytes 316 E704 B6 ORA M ) 317 E705 C215DA JNZ :DA15 Then run error 'NUMBER OUT 318 OF RANGE' 319 E708 23 INX H 320 E709 7E MOV A,M ) 321 E70A 23 INX H ) Get result in HL 322 E70B 6E MOV L,M ) 323 E70C 67 MOV H,A ) 324 E70D D1 POP D 325 E70E F1 POP PSW 326 E70F C9 RET 327 328 * If result in MACC: 329 330 E710 C5 RX210 PUSH B 331 E711 E7 RST 4 Copy MACC to reg A,B,C,D 332 E712 15 DATA :15 333 E713 B0 ORA B Check if > 2 bytes 334 E714 C215DA JNZ :DA15 Then run error 'NUMBER OUT 335 OF RANGE' 336 E717 6A MOV L,D ) Result in HL 337 E718 61 MOV H,C ) 338 E719 C1 POP B 339 E71A D1 POP D 340 E71B F1 POP PSW 341 E71C C9 RET 342 * 343 ******************************* 344 * RUN A 1-BYTE INT EXPRESSION * 345 ******************************* 346 * 347 * Evaluates a 8-bit INT expression (range 0- 348 * FF). Result in A. 349 * 350 * Entry: BC: Points to expression. 351 * Exit: A: Result. 352 * BC updated, DEHL preserved. 353 * 354 E71D D5 REXI1 PUSH D 355 E71E E5 PUSH H 356 E71F CD19E8 CALL :E819 Eval arguments in num expr 357 Result in MACC or WORKE 358 E722 7C MOV A,H 359 E723 B5 ORA L 360 E724 CA36E7 JZ :E736 If HL=0: Get result frm MACC 361 362 * Result in WORKE: 363 364 E727 7E MOV A,M ) 365 E728 23 INX H ) 366 E729 B6 ORA M ) Check if > 1 byte 367 E72A 23 INX H ) 368 E72B B6 ORA M ) 369 E72C C215DA JNZ :DA15 Then run error 'NUMBER OUT 370 OF RANGE' 371 E72F 23 INX H 372 E730 7E MOV A,M Get result in A 373 E731 E1 POP H PAGE 07 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 374 E732 D1 POP D 375 E733 C9 RET 376 377 * If result in MACC (also entry from REXF1): 378 379 E734 D5 RX110 PUSH D 380 E735 E5 PUSH H 381 E736 E1 RX120 POP H 382 E737 C5 PUSH B 383 E738 E7 RST 4 Copy MACC to reg A,B,C,D 384 E739 15 DATA :15 385 E73A B0 ORA B ) Check if > 1 byte 386 E73B B1 ORA C ) 387 E73C C215DA JNZ :DA15 Then run error 'NUMBER OUT 388 OF RANGE' 389 E73F 7A MOV A,D Get result in A 390 E740 C1 POP B 391 E741 D1 POP D 392 E742 C9 RET 393 * 394 ************************************************ 395 * RUN 1-BYTE INT EXPRESSION WITH LIMITED RANGE * 396 ************************************************ 397 * 398 * Entry: BC: Points to expression. 399 * A: Range of arguments (<=FE). 400 * Exit: BC updated, DEHL preserved, F corrupted. 401 * A: Result. 402 * 403 E743 D5 REXIL PUSH D 404 E744 57 MOV D,A Argument range in D 405 E745 CD1DE7 CALL :E71D Get value of argument in A 406 E748 14 INR D 407 E749 BA CMP D Out of range ? Then run 408 E74A D215DA JNC :DA15 error 'NUMBER OUT OF RANGE' 409 E74D D1 POP D 410 E74E C9 RET 411 * 412 ********************************************* 413 * CHECK VARIABLE TYPE AND GET ITS INT VALUE * 414 ********************************************* 415 * 416 * Entry: BC: Points to expression. 417 * Exit: Error: If string type. 418 * If OK: Value in A (FPT: converted to INT). 419 * BC updated, DEHL preserved. 420 * 421 E74F 0A REX1 LDAX B Get var. type byte 422 E750 03 INX B 423 E751 FE20 CPI :20 String type? 424 E753 CA1ADA JZ :DA1A Then run error 'TYPE 425 MISMATCH' 426 E756 FE10 CPI :10 INT type? 427 E758 CA1DE7 JZ :E71D Then get value in A 428 429 * If FPT: 430 431 E75B CD08E8 REXF1 CALL :E808 Get value in MACC 432 E75E E7 RST 4 Change it to INT 433 E75F 48 DATA :48 434 E760 C334E7 JMP :E734 Get value in A 435 * PAGE 08 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 436 *======================================* 437 * RUN EXPRESSIONS WITH OPERATOR PREFIX * 438 *======================================* 439 * 440 * #E763-EBED evaluate logical, FPT, INT or STR 441 * expressions in 'operator prefix' format. 442 * 443 * Register allocation during operation: 444 * INT/FPT: D=0: MACC empty. 445 * E: Operator. 446 * HL=0: Result in MACC. 447 * HL<>0: HL points to result. 448 * STR: HL: Points to string. 449 * E: Type of string (constant [0], 450 * variable [1], temporary [2]). 451 * 452 ********************************* 453 * EVALUATE A LOGICAL EXPRESSION * 454 ********************************* 455 * 456 E763 1600 REXPL MVI D,:00 MACC free 457 E765 0A LDAX B Get byte 458 E766 E660 ANI :60 459 E768 FE40 CPI :40 String ? 460 E76A CABDE7 JZ :E7BD Then jump 461 E76D 0A LDAX B Get byte 462 E76E E61F ANI :1F 463 E770 FE18 CPI :18 Relational operator? 464 E772 DA50E8 JC :E850 If not: eval expr which 465 begins with num operator 466 E775 03 INX B 467 E776 FE1A CPI :1A Bracket? 468 E778 CA63E7 JZ :E763 Then ignore it 469 470 * Logical AND or OR: 471 472 E77B F5 PUSH PSW Preserve type of operation 473 E77C CD63E7 CALL :E763 Get 1st operand 474 E77F F5 PUSH PSW Preserve it 475 E780 CD63E7 CALL :E763 Get 2nd operand 476 E783 D1 POP D 1st operand in D 477 E784 F5 PUSH PSW Preserve 2nd operand 478 E785 A2 ANA D AND operation 479 E786 5F MOV E,A Result in E 480 E787 F1 POP PSW 2nd operand in A 481 E788 B2 ORA D OR operation 482 E789 57 MOV D,A Result in D 483 E78A F1 POP PSW Type of operation in F 484 E78B 7A MOV A,D Result OR in A 485 E78C EA90E7 JPE :E790 Quit if OR 486 E78F 7B MOV A,E Result AND in A 487 E790 C9 RXL10 RET 488 * 489 ****************************** 490 * EVALUATE STRING EXPRESSION * 491 ****************************** 492 * 493 * This routine returns temporary strings before 494 * they are really free. 495 * The heap is cleared if it is a temporary string. 496 * 497 * Entry: BC: Points to expression. PAGE 09 DAI FIRMWARE 0E602-0E79C V1.0 Rev.1 498 * Exit: BC updated, AFD corrupted. 499 * HL: Points to string. 500 * E: Status. 501 * 502 E791 CD9DE7 REXSR CALL :E79D Evaluate string expr 503 E794 7B MOV A,E Get status 504 E795 FE02 CPI :02 Temporary ? 505 E797 E5 PUSH H 506 E798 CC87D1 CZ :D187 Then clear heap entry 507 E79B E1 POP H 508 E79C C9 RET 509 * 510 * 511 * 512 E79D END *************************** * S Y M B O L T A B L E * *************************** MPT47 E67B R4C10 E620 R4COL E61C RCALM E6A4 RCLEAR E6B5 RCM10 E6B3 RCOLG E615 RCOLT E60E RDIM E62F RDM05 E631 RDM10 E648 RDM20 E64D RDM30 E66B REX1 E74F REXF1 E75B REXI1 E71D REXI2 E6F8 REXIL E743 REXPL E763 REXSR E791 RLN E6D9 RLN10 E6E5 RLNF E6E7 RLNFI E6ED RTK50 E67C RTR10 E6D0 RTROF E6D5 RTRON E6CE RUT E69E RX110 E734 RX120 E736 RX210 E710 RXL10 E790 SCRER E602 ZHREQ E68B