PAGE 01 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 002 ORG :E6FD 003 * 004 * 005 * 006 ******************************* 007 * FIND VARIABLE NAME IN INPUT * 008 ******************************* 009 * 010 * Checks if 1st character is a upper case one. 011 * Reads the input (starting with character after 012 * C) till it finds a non-alphanumeric character 013 * (number or upper case). On a carry CALL, it also 014 * accepts %, ! or $ at the end. Blanks are not 015 * ignored and not accepted. 016 * 017 * Entry: C : Input position. 018 * Exit: B : Entry C. 019 * C : Points to 1st character not accepted. 020 * D : Count of 1st character not accepted. 021 * (1st character read has count 1). 022 * A,E: 1st non-alphanumeric character read. 023 * HL preserved. F corrupted. 024 * 025 E6FD F5 RDID PUSH PSW Preserve CY-flag 026 E6FE 41 MOV B,C 027 E6FF 1600 MVI D,:00 Init count 028 E701 14 L3E110 INR D Count +1 029 E702 0C INR C Line pos +1 030 E703 7A MOV A,D Count in A 031 E704 FE0F CPI :0F Max 14 char for a name 032 E706 DA0AE7 JC :E70A 033 E709 15 DCR D Skip last char if > 14 034 E70A CDE0DD L3E111 CALL :DDE0 Get char from line 035 E70D CD09DE CALL :DE09 Check if nr or upper case 036 E710 DA01E7 JC :E701 Get next char if O.K. 037 E713 CDE0DD CALL :DDE0 Get 1st non-alphanum.char 038 from line 039 E716 5F MOV E,A Store it in E 040 E717 F1 POP PSW Get CY-flag back 041 E718 7B MOV A,E Get char back in A 042 E719 D0 RNC Abort if non-carry CALL 043 044 * On carry CALL only: accept !,%,$: 045 046 E71A FE25 CPI :25 047 E71C CA27E7 JZ :E727 Jump if char is '%' 048 E71F FE21 CPI :21 049 E721 CA27E7 JZ :E727 Jump if char is '!' 050 E724 FE24 CPI :24 051 E726 C0 RNZ Abort if char is not '$' 052 E727 0C L3E112 INR C Update line pos 053 E728 14 INR D Update count 054 E729 C9 RET 055 * 056 ******************* 057 * GET LINE NUMBER * 058 ******************* 059 * 060 * Exit: C,HL: Updated. 061 * B preserved, AFDE corrupted. 062 * 'SYNTAX ERROR' if no linenr given. 063 * PAGE 02 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 064 E72A CD31E7 ELN CALL :E731 Read linenr into EBUF 065 E72D D20BDA JNC :DA0B Run 'SYNTAX ERROR' if no 066 number given 067 E730 C9 RET 068 * 069 ****************************** 070 * READ LINE NUMBER INTO EBUF * 071 ****************************** 072 * 073 * Exit: CY=0: No linenumber given. Error exit if 074 * linenumber is 0 or > #FFFF. 075 * CY=1: O.K. 076 * C,HL: Updated. 077 * B preserved, AFDE corrupted. 078 * 079 E731 CDD2DD L3E114 CALL :DDD2 Get char from line, neglect 080 tab + space 081 E734 CD24C0 CALL :C024 Input INT number to MACC 082 E737 D0 RNC Abort if no linenr given 083 E738 C5 PUSH B 084 E739 E7 RST 4 Copy MACC into reg ABCD 085 E73A 15 DATA :15 086 E73B B0 ORA B 087 E73C C251E7 JNZ :E751 Error exit if > #FFFF 088 E73F B1 ORA C 089 E740 B2 ORA D 090 E741 CA51E7 JZ :E751 Error exit if nr = 0 091 E744 5A MOV E,D ) Linenr in DE 092 E745 51 MOV D,C ) 093 E746 72 MOV M,D Hibyte linenr into EBUF 094 E747 CD18E0 CALL :E018 Update EBUF pointer 095 E74A 73 MOV M,E Lobyte linenr into EBUF 096 E74B CD18E0 CALL :E018 Update EBUF pointer 097 E74E C1 POP B 098 E74F 37 STC CY=1 (O.K.) 099 E750 C9 RET 100 101 * Error exit: 102 103 E751 C1 L3E115 POP B 104 E752 3E15 MVI A,:15 105 E754 C3F5D9 JMP :D9F5 Run error 'NUMBER OUT OF 106 RANGE' 107 * 108 ************************************* 109 * ENCODE BINARY OPERATION INTO EBUF * 110 ************************************* 111 * 112 * Entry: A : Result of 3E7CF: 113 * 1xx xxxxx : compute type / opcode. 114 * E : Table code byte. 115 * HL: 1st free location EBUF. 116 * 117 E757 F5 L3E116 PUSH PSW 118 E758 7B MOV A,E Get conversion code byte 119 E759 EB XCHG 120 E75A 2A3B01 LHLD :013B Get addr last operator in 121 EBUF 122 E75D EB XCHG in DE 123 E75E CD70E7 CALL :E770 Add conversion byte for 124 2nd operand 125 E761 0F RRC PAGE 03 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 126 E762 0F RRC 127 E763 EB XCHG 128 E764 2A3901 LHLD :0139 Get addr in EBUF for next 129 operator 130 E767 EB XCHG 131 E768 CD70E7 CALL :E770 Add conversion byte for 132 1st operand 133 E76B F1 POP PSW Restore compute/opcode in A 134 E76C CD83E7 CALL :E783 Insert it into EBUF 135 E76F C9 RET 136 * 137 ********************************************* 138 * ADD INT/FPT CONVERSION BYTE TO EXPRESSION * 139 ********************************************* 140 * 141 * Entry: A : Conversion byte: 142 * #01: Convert FPT to INT. 143 * #02: Convert INT to FPT. 144 * 145 E770 F5 L3E117 PUSH PSW 146 E771 E603 ANI :03 Conversion only 147 E773 CA81E7 JZ :E781 Jump if no conversion reqd 148 E776 1F RAR CY=1 if FPT to INT 149 E777 3E9F MVI A,:9F Conv.byte FPT to INT 150 E779 DA7EE7 JC :E77E 151 E77C 3EBF MVI A,:BF Conv.byte INT to FPT 152 E77E CD83E7 L3E118 CALL :E783 Insert conv.byte into EBUF 153 E781 F1 L3E119 POP PSW 154 E782 C9 RET 155 * 156 ************************* 157 * INSERT BYTE INTO EBUF * 158 ************************* 159 * 160 * Data is moved 1 byte to create space for byte 161 * to be inserted. 162 * 163 * Entry: A : Byte to be inserted. 164 * DE: Startaddress source bank. 165 * HL: Endaddress source bank +1. 166 * Exit: HL= HL + 1. 167 * ABCDE preserved. 168 * 169 E783 C5 L3E120 PUSH B 170 E784 42 MOV B,D ) Start source in BC 171 E785 4B MOV C,E ) 172 E786 03 INX B Destination 1 byte higher 173 E787 F5 PUSH PSW 174 E788 D5 PUSH D 175 E789 CD18E0 CALL :E018 Update EBUF pointer 176 E78C E5 PUSH H 177 E78D 2B DCX H 178 E78E CD4FDE CALL :DE4F Move EBUF contents 1 byte 179 E791 E1 POP H 180 E792 D1 POP D 181 E793 F1 POP PSW 182 E794 12 STAX D Store byte into EBUF 183 E795 C1 POP B 184 E796 C9 RET 185 * 186 * 187 * PAGE 04 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 188 ***************************************** 189 * ENCODE AN UNITARY OPERATOR FOR A TERM * 190 ***************************************** 191 * 192 * Entry: A : Code according to table CFD8. 193 * Exit: BCHL preserved. DE corrupted. 194 * A : Code byte: 195 * + - INOT 196 * INT BC BD BE 197 * FPT 9C 9D * 198 * 199 E797 E5 L3E121 PUSH H 200 E798 213601 LXI H,:0136 Addr type last expression 201 E79B E61F ANI :1F Opcode only 202 E79D FE00 CPI :00 '+' ? 203 E79F 161C MVI D,:1C 204 E7A1 CABAE7 JZ :E7BA Then jump 205 E7A4 FE01 CPI :01 '-' ? 206 E7A6 161D MVI D,:1D 207 E7A8 CABAE7 JZ :E7BA Then jump 208 E7AB FE1E CPI :1E 'INOT' ? 209 E7AD C20BDA JNZ :DA0B Run 'SYNTAX ERROR' if not 210 211 * If 'INOT': 212 213 E7B0 7E MOV A,M Get type last expression 214 E7B1 FE10 CPI :10 Must be INT 215 E7B3 C21ADA JNZ :DA1A Run error 'TYPE MISMATCH' 216 if not 217 E7B6 3EBE MVI A,:BE Code 'INOT' in A 218 E7B8 E1 L3E122 POP H 219 E7B9 C9 RET 220 221 * If '+' or '-': 222 223 E7BA 7E L3E123 MOV A,M Get type last expression 224 E7BB FE10 CPI :10 225 E7BD 1EA0 MVI E,:A0 226 E7BF CACAE7 JZ :E7CA Jump if INT 227 E7C2 7E MOV A,M Get type last expression 228 E7C3 FE00 CPI :00 229 E7C5 1E80 MVI E,:80 230 E7C7 C21ADA JNZ :DA1A Run error 'TYPE MISMATCH' 231 if not FPT 232 E7CA 7A L3E124 MOV A,D ) Set up code in A 233 E7CB B3 ORA E ) 234 E7CC C3B8E7 JMP :E7B8 235 * 236 ***************************************** 237 * OBTAIN TYPE INFO FOR BINARY OPERATION * 238 ***************************************** 239 * 240 * Entry: A : Code for binary operation (lower 5 241 * bits). 242 * E : Type 1st operand. 243 * TYPE: Type 2nd operand. 244 * 245 * Routine compares both types. If different, one 246 * must be INT and the other FPT, else type mismatch 247 * error. 248 * Type conversion and operation type are obtained 249 * from table on 3E835. Type mismatch if illegal PAGE 05 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 250 * type. 251 * Type of result is stored in TYPE. 252 * 253 * Exit: E : Type code from table. 254 * A : Code for EBUF: 1xx xxxxx: 255 * bits 5,6: type of compute required: 256 * 0 : FPT 257 * 1 : INT 258 * 2 : STR 259 * 3 : Boolean 260 * bits 0-4: Opcode. 261 * BCDHL preserved. 262 * 263 E7CF E5 L3E125 PUSH H 264 E7D0 D5 PUSH D 265 E7D1 E61F ANI :1F Opcode only 266 E7D3 F5 PUSH PSW 267 E7D4 CD1FE8 CALL :E81F Set D according to opcode 268 E7D7 3A3601 LDA :0136 Get type latest expression 269 E7DA BB CMP E Compare both types 270 E7DB C209E8 JNZ :E809 Jump if not identical 271 E7DE 07 RLC ) 272 E7DF 07 RLC ) Type code from TYPE in 273 E7E0 07 RLC ) lonibble 274 E7E1 07 RLC ) 275 E7E2 E603 ANI :03 Only lower 2 bits 276 E7E4 6F MOV L,A in L 277 E7E5 7A L3E126 MOV A,D Get opcode group (0-5) 278 E7E6 87 ADD A *2 279 E7E7 57 MOV D,A in D 280 E7E8 87 ADD A *4 281 E7E9 82 ADD D *6 (find group in table) 282 E7EA 85 ADD L Find pos in grouptable 283 E7EB 2135E8 LXI H,:E835 Startaddr result table 284 E7EE CD30DE CALL :DE30 Find addr resultcode in 285 table 286 E7F1 7E MOV A,M Get resultcode 287 E7F2 3C INR A Check if code is FF 288 E7F3 CA1ADA JZ :DA1A Then run error 'TYPE 289 MISMATCH' 290 E7F6 3D DCR A 291 E7F7 E630 ANI :30 Get type of result only 292 E7F9 323601 STA :0136 Store type latest expression 293 E7FC D1 POP D Get code for binary 294 operation in D 295 E7FD 5E MOV E,M ) Get resultcode from table 296 E7FE 7E MOV A,M ) in E and in A 297 E7FF 1F RAR 298 E800 E660 ANI :60 Reqd computing in bits 5,6 299 E802 B2 ORA D Add opcode in bits 0-4 300 E803 F680 ORI :80 Set bit 7 301 E805 E1 POP H 302 E806 54 MOV D,H Restore D 303 E807 E1 POP H 304 E808 C9 RET 305 306 * If both types not identical: 307 308 E809 2E04 L3E127 MVI L,:04 309 E80B FE00 CPI :00 TYPE is FPT ? 310 E80D CA16E8 JZ :E816 Then jump 311 E810 2C INR L PAGE 06 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 312 E811 FE10 CPI :10 TYPE is INT ? 313 E813 C21ADA JNZ :DA1A Run error 'TYPE MISMATCH' 314 if not 315 E816 83 L3E128 ADD E Add other type 316 E817 FE10 CPI :10 Result must be #10 317 E819 C21ADA JNZ :DA1A Run error 'TYPE MISMATCH' 318 if not 319 E81C C3E5E7 JMP :E7E5 Calc conversion 320 * 321 * SET D DEPENDING ON OPCODE BINARY OPERATOR: 322 * 323 * Entry: A : Opcode binary operator (table #CF91). 324 * Exit: ABCEHL preserved. 325 * 326 E81F 1600 L3E129 MVI D,:00 D=0 327 E821 FE01 CPI :01 328 E823 D8 RC Ready if opcode is 0 (+) 329 E824 14 INR D D=1 330 E825 FE04 CPI :04 331 E827 D8 RC Ready if opcode is 1,2 or 332 3 (-,/,*) 333 E828 1602 MVI D,:02 D=2 334 E82A C8 RZ Ready if opcode is 4 (^) 335 E82B 14 INR D D=3 336 E82C FE10 CPI :10 337 E82E D8 RC Ready if opcode is 5-F 338 (IOR,IAND,IXOR,SHL,SHR,MOD) 339 E82F 14 INR D D=4 340 E830 FE18 CPI :18 341 E832 D8 RC Ready if opcode is 10-17 342 (>=, <=, >, <, =, <>) 343 E833 14 INR D D=5 344 E834 C9 RET If opcode >= 18 (AND,OR) 345 * 346 * TABLE WITH TYPE RESULTS: 347 * 348 * The table gives the relation between input 349 * operands, the binary operator and the result 350 * for different groups of binary operations. 351 * The groupnumber is calculated in 3E81F. 352 * 353 * Format each group: 6 bytes. Sequence: 354 * FPT/FPT 355 * INT/INT 356 * STR/STR 357 * LOGIC/LOGIC 358 * INT/FPT 359 * FPT/INT 360 * Format each byte: 361 * bit 7,6: type arithmetic ) 0: FPT 1: INT 362 * bit 5,4: Type result ) 2: STR 3: logic 363 * bit 3,2: Conversion left operand. 364 * bit 1,0: Conversion right operand. 365 * 0 : No conversion. 366 * 1 : Convert to INT. 367 * 2 : Convert to FPT. 368 * FF : Not possible. 369 * 370 E835 00 L3E385 DATA :00 Group D=0: 371 E836 50 DATA :50 + 372 E837 A0 DATA :A0 373 E838 FF DATA :FF PAGE 07 DAI FIRMWARE 3E6FD-3E858 V1.0 Rev.1 374 E839 08 DATA :08 375 E83A 02 DATA :02 376 * 377 E83B 00 DATA :00 Group D=1: 378 E83C 50 DATA :50 -,/,* 379 E83D FF DATA :FF 380 E83E FF DATA :FF 381 E83F 08 DATA :08 382 E840 02 DATA :02 383 * 384 E841 00 DATA :00 Group D=2: 385 E842 0A DATA :0A ^ 386 E843 FF DATA :FF 387 E844 FF DATA :FF 388 E845 08 DATA :08 389 E846 02 DATA :02 390 * 391 E847 55 DATA :55 Group D=3: 392 E848 50 DATA :50 IAND,IOR,IXOR,MOD,SHL,SHR 393 E849 FF DATA :FF 394 E84A FF DATA :FF 395 E84B 51 DATA :51 396 E84C 54 DATA :54 397 * 398 E84D 30 DATA :30 Group D=4: 399 E84E 70 DATA :70 <,>,<>,=,<=,>= 400 E84F B0 DATA :B0 401 E850 FF DATA :FF 402 E851 38 DATA :38 403 E852 32 DATA :32 404 * 405 E853 FF DATA :FF Group D=5: 406 E854 FF DATA :FF AND,OR 407 E855 FF DATA :FF 408 E856 F0 DATA :F0 409 E857 FF DATA :FF 410 E858 FF DATA :FF 411 * 412 * 413 * 414 E859 END *************************** * S Y M B O L T A B L E * *************************** ELN E72A L3E110 E701 L3E111 E70A L3E112 E727 L3E114 E731 L3E115 E751 L3E116 E757 L3E117 E770 L3E118 E77E L3E119 E781 L3E120 E783 L3E121 E797 L3E122 E7B8 L3E123 E7BA L3E124 E7CA L3E125 E7CF L3E126 E7E5 L3E127 E809 L3E128 E816 L3E129 E81F L3E385 E835 RDID E6FD