
PAGE 01    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

002                         ORG   :E401
003                 *
004                 *
005                 *
006                 ************************
007                 * RUN basiccmd RESTORE *
008                 ************************
009                 *
010 E401 2A9F02     RREST   LHLD  :029F     Get startaddr. textbuf
011 E404 222401             SHLD  :0124     Store it in DATAP
012 E407 AF                 XRA   A
013 E408 3D                 DCR   A
014 E409 C352E4             JMP   :E452     Set DATAQ=FF
015                 *
016                 *****************
017                 * RUN RANDOMISE *
018                 *****************
019                 *
020                 * Returns a hardware random number 0 < R < 1.
021                 *
022                 * Exit: BC preserved. AFDEHL corrupted.
023                 *       Result in MACC.
024                 *
025 E40C C5         RRAND   PUSH  B
026 E40D 2100FD             LXI   H,:FD00   Addr PORI
027 E410 CD5FD6             CALL  :D65F     BC=0, E=0, #40 or #80
028 E413 1601               MVI   D,:01
029                 *
030 E415 3A9302     RMI10   LDA   :0293     Get RNDLY (0 by C72E)
031 E418 CD58D6             CALL  :D658     Delay, A=M XOR E
032 E41B 07                 RLC 
033 E41C 07                 RLC 
034                             
035                 * Now CY is 0 if E=#40 and CY = bit 6 of FD00
036                 * (hardware random) if E=0 or E=#80.
037                             
038 E41D 7A         RMI20   MOV   A,D
039 E41E 17                 RAL             RAL D
040 E41F 57                 MOV   D,A
041 E420 79                 MOV   A,C
042 E421 17                 RAL             RAL C
043 E422 4F                 MOV   C,A
044 E423 78                 MOV   A,B
045 E424 17                 RAL             RAL B
046 E425 47                 MOV   B,A
047 E426 B7                 ORA   A
048 E427 F215E4             JP    :E415     Again if B<#80 (must be
049                                         normalised FPT nr)
050                             
051                 * Result in MACC:
052                             
053 E42A 3E01               MVI   A,:01     Set exp.byte for 1 < R < 2
054 E42C E7                 RST   4         Copy A,B,C,D to MACC
055 E42D 12                 DATA  :12
056 E42E 21F1D0             LXI   H,:D0F1   Addr FPT(-1)
057 E431 E7                 RST   4         Add -1 to MACC
058 E432 00                 DATA  :00       Now: 0 < R < 1
059 E433 C1                 POP   B
060 E434 B7                 ORA   A         No special action
061 E435 C9                 RET 
062                 *
063                 *

PAGE 02    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

064                 ******************
065                 * cont. of 0E3DC *
066                 ******************
067                 *
068 E436 23         MPT36   INX   H
069 E437 7E                 MOV   A,M       Get length dataline
070 E438 323401             STA   :0134     Store it in EFECT
071 E43B 23                 INX   H         Pnts to start data bytes
072 E43C 223201             SHLD  :0132     Startaddr string in EFEPT
073 E43F 00                 NOP 
074 E440 00                 NOP 
075 E441 E1                 POP   H
076 E442 D1                 POP   D
077 E443 1E00               MVI   E,:00
078 E445 F1                 POP   PSW
079 E446 C9                 RET 
080                 *
081                 **************************
082                 * PREPARE GETTING INPUTS *
083                 **************************
084                 *
085 E447 221D01     MPT5A   SHLD  :011D     Store SP+2 in ERSSP
086 E44A 3EFF               MVI   A,:FF
087 E44C 321701             STA   :0117     Set flag for running inputs
088 E44F C3D0E3             JMP   :E3D0     Print '?', input a textline
089                 *
090                 ******************
091                 * cont. of 0E401 *
092                 ******************
093                 *
094 E452 322301     MPT32   STA   :0123     Save offset next char to
095 E455 C9                 RET             encode
096                 *
097 E456 FF                 DATA  :FF
098 E457 FF                 DATA  :FF
099 E458 FF                 DATA  :FF
100 E459 FF                 DATA  :FF
101                 *
102                 ********************
103                 * RUN basiccmd LET *
104                 ********************
105                 *
106                 * Valid as direct command or in program. Computes
107                 * variable pointer or variable reference and
108                 * checks type. 'LET' can be explicitly or
109                 * implicitly given.
110                 *
111                 * Entry: BC: Points to program line.
112                 * Exit:  BC: Updated.
113                 *        A:  Type of variable.
114                 *        FDEHL corrupted.
115                 *
116                 *RLETX
117 E45A CD63E9     RLETI   CALL  :E963     Get varptr in HL, T/L in A
118 E45D E630               ANI   :30       Type only
119 E45F F5                 PUSH  PSW       Save type
120 E460 FE20               CPI   :20       String type?
121 E462 C294E4             JNZ   :E494     Jump if INT/FPT
122                             
123                 * If string type:
124                             
125 E465 E5         RLT10   PUSH  H         Save varptr

