PAGE 01 DAI FIRMWARE 0E92D-0EA3F V1.0 Rev.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.0 Rev.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.0 Rev.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.0 Rev.1 188 E9BE CD8FDE CALL :DE8F Multiply index by it 189 E9C1 E3 XTHL 190 E9C2 C3A2E9 JMP :E9A2 Process next subscript 191 * 192 E9C5 EB RVR30 XCHG 193 E9C6 E1 POP H Get index to array from 194 symtab 195 E9C7 F1 POP PSW Get type byte 196 E9C8 F5 PUSH PSW 197 E9C9 E630 ANI :30 Bits 5,6 only 198 E9CB FE20 CPI :20 199 E9CD 29 DAD H Add offset to element 200 E9CE CAD2E9 JZ :E9D2 201 E9D1 29 DAD H 202 E9D2 19 RVR40 DAD D Abs addr of element in HL 203 (STR: pntr to string) 204 E9D3 F1 POP PSW 205 E9D4 D1 POP D 206 E9D5 C41BC0 CNZ :C01B Evt retrieve MACC from stack 207 E9D8 C9 RET 208 * 209 **************************** 210 * EVALUATE A FUNCTION CALL * 211 **************************** 212 * 213 * Finds address of function routine in 214 * indirection table (#E9F0) and performs the 215 * function routine. 216 * 217 * Entry: BC: Points to function label (#20) 218 * in program line. 219 * Exit: MACC: Numeric result. 220 * BC updated, AFDEHL corrupted. 221 * 222 E9D9 03 RFUN INX B Pnts past label 223 E9DA 0A LDAX B Get function code 224 E9DB 03 INX B 225 E9DC 6F MOV L,A Code in HL 226 E9DD 2600 MVI H,:00 227 E9DF 11F0E9 LXI D,:E9F0 Get startaddr. table 228 E9E2 29 DAD H Code *2 229 E9E3 19 DAD D Add offset to startaddr 230 E9E4 5E MOV E,M lobyte addr in E 231 E9E5 23 INX H 232 E9E6 7E MOV A,M hibyte addr in A 233 E9E7 F680 ORI :80 Set msb = 1 234 E9E9 57 MOV D,A hibyte in D 235 E9EA BE CMP M Was it already E...? 236 E9EB D5 PUSH D Addr function on stack 237 E9EC CC08E8 CZ :E808 Then evaluate 1st num 238 expr, result in MACC 239 E9EF C9 RET Go to function routine 240 * 241 ****************************** 242 * FUNCTION INDIRECTION TABLE * 243 ****************************** 244 * 245 * Startaddress table is E9F0. The function code 246 * is given between brackets. 247 * If the msb of the address is set, the first 248 * argument is a numeric one. 249 * PAGE 05 DAI FIRMWARE 0E92D-0EA3F V1.0 Rev.1 250 * In the textbuffer, the Basic fuctions are 251 * indicated by 20 xx, (xx is function code). 252 * 253 E9F0 50EA FUNIT DBL :EA50 (00) ABS 254 E9F2 53EA DBL :EA53 (01) ALOG 255 E9F4 CB6A DBL :6ACB (02) ASC 256 E9F6 D26A DBL :6AD2 (03) CHR$ 257 E9F8 B86A DBL :6AB8 (04) CURY 258 E9FA BE6A DBL :6ABE (05) CURX 259 E9FC 56EA DBL :EA56 (06) EXP 260 E9FE 59EA DBL :EA59 (07) FRAC 261 EA00 436B DBL :6B43 (08) FRE 262 EA02 5CEB DBL :EB5C (09) FREQ 263 EA04 796B DBL :6B79 (0A) GETC 264 EA06 836A DBL :6A83 (0B) HEX$ 265 EA08 826B DBL :6B82 (0C) INP 266 EA0A 8DEB DBL :EB8D (0D) INT 267 EA0C E26A DBL :6AE2 (0E) LEFT$ 268 EA0E C46A DBL :6AC4 (0F) LEN 269 EA10 A16B DBL :6BA1 (10) VARPTR 270 EA12 5CEA DBL :EA5C (11) LOG 271 EA14 5FEA DBL :EA5F (12) LOGT 272 EA16 A76B DBL :6BA7 (13) XMAX 273 EA18 AE6B DBL :6BAE (14) YMAX 274 EA1A 0E6B DBL :6B0E (15) MID$ 275 EA1C C16B DBL :6BC1 (16) PDL 276 EA1E 166C DBL :6C16 (17) PEEK 277 EA20 1D6C DBL :6C1D (18) PI 278 EA22 FF6A DBL :6AFF (19) RIGHT$ 279 EA24 27EC DBL :EC27 (1A) RND 280 EA26 9D6C DBL :6C9D (1B) SCRN 281 EA28 7BEC DBL :EC7B (1C) SGN 282 EA2A 8C6A DBL :6A8C (1D) SPC 283 EA2C 62EA DBL :EA62 (1E) SQR 284 EA2E 77EA DBL :EA77 (1F) STR$ 285 EA30 A26A DBL :6AA2 (20) TAB 286 EA32 256B DBL :6B25 (21) VAL 287 EA34 65EA DBL :EA65 (22) SIN 288 EA36 68EA DBL :EA68 (23) COS 289 EA38 6BEA DBL :EA6B (24) TAN 290 EA3A 6EEA DBL :EA6E (25) ASIN 291 EA3C 71EA DBL :EA71 (26) ACOS 292 EA3E 74EA DBL :EA74 (27) ATN 293 * 294 * 295 * 296 EA40 END *************************** * S Y M B O L T A B L E * *************************** ERRUA E990 FUNIT E9F0 MPT45 E92D RARRN E95A 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