PAGE 01 DAI FIRMWARE 0E92D-0EA3F V1.1 002 ORG :E92D 003 * 004 * 005 * 006 ************************* 007 * LENGTH OF BLOCK IN BC * 008 ************************* 009 * 010 * Part of Run 'CLEAR' (D214). 011 * 012 E92D CD1ADE MPT45 CALL :DE1A Calc. length of block 013 E930 44 MOV B,H ) 014 E931 4D MOV C,L ) Length in BC 015 E932 C9 RET 016 * 017 ********************** 018 * EVALUATE A COMPARE * 019 ********************** 020 * 021 * Decodes flags and opcode to a truthtable. 022 * Following a XFCOMP or a XICOMP by a jump to 023 * E933 leaves FF (true) or 00 (false) in A as 024 * result. 025 * 026 * Entry: E: Opcode. 027 * F: Flags. 028 * Exit: BCDEF preserved, HL corrupted. 029 * A: Truth value. 030 * 031 E933 F5 ROREL PUSH PSW Save flags 032 E934 7B MOV A,E ) 033 E935 E60F ANI :0F ) Calc offset 034 E937 87 ADD A ) 035 E938 87 ADD A ) 036 E939 2143E9 LXI H,:E943 Base addr 037 E93C CD30DE CALL :DE30 Add offset to base 038 E93F F1 POP PSW Restore flags 039 E940 3EFF MVI A,:FF Init truth value 040 E942 E9 PCHL Goto routine 041 * 042 E943 F0 ROGEQ RP FF if MACC >= M 043 E944 C358E9 JMP :E958 (S=0) 044 * 045 E947 FA58E9 ROGT JM :E958 FF if MACC > M 046 E94A 00 NOP (S=0 and Z=0) 047 * 048 E94B C0 RONEQ RNZ FF if MACC <> M 049 E94C C358E9 JMP :E958 (Z=0) 050 * 051 E94F C8 ROLEQ RZ FF if MACC <= M 052 E950 00 NOP (S=1 or Z=1) 053 E951 00 NOP 054 E952 00 NOP 055 * 056 E953 F8 ROLT RM FF if MACC < M 057 E954 C358E9 JMP :E958 (S=1) 058 * 059 E957 C8 ROEQ RZ FF if MACC = M 060 (Z=1) 061 * 062 E958 2F RFALSE CMA 00 if condition false 063 E959 C9 RET PAGE 02 DAI FIRMWARE 0E92D-0EA3F V1.1 064 * 065 **************************** 066 * RUN A VARIABLE REFERENCE * 067 **************************** 068 * 069 * Produces a pointer to the value of a variable. 070 * The variable may be simple or subscripted and 071 * of any type. If subscripted, subscripts are 072 * evaluated and checked for range. 073 * 074 * Entry: BC: Points to encoded variable. 075 * D: 0 if MACC free. 076 * Exit: BC updated, DE preserved, F corrupted. 077 * HL: Points to variable storage. 078 * A: Type of variable from symbol table. 079 * 080 E95A D5 RARRN PUSH D 081 E95B AF XRA A Array name only 082 * 083 E95C 1600 RVREN MVI D,:00 084 E95E C33DD7 JMP :D73D Run varptr 085 * 086 E961 FF DATA :FF 087 E962 FF DATA :FF 088 * 089 ************************************* 090 * RUN VARPTR (ARRAY WITH ARGUMENTS) * 091 ************************************* 092 * 093 * Runs a varptr with A=FF, D=0. 094 * 095 * Exit: BC updated, DE preserved, MACC corrupted. 096 * HL: Varptr. 097 * A: T/L byte. 098 * 099 E963 D5 RVAR PUSH D 100 E964 3EFF MVI A,:FF Set mask for arrays (not 101 name only) 102 E966 C35CE9 JMP :E95C Run varptr 103 * 104 E969 FF DATA :FF 105 E96A FF DATA :FF 106 * 107 ************************** 108 * RUN A VARIABLE POINTER * 109 ************************** 110 * 111 * RVARE: Entry for arrays. 112 * RVR05: 'Normal' entry. 113 * 114 * Entry: BC: Points to var.reference in program. 115 * A: Mask. 116 * D: 0 if MACC free. 117 * Exit: HL: Varptr (for strings: stringpntr). 118 * A: T/L of symtab. 119 * BC updated, DE preserved. 120 * 121 E96B 3EFF RVARE MVI A,:FF Not array name only 122 E96D F5 RVR05 PUSH PSW 123 E96E D5 PUSH D 124 E96F 0A LDAX B ) 125 E970 03 INX B ) PAGE 03 DAI FIRMWARE 0E92D-0EA3F V1.1 126 E971 E63F ANI :3F ) Get offset in symtab 127 E973 57 MOV D,A ) in DE 128 E974 0A LDAX B ) 129 E975 03 INX B ) 130 E976 5F MOV E,A ) 131 E977 2AA102 LHLD :02A1 Get start symtab 132 E97A 19 DAD D HL pnts to actual addr 133 in symtab 134 E97B D1 POP D 135 E97C F1 POP PSW Restore mask 136 E97D A6 ANA M And with T/L byte 137 E97E E640 ANI :40 Bit 6 only 138 E980 7E MOV A,M 139 E981 23 INX H 140 E982 C8 RZ Abort if simple variable or 141 array name only 142 143 * Compute actual position in array: 144 145 E983 15 DCR D 146 E984 14 INR D Check D=0: MACC free 147 E985 C418C0 CNZ :C018 Save MACC on stack if not 148 E988 D5 PUSH D 149 E989 F5 PUSH PSW 150 E98A 5E MOV E,M ) Get pntr from symtab 151 E98B 23 INX H ) in DE 152 E98C 56 MOV D,M ) 153 E98D 23 INX H 154 E98E 7A MOV A,D ) Check if undimensioned 155 E98F B3 ORA E ) 156 E990 3E0F ERRUA MVI A,:0F Then run error 157 E992 CAF5D9 JZ :D9F5 'UNDEFINED ARRAY' 158 E995 D5 PUSH D 159 E996 210000 LXI H,:0000 Init index 160 E999 E3 XTHL Pntr to array in HL 161 E99A 0A LDAX B Get nr of subscripts 162 E99B 03 INX B 163 E99C 57 MOV D,A in D 164 E99D BE CMP M Comp. with nr of dimensions 165 E99E 23 INX H 166 E99F C229DA JNZ :DA29 Run 'SUBSCRIPT ERROR' if 167 not identical 168 E9A2 CD4FE7 RVR10 CALL :E74F Get variable type in A 169 E9A5 BE RVR15 CMP M 170 E9A6 DAB1E9 JC :E9B1 If value in A is offset 171 E9A9 CAB1E9 JZ :E9B1 172 E9AC 3E05 MVI A,:05 If subscript <0 or >FF: 173 E9AE C3F5D9 JMP :D9F5 Run 'SUBSCRIPT ERROR' 174 175 * Calc reference to Nth array element 176 * via (a1*(d2+1)+a2*(d3+1)+..+aN). aN 177 * is argument, dN is dimension: 178 179 E9B1 E3 RVR20 XTHL Restore HL=00 180 E9B2 CD30DE CALL :DE30 Add offset to index 181 E9B5 15 DCR D decr nr of arguments 182 E9B6 E3 XTHL 183 E9B7 23 INX H 184 E9B8 CAC5E9 JZ :E9C5 If no more subscipts 185 E9BB 7E MOV A,M Next dimension 186 E9BC 3C INR A 187 E9BD E3 XTHL PAGE 04 DAI FIRMWARE 0E92D-0EA3F V1.1 188 * 189 ************************** 190 * RUN A VARIABLE POINTER * 191 ************************** 192 * 193 * This enables the use of DIM (255,255). In V1.0, 194 * the max. dimension was 254. 195 * 196 E9BE CDF0ED CALL :EDF0 ] Another calculation 197 routine is used 198 E9C1 E3 XTHL 199 E9C2 C3A2E9 JMP :E9A2 Process next subscript 200 * 201 E9C5 EB RVR30 XCHG 202 E9C6 E1 POP H Get index to array from 203 symtab 204 E9C7 F1 POP PSW Get type byte 205 E9C8 F5 PUSH PSW 206 E9C9 E630 ANI :30 Bits 5,6 only 207 E9CB FE20 CPI :20 208 E9CD 29 DAD H Add offset to element 209 E9CE CAD2E9 JZ :E9D2 210 E9D1 29 DAD H 211 E9D2 19 RVR40 DAD D Abs addr of element in HL 212 (STR: pntr to string) 213 E9D3 F1 POP PSW 214 E9D4 D1 POP D 215 E9D5 C41BC0 CNZ :C01B Evt retrieve MACC from stack 216 E9D8 C9 RET 217 * 218 **************************** 219 * EVALUATE A FUNCTION CALL * 220 **************************** 221 * 222 * Finds address of function routine in 223 * indirection table (#E9F0) and performs the 224 * function routine. 225 * 226 * Entry: BC: Points to function label (#20) 227 * in program line. 228 * Exit: MACC: Numeric result. 229 * BC updated, AFDEHL corrupted. 230 * 231 E9D9 03 RFUN INX B Pnts past label 232 E9DA 0A LDAX B Get function code 233 E9DB 03 INX B 234 E9DC 6F MOV L,A Code in HL 235 E9DD 2600 MVI H,:00 236 E9DF 11F0E9 LXI D,:E9F0 Get startaddr. table 237 E9E2 29 DAD H Code *2 238 E9E3 19 DAD D Add offset to startaddr 239 E9E4 5E MOV E,M lobyte addr in E 240 E9E5 23 INX H 241 E9E6 7E MOV A,M hibyte addr in A 242 E9E7 F680 ORI :80 Set msb = 1 243 E9E9 57 MOV D,A hibyte in D 244 E9EA BE CMP M Was it already E...? 245 E9EB D5 PUSH D Addr function on stack 246 E9EC CC08E8 CZ :E808 Then evaluate 1st num 247 expr, result in MACC 248 E9EF C9 RET Go to function routine 249 * PAGE 05 DAI FIRMWARE 0E92D-0EA3F V1.1 250 ****************************** 251 * FUNCTION INDIRECTION TABLE * 252 ****************************** 253 * 254 * Startaddress table is E9F0. The function code 255 * is given between brackets. 256 * If the msb of the address is set, the first 257 * argument is a numeric one. 258 * 259 * In the textbuffer, the Basic fuctions are 260 * indicated by 20 xx, (xx is function code). 261 * 262 E9F0 50EA FUNIT DBL :EA50 (00) ABS 263 E9F2 53EA DBL :EA53 (01) ALOG 264 E9F4 CB6A DBL :6ACB (02) ASC 265 E9F6 D26A DBL :6AD2 (03) CHR$ 266 E9F8 B86A DBL :6AB8 (04) CURY 267 E9FA BE6A DBL :6ABE (05) CURX 268 E9FC 56EA DBL :EA56 (06) EXP 269 E9FE 59EA DBL :EA59 (07) FRAC 270 EA00 436B DBL :6B43 (08) FRE 271 EA02 5CEB DBL :EB5C (09) FREQ 272 EA04 756B DBL :6B75 (0A) GETC 273 EA06 836A DBL :6A83 (0B) HEX$ 274 EA08 826B DBL :6B82 (0C) INP 275 EA0A 8DEB DBL :EB8D (0D) INT 276 EA0C E26A DBL :6AE2 (0E) LEFT$ 277 EA0E C46A DBL :6AC4 (0F) LEN 278 EA10 A16B DBL :6BA1 (10) VARPTR 279 EA12 5CEA DBL :EA5C (11) LOG 280 EA14 5FEA DBL :EA5F (12) LOGT 281 EA16 A76B DBL :6BA7 (13) XMAX 282 EA18 AE6B DBL :6BAE (14) YMAX 283 EA1A 0E6B DBL :6B0E (15) MID$ 284 EA1C C16B DBL :6BC1 (16) PDL 285 EA1E 166C DBL :6C16 (17) PEEK 286 EA20 1D6C DBL :6C1D (18) PI 287 EA22 FF6A DBL :6AFF (19) RIGHT$ 288 EA24 27EC DBL :EC27 (1A) RND 289 EA26 9D6C DBL :6C9D (1B) SCRN 290 EA28 7BEC DBL :EC7B (1C) SGN 291 EA2A 8C6A DBL :6A8C (1D) SPC 292 EA2C 62EA DBL :EA62 (1E) SQR 293 EA2E 77EA DBL :EA77 (1F) STR$ 294 EA30 A26A DBL :6AA2 (20) TAB 295 EA32 256B DBL :6B25 (21) VAL 296 EA34 65EA DBL :EA65 (22) SIN 297 EA36 68EA DBL :EA68 (23) COS 298 EA38 6BEA DBL :EA6B (24) TAN 299 EA3A 6EEA DBL :EA6E (25) ASIN 300 EA3C 71EA DBL :EA71 (26) ACOS 301 EA3E 74EA DBL :EA74 (27) ATN 302 * 303 * 304 * 305 EA40 END *************************** * S Y M B O L T A B L E * *************************** ERRUA E990 FUNIT E9F0 MPT45 E92D RARRN E95A PAGE 06 DAI FIRMWARE 0E92D-0EA3F V1.1 RFALSE E958 RFUN E9D9 ROEQ E957 ROGEQ E943 ROGT E947 ROLEQ E94F ROLT E953 RONEQ E94B ROREL E933 RVAR E963 RVARE E96B RVR05 E96D RVR10 E9A2 RVR15 E9A5 RVR20 E9B1 RVR30 E9C5 RVR40 E9D2 RVREN E95C