
PAGE 01    DAI FIRMWARE 0E401-0E601  V1.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 C355E4             JMP   :E455     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.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                 * The keyboard pointers are set to their default
086                 * values before inputs are asked. This avoids
087                 * keybounce.
088                 *
089 E447 221D01             SHLD  :011D
090 E44A CD63D5             CALL  :D563     ] Init keyb pntrs
091 E44D 3EFF               MVI   A,:FF
092 E44F 321701             STA   :0117
093 E452 C3D0E3             JMP   :E3D0
094                 *
095                 ******************
096                 * cont. of 0E401 *
097                 ******************
098                 *
099                 * Instruction only moved.
100                 *
101 E455 322301             STA   :0123
102 E458 C9                 RET 
103 E459 FF                 DATA  :FF
104                 *
105                 ********************
106                 * RUN basiccmd LET *
107                 ********************
108                 *
109                 * Valid as direct command or in program. Computes
110                 * variable pointer or variable reference and
111                 * checks type. 'LET' can be explicitly or
112                 * implicitly given.
113                 *
114                 * Entry: BC: Points to program line.
115                 * Exit:  BC: Updated.
116                 *        A:  Type of variable.
117                 *        FDEHL corrupted.
118                 *
119                 *RLETX
120 E45A CD63E9     RLETI   CALL  :E963     Get varptr in HL, T/L in A
121 E45D E630               ANI   :30       Type only
122 E45F F5                 PUSH  PSW       Save type
123 E460 FE20               CPI   :20       String type?
124 E462 C294E4             JNZ   :E494     Jump if INT/FPT
125                             

PAGE 03    DAI FIRMWARE 0E401-0E601  V1.1

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

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

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

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

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

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

498 E5F0 C1                 POP   B
499 E5F1 E1                 POP   H
500 E5F2 C9                 RET 
501                 *
502                 ***********************
503                 * EVALUATE COORDINATE *
504                 ***********************
505                 *
506 E5F3 CDF8E6     RCOOR   CALL  :E6F8     Get x-coord in HL
507 E5F6 C31DE7             JMP   :E71D     Get y-coord in A
508                 *
509                 ********************************
510                 * EVALUATE COORDINATE + COLOUR *
511                 ********************************
512                 *
513 E5F9 CDF3E5     RCOCO   CALL  :E5F3     Get x-coord in HL
514 E5FC 5F                 MOV   E,A       Y-coord in E
515 E5FD 3E17       RCOL    MVI   A,:17
516 E5FF C343E7             JMP   :E743     Get colour (0-23) in A
517                 *
518                 *
519                 *
523 E602                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
L0E99  E5C0   MPT36  E436   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
