
PAGE 01    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

002                         ORG   :E407
003                 *
004                 *
005                 *
006                 ****************************
007                 * SET UP SCREEN FOR MODE 0 *
008                 ****************************
009                 *
010                 * Sets up a mode 0 screen, whatever the current mode
011                 * is. If already a character area exists, it is
012                 * moved to the top of the new screen.
013                 *
014                 * Entry: None.
015                 * Exit:  All registers corrupted.
016                 *        CY=0: OK.
017                 *        CY=1: No room.
018                 *
019 E407 37         SSM0    STC             CY=1
020 E408 F5                 PUSH  PSW
021 E409 2130E0             LXI   H,:E030   Startaddr mode 0 table
022 E40C CD45E5             CALL  :E545     Load pointers with parameter
023 E40F DA3CE4             JC    :E43C     If no room available
024 E412 117C00             LXI   D,:007C   Addr text colour table
025 E415 D5                 PUSH  D         Save addr
026 E416 2A8000             LHLD  :0080     Get 1st byte screen RAM
027 E419 0606               MVI   B,:06
028 E41B CDFCE5             CALL  :E5FC     Set up header
029 E41E 3A9D00             LDA   :009D     Get old screen mode
030 E421 FE10               CPI   :10       During initialisation ?
031 E423 CA2DE4             JZ    :E42D     Then jump
032 E426 1F                 RAR             Split screen ?
033 E427 D22DE4             JNC   :E42D     Jump if not
034 E42A CD35E6             CALL  :E635     If split mode: move old
035                                         text, cursor, etc
036 E42D EB         SS010   XCHG            Addr after header in DE
037 E42E 2A8C00             LHLD  :008C     Get addr end char area
038 E431 EB                 XCHG
039 E432 CDFDE1             CALL  :E1FD     Blank char area
040 E435 D487E6             CNC   :E687     Set cursor at begin 1st line
041                             
042                 * Entry from SSMG:
043                             
044 E438 D1         SS015   POP   D
045 E439 F1                 POP   PSW
046 E43A 3F                 CMC             CY=0
047 E43B C9                 RET 
048                             
049                 * If no room available:
050                 * Entry from SSMG, SSM, SSMA:
051                             
052 E43C F1         SS020   POP   PSW       CY=1
053 E43D C9                 RET 
054                 *
055                 **********************************
056                 * SET UP SCREEN FOR GRAPHIC MODE *
057                 **********************************
058                 *
059                 * Entry: A:  Screen mode (split if odd).
060                 * Exit:  CY=0: O.K.:
061                 *        Split mode:       DE: Addr text colours.
062                 *        All graphic mode: DE: Addr graph colours.
063                 *        AF preserved. BCHL corrupted.

PAGE 02    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

064                 *        CY=1: Insufficient room.
065                 *
066 E43E 37         SSMG    STC 
067 E43F F5                 PUSH  PSW
068 E440 57                 MOV   D,A       Screen mode in D
069 E441 E601               ANI   :01       Z=1 if full colour mode
070 E443 7A                 MOV   A,D
071 E444 1F                 RAR             Disable split mode bit in A
072 E445 C4B6E4             CNZ   :E4B6     If split mode: set up screen
073 E448 CC5FE4             CZ    :E45F     If full colour mode: idem
074 E44B DA3CE4             JC    :E43C     Abort if no room
075 E44E F1                 POP   PSW       Get mode code
076 E44F F5                 PUSH  PSW
077 E450 D5                 PUSH  D
078 E451 119E00             LXI   D,:009E   Addr COLORG table
079 E454 2A8000             LHLD  :0080     Get addr 1st byte screen RAM
080 E457 0606               MVI   B,:06     Depth each blanking line
081                                         in header -1
082 E459 CDFCE5             CALL  :E5FC     Set up header with COLORG
083                                         colours
084 E45C C338E4             JMP   :E438     Quit, all OK
085                 *
086                 * SET UP A FULL GRAPHIC SCREEN:
087                 *
088                 * Sets up a screen RAM for an all-graphics mode.
089                 *
090                 * Entry: A: Mode code /2.
091                 *        D: Mode code.
092                 * Exit:  CY=0: O.K.:
093                 *              DE points to table graphic colours.
094                 *              AF preserved. BCHL corrupted.
095                 *        CY=1: Insufficient space.
096                 *
097 E45F 37         SSM     STC 
098 E460 F5                 PUSH  PSW
099 E461 219AE5             LXI   H,:E59A   Addr table vectors full
100                                         graphic mode
101 E464 CD39E5             CALL  :E539     Set up screen mode
102 E467 DA3CE4             JC    :E43C     Jump if no room
103 E46A 3A9D00             LDA   :009D     Get current screen mode
104 E46D 92                 SUB   D         ) Check if change split
105 E46E 3D                 DCR   A         ) to all graphics
106 E46F CA00D7             JZ    :D700     Then check if sufficient
107                                         RAM available and change
108                                         mode
109 E472 CD6BE3             CALL  :E36B     Delete cursor
110 E475 3A9600             LDA   :0096     Get nr of graphics lines
111 E478 4F                 MOV   C,A       in C
112 E479 2A8200             LHLD  :0082     Get addr top graph area
113 E47C CDADE5             CALL  :E5AD     Blank whole screen
114 E47F 119E00     SSM10   LXI   D,:009E   Addr COLORG table
115 E482 F1                 POP   PSW
116 E483 3F                 CMC             CY=0: O.K.
117 E484 C9                 RET 
118                             
119                 * Change from split to all-graphic mode:
120                             
121 E485 D20FD7     SSM21   JNC   :D70F     Set up screen mode
122 E488 CD6BE3             CALL  :E36B     Delete cursor
123 E48B 2A8800             LHLD  :0088     Get addr temp save area
124 E48E 44                 MOV   B,H       ) in BC
125 E48F 4D                 MOV   C,L       )