PAGE 03    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

126 E466 7E                 MOV   A,M       )
127 E467 23                 INX   H         )
128 E468 66                 MOV   H,M       ) Addr string in HL
129 E469 6F                 MOV   L,A
130 E46A E3                 XTHL            ) Save stringaddr
131 E46B E5                 PUSH  H         ) and varptr
132 E46C CD9DE7             CALL  :E79D     Get value being assigned
133 E46F 7B                 MOV   A,E       Get status
134 E470 FE02               CPI   :02
135 E472 CA7FE4             JZ    :E47F     Jump if temp on heap
136 E475 7E                 MOV   A,M       Get string length
137 E476 EB                 XCHG
138 E477 CD8BD1             CALL  :D18B     Get place in heap for string
139 E47A E5                 PUSH  H
140 E47B CD72D1             CALL  :D172     Transfer string into heap
141 E47E E1                 POP   H
142 E47F EB         RLT20   XCHG            Pntr to string in DE
143 E480 E1                 POP   H         Pntr to variable in HL
144 E481 73                 MOV   M,E       ) Stringpntr in variable
145 E482 23                 INX   H         )
146 E483 72                 MOV   M,D       )
147                             
148                 * Entry from scratch:
149                             
150 E484 2A9F02     RLT25   LHLD  :029F     Get startaddr. textbuf
151 E487 EB                 XCHG            in DE
152 E488 E1                 POP   H         Get pntr old value
153 E489 7C                 MOV   A,H
154 E48A B5                 ORA   L
155 E48B C414DE             CNZ   :DE14     If <>0: Test if on heap
156 E48E DC87D1             CC    :D187     Then clear string in heap
157 E491 C3B2E4             JMP   :E4B2     Ready
158                             
159                 * If FPT/INT type:
160                             
161 E494 E5         RLT30   PUSH  H
162 E495 CD19E8             CALL  :E819     Eval numeric arguments
163 E498 7C                 MOV   A,H
164 E499 B5                 ORA   L
165 E49A C2A3E4             JNZ   :E4A3     Copy num expr if not in MACC
166 E49D E1                 POP   H
167 E49E E7                 RST   4         Copy MACC to variable
168 E49F 0F                 DATA  :0F
169 E4A0 C3B2E4             JMP   :E4B2     Ready
170                             
171                 * If just constant or variable:
172                             
173 E4A3 D1         RLT50   POP   D         Get pntr to variable
174 E4A4 D5                 PUSH  D
175 E4A5 C5                 PUSH  B
176 E4A6 0604               MVI   B,:04     Nr of bytes
177 E4A8 7E         RLT60   MOV   A,M       Get byte
178 E4A9 12                 STAX  D         Store it in variable
179 E4AA 23                 INX   H
180 E4AB 13                 INX   D
181 E4AC 05                 DCR   B         Decr byte count
182 E4AD C2A8E4             JNZ   :E4A8     Next byte if not ready
183 E4B0 C1                 POP   B
184 E4B1 E1                 POP   H
185                             
186                 * Ready:
187                             

PAGE 04    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

