
PAGE 01    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

002                         ORG   :D790
003                 *
004                 *
005                 *
006                 ************************
007                 * CHECK FREE RAM SPACE *
008                 ************************
009                 *
010                 * Entry: DE: Startaddress.
011                 *        HL: 1st not useable address.
012                 * Exit:  HL: Useable RAM space.
013                 *        ABCDE preserved.
014                 *
015 D790 CD1ADE     MPT25   CALL  :DE1A     Calculate free space
016 D793 2B                 DCX   H
017 D794 C9                 RET 
018                 *
019                 **********************************
020                 * TRANSFER DATA/CASSETTE VECTORS *
021                 **********************************
022                 *
023                 * Transfer data/cassette switching vectors from
024                 * ROM to RAM vector area.
025                 *
026                 * Exit: AFBC preserved. DEHL corrupted.
027                 *
028                 *MPT01
029 D795 C5         CASIN   PUSH  B
030 D796 21CBD7             LXI   H,:D7CB   Highest source address
031 D799 11A4D7             LXI   D,:D7A4   Lowest source address
032 D79C 01C502             LXI   B,:02C5   Lowest destination address
033 D79F CD4FDE             CALL  :DE4F     Transfer cassette vectors
034 D7A2 C1                 POP   B
035 D7A3 C9                 RET 
036                 *
037                 ***********************************
038                 * DATA/CASSETTE SWITCHING VECTORS *
039                 ***********************************
040                 *
041                 * This data block is moved into the RAM area
042                 * #02C5-#02EB during system initialisation.
043                 *
044 D7A4 C3B8D2     CINTB   JMP   :D2B8     WOPEN
045 D7A7 C3F1D2             JMP   :D2F1     WBLK
046 D7AA C327D4             JMP   :D427     WCLOSE
047 D7AD C325D3             JMP   :D325     ROPEN
048 D7B0 C340D3             JMP   :D340     RBLK
049 D7B3 C345D4             JMP   :D445     RCLOSE
050 D7B6 C3A2D3             JMP   :D3A2     MBLK
051 D7B9 C9                 RET             RESET
052 D7BA 00                 NOP 
053 D7BB 00                 NOP 
054 D7BC C9                 RET             DOUTC
055 D7BD 00                 NOP 
056 D7BE 00                 NOP 
057 D7BF C3B4DD             JMP   :DDB4     DINC
058 D7C2 C9                 RET 
059 D7C3 00                 NOP 
060 D7C4 00                 NOP 
061 D7C5 2424               DATA  :24,:24   TAPSL
062 D7C7 243C               DATA  :24,:3C   TAPSD
063 D7C9 2418               DATA  :24,:18   TAPST

PAGE 02    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

064                 *
065                 ************************************
066                 * WAIT FOR SPACEBAR, PRINT CAR.RET *
067                 ************************************
068                 *
069                 * Exit: BCDEHL preserved.
070                 *       CY=1: Break pressed.
071                 *
072                 *CINTE
073 D7CB CDDAD6     WPT     CALL  :D6DA     Wait for spacebar
074 D7CE DA0CC8             JC    :C80C     If BREAK pressed: into
075                                         Basic monitor
076 D7D1 C35EDD             JMP   :DD5E     Print car.ret; ret
077                 *
078 D7D4 FF                 DATA  :FF
079 D7D5 FF                 DATA  :FF
080 D7D6 FF                 DATA  :FF
081 D7D7 FF                 DATA  :FF
082                 *
083                 *********************************
084                 * WRITE BLOCK + TRAILER ON TAPE *
085                 *********************************
086                 *
087                 * Entry: DE: Length block.
088                 *        HL: Startaddress block.
089                 * Exit:  A=0, BCDE preserved.
090                 *        HL points past block written.
091                 *
092 D7D8 CDC802     MPT10   CALL  :02C8     Write block
093 D7DB C3CB02             JMP   :02CB     Write trailer
094                 *
095                 ************************
096                 * FAILURE DURING ROPEN *
097                 ************************
098                 *
099 D7DE 0D         RPN20   DCR   C
100 D7DF 0C                 INR   C         Load during program ?
101 D7E0 C45EDD             CNZ   :DD5E     Print car.ret if not
102 D7E3 C329D3             JMP   :D329     Back to read file leader
103                 *
104                 **************************
105                 * CHECK FILE OF ANY TYPE *
106                 **************************
107                 *
108                 *MPT12
109 D7E6 3E00       AMBLK   MVI   A,:00     File type correct
110 D7E8 C3D702             JMP   :02D7     Read and check program name
111                 *
112                 *****************************************
113                 * WRITE BYTE ON CURSOR POSITION ADDRESS *
114                 * AND UPDATE CURSOR POSITION.           *
115                 *****************************************
116                 *
117                 * This routine is a fast printing routine:
118                 * the data byte is poked directly into the
119                 * screen RAM.
120                 *
121                 * Entry: Byte to be written on screen in A.
122                 * Exit:  All registers preserved.
123                 *
124 D7EB E5         LD95    PUSH  H
125 D7EC 00                 NOP 