PAGE 03    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

126 E490 C5                 PUSH  B         Save it on stack
127 E491 2A9200             LHLD  :0092     Get startaddr archive
128                                         area
129 E494 EB                 XCHG            in DE
130 E495 2A8C00             LHLD  :008C     Get addr end archive area
131 E498 CDC2E6             CALL  :E6C2     Move archive area into
132                                         temp save area
133 E49B 2A8600             LHLD  :0086     Get addr top of rolled area
134 E49E 44                 MOV   B,H       ) in BC
135 E49F 4D                 MOV   C,L       )
136 E4A0 2A8200             LHLD  :0082     Get addr top old graphics
137 E4A3 EB                 XCHG            in DE
138 E4A4 2A9900             LHLD  :0099     Get end old screen
139 E4A7 CDC2E6             CALL  :E6C2     Move lower part screen
140                                         downwards
141 E4AA 42                 MOV   B,D       ) BC is addr where to put
142 E4AB 4B                 MOV   C,E       ) archive area
143 E4AC D1                 POP   D         Get startaddr temp save area
144 E4AD 2A9000             LHLD  :0090     Get end temp save area
145 E4B0 CDC2E6             CALL  :E6C2     Move temp save area to
146                                         top of screen
147 E4B3 C37FE4             JMP   :E47F     Quit
148                 *
149                 * SET UP SCREEN FOR SPLIT MODE:
150                 *
151                 * Sets up a split screen for a given mode in the
152                 * lower RAM.
153                 *
154                 * Entry: A: Mode code /2.
155                 *        D: Mode code.
156                 * Exit:  CY=0: O.K.:
157                 *              DE: Address text colour table.
158                 *              AF preserved, BCHL corrupted.
159                 *        CY=1: Insufficient space.
160                 *
161 E4B6 37         SSMA    STC 
162 E4B7 F5                 PUSH  PSW
163 E4B8 21A0E5             LXI   H,:E5A0   Startaddr table vectors
164                                         split modes
165 E4BB CD39E5             CALL  :E539     Set up screen mode
166 E4BE DA3CE4             JC    :E43C     Abort if insufficient space
167 E4C1 3A9D00             LDA   :009D     Get old screen mode
168 E4C4 92                 SUB   D         ) Check if change from
169 E4C5 3C                 INR   A         ) all-graph to split
170 E4C6 F5                 PUSH  PSW       Preserve flags
171 E4C7 D5                 PUSH  D         and new mode code
172 E4C8 C2F9E4             JNZ   :E4F9     If not splitting old mode:
173                                         clear graph and moved areas
174 E4CB CD06D7             CALL  :D706     Check suff RAM available;
175                                         prepare full graphic mode
176 E4CE 00                 NOP 
177 E4CF D20DD7             JNC   :D70D     Set up current mode if
178                                         not O.K.
179 E4D2 2A9200             LHLD  :0092     Get start temp save area
180 E4D5 44                 MOV   B,H       ) in BC
181 E4D6 4D                 MOV   C,L       )
182 E4D7 2A8200             LHLD  :0082     Get addr after header
183 E4DA EB                 XCHG            in DE
184 E4DB 2A8600             LHLD  :0086     Get addr top of screen
185 E4DE CDC2E6             CALL  :E6C2     Move top of screen into
186                                         temp save area
187 E4E1 42                 MOV   B,D       ) BC is addr top of screen

