
PAGE 01    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

002                         ORG   :E016
003                 *
004                 *
005                 *
006                 **************************
007                 * RUN basiccmd WAIT TIME *
008                 **************************
009                 *
010                 * Timer 01BE/BF is decremented by clock
011                 * interrupt RST7.
012                 *
013 E016 CDF8E6     RWTET   CALL  :E6F8     Get time to wait
014 E019 22BE01             SHLD  :01BE     Load timer
015 E01C 2ABE01     RWT40   LHLD  :01BE     Get timer
016 E01F 7C                 MOV   A,H
017 E020 B5                 ORA   L
018 E021 C8                 RZ              Abort if (timer)=0
019 E022 CDA5D6             CALL  :D6A5     Check keyb for new inputs
020 E025 D21CE0             JNC   :E01C     Again if no break pressed
021                             
022                 * If suspended:
023                             
024 E028 C312E0             JMP   :E012     Abort, 'command broken in'
025                 *
026                 ***************************************
027                 * RUN basiccmd FOR .. TO .. (STEP ..) *
028                 ***************************************
029                 *
030 E02B D1         RFOR    POP   D         Kill return addr
031 E02C CD3CE1             CALL  :E13C     Save old FRAME on stack
032 E02F CD5AE4             CALL  :E45A     Init variable
033 E032 220401             SHLD  :0104     Remember location variable
034 E035 E630               ANI   :30
035 E037 D610               SUI   :10       Set flags for var.type
036 E039 CD08E8             CALL  :E808     Eval TO expr, result in MACC
037 E03C CAA2E0             JZ    :E0A2     If INT variable
038                             
039                 * If FPT variable:
040                             
041 E03F E7                 RST   4         Subtract 'FROM'
042 E040 03                 DATA  :03
043 E041 210601             LXI   H,:0106   Get addr. LSTPF
044 E044 3600               MVI   M,:00     Default STEP implicit
045 E046 0A                 LDAX  B         Get evt. STEP val. from text
046 E047 03                 INX   B
047 E048 FEFF               CPI   :FF
048 E04A CA5FE0             JZ    :E05F     Jump if no STEP
049                             
050                 * If STEP:
051                             
052 E04D CD18C0             CALL  :C018     Save 'to-from' on stack
053 E050 34                 INR   M         Stepflag explicit
054 E051 0B                 DCX   B
055 E052 CD08E8             CALL  :E808     Stepvalue in MACC
056 E055 210701             LXI   H,:0107   Addr. LSTEP
057 E058 E7                 RST   4         Stepvalue in LSTEP
058 E059 0F                 DATA  :0F
059 E05A CD1BC0             CALL  :C01B     'to-from' range in MACC
060 E05D E7                 RST   4         Find nr of iterations
061 E05E 09                 DATA  :09
062 E05F E7         RFR10   RST   4         Make it INT
063 E060 48                 DATA  :48

PAGE 02    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