PAGE 03    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

126 D7ED 2A7200             LHLD  :0072     Get cursor position address
127 D7F0 77                 MOV   M,A       Write byte on screen
128 D7F1 2B                 DCX   H         ) Update cursor addr
129 D7F2 2B                 DCX   H         )
130 D7F3 227200             SHLD  :0072     Save new cursor address
131 D7F6 E1                 POP   H
132 D7F7 C9                 RET 
133                 *
134                 ***************************
135                 * SAVE: WRITE NAME LENGTH *
136                 ***************************
137                 *
138                 * Entry: HL: Addr. length byte of name.
139                 * Exit:  DE: Length of name.
140                 *        HL: Points past string.
141                 *        BC: Preserved.
142                 *        A:  Checksum on string.
143                 *
144 D7F8 5E         MPT22   MOV   E,M       Get name length
145 D7F9 1600               MVI   D,:00
146 D7FB 23                 INX   H         HL to 1st byte of name
147 D7FC C3F1D2             JMP   :D2F1     Write name length
148                 *
149                 ********************************
150                 * INITIALISE LOADING FROM TAPE *
151                 ********************************
152                 *
153                 * Entry: HL: Points to length byte of name requested
154                 * Exit:  DE: Length requested name.
155                 *        HL: Points to first byte of name.
156                 *        AFBC preserved.
157                 *
158 D7FF 5E         MPT23   MOV   E,M       Get length requested name
159 D800 1600               MVI   D,:00     in DE
160 D802 23                 INX   H         HL points to 1st byte name
161 D803 C32ED4             JMP   :D42E     Cassette motors on; ret
162                 *
163                 *********************
164                 * UPDATE POROM/PORO *
165                 *********************
166                 *
167                 * Entry: MPT52: Byte for ROM/cassette select in A.
168                 *        MPT53: New POROM byte.
169                 *
170 D806 E6F0       MPT52   ANI   :F0       Enable ROM/cassette select
171 D808 324000     MPT53   STA   :0040     Load POROM
172 D80B 3206FD             STA   :FD06     and PORO
173 D80E C9                 RET 
174                 *
175                 *****************
176                 * part of 2EAC1 *
177                 *****************
178                 *
179                 * If pointer is off top visible screen:
180                 *
181 D80F 7A         PCK40   MOV   A,D
182 D810 FED0               CPI   :D0
183 D812 DAEFEA             JC    :EAEF     (2) if <= CF (no overflow
184                                         below 0)
185 D815 E5                 PUSH  H         ) if > CF:
186 D816 C5                 PUSH  B         ) Exchange BC and HL
187 D817 E1                 POP   H         )

PAGE 04    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

