
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
