PAGE 01 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 002 ORG :E79D 003 * 004 * 005 * 006 ******************************************* 007 * EVALUATE ARGUMENTS IN STRING EXPRESSION * 008 ******************************************* 009 * 010 * Only '+' or compare with logical result is 011 * allowed. The right-hand side of a string expres- 012 * sion is evaluated. If it is not status 02, it is 013 * moved into the Heap. The stringpointer is saved 014 * at the varptr location. 015 * If the variable had already an old value on the 016 * heap, it is cleared, see further exit conditions. 017 * 018 * Entry: (BC): 1..... Expr. begins with operator. 019 * 01.... Variable reference. 020 * 001... Function call. 021 * else Constant. 022 * Exit: BC updated, DEHL corrupted. 023 * A: Type (#20). 024 * 025 E79D 0A REXPS LDAX B get 1st byte 026 E79E 07 RLC 027 E79F DABDE7 JC :E7BD Jump if 1st byte is operator 028 E7A2 07 RLC 029 E7A3 DAB3E7 JC :E7B3 Jump if string variable 030 E7A6 07 RLC 031 E7A7 DAD9E9 JC :E9D9 Jump if string function 032 033 * If string constant: 034 035 E7AA 1E00 MVI E,:00 Status: constant 036 E7AC 03 INX B 037 E7AD 0A LDAX B Get string length 038 E7AE 60 MOV H,B ) Stringpntr in HL 039 E7AF 69 MOV L,C ) 040 E7B0 C390E1 JMP :E190 Abort with BC pnts after STR 041 042 * If string variable: 043 044 E7B3 CD63E9 RXS10 CALL :E963 Get varptr in HL, T/L in A 045 E7B6 5E MOV E,M ) 046 E7B7 23 INX H ) Stringaddr in DE 047 E7B8 56 MOV D,M ) 048 E7B9 EB XCHG and in HL 049 E7BA 1E01 MVI E,:01 Status: variable 050 E7BC C9 RET 051 052 * If string operation: 053 054 E7BD 0A ROSTR LDAX B Get 1st byte 055 E7BE 03 INX B 056 E7BF F5 PUSH PSW 057 E7C0 D5 PUSH D 058 E7C1 CD9DE7 CALL :E79D Evaluate string expression 059 E7C4 F1 POP PSW 060 E7C5 57 MOV D,A 061 E7C6 F1 POP PSW 062 E7C7 E5 PUSH H Remember it 063 E7C8 53 MOV D,E Type in D PAGE 02 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 064 E7C9 F5 PUSH PSW 065 E7CA D5 PUSH D 066 E7CB CD9DE7 CALL :E79D Eval 2nd string expr 067 E7CE F1 POP PSW 068 E7CF 57 MOV D,A 069 E7D0 F1 POP PSW 070 E7D1 C5 PUSH B Save it 071 E7D2 44 MOV B,H 072 E7D3 4D MOV C,L 073 E7D4 E1 POP H 074 E7D5 E3 XTHL Save program pointer 075 E7D6 C5 PUSH B ) 076 E7D7 42 MOV B,D ) 077 E7D8 4B MOV C,E ) Re-arrange registers 078 E7D9 EB XCHG ) 079 E7DA E1 POP H ) 080 E7DB FEC0 CPI :C0 Operator is '+'? 081 E7DD CAEBE7 JZ :E7EB Then append 2 strings 082 083 * If string compare: 084 085 E7E0 CD21D1 CALL :D121 Compare 2 strings 086 E7E3 CDF8E7 CALL :E7F8 Returns operands if temp 087 E7E6 C1 POP B restore 088 E7E7 5F MOV E,A Opcode in E 089 E7E8 C333E9 JMP :E933 Evaluate the compare 090 091 * If operator is '+': 092 093 E7EB E5 ROS10 PUSH H 094 E7EC CD06D1 CALL :D106 Make 1 string out of 2 095 E7EF E3 XTHL Save pntr to result/store 096 pntr to operand 097 E7F0 CDF8E7 CALL :E7F8 Clean up heap 098 E7F3 E1 POP H Pntr to result in HL 099 E7F4 C1 POP B Program pntr in BC 100 E7F5 1E02 MVI E,:02 Status: temporary 101 E7F7 C9 RET 102 * 103 * CLEAR UP HEAP AFTER STRING OPERATION: 104 * 105 * Entry: B,C: Code for 1st resp. 2nd operand. 106 * (0=const, 1=var, 2=temp). 107 * DE: Points to 1st operand. 108 * HL: Points to 2nd operand. 109 * Exit: DEHL corrupted, AFBC preserved. 110 * 111 E7F8 F5 DROPS PUSH PSW 112 E7F9 79 MOV A,C Get code 2nd operand 113 E7FA FE02 CPI :02 Temporary? 114 E7FC CC87D1 CZ :D187 Then clear string in heap 115 E7FF EB XCHG 116 E800 78 MOV A,B Get code 1st operand 117 E801 FE02 CPI :02 Temporary? 118 E803 CC87D1 CZ :D187 Then clear string in heap 119 E806 F1 POP PSW 120 E807 C9 RET 121 * 122 ********************************* 123 * EVALUATE A NUMERIC EXPRESSION * 124 ********************************* 125 * PAGE 03 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 126 * Entry: BC: Points to a numeric function argument 127 * or a numeric expression in program. 128 * Exit: BC updated, AFDEHL preserved. 129 * Result in MACC. 130 * 131 E808 F5 REXNA PUSH PSW 132 E809 D5 PUSH D 133 E80A E5 PUSH H 134 E80B CD19E8 CALL :E819 Eval arguments in num expr 135 E80E 7C MOV A,H 136 E80F B5 ORA L 137 E810 CA15E8 JZ :E815 Abort if result in MACC 138 E813 E7 RST 4 Else: copy operand to MACC 139 E814 0C DATA :0C 140 E815 E1 L0E146 POP H 141 E816 D1 POP D 142 E817 F1 POP PSW 143 E818 C9 RET 144 * 145 ******************************************** 146 * EVALUATE ARGUMENTS IN NUMERIC EXPRESSION * 147 ******************************************** 148 * 149 * Checks for constants, functions, variables and 150 * operators. The right-hand side of the expression 151 * is therefore evaluated. The value of the variable 152 * is stored at its varptr location. 153 * 154 * Entry: BC: Points to expression in program. 155 * (BC): 1.... Expr begins with operator. 156 * 01... Variable reference. 157 * 001.. Function call. 158 * Else Constant. 159 * D<>0: MACC must be preserved. 160 * 161 E819 1600 REXPN MVI D,:00 Set MACC free 162 163 * Called by lower levels: 164 165 E81B 0A RXN10 LDAX B Get 1st byte 166 E81C 07 RLC 167 E81D DA50E8 JC :E850 Jump if expr starts with 168 operator 169 E820 07 RLC 170 E821 DA6BE9 JC :E96B Jump if var reference 171 E824 07 RLC 172 E825 DA30E8 JC :E830 Jump if function call 173 174 * If numeric constant: 175 176 E828 03 INX B Past flag byte 177 E829 60 MOV H,B ) HL pnts to constant 178 E82A 69 MOV L,C ) 179 E82B 03 INX B 180 E82C 03 INX B 181 E82D 03 INX B 182 E82E 03 INX B Program pntr pnts beyond 183 E82F C9 RET 184 185 * If numeric function: 186 187 E830 D5 RFUNN PUSH D PAGE 04 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 188 E831 7A MOV A,D 189 E832 B7 ORA A 190 E833 CA46E8 JZ :E846 Jump if MACC free 191 E836 CD18C0 CALL :C018 Save MACC on stack 192 E839 CDD9E9 CALL :E9D9 Evaluate function call 193 result in MACC 194 E83C 212901 LXI H,:0129 Addr WORKE 195 E83F E7 RST 4 Copy result to WORKE 196 E840 0F DATA :0F 197 E841 CD1BC0 CALL :C01B Restore MACC from stack 198 E844 D1 POP D 199 E845 C9 RET 200 E846 CDD9E9 RFN10 CALL :E9D9 Evaluate function call, 201 result in MACC 202 E849 D1 POP D 203 E84A 16FF MVI D,:FF Set MACC to be preserved 204 E84C 210000 LXI H,:0000 Flag 'result in MACC' 205 E84F C9 RET 206 207 * If expr begins with numeric operator: 208 209 E850 0A RONUM LDAX B Get operator 210 E851 E67F ANI :7F Clip operator bit 211 E853 03 INX B 212 E854 FE1A CPI :1A Bracket? 213 E856 CA1BE8 JZ :E81B Then ignore it 214 E859 15 DCR D 215 E85A 14 INR D Check if D<>0 216 E85B C418C0 CNZ :C018 Then save MACC on stack 217 E85E D5 PUSH D 218 E85F 5F MOV E,A Opcode in E 219 E860 21DCE8 LXI H,:E8DC 220 E863 E5 PUSH H Returnaddr on stack 221 E864 CD19E8 CALL :E819 Get 1st operand 222 E867 7B MOV A,E Opcode in A 223 E868 E61F ANI :1F 224 E86A FE1C CPI :1C 225 E86C D29FE8 JNC :E89F Jump if unitary operation 226 227 * If boolean operator: 228 229 E86F E5 PUSH H Save pntr to 1st operand 230 E870 CD1BE8 CALL :E81B Get 2nd operand 231 E873 7C MOV A,H 232 E874 B5 ORA L 233 E875 C27DE8 JNZ :E87D Jump if HL pnts to WORKE 234 E878 212901 LXI H,:0129 Addr WORKE 235 E87B E7 RST 4 Copy 2nd operand to WORKE 236 E87C 0F DATA :0F 237 E87D E3 RON10 XTHL 238 E87E 7C MOV A,H 239 E87F B5 ORA L 240 E880 CA85E8 JZ :E885 Jump if 1st operand in MACC 241 E883 E7 RST 4 Else copy it from WORKE 242 E884 0C DATA :0C to MACC 243 E885 7B L0E153 MOV A,E Get opcode 244 E886 E61F ANI :1F 245 E888 FE10 CPI :10 246 E88A D2C9E8 JNC :E8C9 If relational operation 247 248 * If arithmetic operation: 249 PAGE 05 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 250 E88D BB CMP E 251 E88E 21FDE8 LXI H,:E8FD Addr table INT routines 252 E891 C297E8 JNZ :E897 Jump if INT 253 E894 21EEE8 LXI H,:E8EE Addr table FPT routines 254 E897 1600 RON20 MVI D,:00 Set MACC free 255 E899 5F MOV E,A Opcode in E 256 E89A 19 DAD D 257 E89B 19 DAD D 258 E89C 19 DAD D Find routine in table 259 E89D E3 XTHL Addr routine on stack; pntr 260 to 2nd operand in HL 261 E89E C9 RET Perform routine 262 * 263 * If an unitary operation: 264 * 265 * Entry: HL: Points to operand (0 if in MACC). 266 * E: Full opcode. 267 * A: Lower 5 bits opcode. 268 * Returnaddr on stack (E8DC). 269 * Exit: Result in MACC. 270 * ABCDEHL preserved 271 * 272 E89F F5 RON40 PUSH PSW 273 E8A0 7C MOV A,H 274 E8A1 B5 ORA L 275 E8A2 CAA7E8 JZ :E8A7 If operand in MACC 276 E8A5 E7 RST 4 Else: operand in MACC 277 E8A6 0C DATA :0C 278 E8A7 F1 L0E156 POP PSW 279 E8A8 C8 RZ Ready if unitary '+' 280 E8A9 BB CMP E Bits 6,7 opcode 0? 281 E8AA CABEE8 JZ :E8BE Then change MACC to INT 282 E8AD FE1E CPI :1E INOT? 283 E8AF DABBE8 JC :E8BB Then change sign MACC (INT) 284 E8B2 C2B8E8 JNZ :E8B8 Then convert MACC to FPT 285 E8B5 E7 RST 4 Perform INOT 286 E8B6 6C DATA :6C 287 E8B7 C9 RET 288 * 289 E8B8 E7 L0E157 RST 4 Convert MACC to FPT 290 E8B9 4B DATA :4B 291 E8BA C9 RET 292 * 293 E8BB E7 RON44 RST 4 Change sign MACC (INT) 294 E8BC 60 DATA :60 295 E8BD C9 RET 296 * 297 E8BE FE1D RON45 CPI :1D 298 E8C0 CAC6E8 JZ :E8C6 Then change sign MACC (FPT) 299 E8C3 E7 RST 4 Convert MACC to INT 300 E8C4 48 DATA :48 301 E8C5 C9 RET 302 * 303 E8C6 E7 RON49 RST 4 Change sign MACC (FPT) 304 E8C7 1B DATA :1B 305 E8C8 C9 RET 306 * 307 * If relational numeric operation: 308 * 309 * Entry: 1st operand in MACC, 2nd operand on stack. 310 * E: Full opcode. 311 * A: Lowest 5 bits opcode. PAGE 06 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 312 * Exit: BC preserved, DEHL corrupted. 313 * 314 E8C9 E1 RON50 POP H Get pntr 2nd operand 315 E8CA BB CMP E 316 E8CB CAD6E8 JZ :E8D6 Jump if FPT 317 E8CE CD15C0 CALL :C015 Compare 2 INT numbers 318 E8D1 E1 RON55 POP H Kill returnaddr 319 E8D2 E1 POP H Kill saved DE 320 E8D3 C333E9 JMP :E933 Return logical result 321 E8D6 CD0CC0 RON60 CALL :C00C Compare 2 FPT numbers 322 E8D9 C3D1E8 JMP :E8D1 323 * 324 * MOVE OPERAND: 325 * 326 * REX.. routines return here after operation. 327 * Moves operand to proper location after computing. 328 * 329 * Entry: DE and returnaddress on stack. 330 * Exit: ABC preserved. 331 * 332 E8DC D1 RON30 POP D 333 E8DD 15 DCR D 334 E8DE 14 INR D Check D=0 (MACC free) 335 E8DF 16FF MVI D,:FF 336 E8E1 210000 LXI H,:0000 Flag 'result in MACC' 337 E8E4 C8 RZ Abort if operand in MACC 338 E8E5 212901 LXI H,:0129 Addr WORKE 339 E8E8 E7 RST 4 Copy MACC to WORKE 340 E8E9 0F DATA :0F 341 E8EA CD1BC0 CALL :C01B Restore old MACC from stack 342 E8ED C9 RET 343 * 344 * TABLE OF JUMPS TO INT/FPT OPERATOR ROUTINES: 345 * 346 E8EE E7 ROFTAB RST 4 347 E8EF 00 DATA :00 MFADD; + 348 E8F0 C9 RET 349 * 350 E8F1 E7 RST 4 351 E8F2 03 DATA :03 MFSUB; - 352 E8F3 C9 RET 353 * 354 E8F4 E7 RST 4 355 E8F5 09 DATA :09 MFDIV; / 356 E8F6 C9 RET 357 * 358 E8F7 E7 RST 4 359 E8F8 06 DATA :06 MFMUL; * 360 E8F9 C9 RET 361 * 362 E8FA E7 RST 4 363 E8FB 24 DATA :24 MPWR ; ^ 364 E8FC C9 RET 365 * 366 E8FD E7 ROITAB RST 4 367 E8FE 4E DATA :4E MIADD; + 368 E8FF C9 RET 369 * 370 E900 E7 RST 4 371 E901 51 DATA :51 MISUB; - 372 E902 C9 RET 373 * PAGE 07 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 374 E903 E7 RST 4 375 E904 57 DATA :57 MIDIV; / 376 E905 C9 RET 377 * 378 E906 E7 RST 4 379 E907 54 DATA :54 MIMUL; * 380 E908 C9 RET 381 * 382 E909 00 DATA :00 383 E90A 00 DATA :00 384 E90B 00 DATA :00 385 E90C 00 DATA :00 386 E90D 00 DATA :00 387 E90E 00 DATA :00 388 E90F 00 DATA :00 389 E910 00 DATA :00 390 E911 00 DATA :00 391 E912 00 DATA :00 392 E913 00 DATA :00 393 E914 00 DATA :00 394 E915 00 DATA :00 395 E916 00 DATA :00 396 E917 00 DATA :00 397 * 398 E918 E7 RST 4 MIAND 399 E919 63 DATA :63 400 E91A C9 RET 401 * 402 E91B E7 RST 4 MIOR 403 E91C 66 DATA :66 404 E91D C9 RET 405 * 406 E91E 00 DATA :00 407 E91F 00 DATA :00 408 E920 00 DATA :00 409 * 410 E921 E7 RST 4 MIXOR 411 E922 69 DATA :69 412 E923 C9 RET 413 * 414 E924 E7 RST 4 MSHL 415 E925 6F DATA :6F 416 E926 C9 RET 417 * 418 E927 E7 RST 4 MSHR 419 E928 72 DATA :72 420 E929 C9 RET 421 * 422 E92A E7 RST 4 MIREM 423 E92B 5A DATA :5A 424 E92C C9 RET 425 * 426 * 427 * 428 E92D END *************************** * S Y M B O L T A B L E * *************************** DROPS E7F8 L0E146 E815 L0E153 E885 L0E156 E8A7 L0E157 E8B8 REXNA E808 REXPN E819 REXPS E79D PAGE 08 DAI FIRMWARE 0E79D-0E92C V1.0 Rev.1 RFN10 E846 RFUNN E830 ROFTAB E8EE ROITAB E8FD RON10 E87D RON20 E897 RON30 E8DC RON40 E89F RON44 E8BB RON45 E8BE RON49 E8C6 RON50 E8C9 RON55 E8D1 RON60 E8D6 RONUM E850 ROS10 E7EB ROSTR E7BD RXN10 E81B RXS10 E7B3