PAGE 01 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 002 ORG :E3F1 003 * 004 * 005 * 006 ************************************************** 007 * ENCODE A TERM WITH A POSSIBLE UNITARY OPERATOR * 008 ************************************************** 009 * 010 * L3E381: First operand may be preceeded by unitary 011 * operator +, - or INOT. 012 * Then code byte preceeding 1st operand is: 013 * + - INOT 014 * INT: BC BD BE 015 * FPT: 9C 9D * 016 * 017 * L3E382: Encodes a sequence of higher priority 018 * operations and their operands. 019 * Encodes all terms after OLDOP in input 020 * which form a succession of higher priority 021 * operators until next lower or equal 022 * operator is found. This will be in RGTOP. 023 * The type of this collection will be in 024 * TYPE. 025 * 026 * Exit: C,HL updated. BE corrupted. CY=0. 027 * A: bits 5,6,7 OLDOP; D: bits 5,6,7 new RGTOP 028 * 029 E3F1 CDF6E6 L3E381 CALL :E6F6 Find unitary operator 030 in table 031 E3F4 B7 ORA A 032 E3F5 C244E4 JNZ :E444 Jump if found 033 * 034 E3F8 223901 L3E382 SHLD :0139 Set pntr place for operator 035 E3FB CD55E4 CALL :E455 Encode 1st operand 036 E3FE CDEAE6 L3E383 CALL :E6EA Find binary or unitary 037 operator in table 038 E401 323701 STA :0137 Store latest prio operator 039 E404 3A3701 L3E384 LDA :0137 Get latest prio operator 040 E407 E6E0 ANI :E0 Prio in bits 5,6,7 041 E409 57 MOV D,A RGTOP in D 042 E40A 3A3801 LDA :0138 Get old prio operator 043 E40D E6E0 ANI :E0 Prio only 044 E40F BA CMP D Compare both operators 045 E410 D0 RNC Ready if RGTOP <= OLDOP 046 047 * RGTOP > OLDOP: 048 049 E411 EB XCHG 050 E412 2A3601 LHLD :0136 Get type latest expression 051 E415 E5 PUSH H Preserve type left operand 052 and RGTOP 053 E416 3A3801 LDA :0138 Get old prio operator 054 E419 F5 PUSH PSW Preserve it 055 E41A D5 PUSH D Preserve EBUF pntr 056 E41B 2A3901 LHLD :0139 Get pntr place for operator 057 E41E E5 PUSH H Preserve HOPPT 058 E41F EB XCHG New EBUF pntr in HL 059 E420 3A3701 LDA :0137 Get latest prio operator 060 E423 323801 STA :0138 and store it as old one 061 E426 CDF8E3 CALL :E3F8 Encode right hand operand 062 until higher prio operators 063 E429 EB XCHG PAGE 02 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 064 E42A E1 POP H 065 E42B 223901 SHLD :0139 Restore HOPPT 066 E42E E1 POP H 067 E42F 223B01 SHLD :013B Restore RGTPT 068 E432 F1 POP PSW 069 E433 323801 STA :0138 Restore OLDOP 070 E436 EB XCHG New EBUF pntr in HL 071 E437 D1 POP D Restore type left operand 072 (E) and orig RGTOP (D) 073 E438 7A MOV A,D Old RGTOP in A 074 E439 E61F ANI :1F Op.code only 075 E43B CDCFE7 CALL :E7CF Obtain type info for 076 binary operation 077 E43E CD57E7 CALL :E757 Encode binary operation 078 into EBUF 079 E441 C304E4 JMP :E404 Check again if prios correct 080 081 * Unitary operator: 082 083 E444 223901 L3E56 SHLD :0139 Set pntr place for operator 084 E447 E5 PUSH H 085 E448 CD55E4 CALL :E455 Encode a term 086 E44B CD97E7 CALL :E797 Encode unitary operator 087 for a term 088 E44E D1 POP D 089 E44F CD83E7 CALL :E783 Byte in A into EBUF 090 E452 C3FEE3 JMP :E3FE Encode sequence with prio's 091 * 092 * ENCODE A TERM: 093 * 094 * Non-error exit: C,HL: updated. 095 * BCDE corrupted, AF preserved. 096 * 097 E455 F5 L3E57 PUSH PSW 098 E456 CDD2DD CALL :DDD2 Get char from line, neglect 099 tab + space 100 E459 FE22 CPI :22 101 E45B CA9BE4 JZ :E49B Jump if char is '"' 102 E45E FE28 CPI :28 103 E460 CA86E4 JZ :E486 Jump if char is '(' 104 E463 CD02DE CALL :DE02 Check if char is upper case 105 E466 DA77E4 JC :E477 Then jump 106 E469 FE2D CPI :2D 107 E46B CA0BDA JZ :DA0B Run 'SYNTAX ERROR' if '-' 108 E46E CDC8E4 CALL :E4C8 Encode a number 109 E471 D20BDA JNC :DA0B Evt run 'SYNTAX ERROR' 110 E474 C3A4E4 JMP :E4A4 Store type and quit 111 112 * If upper case character: 113 114 E477 CD22E5 L3E58 CALL :E522 Encode function 115 E47A DAA4E4 JC :E4A4 If ready: store type (#30) 116 and quit 117 E47D 48 MOV C,B 118 E47E 1600 MVI D,:00 119 E480 CDBCE5 CALL :E5BC Encode var/array reference 120 E483 C3A7E4 JMP :E4A7 Quit 121 122 * If opening bracket: 123 124 E486 369A L3E59 MVI M,:9A Load #9A in EBUF 125 E488 CD18E0 CALL :E018 Update EBUF pointer PAGE 03 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 126 E48B 0C INR C Next pos in textline 127 E48C CDC9E3 CALL :E3C9 Encode expression 128 E48F CDE0DD CALL :DDE0 Get char from line 129 E492 FE29 CPI :29 130 E494 C20BDA JNZ :DA0B 'SYNTAX ERROR' if not ')' 131 E497 0C INR C Next pos in textline 132 E498 C3A7E4 JMP :E4A7 Quit 133 134 * If opening '"': 135 136 E49B 00 L3E60 NOP 137 E49C CD80E8 CALL :E880 Store quoted text in EBUF 138 E49F 3E20 MVI A,:20 Type is STR 139 E4A1 C3A4E4 JMP :E4A4 Store type and quit 140 141 * Ready: 142 143 E4A4 323601 L3E61 STA :0136 Set type latest expression 144 E4A7 F1 L3E62 POP PSW 145 E4A8 C9 RET 146 * 147 *************************** 148 * ENCODE 'SAVEA', 'LOADA' * 149 *************************** 150 * 151 *ELODA 152 E4A9 CD78E6 ESAVA CALL :E678 Enc. array without arguments 153 E4AC C355E3 JMP :E355 Into encode 'SAVE/LOAD' 154 * 155 E4AF FF DATA :FF 156 E4B0 FF DATA :FF 157 E4B1 FF DATA :FF 158 E4B2 FF DATA :FF 159 E4B3 FF DATA :FF 160 E4B4 FF DATA :FF 161 E4B5 FF DATA :FF 162 E4B6 FF DATA :FF 163 E4B7 FF DATA :FF 164 E4B8 FF DATA :FF 165 E4B9 FF DATA :FF 166 E4BA FF DATA :FF 167 E4BB FF DATA :FF 168 E4BC FF DATA :FF 169 E4BD FF DATA :FF 170 E4BE FF DATA :FF 171 E4BF FF DATA :FF 172 E4C0 FF DATA :FF 173 E4C1 FF DATA :FF 174 E4C2 FF DATA :FF 175 E4C3 FF DATA :FF 176 E4C4 FF DATA :FF 177 E4C5 FF DATA :FF 178 E4C6 FF DATA :FF 179 E4C7 FF DATA :FF 180 * 181 ******************* 182 * ENCODE A NUMBER * 183 ******************* 184 * 185 * Encodes a INT or a FPT number. 186 * 187 * Entry: C : Offset of start of number. PAGE 04 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 188 * HL: Points to EBUF. 189 * 190 * On exit: In A: #00 FPT; #10 INT; #10 HEX. 191 * In EBUF: #10 FPT; #14 INT; #15 HEX. 192 * 193 * On exit, non-hex numbers will only be INT if reqd 194 * type or IMP type is INT, and there is no '.' or 195 * 'E' in the input string. 196 * 197 * Non-error exit: CY=1: C,HL updated, B preserved. 198 * A: Type-code, DE: entry BC. 199 * Error exit: CY=0, BCDEHL preserved. 200 * 201 E4C8 C5 ENUM PUSH B 202 E4C9 E5 PUSH H 203 E4CA CDD2DD CALL :DDD2 Get char from line, neglect 204 tab + space 205 E4CD FE23 CPI :23 206 E4CF CA13E5 JZ :E513 Hex if char is '#' 207 E4D2 3A9002 LDA :0290 Get required number type 208 E4D5 B7 ORA A 209 E4D6 C2DCE4 JNZ :E4DC Jump if reqd type is not FPT 210 E4D9 3A8F02 LDA :028F Get default number type 211 E4DC FE00 ENM03 CPI :00 212 E4DE CAFFE4 JZ :E4FF Jump if type is not FPT 213 214 * If INT: 215 216 E4E1 3614 MVI M,:14 Load #14 in EBUF 217 E4E3 CD18E0 CALL :E018 Update EBUF pointer 218 E4E6 CD7BE5 CALL :E57B INT nr into EBUF 219 E4E9 D2FFE4 JNC :E4FF Then handle as FPT 220 E4EC CDE0DD CALL :DDE0 Get char from line 221 E4EF FE2E CPI :2E 222 E4F1 CAFFE4 JZ :E4FF Try FPT if no digits before 223 the '.' 224 E4F4 FE45 CPI :45 225 E4F6 CAFFE4 JZ :E4FF Handle as FPT if 'E' 226 E4F9 3E10 ENM05 MVI A,:10 Type is INT 227 E4FB D1 ENM10 POP D 228 E4FC D1 POP D 229 E4FD 37 STC CY=1 230 E4FE C9 RET 231 232 * If FPT: 233 234 E4FF E1 ENM20 POP H 235 E500 C1 POP B 236 237 * Entry from ETCON: 238 239 E501 C5 ENM25 PUSH B ) Save pointers 240 E502 E5 PUSH H ) 241 E503 3610 MVI M,:10 Load #10 in EBUF 242 E505 CD18E0 CALL :E018 Update EBUF pointer 243 E508 CD96E5 CALL :E596 FPT nr into EBUF 244 E50B 3E00 MVI A,:00 Type is FPT 245 E50D DAFBE4 JC :E4FB Jump if no errors 246 E510 E1 POP H 247 E511 C1 POP B 248 E512 C9 RET Error exit (no number) 249 PAGE 05 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 250 * If HEX: 251 252 E513 3615 ENM30 MVI M,:15 Load #15 in EBUF 253 E515 CD18E0 CALL :E018 Update EBUF pointer 254 E518 00 NOP 255 E519 CD84E8 CALL :E884 Hex nr into EBUF 256 E51C D20BDA JNC :DA0B Run 'SYNTAX ERROR' if no 257 digits 258 E51F C3F9E4 JMP :E4F9 Quit 259 * 260 ********************* 261 * ENCODE A FUNCTION * 262 ********************* 263 * 264 * Reads a system function (both function and 265 * arguments) into EBUF. Error exit if syntax or 266 * type mismatch errors are found. 267 * 268 * Entry: HL: Points to 1st free pos. in EBUF. 269 * C : Points to input. 270 * Exit: If found: CY=1: 271 * A: Type info of result. 272 * C,HL updated; BDE corrupted. 273 * If not found: CY=0: 274 * A: End of table count. 275 * B: Start of name in input. 276 * C: Points beyond. 277 * DE: Points to 0 T/L byte at table end. 278 * HL: Points to EBUF. 279 * 280 E522 E5 EFUN PUSH H 281 E523 37 STC Set 'include type letter' 282 E524 CDFDE6 CALL :E6FD Find variable name in input, 283 allow !,%,$. 284 E527 21E6CF LXI H,:CFE6 Addr table BASIC functions 285 E52A CD5ACA CALL :CA5A Find function in table 286 E52D 7B MOV A,E Get serialnr of entry in 287 table in A 288 E52E EB XCHG 289 E52F E1 POP H 290 E530 D27AE5 JNC :E57A Abort if not found (CY=0) 291 292 * If found in table: 293 294 E533 3620 MVI M,:20 Load fn.code (#20) in EBUF 295 E535 CD18E0 CALL :E018 Update EBUF pointer 296 E538 77 MOV M,A Load how manyth function 297 in EBUF 298 E539 CD18E0 CALL :E018 Update EBUF pointer 299 E53C 1A LDAX D Get T/L byte of function 300 E53D 13 INX D 301 E53E F5 PUSH PSW Preserve it 302 E53F E60F ANI :0F Length only 303 E541 CA76E5 JZ :E576 Jump if no arguments reqd 304 305 * If arguments required: 306 307 E544 F5 PUSH PSW Preserve length fuction 308 E545 CD67E8 CALL :E867 Check if next char is '(', 309 E548 28 DATA :28 run 'SYNTAX ERROR' if not 310 E549 EB L3E72 XCHG 311 E54A 7E MOV A,M Get T/L byte PAGE 06 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 312 E54B 23 INX H 313 E54C EB XCHG 314 E54D FE30 CPI :30 Boolean type ? 315 E54F CCBCE5 CZ :E5BC Then encode var/array ref. 316 E552 CA65E5 JZ :E565 and jump 317 E555 FE20 CPI :20 STR type ? 318 E557 CCA1E3 CZ :E3A1 Then encode STR expr 319 E55A CA65E5 JZ :E565 and jump 320 E55D FE10 CPI :10 INT type ? 321 E55F CC6DE3 CZ :E36D Then encode INT expr 322 E562 C476E3 CNZ :E376 Else: encode FPT expr 323 * 324 E565 F1 L3E73 POP PSW Get length function 325 E566 3D DCR A Check if all arguments done 326 E567 CA72E5 JZ :E572 Jump if ready 327 E56A F5 PUSH PSW Preserve T/L function 328 E56B CD67E8 CALL :E867 Check if next char is ',', 329 E56E 2C DATA :2C run 'SYNTAX ERROR' if not 330 E56F C349E5 JMP :E549 Encode next argument 331 E572 CD67E8 L3E74 CALL :E867 Check if next char is ')', 332 E575 29 DATA :29 run 'SYNTAX ERROR' if not 333 E576 F1 L3E75 POP PSW Get T/L function 334 E577 E630 ANI :30 Type only 335 E579 37 STC CY=1 336 E57A C9 L3E76 RET 337 * 338 ************************ 339 * INT NUMBER INTO EBUF * 340 ************************ 341 * 342 * Entry: C : Points to input. 343 * HL: Points to EBUF. 344 * 345 E57B CDD2DD EINT CALL :DDD2 Get char from line, neglect 346 tab + space 347 E57E FE2D CPI :2D 348 E580 C285E5 JNZ :E585 Jump if char is not '-' 349 E583 0C INR C 350 E584 AF XRA A Else: clear sign bit 351 E585 CD24C0 L3E78 CALL :C024 Input INT number to MACC 352 E588 C28DE5 JNZ :E58D Jump if nr was >= 0 353 E58B E7 RST 4 Change sign MACC 354 E58C 60 DATA :60 355 E58D C3A3E5 L3E79 JMP :E5A3 Move MACC into EBUF 356 * 357 ************************ 358 * HEX NUMBER INTO EBUF * 359 ************************ 360 * 361 E590 CD2AC0 L3E80 CALL :C02A Input HEX number to MACC 362 E593 C3A3E5 JMP :E5A3 Move MACC into EBUF 363 * 364 ************************ 365 * FPT NUMBER INTO EBUF * 366 ************************ 367 * 368 * Entry: C : Points to input. 369 * HL: Points to EBUF. 370 * Non-error exit: CY=1: 371 * C,HL updated. B preserved. A corrupted. 372 * DE: Location of number in EBUF. 373 * Error exit: CY=0: PAGE 07 DAI FIRMWARE 3E3F1-3E5BB V1.0 Rev.1 374 * BDEHL preserved, A corrupted, C updated. 375 * 376 E596 CDD2DD EFPT CALL :DDD2 Get char from line, neglect 377 tab + space 378 E599 FE2D CPI :2D 379 E59B C2A0E5 JNZ :E5A0 Jump if char is not '-' 380 E59E 0C INR C 381 E59F AF XRA A Else: clear sign bit 382 E5A0 CD79E8 L3E82 CALL :E879 FPT nr into MACC, evt 383 change sign 384 385 * Entry for HEX/INT numbers: 386 387 E5A3 D2BBE5 L3E83 JNC :E5BB Abort if there are no digits 388 E5A6 C5 PUSH B 389 E5A7 54 MOV D,H Old EBUF pntr in DE 390 E5A8 5D MOV E,L 391 E5A9 CD18E0 CALL :E018 ) Update EBUF pointer 392 E5AC CD18E0 CALL :E018 ) to after new input 393 E5AF CD18E0 CALL :E018 ) 394 E5B2 CD18E0 CALL :E018 ) 395 E5B5 EB XCHG 396 E5B6 E7 RST 4 Copy MACC into EBUF 397 E5B7 0F DATA :0F 398 E5B8 EB XCHG 399 E5B9 C1 POP B 400 E5BA 37 STC CY=1 401 E5BB C9 L3E84 RET 402 * 403 * 404 * 408 E5BC END *************************** * S Y M B O L T A B L E * *************************** EFPT E596 EFUN E522 EINT E57B ELODA E4A9 ENM03 E4DC ENM05 E4F9 ENM10 E4FB ENM20 E4FF ENM25 E501 ENM30 E513 ENUM E4C8 ESAVA E4A9 L3E381 E3F1 L3E382 E3F8 L3E383 E3FE L3E384 E404 L3E56 E444 L3E57 E455 L3E58 E477 L3E59 E486 L3E60 E49B L3E61 E4A4 L3E62 E4A7 L3E72 E549 L3E73 E565 L3E74 E572 L3E75 E576 L3E76 E57A L3E78 E585 L3E79 E58D L3E80 E590 L3E82 E5A0 L3E83 E5A3 L3E84 E5BB