188 E4B2 F1         RLT90   POP   PSW
189 E4B3 C9                 RET 
190                             
191                 * Entry from READ/INPUT for FPT/INT:
192                             
193 E4B4 F5         RLT70   PUSH  PSW
194 E4B5 C394E4             JMP   :E494     Value to variable
195                             
196                 * Entry from READ/INPUT for STR:
197                             
198 E4B8 F5         RLT80   PUSH  PSW
199 E4B9 C365E4             JMP   :E465     Stringvalue to variable
200                 *
201                 **********************
202                 * RUN basiccmd SOUND *
203                 **********************
204                 *
205                 * Formats: SOUND <CHAN><ENV><VOL><TG><FREQ>.
206                 *          SOUND <CHAN> OFF.
207                 *          SOUND OFF.
208                 *
209                 * Entry: BC: Points to program line.
210                 * Exit:  BC updated, AFDEHL corrupted.
211                 *
212 E4BC 0A         RSOUND  LDAX  B         Get 1st expr.
213 E4BD FEFF               CPI   :FF       Is it sound OFF?
214 E4BF CA01E5             JZ    :E501     Then turn all sound off
215 E4C2 3E02               MVI   A,:02
216 E4C4 CD43E7             CALL  :E743     Get channelnr (0,1,2)
217 E4C7 21C201             LXI   H,:01C2   Startaddr SCB0
218 E4CA 110E00             LXI   D,:000E   Length SCB
219 E4CD F5                 PUSH  PSW       Save channelnr
220 E4CE 3D         SND10   DCR   A
221 E4CF FAD6E4             JM    :E4D6     If chan.0 or ready
222 E4D2 19                 DAD   D         Absolute addr SCB in HL
223 E4D3 C3CEE4             JMP   :E4CE     If chan.2
224 E4D6 D1         SND20   POP   D         Channelnr in D
225 E4D7 CD1FE5             CALL  :E51F     Set up SCB <ENV><VOL>
226 E4DA DAFCE4             JC    :E4FC     If channel to be OFF
227 E4DD 3E03               MVI   A,:03
228 E4DF CD43E7             CALL  :E743     Get <TG>
229 E4E2 F5                 PUSH  PSW
230 E4E3 E601               ANI   :01       Tremoloflag only
231 E4E5 77                 MOV   M,A       Into SCB
232 E4E6 23                 INX   H
233 E4E7 00                 NOP 
234 E4E8 00                 NOP 
235 E4E9 F1                 POP   PSW       Restore <TG>
236 E4EA E602               ANI   :02       Glissandoflag only
237 E4EC 1F                 RAR 
238 E4ED 3C                 INR   A
239 E4EE 23                 INX   H         1 free byte
240 E4EF 77                 MOV   M,A       Glissandoflag in SCB
241 E4F0 23                 INX   H         )
242 E4F1 23                 INX   H         ) Ignore current period
243 E4F2 23                 INX   H         )
244 E4F3 E5                 PUSH  H         Save pntr to reqd period
245 E4F4 CDF8E6             CALL  :E6F8     Get <period>
246 E4F7 EB                 XCHG            in DE
247 E4F8 E1                 POP   H
248 E4F9 73                 MOV   M,E       ) Reqd period in SCB
249 E4FA 23                 INX   H         )

PAGE 05    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

