
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