064 E061 210B01     RFR20   LXI   H,:010B   Addr. LCOUNT
065 E064 E7                 RST   4         Iterations in LCOUNT
066 E065 0F                 DATA  :0F
067 E066 7E                 MOV   A,M
068 E067 B7                 ORA   A
069 E068 FC9ECB             CM    :CB9E     Clear LCOUNT if loop in
070                                         wrong direction
071 E06B 60                 MOV   H,B       ) Current pos in start of
072 E06C 69                 MOV   L,C       ) loop in HL
073 E06D 220F01             SHLD  :010F     Set pointer to start loop
074                             
075                 * Now delete any previous use of the loop:
076                             
077 E070 011000             LXI   B,:0010   Size of 1 'FOR' stackframe
078 E073 2A0401             LHLD  :0104     Get current loop variable
079 E076 EB                 XCHG            in DE
080 E077 210000             LXI   H,:0000
081 E07A 39                 DAD   SP        Stack start
082 E07B C37FE0             JMP   :E07F     Into loop
083                             
084                 * Loop:
085                             
086 E07E 09         RFR30   DAD   B         Up 1 frame
087 E07F 7E         RFR40   MOV   A,M
088 E080 23                 INX   H
089 E081 B6                 ORA   M
090 E082 CA9FE0             JZ    :E09F     Jump if top of stack
091 E085 7E                 MOV   A,M
092 E086 2B                 DCX   H
093 E087 BA                 CMP   D         Comp top byte variable addr
094 E088 C27EE0             JNZ   :E07E     Again if not the same
095 E08B 7E                 MOV   A,M
096 E08C 93                 SUB   E
097 E08D C27EE0             JNZ   :E07E     Cont if bottombyte different
098 E090 E5                 PUSH  H         Frame bottom to be removed
099 E091 210200             LXI   H,:0002
100 E094 39                 DAD   SP        Update stackpointer
101 E095 54                 MOV   D,H       ) DE is bottom of area to be
102 E096 5D                 MOV   E,L       ) moved
103 E097 09                 DAD   B         Add 1 frame
104 E098 44                 MOV   B,H       ) Place to move area to
105 E099 4D                 MOV   C,L       )
106 E09A E1                 POP   H         Top area to move
107 E09B CD4FDE             CALL  :DE4F     Remove old frame
108 E09E F9                 SPHL            New stack position
109 E09F C314E1     RFR50   JMP   :E114     Use common mode to re-
110                                         instate textpointer
111                             
112                 * If INT variable:
113                             
114 E0A2 E7         RFR70   RST   4         Subtract 'from'
115 E0A3 51                 DATA  :51
116 E0A4 210601             LXI   H,:0106   Get addr. LSTPF
117 E0A7 3680               MVI   M,:80     Default step implicit
118 E0A9 0A                 LDAX  B         Get evt STEP value
119 E0AA 03                 INX   B
120 E0AB FEFF               CPI   :FF
121 E0AD CA61E0             JZ    :E061     If no step given
122                             
123                 * If STEP:
124                             
125 E0B0 CD18C0             CALL  :C018     Save 'to-from' on stack

PAGE 03    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

126 E0B3 34                 INR   M         Stepflag explicit
127 E0B4 0B                 DCX   B
128 E0B5 CD08E8             CALL  :E808     Get stepvalue in MACC
129 E0B8 210701             LXI   H,:0107   Addr. stepvalue if explicit
130 E0BB E7                 RST   4         Stepvalue in LSTEP
131 E0BC 0F                 DATA  :0F
132 E0BD CD1BC0             CALL  :C01B     'to-from' range in MACC
133 E0C0 E7                 RST   4         Find nr of iterations
134 E0C1 57                 DATA  :57
135 E0C2 C361E0             JMP   :E061     Handle loop
136                 *
137                 **************************************
138                 * RUN basiccmd NEXT <named variable> *
139                 **************************************
140                 *
141 E0C5 D1         RNEXI   POP   D         Returnaddr
142 E0C6 CD63E9             CALL  :E963     Get varptr in HL
143 E0C9 EB         RNX10   XCHG
144 E0CA 2A0401             LHLD  :0104     Get current loop variable
145 E0CD 7D                 MOV   A,L
146 E0CE B4                 ORA   H         Loopvariable 0?
147 E0CF CA2EDA             JZ    :DA2E     Then run error 'NEXT
148                                         WITHOUT FOR'
149 E0D2 CD14DE             CALL  :DE14     Compare loop and named
150                                         variable pntrs
151 E0D5 CAEEE0             JZ    :E0EE     Perform NEXT if identical
152 E0D8 EB                 XCHG
153 E0D9 221901             SHLD  :0119     Store in scratch area
154 E0DC CD67E1             CALL  :E167     Re-instate next loopvariable
155 E0DF 2A1901             LHLD  :0119     Get it back
156 E0E2 C3C9E0             JMP   :E0C9     Try for a match
157                 *
158                 *********************
159                 * RUN basiccmd NEXT *
160                 *********************
161                 *
162                 * No variable name is given.
163                 *
164 E0E5 D1         RNEXT   POP   D         Returnaddr
165 E0E6 2A0401             LHLD  :0104     Get current loop variable
166 E0E9 7D                 MOV   A,L
167 E0EA B4                 ORA   H         Loopvar is 0?
168 E0EB CA2EDA             JZ    :DA2E     Then run error 'NEXT
169                                         WITHOUT FOR'
170 E0EE 3A0601     RNX20   LDA   :0106     Get LSTPF
171 E0F1 B7                 ORA   A
172 E0F2 FA33E1             JM    :E133     Jump if INT loop variable
173                             
174                 * If FPT loop variable:
175                             
176 E0F5 1F                 RAR 
177 E0F6 DA1DE1             JC    :E11D     Jump if explicit step
178 E0F9 CD06C0             CALL  :C006     Incr. variable in memory
179 E0FC 210E01     RNX30   LXI   H,:010E   Addr lobyte LCOUNT
180 E0FF 7E         RNX40   MOV   A,M       Get lobyte
181 E100 D601               SUI   :01
182 E102 77                 MOV   M,A       Decr it
183 E103 D214E1             JNC   :E114     Continu if no overflow
184 E106 2B                 DCX   H         Pnts to next byte LCOUNT
185 E107 7D                 MOV   A,L
186 E108 FE0A               CPI   :0A       Hibyte done?
187 E10A C2FFE0             JNZ   :E0FF     More bytes if not

