
PAGE 01    DAI FIRMWARE 2EA0B-2EBF3  V1.1

002                         ORG   :EA0B
003                 *
004                 *
005                 *
006                 **************
007                 * FILL BLOCK *
008                 **************
009                 *
010                 * Fills a rectangular block of whole fields with
011                 * one colour.
012                 *
013                 * Entry: HL:    Address bottom left corner.
014                 *        DE:    Y,X-counts of size of block (E in
015                 *               fields).
016                 *        FCOLR: Colour info.
017                 * Exit:  BCDEHL preserved. AF corrupted.
018                 *
019 EA0B C5         FILBK   PUSH  B
020 EA0C D5                 PUSH  D
021 EA0D E5                 PUSH  H
022 EA0E 3AC200             LDA   :00C2     ) Get details for colour
023 EA11 4F                 MOV   C,A       ) required in BC
024 EA12 3AC300             LDA   :00C3     )
025 EA15 47                 MOV   B,A       )
026 EA16 1C                 INR   E         Count range up by 1
027 EA17 D5         FBK10   PUSH  D
028 EA18 E5                 PUSH  H
029 EA19 3AC100     FBK20   LDA   :00C1     Get animate flag
030 EA1C B7                 ORA   A
031 EA1D C246EA             JNZ   :EA46     Jump if set
032 EA20 3A9D00             LDA   :009D     Get current screen mode
033 EA23 1F                 RAR 
034 EA24 1F                 RAR 
035 EA25 70                 MOV   M,B       Colour details in screen RAM
036 EA26 2B                 DCX   H
037 EA27 D23EEA             JNC   :EA3E     Jump if 16-colour mode
038                             
039                 * If 4-colour mode:
040                             
041 EA2A 71                 MOV   M,C       Colour details in screen RAM
042                 *
043 EA2B 2B         FBK30   DCX   H
044 EA2C 1D                 DCR   E
045 EA2D C219EA             JNZ   :EA19     Loop to do all fields
046 EA30 E1                 POP   H         HL pnts to left of rectangle
047 EA31 D1                 POP   D         Get Y-size count
048 EA32 15                 DCR   D
049 EA33 14                 INR   D
050 EA34 CA53EA             JZ    :EA53     Abort if ready
051 EA37 15                 DCR   D         Update Y-count
052 EA38 CDC1EA             CALL  :EAC1     Update pntr to next line
053 EA3B C317EA             JMP   :EA17     Next line
054                             
055                 * If 16-colour mode:
056                             
057 EA3E 7E         FBK40   MOV   A,M       Get data from screen RAM
058 EA3F E60F               ANI   :0F       Lonibble only (old BG)
059 EA41 B1                 ORA   C         Add details
060 EA42 77                 MOV   M,A       Preserve old background
061 EA43 C32BEA             JMP   :EA2B
062                             
063                 * If animate:

PAGE 02    DAI FIRMWARE 2EA0B-2EBF3  V1.1

064                             
065 EA46 E5         FBK50   PUSH  H
066 EA47 05                 DCR   B
067 EA48 04                 INR   B
068 EA49 C24DEA             JNZ   :EA4D
069 EA4C 2B                 DCX   H
070 EA4D 71         FBK60   MOV   M,C       Change whole field
071 EA4E E1                 POP   H
072 EA4F 2B                 DCX   H
073 EA50 C32BEA             JMP   :EA2B     Next field
074                 *
075 EA53 E1         FBK90   POP   H
076 EA54 D1                 POP   D
077 EA55 C1                 POP   B
078 EA56 C9                 RET 
079                 *
080                 **************
081                 * FILL STRIP *
082                 **************
083                 *
084                 * Fills a vertical strip on the screen with one
085                 * colour.
086                 *
087                 * Entry: HL: Points to bottom field of strip.
088                 *        B:  Mask bits to change.
089                 *        D:  Height -1 of strip.
090                 * Exit:  AF corrupted. BCDEHL preserved.
091                 *
092 EA57 C5         FILST   PUSH  B
093 EA58 D5                 PUSH  D
094 EA59 E5                 PUSH  H
095 EA5A 3A9D00             LDA   :009D     Get current screen mode
096 EA5D 1F                 RAR 
097 EA5E 1F                 RAR 
098 EA5F D2A9EA             JNC   :EAA9     Jump if 16-colour mode
099                             
100                 * If 4-colour mode:
101                             
102 EA62 D5                 PUSH  D
103 EA63 EB                 XCHG
104 EA64 2AC200             LHLD  :00C2     Get details for colour reqd
105 EA67 3AC100             LDA   :00C1     Get animate flag
106 EA6A B7                 ORA   A
107 EA6B C291EA             JNZ   :EA91     Jump if set
108 EA6E 78                 MOV   A,B       )
109 EA6F A4                 ANA   H         )
110 EA70 4F                 MOV   C,A       ) Mask for bits to be update
111 EA71 78                 MOV   A,B       )
112 EA72 A5                 ANA   L         )
113 EA73 6F                 MOV   L,A       )
114 EA74 78                 MOV   A,B
115 EA75 2F                 CMA             Bits to be preserved
116 EA76 47                 MOV   B,A
117 EA77 67                 MOV   H,A
118 EA78 EB         FST05   XCHG
119 EA79 78         FST10   MOV   A,B
120 EA7A A6                 ANA   M         Pick up old colours
121 EA7B B1                 ORA   C
122 EA7C 77                 MOV   M,A       Update top bits
123 EA7D 2B                 DCX   H
124 EA7E 7A                 MOV   A,D
125 EA7F A6                 ANA   M