250 E4FB 72                 MOV   M,D       )
251 E4FC CD96D9     SND70   CALL  :D996     Enable sound interrupts
252 E4FF B7                 ORA   A         No special action
253 E500 C9                 RET 
254                             
255                 * If SOUND OFF:
256                             
257 E501 03         SND80   INX   B
258 E502 CD8FD9             CALL  :D98F     Disable sound interrupts
259 E505 C5                 PUSH  B
260 E506 CDA6D8             CALL  :D8A6     Stop oscillators
261 E509 C1                 POP   B
262 E50A B7                 ORA   A         No special action
263 E50B C9                 RET 
264                 *
265                 **********************
266                 * RUN basiccmd NOISE *
267                 **********************
268                 *
269                 * Sets up a noise control block.
270                 * Formats: NOISE <ENV><VOL>.
271                 *          NOISE OFF.
272                 *
273                 * Entry: BC: Points to expression.
274                 * Exit:  Noise off: BC updated, DE preserved,
275                 *                   AFHL corrupted.
276                 *        Noise on:  BC updated, AFDEHL corrupted.
277                 *
278 E50C 21EC01     RNOISE  LXI   H,:01EC   Startaddr NCB
279 E50F 1603               MVI   D,:03     Channelnr.3
280 E511 CD1FE5             CALL  :E51F     Set up NCB
281 E514 DAFCE4             JC    :E4FC     If channel to be off
282 E517 3600               MVI   M,:00     No tremolo
283 E519 23                 INX   H
284 E51A 3600               MVI   M,:00     Current volume = 0
285 E51C C3FCE4             JMP   :E4FC     Enable sound interrupts
286                 *
287                 ****************
288                 * SET ENVELOPE *
289                 ****************
290                 *
291                 * Sets up a sound or noise control block for
292                 * a channel.
293                 *
294                 * Entry: D:  Channelnumber (0,1,2 or 3).
295                 *        BC: Points to programline.
296                 *        HL: Points to startaddr SCB/NCB.
297                 * Exit:  If sound/noise off (CY=1):
298                 *        FF in 1st byte of SCB/NCB.
299                 *            HL: points to 1st byte SCB/NCB.
300                 *            BC: points to 2nd byte SCB/NCB.
301                 *            DE preserved, AF corrupted.
302                 *        If sound/noise on (CY=0):
303                 *        00 in 1st byte SCB/NCB.
304                 *            HL: Points after free byte.
305                 *            DE: Envelopeaddr +1.
306                 *            BC: Points beyond volume.
307                 *            AF: corrupted.
308                 *
309 E51F CD8FD9     SNGEV   CALL  :D98F     Disable sound interrupts
310 E522 3600               MVI   M,:00     00 in 1st byte SCB/NCB
311 E524 0A                 LDAX  B         Get 1st byte from progr.line

PAGE 06    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

312 E525 FEFF               CPI   :FF
313 E527 CA52E5             JZ    :E552     Jump if channel to be off
314                             
315                 * If channel on:
316                             
317 E52A 23                 INX   H         Pntr to next byte of block
318 E52B E5                 PUSH  H         Save pntr
319 E52C 3E01               MVI   A,:01
320 E52E CD43E7             CALL  :E743     Get envelopenr in A (0,1)
321 E531 21F501             LXI   H,:01F5   Addr envelope area
322 E534 0F                 RRC 
323 E535 0F                 RRC 
324 E536 5F                 MOV   E,A       DE=64*A
325 E537 1600               MVI   D,:00
326 E539 19                 DAD   D         Add offset for env area
327 E53A EB                 XCHG            Pntr to envelope in DE
328 E53B E1                 POP   H         Get input pntr SCB/NCB
329 E53C 73                 MOV   M,E       ) Envelope addr in block
330 E53D 23                 INX   H         )
331 E53E 72                 MOV   M,D       )
332 E53F 23                 INX   H
333 E540 13                 INX   D
334 E541 73                 MOV   M,E       ) Env addr +1 in block
335 E542 23                 INX   H         )
336 E543 72                 MOV   M,D       )
337 E544 23                 INX   H
338 E545 3E0F               MVI   A,:0F
339 E547 CD43E7             CALL  :E743     Get volume multiplier in
340                                         A (0-15)
341 E54A 07                 RLC             )
342 E54B 07                 RLC             ) *8
343 E54C 07                 RLC             )
344 E54D 77                 MOV   M,A       Vol.*8 in block
345 E54E 23                 INX   H         Pntr to basic volume
346 E54F 23                 INX   H         Pntr to tremoloflag
347 E550 B7                 ORA   A         Return 'channel on'
348 E551 C9                 RET 
349                             
350                 * If channel to be off:
351                             
352 E552 03         SNG10   INX   B
353 E553 35                 DCR   M         FF in 1st byte SCB/NCB
354 E554 7A                 MOV   A,D       Get channelnr
355 E555 FE03               CPI   :03
356 E557 CA63E5             JZ    :E563     Jump if noisechannel
357 E55A 0F                 RRC             ) Find disable data for
358 E55B 0F                 RRC             ) chan. 0-2
359 E55C F636               ORI   :36       )
360 E55E 3206FC             STA   :FC06     Load sound cmd word
361 E561 37                 STC             Return 'channel off'
362 E562 C9                 RET 
363                             
364                 * If noise to be off:
365                             
366 E563 3A9502     SNG20   LDA   :0295     Get volume osc.2 + noise
367 E566 E60F               ANI   :0F       Vol. noise = 0
368 E568 329502             STA   :0295     Update POR1M
369 E56B 3205FD             STA   :FD05     and POR1
370 E56E 37                 STC             Return 'channel off'
371 E56F C9                 RET 
372                 *
373                 *