PAGE 04    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

188                             
189                 * Loop finished:
190                             
191 E10D CD67E1             CALL  :E167     Pop frame
192 E110 B7                 ORA   A         No special action
193 E111 C38FC8             JMP   :C88F     Exit to Basic monitor
194                             
195                 * More time round (entry from 'FOR'):
196                             
197 E114 2A0F01     RNX50   LHLD  :010F     Get pntr to start loop
198 E117 44                 MOV   B,H       ) in BC
199 E118 4D                 MOV   C,L       )
200 E119 B7                 ORA   A         No special action
201 E11A C38FC8             JMP   :C88F     Exit to Basic monitor
202                             
203                 * Explicit step:
204                             
205 E11D E7         RNX60   RST   4         Get value loopvar in MACC
206 E11E 0C                 DATA  :0C
207 E11F E5                 PUSH  H
208 E120 210701             LXI   H,:0107   Addr. LSTEP
209 E123 D228E1             JNC   :E128     If INT
210 E126 E7                 RST   4         FPT: add stepvalue
211 E127 00                 DATA  :00
212 E128 DA2DE1     L0E19   JC    :E12D     If FPT
213 E12B E7                 RST   4         INT: add stepvalue
214 E12C 4E                 DATA  :4E
215 E12D E1         L0E20   POP   H
216 E12E E7                 RST   4         Store new value in
217 E12F 0F                 DATA  :0F       variable
218 E130 C3FCE0             JMP   :E0FC     Test end of loop
219                             
220                 * If INT loopvariable:
221                             
222 E133 EA1DE1     RNX70   JPE   :E11D     Jump if explicit step
223 E136 CD0FC0             CALL  :C00F     Incr. variable in memory
224 E139 C3FCE0             JMP   :E0FC     Test end of loop
225                 *
226                 **************
227                 * PUSH FRAME *
228                 **************
229                 *
230                 * Several pointers are save on stack during
231                 * execution of FOR-NEXT loops.
232                 *
233 E13C D1         PUSHF   POP   D         Get addr. where to continue
234 E13D 2A0401             LHLD  :0104     Get current loop variable
235 E140 7C                 MOV   A,H
236 E141 B5                 ORA   L         Check if 0
237 E142 CA64E1             JZ    :E164     Then abort routine
238 E145 2A0F01             LHLD  :010F
239 E148 E5                 PUSH  H         Save pntr to start loop
240 E149 2A1101             LHLD  :0111
241 E14C E5                 PUSH  H         Save pntr to start loop line
242 E14D 2A0B01             LHLD  :010B
243 E150 E5                 PUSH  H         ) Save loop iteration count
244 E151 2A0D01             LHLD  :010D     ) (4 bytes)
245 E154 E5                 PUSH  H
246 E155 2A0701             LHLD  :0107
247 E158 E5                 PUSH  H         ) Save step value
248 E159 2A0901             LHLD  :0109     ) (4 bytes)
249 E15C E5                 PUSH  H