PAGE 03    DAI FIRMWARE 2EA0B-2EBF3  V1.1

126 EA80 B3                 ORA   E
127 EA81 77                 MOV   M,A       Update bottom bits
128 EA82 23                 INX   H
129 EA83 E3                 XTHL
130 EA84 7C                 MOV   A,H
131 EA85 25                 DCR   H
132 EA86 B7                 ORA   A
133 EA87 CABCEA             JZ    :EABC     Jump if ready
134 EA8A E3                 XTHL
135 EA8B CDC1EA             CALL  :EAC1     Update pointer
136 EA8E C379EA             JMP   :EA79     Next line
137                             
138                 * If animate:
139                             
140 EA91 E5         FST15   PUSH  H         Preserve colour details
141 EA92 78                 MOV   A,B
142 EA93 A5                 ANA   L
143 EA94 4F                 MOV   C,A       Bits to be set in C
144 EA95 78                 MOV   A,B
145 EA96 2F                 CMA 
146 EA97 B5                 ORA   L
147 EA98 47                 MOV   B,A       To be set
148 EA99 2E00               MVI   L,:00
149 EA9B 26FF               MVI   H,:FF     For other byte
150 EA9D F1                 POP   PSW       Get colour details
151 EA9E B7                 ORA   A
152 EA9F C2A6EA             JNZ   :EAA6
153 EAA2 C5                 PUSH  B
154 EAA3 E5                 PUSH  H
155 EAA4 C1                 POP   B
156 EAA5 E1                 POP   H
157 EAA6 C378EA     FST18   JMP   :EA78
158                             
159                 * If 16-colour mode:
160                             
161 EAA9 3AC200     FST20   LDA   :00C2     Get 1 byte of details colour
162                                         required
163 EAAC 4F                 MOV   C,A       Set colour as reqd
164 EAAD CDDEE8     FST30   CALL  :E8DE     Update
165 EAB0 7A                 MOV   A,D
166 EAB1 15                 DCR   D
167 EAB2 B7                 ORA   A
168 EAB3 CABDEA             JZ    :EABD
169 EAB6 CDC1EA             CALL  :EAC1     Next line
170 EAB9 C3ADEA             JMP   :EAAD     Next field
171                             
172                 * If ready:
173                             
174 EABC E1         FST90   POP   H
175 EABD E1         FST91   POP   H
176 EABE D1                 POP   D
177 EABF C1                 POP   B
178 EAC0 C9                 RET 
179                 *
180                 **************************
181                 * MOVE AND CHECK POINTER *
182                 **************************
183                 *
184                 * DADCK: Moves a pointer 1 line up screen and
185                 *        offsets to alternate area if necessary.
186                 * PTRCK: Checks a memory pointer and moves it
187                 *        into or out of the archive area if

PAGE 04    DAI FIRMWARE 2EA0B-2EBF3  V1.1