188 D818 C1                 POP   B         )
189 D819 C3EFEA             JMP   :EAEF     (2)
190                 *
191 D81C FF                 DATA  :FF
192                 *
193                 **********************
194                 * RUN basiccmd SAVEA *
195                 **********************
196                 *
197 D81D CD3BD8     RSAVA   CALL  :D83B     Evaluate array type to be
198                                         saved
199 D820 F5                 PUSH  PSW       Save type array
200 D821 C226D8             JNZ   :D826     Jump if INT/FPT array
201 D824 E7                 RST   4         Move stringarray into one
202 D825 75                 DATA  :75       string in free RAM
203 D826 F1         LD99    POP   PSW       Get type array
204 D827 E5                 PUSH  H
205 D828 D5                 PUSH  D
206 D829 F5                 PUSH  PSW
207 D82A CD91E7             CALL  :E791     (0) Evaluate program name
208 D82D 3E32               MVI   A,:32     File type byte '2'
209 D82F CDC502             CALL  :02C5     WOPEN
210 D832 F1                 POP   PSW       Get type array
211 D833 213E01             LXI   H,:013E   Startaddr EBUF
212 D836 77                 MOV   M,A       Type into EBUF
213 D837 C368D6             JMP   :D668     Write 2 blocks + trailer
214                 *
215 D83A 00                 NOP 
216                 *
217                 ******************************************
218                 * EVALUATE ARRAY TYPE TO BE SAVED/LOADED *
219                 ******************************************
220                 *
221                 * Exit: A:   Array type.
222                 *       DE:  Length all array elements.
223                 *       HL:  Beginaddr. 1st array element.
224                 *       Z=1: String array.
225                 *       Z=0: INT/FPT array.
226                 *
227 D83B CD5AE9     RLSAS   CALL  :E95A     (0) Get array addr in HL
228 D83E E630               ANI   :30       Allow any type array
229 D840 F5                 PUSH  PSW       Save type
230 D841 5E                 MOV   E,M       )
231 D842 23                 INX   H         ) Get array pntr in DE
232 D843 56                 MOV   D,M       )
233 D844 7B                 MOV   A,E
234 D845 B2                 ORA   D
235 D846 CA90E9             JZ    :E990     (0) Undef. array if no addr
236 D849 EB                 XCHG            Pointer to array in HL
237 D84A 2B                 DCX   H
238 D84B 2B                 DCX   H
239 D84C 56                 MOV   D,M       Get 1st length byte
240 D84D 23                 INX   H
241 D84E 7E                 MOV   A,M       Get 2nd length byte
242 D84F 23                 INX   H
243 D850 96                 SUB   M         Minus nr of dim. bytes
244 D851 5F                 MOV   E,A
245 D852 7A                 MOV   A,D
246 D853 DE00               SBI   :00       Update hibyte if borrow
247 D855 57                 MOV   D,A
248 D856 1B                 DCX   D         DE is length all array elem.
249 D857 CD39DE             CALL  :DE39     HL is beginaddr 1st element

PAGE 05    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

250 D85A F1                 POP   PSW       Get type in A
251 D85B FE20               CPI   :20       Set Z-flag on type
252 D85D C9                 RET 
253                 *
254                 **********************
255                 * RUN basiccmd LOADA *
256                 **********************
257                 *
258 D85E CD3BD8     RLODA   CALL  :D83B     Evaluate array type to be
259                                         loaded
260 D861 E5                 PUSH  H         Save startaddr array elem.
261 D862 F5                 PUSH  PSW       Save type
262 D863 CD78D6             CALL  :D678     Evaluate requested program
263                                         name; prep. select ROM bank
264 D866 CD08D8             CALL  :D808     Select ROM bank 1
265 D869 F1                 POP   PSW       Get type
266 D86A C30FEE             JMP   :EE0F     (1) Read block from tape and
267                                         store it in array
268                 *
269                 ************************************
270                 * INITIALISE 'EDIT': EMPTY HEAP,   *
271                 * CLEAR SYMBOL TABLE, MOVE PROGRAM *
272                 ************************************
273                 *
274                 * Part of 'Init. EDIT' (0E265).
275                 *
276                 * Entry: CY=1: Not sufficient memory available.
277                 *
278 D86D DA10DA     MPT33   JC    :DA10     Evt. run error 'OUT OF
279                                         MEMORY'
280 D870 C323CB             JMP   :CB23     Empty heap, move
281                                         program, clear symtab
282                 *
283                 ******************************************
284                 * LIST CURRENT LINE IF LINENR IS CORRECT *
285                 ******************************************
286                 *
287                 * Part of 'run LIST <range>' (0E1B6).
288                 *
289                 * Entry: CY=0 if linenr. <= 0 or > FFFF.
290                 *
291 D873 D215DA     MPT3A   JNC   :DA15     Evt. run error 'NUMBER
292                                         OUT OF RANGE'
293 D876 C3ABEC             JMP   :ECAB     (0) List current line
294                 *
295                 **************************
296                 * INPUT FROM EDIT BUFFER *
297                 **************************
298                 *
299                 * Part of 'restart interpreter' (C823).
300                 *
301 D879 E5         MPT05   PUSH  H
302 D87A CD91E2             CALL  :E291     (0) Input from editbuffer
303 D87D E1                 POP   H
304 D87E C9                 RET 
305                 *
306                 *******************************
307                 * part of RUN 'CLEAR' (0E6B5) *
308                 *******************************
309                 *
310                 * Checks for heap too big.
311                 *