PAGE 05    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

250 E15D 3A0601             LDA   :0106
251 E160 F5                 PUSH  PSW       Save LSTPF
252 E161 2A0401             LHLD  :0104
253 E164 E5         PU1     PUSH  H         Save current loop variable
254 E165 EB                 XCHG            Addr. to continue in HL
255 E166 E9                 PCHL            Set program counter
256                 *
257                 *************
258                 * POP FRAME *
259                 *************
260                 *
261                 * Restores looppointers in RAM.
262                 *
263 E167 D1         POPF    POP   D
264 E168 E1                 POP   H
265 E169 220401             SHLD  :0104     Restore LOPVAR
266 E16C 7C                 MOV   A,H
267 E16D B5                 ORA   L         LOPVAR=0?
268 E16E CA8DE1             JZ    :E18D     Then abort routine
269 E171 F1                 POP   PSW
270 E172 320601             STA   :0106     Restore LSTPF
271 E175 E1                 POP   H         )
272 E176 220901             SHLD  :0109     ) Restore LSTEP
273 E179 E1                 POP   H         ) (4 bytes)
274 E17A 220701             SHLD  :0107
275 E17D E1                 POP   H         )
276 E17E 220D01             SHLD  :010D     ) Restore LCOUNT
277 E181 E1                 POP   H         ) (4 bytes)
278 E182 220B01             SHLD  :010B
279 E185 E1                 POP   H
280 E186 221101             SHLD  :0111     Restore LOPLN
281 E189 E1                 POP   H
282 E18A 220F01             SHLD  :010F     Restore LOPPT
283 E18D D5         PP1     PUSH  D
284 E18E C9                 RET 
285                 *
286                 **********************************
287                 * RUN basiccmds DATA - REM - IMP *
288                 **********************************
289                 *
290                 * RREM/RDATA:
291                 *    Entry: B: Points to length byte of string.
292                 *    Exit:  DEHL preserved. AF corrupted.
293                 * RIMP:
294                 *    No action.
295                 *
296                 *RREM
297 E18F 0A         RDATA   LDAX  B         Get length of string
298                             
299                 * Entry for REXPS:
300                             
301 E190 03         RRM10   INX   B         BC points to 1st char
302 E191 81                 ADD   C
303 E192 4F                 MOV   C,A       BC points to end of string
304 E193 D0                 RNC 
305 E194 04                 INR   B         If overflow: correct B
306                             
307                 * Entry for RUN IMP:
308                             
309 E195 B7         RIMP    ORA   A         No special action
310 E196 C9                 RET 
311                             

PAGE 06    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