PAGE 07    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

374                 *************************
375                 * RUN basiccmd ENVELOPE *
376                 *************************
377                 *
378                 * Load envelope table 0 or 1 with data.
379                 * Formats: ENVELOPE <ENV> (<V>,<T>;) <V>,<T> FF.
380                 *          ENVELOPE <ENV> (<V>,<T>;) <V>.
381                 *
382 E570 3E01       RENV    MVI   A,:01
383 E572 CD43E7             CALL  :E743     Get envelope number (0,1)
384 E575 0F                 RRC 
385 E576 0F                 RRC 
386 E577 5F                 MOV   E,A       ) Offset for env addr
387 E578 1600               MVI   D,:00     )
388 E57A 21F501             LXI   H,:01F5   Addr env storage area
389 E57D 19                 DAD   D         Startaddr table in HL
390 E57E 3600               MVI   M,:00     00 in 1st field
391 E580 23                 INX   H
392 E581 0A                 LDAX  B         Get length of expr
393 E582 03                 INX   B
394 E583 3C                 INR   A
395 E584 57                 MOV   D,A       Nr of complete entries in D
396 E585 15         REN10   DCR   D
397 E586 CA9DE5             JZ    :E59D     If all entries done
398 E589 3E10               MVI   A,:10
399 E58B CD43E7             CALL  :E743     Get volume (0-16)
400 E58E 77                 MOV   M,A       Into env table
401 E58F 23                 INX   H
402 E590 CD1DE7             CALL  :E71D     Get time
403 E593 D601               SUI   :01       Min. value is 1
404 E595 DA15DA             JC    :DA15     Run error 'NUMBER OUT OF
405                                         RANGE' if time=0
406 E598 77                 MOV   M,A       Time into env table
407 E599 23                 INX   H
408 E59A C385E5             JMP   :E585     Next <V>,<T>
409 E59D 36FF       REN15   MVI   M,:FF     FF as last in env table
410 E59F 0A                 LDAX  B         Get last expr
411 E5A0 03                 INX   B
412 E5A1 FEFF               CPI   :FF       End marker?
413 E5A3 CAB0E5             JZ    :E5B0     Then quit
414 E5A6 0B                 DCX   B
415 E5A7 3E10               MVI   A,:10
416 E5A9 CD43E7             CALL  :E743     Get final volume <V>
417 E5AC 77                 MOV   M,A       <V> into env table
418 E5AD 23                 INX   H
419 E5AE 36FF               MVI   M,:FF     Time = forever
420 E5B0 B7         REN20   ORA   A         No special action
421 E5B1 C9                 RET 
422                 *
423                 ***********************
424                 * RUN basiccmd CURSOR *
425                 ***********************
426                 *
427 E5B2 CDF3E5     RCURS   CALL  :E5F3     Evaluate coordinate
428 E5B5 67                 MOV   H,A       Y-coord in H
429 E5B6 EF                 RST   5         Set cursor position
430 E5B7 09                 DATA  :09
431 E5B8 C3C9E5             JMP   :E5C9     Evt run screen error
432                 *
433                 *********************
434                 * RUN basiccmd MODE *
435                 *********************

PAGE 08    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