PAGE 06    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

312 D87F CDF8E6     MPT42   CALL  :E6F8     (0) Get space req. in HL
313 D882 7C                 MOV   A,H
314 D883 B7                 ORA   A         Set flags on hibyte
315 D884 37                 STC             CY=1 if > 32K
316 D885 C9                 RET 
317                 *
318                 ************************************
319                 * EVT. INITIALISE 4 COLOUR ANIMATE *
320                 ************************************
321                 *
322                 * Part of 2E9C3.
323                 *
324 D886 FE14       SPT04   CPI   :14
325 D888 D0                 RNC             Abort if A >= 14
326 D889 32C100             STA   :00C1     Set for 4-colour animate
327 D88C C9                 RET 
328                 *
329                 ********
330                 * DATA *
331                 ********
332                 *
333 D88D 20         LD221   DATA  :20       Space
334 D88E 8C72               DATA  :8C,:72   Pntr. to 'MODE'
335 D890 00                 DATA  :00
336                 *
337                 ******************************
338                 * part of 1EE0B - (not used) *
339                 ******************************
340                 *
341 D891 F5         LD105   PUSH  PSW
342 D892 CD91E7             CALL  :E791     (1)
343 D895 F1                 POP   PSW
344 D896 C9                 RET 
345                 *
346                 *******************************************
347                 * READ BLOCK FROM TAPE, EVT. ERROR REPORT *
348                 *******************************************
349                 *
350                 * Part of LOADA (1EE0F).
351                 *
352 D897 CDD102     MPT19   CALL  :02D1     Read block from tape
353 D89A D2B3D2             JNC   :D2B3     Evt. run 'LOADING ERROR'
354 D89D C9                 RET 
355                 *
356                 **************************************
357                 * LIST ARRAY NAME, SPACE, EXPRESSION *
358                 **************************************
359                 *
360                 * Used in listing 'Savea/Loada' textlines.
361                 *
362 D89E CDF7EE     SCN30   CALL  :EEF7     (0) List array name
363 D8A1 C365ED             JMP   :ED65     (0) List space, expression
364                 *
365 D8A4 FF                 DATA  :FF
366 D8A5 FF                 DATA  :FF
367                 *
368                 ******************************
369                 * INITIALISE SOUND GENERATOR *
370                 ******************************
371                 *
372                 * All sound channels are switched off.
373                 *

PAGE 07    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