PAGE 04    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

188 E4E2 4B                 MOV   C,E       )
189 E4E3 EB                 XCHG            Addr top rolled up area
190 E4E4 2A9900             LHLD  :0099     Get previous end of graphics
191 E4E7 CDC2E6             CALL  :E6C2     Move lower part of screen
192 E4EA 2A8E00             LHLD  :008E     Get final place for archive
193                                         code
194 E4ED 44                 MOV   B,H       ) in BC
195 E4EE 4D                 MOV   C,L       )
196 E4EF 2A9200             LHLD  :0092     Get addr start temp. save
197                                         area
198 E4F2 EB                 XCHG            in DE
199 E4F3 2A9000             LHLD  :0090     Get addr end split mode
200 E4F6 CDC2E6             CALL  :E6C2     Move temp save area into
201                                         archive area
202 E4F9 2A8A00     SMA10   LHLD  :008A     Get start addr char area
203 E4FC EB                 XCHG            in DE
204 E4FD 2A8C00             LHLD  :008C     Get addr end char area
205 E500 3A9D00             LDA   :009D     Get current screen mode
206 E503 1F                 RAR             Check mode
207 E504 0E04               MVI   C,:04     Nr of char lines in A-mode
208 E506 EB                 XCHG
209 E507 D4FDE1             CNC   :E1FD     Blank char area
210 E50A D487E6             CNC   :E687     Cursor on begin of line
211 E50D DC35E6             CC    :E635     Find old text and move it
212 E510 D1                 POP   D
213 E511 2A8200             LHLD  :0082     Get addr after header
214 E514 3A9700             LDA   :0097     Get nr saved graphics lines
215 E517 4F                 MOV   C,A       in C
216 E518 3A9600             LDA   :0096     Get nr of graphics lines
217 E51B 91                 SUB   C         minus saved ones
218 E51C 4F                 MOV   C,A       stored in C
219 E51D F1                 POP   PSW
220 E51E C4ADE5             CNZ   :E5AD     Blank visible graph area
221 E521 2A8E00             LHLD  :008E     Get addr end of screen
222 E524 3A9700             LDA   :0097     Get nr saved graphics lines
223 E527 4F                 MOV   C,A       in C
224 E528 C4ADE5             CNZ   :E5AD     Blank saved graph area
225 E52B 117C00             LXI   D,:007C   Addr text colour table
226 E52E 0600               MVI   B,:00     Middle as narrow as possible
227 E530 2A8800             LHLD  :0088     Get addr middle area
228 E533 F1                 POP   PSW       Get mode code
229 E534 CDFCE5             CALL  :E5FC     Set up middle area
230                                         (blanking)
231 E537 3F                 CMC 
232 E538 C9                 RET 
233                 *
234                 * SET UP SCREEN FOR MODE:
235                 *
236                 * Selects the right table according to the mode
237                 * number and sets the screen variables.
238                 *
239                 * Entry: A:  Mode code /2.
240                 *        HL: Points to screen parameter vectors
241                 *            for each pair of modes.
242                 * Exit:  CY=0: O.K.:
243                 *              AFHL corrupted, BCDE preserved.
244                 *        CY=1: Insufficient space.
245                 *
246 E539 E60E       TABP    ANI   :0E       Bits 1,2,3 only
247 E53B CD01E7             CALL  :E701     Add offset to start table
248 E53E 00                 NOP 
249 E53F 00                 NOP 

PAGE 05    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