436                 *
437                 * Entry: BC: Points to program line.
438                 *
439 E5BB 0A         RMODE   LDAX  B         Get reqd mode in A
440 E5BC 03                 INX   B
441 E5BD C3B5CE             JMP   :CEB5     Change screen mode
442                 *
443 E5C0 C9         L0E99   RET 
444                 *
445                 ********************
446                 * RUN basiccmd DOT *
447                 ********************
448                 *
449 E5C1 CDF9E5     RDOT    CALL  :E5F9     Eval dot addr + colour
450 E5C4 C5                 PUSH  B
451 E5C5 4B                 MOV   C,E       Colour in C
452 E5C6 EF                 RST   5         Draw dot on screen
453 E5C7 1E                 DATA  :1E
454 E5C8 C1         RDT10   POP   B
455 E5C9 DA02E6     RDT20   JC    :E602     Jump if screen error
456 E5CC B7                 ORA   A         No special action
457 E5CD C9                 RET 
458                 *
459                 *********************
460                 * RUN basiccmd DRAW *
461                 *********************
462                 *
463 E5CE CDE0E5     RDRAW   CALL  :E5E0     Eval begin/end addr +
464                                         colour
465 E5D1 E3                 XTHL
466 E5D2 EF                 RST   5         Draw a line on screen
467 E5D3 21                 DATA  :21
468 E5D4 C3C8E5             JMP   :E5C8     Evt. run screen error
469                 *
470                 *********************
471                 * RUN basiccmd FILL *
472                 *********************
473                 *
474 E5D7 CDE0E5     RFILL   CALL  :E5E0     Eval coordinates, colour
475 E5DA E3                 XTHL
476 E5DB EF                 RST   5         Fill a rectangular area
477 E5DC 24                 DATA  :24
478 E5DD C3C8E5             JMP   :E5C8     Evt run screen error
479                 *
480                 ***********************************
481                 * EVALUATE 2 COORDINATES + COLOUR *
482                 ***********************************
483                 *
484 E5E0 CDF3E5     R2COC   CALL  :E5F3     Get 1st coordinate
485 E5E3 E3                 XTHL            X-coord on stack
486 E5E4 E5                 PUSH  H
487 E5E5 5F                 MOV   E,A       Y-coord in E
488 E5E6 CDF3E5             CALL  :E5F3     Get 2nd coordinate,
489                                         x-coord in HL
490 E5E9 57                 MOV   D,A       Y-coord in D
491 E5EA CDFDE5             CALL  :E5FD     Get colour in A
492 E5ED C5                 PUSH  B
493 E5EE D5                 PUSH  D
494 E5EF EB                 XCHG
495 E5F0 C1                 POP   B
496 E5F1 E1                 POP   H
497 E5F2 C9                 RET 

PAGE 09    DAI FIRMWARE 0E401-0E601  V1.0  Rev.1

498                 *
499                 ***********************
500                 * EVALUATE COORDINATE *
501                 ***********************
502                 *
503 E5F3 CDF8E6     RCOOR   CALL  :E6F8     Get x-coord in HL
504 E5F6 C31DE7             JMP   :E71D     Get y-coord in A
505                 *
506                 ********************************
507                 * EVALUATE COORDINATE + COLOUR *
508                 ********************************
509                 *
510 E5F9 CDF3E5     RCOCO   CALL  :E5F3     Get x-coord in HL
511 E5FC 5F                 MOV   E,A       Y-coord in E
512 E5FD 3E17       RCOL    MVI   A,:17
513 E5FF C343E7             JMP   :E743     Get colour (0-23) in A
514                 *
515                 *
516                 *
520 E602                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
L0E99  E5C0   MPT32  E452   MPT36  E436   MPT5A  E447   
R2COC  E5E0   RCOCO  E5F9   RCOL   E5FD   RCOOR  E5F3   
RCURS  E5B2   RDOT   E5C1   RDRAW  E5CE   RDT10  E5C8   
RDT20  E5C9   REN10  E585   REN15  E59D   REN20  E5B0   
RENV   E570   RFILL  E5D7   RLETI  E45A   RLETX  E45A   
RLT10  E465   RLT20  E47F   RLT25  E484   RLT30  E494   
RLT50  E4A3   RLT60  E4A8   RLT70  E4B4   RLT80  E4B8   
RLT90  E4B2   RMI10  E415   RMI20  E41D   RMODE  E5BB   
RNOISE E50C   RRAND  E40C   RREST  E401   RSOUND E4BC   
SND10  E4CE   SND20  E4D6   SND70  E4FC   SND80  E501   
SNG10  E552   SNG20  E563   SNGEV  E51F