312                 *********************
313                 * RUN basiccmd LIST *
314                 *********************
315                 *
316                 * The whole textbuffer contents is listed.
317                 *
318                 *RLIST
319 E197 3EFF       RLIS0   MVI   A,:FF     Init. mode 0
320 E199 EF                 RST   5         Change mode
321 E19A 18                 DATA  :18
322 E19B 3E0C               MVI   A,:0C
323 E19D EF                 RST   5         Clear screen
324 E19E 03                 DATA  :03
325 E19F 2A9F02     RLS05   LHLD  :029F     Get startaddr. textbuf
326 E1A2 EB                 XCHG            in DE
327 E1A3 2AA102             LHLD  :02A1     Get start symtab
328 E1A6 2B                 DCX   H         End textbuf in HL
329 E1A7 C3CFE1             JMP   :E1CF     Perform listing
330                 *
331                 **********************************
332                 * RUN basiccmd LIST <linenumber> *
333                 **********************************
334                 *
335                 * Entry: BC points to linenumber.
336                 * Exit:  BC updated. AFDEHL corrupted.
337                 *
338 E1AA CDE7E6     RLIS1   CALL  :E6E7     Read linenr and find
339                                         it in textbuf
340 E1AD 00                 NOP 
341 E1AE 54                 MOV   D,H       ) Linenr in DE
342 E1AF 5D                 MOV   E,L       )
343 E1B0 DC39DE             CC    :DE39     If linenr found: calc addr
344                                         after string in HL
345 E1B3 C3CFE1             JMP   :E1CF     Perform listing
346                 *
347                 *****************************
348                 * RUN basiccmd LIST <range> *
349                 *****************************
350                 *
351                 * Entry: BC points to 1st linenumber.
352                 * Exit:  BC updated. AFDEHL corrupted.
353                 *
354 E1B6 2A9F02     RLIS2   LHLD  :029F     Get start textbuf
355 E1B9 CDD9E6             CALL  :E6D9     Read 1st linenr
356 E1BC C4F6CA             CNZ   :CAF6     If given: Find it in textbuf
357 E1BF EB                 XCHG            Addr in DE
358 E1C0 2AA102             LHLD  :02A1     Get start symtab
359 E1C3 2B                 DCX   H         End textbuf in HL
360 E1C4 CDD9E6             CALL  :E6D9     Read 1st linenr
361 E1C7 37                 STC 
362 E1C8 3F                 CMC 
363 E1C9 C4F6CA             CNZ   :CAF6     If 1st nr found: find 2nd
364 E1CC DC39DE             CC    :DE39     If found: Calc addr after
365                                         string in HL
366                             
367                 * Perform listing:
368                             
369 E1CF C5         RLS10   PUSH  B
370 E1D0 42                 MOV   B,D       ) Start listed area in BC
371 E1D1 4B                 MOV   C,E       )
372 E1D2 221B01             SHLD  :011B     Store end listed area
373 E1D5 EB                 XCHG            also in DE

PAGE 07    DAI FIRMWARE 0E016-0E1F4  V1.0  Rev.1

374 E1D6 221901             SHLD  :0119     Store start listed area
375 E1D9 60         RLS20   MOV   H,B       ) Startaddr in HL
376 E1DA 69                 MOV   L,C       )
377 E1DB CD14DE             CALL  :DE14     Check if all lines listed
378 E1DE CAF2E1             JZ    :E1F2     Abort if ready
379 E1E1 CD73D8             CALL  :D873     List curent line if linenr
380                                         correct
381 E1E4 CDBBD6             CALL  :D6BB     Scan keyboard
382 E1E7 DAF2E1             JC    :E1F2     Break pressed: stop listing
383 E1EA 00                 NOP 
384 E1EB 00                 NOP 
385 E1EC C4DAD6             CNZ   :D6DA     If a key is pressed:
386                                         Wait for spacebar
387 E1EF D2D9E1             JNC   :E1D9     No break: list further
388                             
389                 * If ready:
390                             
391 E1F2 B7         RLS30   ORA   A         No special action
392 E1F3 C1                 POP   B
393 E1F4 C9                 RET 
394                 *
395                 *
396                 *
401 E1F5                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
L0E19  E128   L0E20  E12D   POPF   E167   PP1    E18D   
PU1    E164   PUSHF  E13C   RDATA  E18F   RFOR   E02B   
RFR10  E05F   RFR20  E061   RFR30  E07E   RFR40  E07F   
RFR50  E09F   RFR70  E0A2   RIMP   E195   RLIS0  E197   
RLIS1  E1AA   RLIS2  E1B6   RLIST  E197   RLS05  E19F   
RLS10  E1CF   RLS20  E1D9   RLS30  E1F2   RNEXI  E0C5   
RNEXT  E0E5   RNX10  E0C9   RNX20  E0EE   RNX30  E0FC   
RNX40  E0FF   RNX50  E114   RNX60  E11D   RNX70  E133   
RREM   E18F   RRM10  E190   RWT40  E01C   RWTET  E016