188                 *        necessary.
189                 *
190                 * Exit:  HL: New pointer.
191                 *
192 EAC1 3A9800     DADCK   LDA   :0098     Get nr bytes/line
193 EAC4 CD01E7             CALL  :E701     Add 1 line length
194 EAC7 C5         PTRCK   PUSH  B
195 EAC8 D5                 PUSH  D
196 EAC9 EB                 XCHG
197 EACA 2A8800             LHLD  :0088     Get addr after end graphics
198                                         area
199 EACD CDFBE6             CALL  :E6FB     Compare HL-DE
200 EAD0 2A8400             LHLD  :0084     Get bottom archive area
201 EAD3 44                 MOV   B,H       ) in BC
202 EAD4 4D                 MOV   C,L       )
203 EAD5 2A8200             LHLD  :0082     Get top visible area
204 EAD8 D2E5EA             JNC   :EAE5     Jump if pntr is below
205                                         visible screen
206 EADB CDFBE6             CALL  :E6FB     Compare HL-DE
207 EADE DA0FD8             JC    :D80F     Jump if pntr is off top
208                                         visible screen
209 EAE1 EB         PCK10   XCHG
210 EAE2 D1         PCK15   POP   D
211 EAE3 C1                 POP   B
212 EAE4 C9                 RET 
213                             
214                 * If pntr is below visible screen:
215                             
216 EAE5 E5         PCK20   PUSH  H         )
217 EAE6 C5                 PUSH  B         ) Swop BC and HL
218 EAE7 E1                 POP   H         )
219 EAE8 C1                 POP   B         )
220 EAE9 CDFBE6             CALL  :E6FB     Compare HL-DE
221 EAEC DAE1EA             JC    :EAE1     Jump if within archive area
222 EAEF EB         PCK30   XCHG
223 EAF0 CDF2E6             CALL  :E6F2     Subtract nearest boundary
224 EAF3 09                 DAD   B         Add other
225 EAF4 C3E2EA             JMP   :EAE2
226                 *
227                 ***************************
228                 * FILL A RECTANGULAR AREA *
229                 ***************************
230                 *
231                 * Entry: DE: Width.
232                 *        B : Height.
233                 *        C : Offset.
234                 *        HL: Address.
235                 * Exit: All registers preserved.
236                 *
237 EAF7 F5         FILRT   PUSH  PSW
238 EAF8 C5                 PUSH  B
239 EAF9 D5                 PUSH  D
240 EAFA E5                 PUSH  H
241 EAFB E5                 PUSH  H
242 EAFC 79                 MOV   A,C
243 EAFD 83                 ADD   E
244 EAFE 67                 MOV   H,A       H = C + E
245 EAFF 3E00               MVI   A,:00
246 EB01 8A                 ADC   D
247 EB02 50                 MOV   D,B
248 EB03 1F                 RAR 
249 EB04 7C                 MOV   A,H

PAGE 05    DAI FIRMWARE 2EA0B-2EBF3  V1.1

250 EB05 DA0DEB             JC    :EB0D
251 EB08 FE08               CPI   :08
252 EB0A DA40EB             JC    :EB40     If > 8: Fill only one strip
253 EB0D 1F         L2E152  RAR 
254 EB0E 0F                 RRC 
255 EB0F E67E               ANI   :7E
256 EB11 E3                 XTHL
257 EB12 F5                 PUSH  PSW
258 EB13 0F                 RRC 
259 EB14 D602               SUI   :02
260 EB16 5F                 MOV   E,A
261 EB17 2B                 DCX   H
262 EB18 2B                 DCX   H
263 EB19 D40BEA             CNC   :EA0B     Fill block
264 EB1C 23                 INX   H
265 EB1D 23                 INX   H
266 EB1E 79                 MOV   A,C
267 EB1F D609               SUI   :09
268 EB21 2F                 CMA 
269 EB22 47                 MOV   B,A
270 EB23 CDE1EB             CALL  :EBE1     Set mask for bits
271 EB26 CD57EA             CALL  :EA57     Fill strip
272 EB29 F1                 POP   PSW
273 EB2A 2F                 CMA 
274 EB2B 4F                 MOV   C,A
275 EB2C 06FF               MVI   B,:FF
276 EB2E 03                 INX   B
277 EB2F 09                 DAD   B
278 EB30 F1                 POP   PSW
279 EB31 E607               ANI   :07
280 EB33 3C                 INR   A
281 EB34 47                 MOV   B,A
282 EB35 0E00               MVI   C,:00
283 EB37 CDE1EB     L2E153  CALL  :EBE1     Set mask for bits
284 EB3A CD57EA             CALL  :EA57     Fill strip
285 EB3D C338E1             JMP   :E138     Popall, ret
286                             
287                 * If < 1 field:
288                             
289 EB40 43         L2E154  MOV   B,E
290 EB41 04                 INR   B
291 EB42 E1                 POP   H
292 EB43 C337EB             JMP   :EB37     Fill a strip only
293                 *
294                 *************************
295                 * CALCULATE HL = A * HL *
296                 *************************
297                 *
298                 * Exit: AFBCDE preserved.
299                 *
300 EB46 F5         HLMUL   PUSH  PSW
301 EB47 D5                 PUSH  D
302 EB48 EB                 XCHG            Original HL in DE
303 EB49 210000             LXI   H,:0000   Init result
304 EB4C B7         L2E156  ORA   A
305 EB4D CA5DEB             JZ    :EB5D     Abort if ready
306 EB50 1F                 RAR             )
307 EB51 F5                 PUSH  PSW       )
308 EB52 D256EB             JNC   :EB56     ) Calc HL = A * HL
309 EB55 19                 DAD   D         )
310 EB56 EB         L2E157  XCHG            )
311 EB57 29                 DAD   H         )