374                 * Exit: AB preserved, CDEHLF corrupted.
375                 *
376 D8A6 2106FC     SNDINI  LXI   H,:FC06
377 D8A9 3636               MVI   M,:36     ) Load 3 timers
378 D8AB 3676               MVI   M,:76     )
379 D8AD 36B6               MVI   M,:B6     )
380 D8AF 210000             LXI   H,:0000
381 D8B2 2204FD             SHLD  :FD04     Volume 4 channels off
382 D8B5 229402             SHLD  :0294     and remember it
383 D8B8 21C201             LXI   H,:01C2   Start 1st SCB
384 D8BB 110E00             LXI   D,:000E   Length SCB
385 D8BE 0E04               MVI   C,:04     4 blocks (3 SCB, 1 NCB)
386 D8C0 36FF       SNI10   MVI   M,:FF     FF in 1st byte SCB (= off)
387 D8C2 19                 DAD   D         Calc start next block
388 D8C3 0D                 DCR   C
389 D8C4 C2C0D8             JNZ   :D8C0     Next block if not ready
390 D8C7 C9                 RET 
391                 *
392                 *********************
393                 * OUTPUT TO DCE-BUS *
394                 *********************
395                 *
396                 * 'Real World' output. Writes a byte to a given
397                 * Real World address.
398                 *
399                 * Entry: D: Busaddress.
400                 *        E: Data for output.
401                 *
402 D8C8 F5         RWOP    PUSH  PSW
403 D8C9 E5                 PUSH  H
404 D8CA 2103FE             LXI   H,:FE03   GIC control address
405 D8CD 3680               MVI   M,:80     All ports output
406 D8CF 2B                 DCX   H         Port C addr. in HL
407 D8D0 36FE               MVI   M,:FE     Clear bus expand signal
408 D8D2 EB                 XCHG            Data in L, busaddr. in H
409 D8D3 2200FE             SHLD  :FE00     Data in PA, busaddr. in PB
410 D8D6 EB                 XCHG            Address PC in HL
411 D8D7 34                 INR   M         Set bus expand signal
412 D8D8 36FD               MVI   M,:FD     Set write strobe true
413                                         (Now data exchange done)
414 D8DA 36FF               MVI   M,:FF     Reset strobe
415 D8DC 35                 DCR   M         Clear bus expand signal
416 D8DD E1                 POP   H
417 D8DE F1                 POP   PSW
418 D8DF C9                 RET 
419                 *
420                 **********************
421                 * INPUT FROM DCE-BUS *
422                 **********************
423                 *
424                 * 'Real World' input. Reads a byte from a given
425                 * Real World address.
426                 *
427                 * Entry: D: Busaddress.
428                 * Exit:  E: Data received.
429                 *
430 D8E0 F5         RWIP    PUSH  PSW
431 D8E1 E5                 PUSH  H
432 D8E2 2103FE             LXI   H,:FE03   GIC control addr. in HL
433 D8E5 3690               MVI   M,:90     PA input, rest output
434 D8E7 2B                 DCX   H         Address PC in HL
435 D8E8 36FE               MVI   M,:FE     Clear bus expand signal

PAGE 08    DAI FIRMWARE D790-D8FA  V1.0  Rev.1

436 D8EA 7A                 MOV   A,D       Busaddress in A
437 D8EB 3201FE             STA   :FE01     Store busaddress in PB
438 D8EE 34                 INR   M         Set bus expand signal
439 D8EF 36FB               MVI   M,:FB     Set read strobe true
440                                         (Now data exchange)
441 D8F1 3A00FE             LDA   :FE00     Data to A
442 D8F4 5F                 MOV   E,A       Data in E
443 D8F5 36FF               MVI   M,:FF     Reset strobe
444 D8F7 35                 DCR   M
445 D8F8 E1                 POP   H
446 D8F9 F1                 POP   PSW
447 D8FA C9                 RET 
448                 *
449                 *
450                 *
456 D8FB                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
AMBLK  D7E6   CASIN  D795   CINTB  D7A4   CINTE  D7CB   
LD105  D891   LD221  D88D   LD95   D7EB   LD99   D826   
MPT01  D795   MPT05  D879   MPT10  D7D8   MPT12  D7E6   
MPT19  D897   MPT22  D7F8   MPT23  D7FF   MPT25  D790   
MPT33  D86D   MPT3A  D873   MPT42  D87F   MPT52  D806   
MPT53  D808   PCK40  D80F   RLODA  D85E   RLSAS  D83B   
RPN20  D7DE   RSAVA  D81D   RWIP   D8E0   RWOP   D8C8   
SCN30  D89E   SNDINI D8A6   SNI10  D8C0   SPT04  D886   
WPT    D7CB