250 E540 00                 NOP 
251 E541 7E                 MOV   A,M       )
252 E542 23                 INX   H         ) Get addr from table in HL
253 E543 66                 MOV   H,M       )
254 E544 6F                 MOV   L,A       )
255                 *
256                 * LOAD POINTERS WITH SCREEN PARAMETERS:
257                 *
258                 * Set up vector area 0084-0098 with variables
259                 * describing the current state of the screen
260                 * in the current mode.
261                 *
262 E545 37         VARS    STC 
263 E546 F5                 PUSH  PSW
264 E547 C5                 PUSH  B
265 E548 D5                 PUSH  D
266 E549 E5                 PUSH  H
267 E54A E5                 PUSH  H
268 E54B E5                 PUSH  H
269 E54C 2A8000             LHLD  :0080     Get addr 1st byte screen RAM
270 E54F 44                 MOV   B,H       in BC
271 E550 4D                 MOV   C,L
272 E551 E1                 POP   H         Get startaddr table
273 E552 79                 MOV   A,C       )
274 E553 96                 SUB   M         )
275 E554 5F                 MOV   E,A       ) Calc end area used in new
276 E555 23                 INX   H         ) mode. Store it in DE.
277 E556 78                 MOV   A,B       )
278 E557 9E                 SBB   M         )
279 E558 57                 MOV   D,A       )
280 E559 210000             LXI   H,:0000
281 E55C DA60E5             JC    :E560     Jump if insufficient space
282 E55F EB                 XCHG
283 E560 37         VRS05   STC 
284 E561 CDA6E5             CALL  :E5A6     Make room for new mode
285 E564 D296E5             JNC   :E596     Jump if no room available
286 E567 2A8800             LHLD  :0088     Get old addr after end
287                                         graphics area
288 E56A 229900             SHLD  :0099     and save it
289 E56D 2A8A00             LHLD  :008A     Get old startaddr char area
290 E570 229B00             SHLD  :009B     and save it
291                             
292                 * Set up area 0084-0093:
293                             
294 E573 118400             LXI   D,:0084   Start of variables which
295                                         need offsets
296 E576 2E08               MVI   L,:08     Nr of pointers to be set
297 E578 E3         VRS10   XTHL            Get addr screen parameters
298 E579 79                 MOV   A,C
299 E57A 96                 SUB   M         Calc lobyte
300 E57B 12                 STAX  D         And store it in pointer
301 E57C 23                 INX   H         Next byte
302 E57D 13                 INX   D
303 E57E 78                 MOV   A,B
304 E57F 9E                 SBB   M         Calc hibyte
305 E580 12                 STAX  D         And store it in pointer
306 E581 23                 INX   H
307 E582 13                 INX   D
308 E583 E3                 XTHL
309 E584 2D                 DCR   L         Decr counter
310 E585 C278E5             JNZ   :E578     Next parameter
311                             

PAGE 06    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

312                 * Set up area 0094-0098:
313                             
314 E588 E1                 POP   H         Get addr 1st parameter
315 E589 0605               MVI   B,:05     Nr unadjusted constant bytes
316 E58B 7E         VRS20   MOV   A,M       Get parameter
317 E58C 12                 STAX  D         and store it in pointer
318 E58D 23                 INX   H
319 E58E 13                 INX   D
320 E58F 05                 DCR   B         Decr counter
321 E590 C28BE5             JNZ   :E58B     Next parameter
322 E593 C32EE1             JMP   :E12E     Popall, CY=0, ret
323                             
324                 * If no room available:
325                             
326 E596 E1         VRS30   POP   H
327 E597 C338E1             JMP   :E138     Popall (CY=1), ret
328                 *
329                 * VECTORS TO TABLES SCREEN PARAMETERS:
330                 *
331                 * The startaddresses of the tables with para-
332                 * meters for the graphic modes are given.
333                 *
334 E59A 45E0       TABM    DBL   :E045     mode 1/2
335 E59C 6FE0               DBL   :E06F     mode 3/4
336 E59E 99E0               DBL   :E099     mode 5/6
337                 *
338 E5A0 5AE0       TABMA   DBL   :E05A     mode 1A/2A
339 E5A2 84E0               DBL   :E084     mode 3A/4A
340 E5A4 AEE0               DBL   :E0AE     mode 5A/6A
341                 *
342                 *************************************
343                 * PERFORM MEMORY MANAGEMENT ROUTINE *
344                 *************************************
345                 *
346                 * Entry: HL points to last free byte in RAM.
347                 *
348 E5A6 23         SMKRM   INX   H
349 E5A7 E5                 PUSH  H
350 E5A8 2AC400             LHLD  :00C4     Get addr mem.management
351                                         routine
352 E5AB E3                 XTHL            Put it on stack
353 E5AC C9                 RET             Perform this routine and
354                                         return afterwards to origin.
355                                         returnaddress.
356                 *
357                 *********************************
358                 * SET UP AN EMPTY GRAPHICS AREA *
359                 *********************************
360                 *
361                 * Initialises an area of the screen into graphic
362                 * state and blanks it. In 16-colour modes, all
363                 * pixels are set 'on'. The foreground colour is
364                 * the first COLORG colour, the background is black.
365                 *
366                 * Entry: D:  Mode code.
367                 *        C:  Number of graphic lines (1-256).
368                 *        HL: Start of area.
369                 * Exit:  All registers preserved.
370                 *
371 E5AD F5         SGINIT  PUSH  PSW
372 E5AE C5                 PUSH  B
373 E5AF D5                 PUSH  D