PAGE 06    DAI FIRMWARE 2EA0B-2EBF3  V1.1

312 EB58 EB                 XCHG            )
313 EB59 F1                 POP   PSW       )
314 EB5A C34CEB             JMP   :EB4C     Cont multiplication
315 EB5D D1         L2E158  POP   D
316 EB5E F1                 POP   PSW
317 EB5F C9                 RET 
318                 *
319                 *************************
320                 * CALCULATE HL = HL / A *
321                 *************************
322                 *
323                 * Exit: AFBCDE preserved.
324                 *
325 EB60 F5         HLDIV   PUSH  PSW
326 EB61 B7                 ORA   A
327 EB62 CA78EB             JZ    :EB78     Abort if A=0
328 EB65 C5                 PUSH  B
329 EB66 D5                 PUSH  D
330 EB67 01FFFF             LXI   B,:FFFF
331 EB6A 2F                 CMA 
332 EB6B 5F                 MOV   E,A
333 EB6C 16FF               MVI   D,:FF
334 EB6E 13                 INX   D
335 EB6F 19         L2E160  DAD   D
336 EB70 03                 INX   B
337 EB71 DA6FEB             JC    :EB6F
338 EB74 69                 MOV   L,C       ) Result in HL
339 EB75 60                 MOV   H,B       )
340 EB76 D1                 POP   D
341 EB77 C1                 POP   B
342 EB78 F1         L2E161  POP   PSW
343 EB79 C9                 RET 
344                 *
345                 *********************************************
346                 * CHECK IF SUFFICIENT ROOM FOR GRAPHIC MODE *
347                 *********************************************
348                 *
349                 * Exit: CY=1: Insufficient room for mode.
350                 *       CY=0: O.K.
351                 *       ABCDEHL preserved.
352                 *
353 EB7A C5         TPOSN   PUSH  B
354 EB7B F5                 PUSH  PSW
355 EB7C D5                 PUSH  D
356 EB7D 3A9D00             LDA   :009D     Get current screen mode
357 EB80 C601               ADI   :01
358 EB82 DA96EB             JC    :EB96     If mode 0: Abort CY=1
359 EB85 EB                 XCHG
360 EB86 2A9400             LHLD  :0094     Get nr of hor. blobs
361 EB89 2B                 DCX   H         minus 1
362 EB8A CDFBE6             CALL  :E6FB     Compare HL-DE
363 EB8D EB                 XCHG
364 EB8E DA96EB             JC    :EB96     Abort CY=1 if insufficient
365                                         room
366 EB91 3A9600             LDA   :0096     Get nr of graphics lines
367 EB94 3D                 DCR   A         minus 1
368 EB95 B9                 CMP   C         Set flags on difference
369 EB96 D1         L2E163  POP   D
370 EB97 C1                 POP   B
371 EB98 78                 MOV   A,B
372 EB99 C1                 POP   B
373 EB9A C9                 RET 

PAGE 07    DAI FIRMWARE 2EA0B-2EBF3  V1.1

374                 *
375                 ***********************************
376                 * FIND COLOUR IN COLORG REGISTERS *
377                 ***********************************
378                 *
379                 * Entry: C: Requested colour.
380                 * Exit:  CY=1: 'Serialnr' of colour in A.
381                 *        CY=0: Colour not available.
382                 *        BCDEHL preserved.
383                 *
384 EB9B C5         STR164  PUSH  B
385 EB9C E5                 PUSH  H
386 EB9D 219E00             LXI   H,:009E   Addr 1st colour byte graph
387 EBA0 0603               MVI   B,:03     Total 4 colour data
388 EBA2 7E         L2E165  MOV   A,M       Get colour
389 EBA3 E60F               ANI   :0F       Colour nibble only
390 EBA5 B9                 CMP   C         Ident to reqd one ?
391 EBA6 CAB2EB             JZ    :EBB2     Then colour found
392 EBA9 23                 INX   H         Pnts to next one
393 EBAA 05                 DCR   B
394 EBAB F2A2EB             JP    :EBA2     Get next colour
395 EBAE B7                 ORA   A         CY=0
396 EBAF E1         L2E166  POP   H
397 EBB0 C1                 POP   B
398 EBB1 C9                 RET 
399                             
400                 * If colour found:
401                             
402 EBB2 3E03       L2E167  MVI   A,:03
403 EBB4 90                 SUB   B         Colour 'nr' in A
404 EBB5 37                 STC 
405 EBB6 C3AFEB             JMP   :EBAF     Quit, CY=1
406                 *
407                 **********************
408                 * GET MEMORY POINTER *
409                 **********************
410                 *
411 EBB9 D5         SMEMMK  PUSH  D
412 EBBA F5                 PUSH  PSW
413 EBBB 78                 MOV   A,B
414 EBBC 0F                 RRC 
415 EBBD 79                 MOV   A,C
416 EBBE 1F                 RAR 
417 EBBF 1F                 RAR 
418 EBC0 E67E               ANI   :7E
419 EBC2 C604               ADI   :04
420 EBC4 5F                 MOV   E,A
421 EBC5 1600               MVI   D,:00
422 EBC7 E1                 POP   H
423 EBC8 E5                 PUSH  H
424 EBC9 6C                 MOV   L,H       Entry A in L
425 EBCA 2600               MVI   H,:00
426 EBCC 23                 INX   H         +1
427 EBCD 3A9800             LDA   :0098     Get nr bytes/line
428 EBD0 CD46EB             CALL  :EB46     Calc HL=A*HL
429 EBD3 CDF2E6             CALL  :E6F2     HL=HL-DE
430 EBD6 EB                 XCHG            Result in DE
431 EBD7 2A8800             LHLD  :0088     Get addr after end graph
432                                         area
433 EBDA 19                 DAD   D         Add offset
434 EBDB CDC7EA             CALL  :EAC7     Check and move pntr
435 EBDE F1                 POP   PSW

PAGE 08    DAI FIRMWARE 2EA0B-2EBF3  V1.1

436 EBDF D1                 POP   D
437 EBE0 C9                 RET 
438                 *
439                 *********************
440                 * SET MASK FOR BITS *
441                 *********************
442                 *
443                 * Entry: B and C are data for mask.
444                 * Exit:  B: Result.
445                 *        AFCDEHL preserved.
446                 *
447 EBE1 F5         SMKMSK  PUSH  PSW
448 EBE2 C5                 PUSH  B
449 EBE3 AF                 XRA   A         A=0
450 EBE4 37         L2E170  STC             CY=1
451 EBE5 1F                 RAR 
452 EBE6 05                 DCR   B
453 EBE7 C2E4EB             JNZ   :EBE4     RAR (B) times
454 EBEA 1F         L2E171  RAR 
455 EBEB 0D                 DCR   C
456 EBEC F2EAEB             JP    :EBEA     RAR until C <= 7F
457 EBEF 17                 RAL 
458 EBF0 C1                 POP   B
459 EBF1 47                 MOV   B,A       Result in B
460 EBF2 F1                 POP   PSW
461 EBF3 C9                 RET 
462                 *
463                 *
464                 *
465 EBF4                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
DADCK  EAC1   FBK10  EA17   FBK20  EA19   FBK30  EA2B   
FBK40  EA3E   FBK50  EA46   FBK60  EA4D   FBK90  EA53   
FILBK  EA0B   FILRT  EAF7   FILST  EA57   FST05  EA78   
FST10  EA79   FST15  EA91   FST18  EAA6   FST20  EAA9   
FST30  EAAD   FST90  EABC   FST91  EABD   HLDIV  EB60   
HLMUL  EB46   L2E152 EB0D   L2E153 EB37   L2E154 EB40   
L2E156 EB4C   L2E157 EB56   L2E158 EB5D   L2E160 EB6F   
L2E161 EB78   L2E163 EB96   L2E165 EBA2   L2E166 EBAF   
L2E167 EBB2   L2E170 EBE4   L2E171 EBEA   PCK10  EAE1   
PCK15  EAE2   PCK20  EAE5   PCK30  EAEF   PTRCK  EAC7   
SMEMMK EBB9   SMKMSK EBE1   STR164 EB9B   TPOSN  EB7A