PAGE 07    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

374 E5B0 E5                 PUSH  H
375 E5B1 7A                 MOV   A,D       Mode in A
376 E5B2 E5                 PUSH  H
377 E5B3 110000             LXI   D,:0000   8 blobs 1st graph colour
378 E5B6 2E00               MVI   L,:00     Control byte: graph, low
379                                         def, 4-colour
380 E5B8 1F                 RAR 
381 E5B9 1F                 RAR 
382 E5BA DACBE5             JC    :E5CB     Jump if 4-colour mode
383                             
384                 * 16-colour mode only:
385                             
386 E5BD F5                 PUSH  PSW
387 E5BE 3A9E00             LDA   :009E     Get 1st colour
388 E5C1 87                 ADD   A         )
389 E5C2 87                 ADD   A         ) Move lonibble into
390 E5C3 87                 ADD   A         ) hinibble
391 E5C4 87                 ADD   A         )
392 E5C5 57                 MOV   D,A       Result in D
393 E5C6 1EFF               MVI   E,:FF     8 blobs foreground
394 E5C8 F1                 POP   PSW
395 E5C9 2E80               MVI   L,:80     Control byte: graph, low
396                                         def, 16-colour
397 E5CB 1F         SGI10   RAR 
398 E5CC DADEE5             JC    :E5DE     Jump if mode 3/4
399                             
400                 * Mode 1/2 and 5/6 only:
401                             
402 E5CF 1F                 RAR 
403 E5D0 260B               MVI   H,:0B     Low def fields/line
404 E5D2 3E03               MVI   A,:03     Low def bit mask
405 E5D4 D2E2E5             JNC   :E5E2     Jump if mode 1/2
406                             
407                 * Mode 5/6 only:
408                             
409 E5D7 262C               MVI   H,:2C     Super def fields/line
410 E5D9 3E20               MVI   A,:20     Super def bit mask
411 E5DB C3E2E5             JMP   :E5E2
412                             
413                 * Mode 3/4 only:
414                             
415 E5DE 2616       SGI20   MVI   H,:16     High def fields/line
416 E5E0 3E11               MVI   A,:11     High def bit mask
417                 *
418 E5E2 B5         SGI30   ORA   L         Add def bits to get mode
419                                         code
420 E5E3 47                 MOV   B,A
421 E5E4 7C                 MOV   A,H       Line length in A
422 E5E5 E1                 POP   H         Get top of area
423 E5E6 F5         SGI50   PUSH  PSW       Save line length
424 E5E7 70                 MOV   M,B       Load line control byte
425 E5E8 2B                 DCX   H
426 E5E9 3640               MVI   M,:40     Null line colour byte
427 E5EB 2B                 DCX   H
428 E5EC 73         SGI60   MOV   M,E       ) Load screen data locations
429 E5ED 2B                 DCX   H         ) with 1 blank field
430 E5EE 72                 MOV   M,D       )
431 E5EF 2B                 DCX   H
432 E5F0 3D                 DCR   A         Next screen location
433 E5F1 C2ECE5             JNZ   :E5EC     Jump if line not ready
434 E5F4 F1                 POP   PSW       Restore nr of locations in A
435 E5F5 0D                 DCR   C         Next screen line

PAGE 08    DAI FIRMWARE 2E407-2E5FB  V1.0  Rev.1

436 E5F6 C2E6E5             JNZ   :E5E6     Jump if not ready
437 E5F9 C338E1             JMP   :E138     Popall, ret
438                 *
439                 *
440                 *
441 E5FC                    END 
 
***************************
* S Y M B O L   T A B L E *
***************************
 
SGI10  E5CB   SGI20  E5DE   SGI30  E5E2   SGI50  E5E6   
SGI60  E5EC   SGINIT E5AD   SMA10  E4F9   SMKRM  E5A6   
SS010  E42D   SS015  E438   SS020  E43C   SSM    E45F   
SSM0   E407   SSM10  E47F   SSM21  E485   SSMA   E4B6   
SSMG   E43E   TABM   E59A   TABMA  E5A0   TABP   E539   
VARS   E545   VRS05  E560   VRS10  E578   VRS20  E58B   
VRS30  E596
