]> 4ch.mooo.com Git - 16.git/blob - 16/tauron30/ASM_SRC/MAIN.ASM
added another library ^^
[16.git] / 16 / tauron30 / ASM_SRC / MAIN.ASM
1 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
2 ;=-                                                                         -=\r
3 ;=-                   Tauron VGA Utilities Version 3.0                      -=\r
4 ;=-                      Released September 20, 1998                        -=\r
5 ;=-                                                                         -=\r
6 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
7 ;=- Copyright (c) 1997, 1998 by Jeff Morgan  =-= This code is FREE provided -=\r
8 ;=- All Rights Reserved.                     =-= that you put my name some- -=\r
9 ;=-                                          =-= where in your credits.     -=\r
10 ;=- DISCLAIMER:                              =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
11 ;=- I assume no responsibility whatsoever for any effect that this package, -=\r
12 ;=- the information contained therein or the use thereof has on you, your   -=\r
13 ;=- sanity, computer, spouse, children, pets or anything else related to    -=\r
14 ;=- you or your existance. No warranty is provided nor implied with this    -=\r
15 ;=- source code.                                                            -=\r
16 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
17 .MODEL  SMALL\r
18 .386\r
19 JUMPS\r
20 LOCALS\r
21 .STACK  200h\r
22 .DATA\r
23 \r
24 ATTRCON_ADDR      EQU       03C0H\r
25 MISC_ADDR         EQU       03C2H\r
26 VGAENABLE_ADDR    EQU       03C3H\r
27 SEQ_ADDR          EQU       03C4H\r
28 GRACON_ADDR       EQU       03CEH\r
29 CRTC_ADDR         EQU       03D4H\r
30 STATUS_ADDR       EQU       03DAH\r
31 \r
32 ; Videomode defines\r
33 VMODE_00H         EQU       00H\r
34 VMODE_01H         EQU       00H\r
35 VMODE_02H         EQU       03H\r
36 VMODE_03H         EQU       03H\r
37 VMODE_04H         EQU       04H\r
38 VMODE_05H         EQU       04H\r
39 VMODE_06H         EQU       06H\r
40 VMODE_07H         EQU       07H\r
41 VMODE_0DH         EQU       0DH\r
42 VMODE_0EH         EQU       0EH\r
43 VMODE_0FH         EQU       0FH\r
44 VMODE_10H         EQU       10H\r
45 VMODE_11H         EQU       11H\r
46 VMODE_12H         EQU       12H\r
47 VMODE_13H         EQU       13H\r
48 VMODE_CHAIN4      EQU       14H\r
49 VMODE_MODE_X      EQU       15H\r
50 VMODE_MODE_A      EQU       16H\r
51 VMODE_MODE_B      EQU       17H\r
52 VMODE_MODE_C      EQU       18H\r
53 VMODE_MODE_D      EQU       19H\r
54 VMODE_MODE_E      EQU       1AH\r
55 VMODE_MODE_F      EQU       1BH\r
56 VMODE_MODE_G      EQU       1CH\r
57 VMODE_MODE_H      EQU       1DH\r
58 VMODE_MODE_I      EQU       1EH\r
59 VMODE_MODE_J      EQU       1FH\r
60 VMODE_MODE_K      EQU       20H\r
61 VMODE_MODE_L      EQU       21H\r
62 VMODE_MODE_M      EQU       22H\r
63 VMODE_MODE_N      EQU       23H\r
64 \r
65 ;These next four lines must be included for the text mode stuff to work.\r
66 oldmode db ?\r
67 oldmisc db ?\r
68 oldmask db ?\r
69 oldmem db ?\r
70 \r
71 PALETTE LABEL BYTE\r
72 DB  0,  0,  0,  0,  0, 42,  0, 42,  0,  0, 42, 42, 42,  0,  0, 42,  0, 42\r
73 DB 42, 21,  0, 42, 42, 42, 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63\r
74 DB 63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63,  0,  0,  0,  5,  5,  5\r
75 DB  8,  8,  8, 11, 11, 11, 14, 14, 14, 17, 17, 17, 20, 20, 20, 24, 24, 24\r
76 DB 28, 28, 28, 32, 32, 32, 36, 36, 36, 40, 40, 40, 45, 45, 45, 50, 50, 50\r
77 DB 56, 56, 56, 63, 63, 63,  0,  0, 63, 16,  0, 63, 31,  0, 63, 47,  0, 63\r
78 DB 63,  0, 63, 63,  0, 47, 63,  0, 31, 63,  0, 16, 63,  0,  0, 63, 16,  0\r
79 DB 63, 31,  0, 63, 47,  0, 63, 63,  0, 47, 63,  0, 31, 63,  0, 16, 63,  0\r
80 DB  0, 63,  0,  0, 63, 16,  0, 63, 31,  0, 63, 47,  0, 63, 63,  0, 47, 63\r
81 DB  0, 31, 63,  0, 16, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63\r
82 DB 63, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31, 31, 63, 39, 31\r
83 DB 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63, 31, 47, 63, 31, 39, 63, 31\r
84 DB 31, 63, 31, 31, 63, 39, 31, 63, 47, 31, 63, 55, 31, 63, 63, 31, 55, 63\r
85 DB 31, 47, 63, 31, 39, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63\r
86 DB 63, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45, 45, 63, 49, 45\r
87 DB 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63, 45, 54, 63, 45, 49, 63, 45\r
88 DB 45, 63, 45, 45, 63, 49, 45, 63, 54, 45, 63, 58, 45, 63, 63, 45, 58, 63\r
89 DB 45, 54, 63, 45, 49, 63,  0,  0, 28,  7,  0, 28, 14,  0, 28, 21,  0, 28\r
90 DB 28,  0, 28, 28,  0, 21, 28,  0, 14, 28,  0,  7, 28,  0,  0, 28,  7,  0\r
91 DB 28, 14,  0, 28, 21,  0, 28, 28,  0, 21, 28,  0, 14, 28,  0,  7, 28,  0\r
92 DB  0, 28,  0,  0, 28,  7,  0, 28, 14,  0, 28, 21,  0, 28, 28,  0, 21, 28\r
93 DB  0, 14, 28,  0,  7, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28\r
94 DB 28, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14, 14, 28, 17, 14\r
95 DB 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28, 14, 21, 28, 14, 17, 28, 14\r
96 DB 14, 28, 14, 14, 28, 17, 14, 28, 21, 14, 28, 24, 14, 28, 28, 14, 24, 28\r
97 DB 14, 21, 28, 14, 17, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28\r
98 DB 28, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20, 20, 28, 22, 20\r
99 DB 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28, 20, 24, 28, 20, 22, 28, 20\r
100 DB 20, 28, 20, 20, 28, 22, 20, 28, 24, 20, 28, 26, 20, 28, 28, 20, 26, 28\r
101 DB 20, 24, 28, 20, 22, 28,  0,  0, 16,  4,  0, 16,  8,  0, 16, 12,  0, 16\r
102 DB 16,  0, 16, 16,  0, 12, 16,  0,  8, 16,  0,  4, 16,  0,  0, 16,  4,  0\r
103 DB 16,  8,  0, 16, 12,  0, 16, 16,  0, 12, 16,  0,  8, 16,  0,  4, 16,  0\r
104 DB  0, 16,  0,  0, 16,  4,  0, 16,  8,  0, 16, 12,  0, 16, 16,  0, 12, 16\r
105 DB  0,  8, 16,  0,  4, 16,  8,  8, 16, 10,  8, 16, 12,  8, 16, 14,  8, 16\r
106 DB 16,  8, 16, 16,  8, 14, 16,  8, 12, 16,  8, 10, 16,  8,  8, 16, 10,  8\r
107 DB 16, 12,  8, 16, 14,  8, 16, 16,  8, 14, 16,  8, 12, 16,  8, 10, 16,  8\r
108 DB  8, 16,  8,  8, 16, 10,  8, 16, 12,  8, 16, 14,  8, 16, 16,  8, 14, 16\r
109 DB  8, 12, 16,  8, 10, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16\r
110 DB 16, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11, 11, 16, 12, 11\r
111 DB 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16, 11, 13, 16, 11, 12, 16, 11\r
112 DB 11, 16, 11, 11, 16, 12, 11, 16, 13, 11, 16, 15, 11, 16, 16, 11, 15, 16\r
113 DB 11, 13, 16, 11, 12, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0\r
114 DB  0,  0,  0,  0,  0,  0,  0,  0,  0, 63, 63, 63\r
115 \r
116 ; Must be included for any videomode to be set.\r
117 include modes.inc\r
118 \r
119 MAIN_MSG LABEL BYTE\r
120 DB 'Tauron VGA Utilities v3.0',13,10\r
121 DB 'Copyright (c) 1998 Jeffrey Morgan.  All Rights Reserved.',13,10\r
122 DB 'Select a video mode to test: (Modes with a ! are not implemented)',13,10\r
123 DB 'Key              Videomode   (Modes with a % are unchained)',13,10\r
124 DB '================================================================================'\r
125 DB ' 0) 00H, 01H -- 40 x 25 x 16         %F) Mode D   --  360 x 200 x 256',13,10\r
126 DB ' 1) Mode L   -- 40 x 43 x 16         %G) Mode E   --  360 x 240 x 256',13,10\r
127 DB ' 2) Mode M   -- 40 x 50 x 16         %H) Mode F   --  360 x 350 x 256',13,10\r
128 DB '!3) 07H      -- 80 x 25 x 2          %I) Mode G   --  360 x 400 x 256',13,10\r
129 DB ' 4) 02H, 03H -- 80 x 25 x 16         %J) Mode H   --  360 x 480 x 256',13,10\r
130 DB ' 5) Mode J   -- 80 x 43 x 16          K) 06H      -- 640 x 200 x 2',13,10\r
131 DB ' 6) Mode K   -- 80 x 50 x 16         !L) 0FH      -- 640 x 350 x 2',13,10 \r
132 DB ' 7) 04H, 05H -- 320 x 200 x 4         M) 11H      -- 640 x 480 x 2',13,10 \r
133 DB ' 8) 0DH      -- 320 x 200 x 16        N) 0EH      -- 640 x 200 x 16',13,10\r
134 DB ' 9) 13H      -- 320 x 200 x 256       O) 10H      -- 640 x 350 x 16',13,10\r
135 DB '%A) Chain 4  --  320 x 200 x 256      P) Mode I   -- 640 x 400 x 16',13,10\r
136 DB '%B) Mode X   --  320 x 240 x 256      Q) 12H      -- 640 x 480 x 16',13,10\r
137 DB '%C) Mode A   --  320 x 350 x 256',13,10\r
138 DB '%D) Mode B   --  320 x 400 x 256      R) Dual Font Test',13,10\r
139 DB '%E) Mode C   --  320 x 480 x 256',13,10\r
140 DB '===============================================================================',13,10\r
141 DB 'Hit ',39,'ESC',39,' to exit.  Press a key [0-9 or A-O]>$'\r
142 \r
143 TEXTMSG_1 DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0\r
144 TEXTMSG_2 DB 179,'Text Mode: 00H        ',179,0 ; +13\r
145 TEXTMSG_3 DB 179,'Width: 80   Height: 25',179,0 ; +8\r
146 TEXTMSG_4 DB 179,'Bytes per screen: 4000',179,0 ; +19\r
147 TEXTMSG_5 DB 179,'Number of pages: 8    ',179,0\r
148 TEXTMSG_6 DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0\r
149 \r
150 TEXTMSG_7 DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0\r
151 TEXTMSG_8 DB 179,'Text Mode J           ',179,0 ; +11\r
152 TEXTMSG_9 DB 179,'Width: 80   Height: 43',179,0 ; +21, +22\r
153 TEXTMSG_A DB 179,'Bytes per screen: 3440',179,0 ; +19, +20, +21, +22\r
154 TEXTMSG_B DB 179,'Number of pages: 8    ',179,0\r
155 TEXTMSG_C DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0\r
156 \r
157 TEXTMSG_D DB 218,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191,0\r
158 TEXTMSG_E DB 179,' DUAL FONT MODE ',179,0 ;\r
159 TEXTMSG_F DB 192,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217,0\r
160 \r
161 FONT_8x8_OFF DW ?\r
162 FONT_8x14_OFF DW ?\r
163 \r
164 ; Attribute for text charcters\r
165 ATT DB 1FH\r
166 \r
167 FONT1 LABEL BYTE\r
168 include font1.asm\r
169 FONT2 LABEL BYTE\r
170 include font2.asm\r
171 .CODE\r
172 \r
173 IODELAY MACRO\r
174    REPT 8\r
175       JMP $+2\r
176    ENDM\r
177 ENDM\r
178 \r
179 Start:\r
180    MOV AX,@DATA\r
181    MOV DS,AX\r
182 \r
183    ; This must be here to ensure that the fonts are properly found because\r
184    ; the location of the fonts in ROM is different on every VGA BIOS.\r
185    ; Get location of the fonts for Modes J and K\r
186    MOV AH,11h\r
187    MOV AL,30h\r
188    MOV BH,03h\r
189    INT 10H\r
190    MOV FONT_8x8_OFF,BP\r
191 \r
192    ; Get location of the fonts for Modes 00H, 01H, 02H, 03H, and 07H\r
193    MOV AH,11h\r
194    MOV AL,30h\r
195    MOV BH,06h\r
196    INT 10H\r
197    MOV FONT_8x14_OFF,BP\r
198 \r
199    ; Reset the mode and clear the screen\r
200    MOV AX,0003H\r
201    INT 10H\r
202 \r
203    ; Print out the message\r
204    MOV DX,OFFSET MAIN_MSG\r
205    MOV AH,9\r
206    INT 21H\r
207 \r
208 MAIN_LOOP:\r
209 \r
210    ; Wait for a keypress\r
211    MOV AH,0\r
212    INT 16H\r
213 \r
214    CMP AL,27\r
215    JE QUIT_PROGRAM\r
216 \r
217    CMP AL,'0'\r
218    JE MODE_00_TEST\r
219 \r
220    CMP AL,'1'\r
221    JE MODE_L_TEST\r
222 \r
223    CMP AL,'2'\r
224    JE MODE_M_TEST\r
225 \r
226    CMP AL,'4'\r
227    JE MODE_03_TEST\r
228 \r
229    CMP AL,'5'\r
230    JE MODE_J_TEST\r
231 \r
232    CMP AL,'6'\r
233    JE MODE_K_TEST\r
234 \r
235    CMP AL,'7'\r
236    JE MODE_04_TEST\r
237 \r
238    CMP AL,'8'\r
239    JE MODE_0D_TEST\r
240 \r
241    CMP AL,'9'\r
242    JE MODE_13_TEST\r
243 \r
244    CMP AL,'a'\r
245    JE MODE_C4_TEST\r
246    CMP AL,'A'\r
247    JE MODE_C4_TEST\r
248 \r
249    CMP AL,'b'\r
250    JE MODE_X_TEST\r
251    CMP AL,'B'\r
252    JE MODE_X_TEST\r
253 \r
254    CMP AL,'c'\r
255    JE MODE_A_TEST\r
256    CMP AL,'C'\r
257    JE MODE_A_TEST\r
258 \r
259    CMP AL,'d'\r
260    JE MODE_B_TEST\r
261    CMP AL,'D'\r
262    JE MODE_B_TEST\r
263 \r
264    CMP AL,'e'\r
265    JE MODE_C_TEST\r
266    CMP AL,'E'\r
267    JE MODE_C_TEST\r
268 \r
269    CMP AL,'f'\r
270    JE MODE_D_TEST\r
271    CMP AL,'F'\r
272    JE MODE_D_TEST\r
273 \r
274    CMP AL,'g'\r
275    JE MODE_E_TEST\r
276    CMP AL,'G'\r
277    JE MODE_E_TEST\r
278 \r
279    CMP AL,'h'\r
280    JE MODE_F_TEST\r
281    CMP AL,'H'\r
282    JE MODE_F_TEST\r
283 \r
284    CMP AL,'i'\r
285    JE MODE_G_TEST\r
286    CMP AL,'I'\r
287    JE MODE_G_TEST\r
288 \r
289    CMP AL,'j'\r
290    JE MODE_H_TEST\r
291    CMP AL,'J'\r
292    JE MODE_H_TEST\r
293 \r
294    CMP AL,'k'\r
295    JE MODE_06_TEST\r
296    CMP AL,'K'\r
297    JE MODE_06_TEST\r
298 \r
299    CMP AL,'m'\r
300    JE MODE_11_TEST\r
301    CMP AL,'M'\r
302    JE MODE_11_TEST\r
303 \r
304    CMP AL,'n'\r
305    JE MODE_0E_TEST\r
306    CMP AL,'N'\r
307    JE MODE_0E_TEST\r
308 \r
309    CMP AL,'o'\r
310    JE MODE_10_TEST\r
311    CMP AL,'O'\r
312    JE MODE_10_TEST\r
313 \r
314    CMP AL,'p'\r
315    JE MODE_I_TEST\r
316    CMP AL,'P'\r
317    JE MODE_I_TEST\r
318 \r
319    CMP AL,'q'\r
320    JE MODE_12_TEST\r
321    CMP AL,'Q'\r
322    JE MODE_12_TEST\r
323 \r
324    CMP AL,'r'\r
325    JE DUAL_TEST\r
326    CMP AL,'R'\r
327    JE DUAL_TEST\r
328    JMP MAIN_LOOP\r
329 \r
330 ; ====================== New Video Mode ====================================\r
331 MODE_00_TEST:\r
332    PUSH VMODE_00H\r
333    CALL SETVIDEOMODE\r
334 \r
335    CALL TEXTTEST\r
336 \r
337    ; Wait for a keypress\r
338    MOV AH,0\r
339    INT 16H\r
340    JMP RESET\r
341 \r
342 ; ====================== New Video Mode ====================================\r
343 MODE_03_TEST:\r
344    PUSH VMODE_03H\r
345    CALL SETVIDEOMODE\r
346 \r
347    CALL TEXTTEST\r
348 \r
349    ; Wait for a keypress\r
350    MOV AH,0\r
351    INT 16H\r
352    JMP RESET\r
353 \r
354 ; ====================== New Video Mode ====================================\r
355 MODE_04_TEST:\r
356    PUSH VMODE_04H\r
357    CALL SETVIDEOMODE\r
358 \r
359    PUSH 0AAAAH\r
360    CALL CLEAR_B8000H\r
361 \r
362    ; Wait for a keypress\r
363    MOV AH,0\r
364    INT 16H\r
365    JMP RESET\r
366 \r
367 ; ====================== New Video Mode ====================================\r
368 MODE_06_TEST:\r
369    PUSH VMODE_06H\r
370    CALL SETVIDEOMODE\r
371 \r
372    PUSH 0FFFFH\r
373    CALL CLEAR_B8000H\r
374 \r
375    ; Wait for a keypress\r
376    MOV AH,0\r
377    INT 16H\r
378    JMP RESET\r
379 \r
380 ; ====================== New Video Mode ====================================\r
381 MODE_0D_TEST:\r
382    PUSH VMODE_0DH\r
383    CALL SETVIDEOMODE\r
384 \r
385    PUSH 12\r
386    CALL CLEAR0DH\r
387 \r
388    ; Wait for a keypress\r
389    MOV AH,0\r
390    INT 16H\r
391    JMP RESET\r
392 \r
393 ; ====================== New Video Mode ====================================\r
394 MODE_0E_TEST:\r
395    PUSH VMODE_0EH\r
396    CALL SETVIDEOMODE\r
397 \r
398    CALL MODETEST\r
399 \r
400    ; Wait for a keypress\r
401    MOV AH,0\r
402    INT 16H\r
403    JMP RESET\r
404 \r
405 ; ====================== New Video Mode ====================================\r
406 MODE_10_TEST:\r
407    PUSH VMODE_10H\r
408    CALL SETVIDEOMODE\r
409 \r
410    CALL MODETEST\r
411 \r
412    ; Wait for a keypress\r
413    MOV AH,0\r
414    INT 16H\r
415    JMP RESET\r
416 \r
417 ; ====================== New Video Mode ====================================\r
418 MODE_11_TEST:\r
419    PUSH VMODE_11H\r
420    CALL SETVIDEOMODE\r
421 \r
422    CALL MODETEST\r
423 \r
424    ; Wait for a keypress\r
425    MOV AH,0\r
426    INT 16H\r
427    JMP RESET\r
428 \r
429 ; ====================== New Video Mode ====================================\r
430 MODE_12_TEST:\r
431    PUSH VMODE_12H\r
432    CALL SETVIDEOMODE\r
433 \r
434    CALL MODETEST\r
435 \r
436    ; Wait for a keypress\r
437    MOV AH,0\r
438    INT 16H\r
439    JMP RESET\r
440 \r
441 ; ====================== New Video Mode ====================================\r
442 MODE_13_TEST:\r
443    PUSH VMODE_13H\r
444    CALL SETVIDEOMODE\r
445 \r
446    CALL MODETEST\r
447 \r
448    ; Wait for a keypress\r
449    MOV AH,0\r
450    INT 16H\r
451    JMP RESET\r
452 \r
453 ; ====================== New Video Mode ====================================\r
454 MODE_I_TEST:\r
455    PUSH VMODE_MODE_I\r
456    CALL SETVIDEOMODE\r
457 \r
458    CALL MODETEST\r
459 \r
460    ; Wait for a keypress\r
461    MOV AH,0\r
462    INT 16H\r
463    JMP RESET\r
464 \r
465 ; ====================== New Video Mode ====================================\r
466 MODE_C4_TEST:\r
467    PUSH VMODE_CHAIN4\r
468    CALL SETVIDEOMODE\r
469 \r
470    CALL MODETEST\r
471 \r
472    ; Wait for a keypress\r
473    MOV AH,0\r
474    INT 16H\r
475    JMP RESET\r
476 \r
477 ; ====================== New Video Mode ====================================\r
478 MODE_X_TEST:\r
479    PUSH VMODE_MODE_X\r
480    CALL SETVIDEOMODE\r
481 \r
482    CALL MODETEST\r
483 \r
484    ; Wait for a keypress\r
485    MOV AH,0\r
486    INT 16H\r
487    JMP RESET\r
488 \r
489 ; ====================== New Video Mode ====================================\r
490 MODE_A_TEST:\r
491    PUSH VMODE_MODE_A\r
492    CALL SETVIDEOMODE\r
493 \r
494    CALL MODETEST\r
495 \r
496    ; Wait for a keypress\r
497    MOV AH,0\r
498    INT 16H\r
499    JMP RESET\r
500 \r
501 ; ====================== New Video Mode ====================================\r
502 MODE_B_TEST:\r
503    PUSH VMODE_MODE_B\r
504    CALL SETVIDEOMODE\r
505 \r
506    CALL MODETEST\r
507 \r
508    ; Wait for a keypress\r
509    MOV AH,0\r
510    INT 16H\r
511    JMP RESET\r
512 \r
513 ; ====================== New Video Mode ====================================\r
514 MODE_C_TEST:\r
515    PUSH VMODE_MODE_C\r
516    CALL SETVIDEOMODE\r
517 \r
518    CALL MODETEST\r
519 \r
520    ; Wait for a keypress\r
521    MOV AH,0\r
522    INT 16H\r
523    JMP RESET\r
524 \r
525 ; ====================== New Video Mode ====================================\r
526 MODE_D_TEST:\r
527    PUSH VMODE_MODE_D\r
528    CALL SETVIDEOMODE\r
529 \r
530    CALL MODETEST\r
531 \r
532    ; Wait for a keypress\r
533    MOV AH,0\r
534    INT 16H\r
535    JMP RESET\r
536 \r
537 ; ====================== New Video Mode ====================================\r
538 MODE_E_TEST:\r
539    PUSH VMODE_MODE_E\r
540    CALL SETVIDEOMODE\r
541 \r
542    CALL MODETEST\r
543 \r
544    ; Wait for a keypress\r
545    MOV AH,0\r
546    INT 16H\r
547    JMP RESET\r
548 \r
549 ; ====================== New Video Mode ====================================\r
550 MODE_F_TEST:\r
551    PUSH VMODE_MODE_F\r
552    CALL SETVIDEOMODE\r
553 \r
554    CALL MODETEST\r
555 \r
556    ; Wait for a keypress\r
557    MOV AH,0\r
558    INT 16H\r
559    JMP RESET\r
560 \r
561 ; ====================== New Video Mode ====================================\r
562 MODE_G_TEST:\r
563    PUSH VMODE_MODE_G\r
564    CALL SETVIDEOMODE\r
565 \r
566    CALL MODETEST\r
567 \r
568    ; Wait for a keypress\r
569    MOV AH,0\r
570    INT 16H\r
571    JMP RESET\r
572 \r
573 ; ====================== New Video Mode ====================================\r
574 MODE_H_TEST:\r
575    PUSH VMODE_MODE_H\r
576    CALL SETVIDEOMODE\r
577 \r
578    CALL MODETEST\r
579 \r
580    ; Wait for a keypress\r
581    MOV AH,0\r
582    INT 16H\r
583    JMP RESET\r
584 \r
585 ; ====================== New Video Mode ====================================\r
586 MODE_J_TEST:\r
587    PUSH VMODE_MODE_J\r
588    CALL SETVIDEOMODE\r
589 \r
590    CALL TEXTTEST\r
591 \r
592    ; Wait for a keypress\r
593    MOV AH,0\r
594    INT 16H\r
595    JMP RESET\r
596 \r
597 ; ====================== New Video Mode ====================================\r
598 MODE_K_TEST:\r
599    PUSH VMODE_MODE_K\r
600    CALL SETVIDEOMODE\r
601 \r
602    CALL TEXTTEST\r
603 \r
604    ; Wait for a keypress\r
605    MOV AH,0\r
606    INT 16H\r
607    JMP RESET\r
608 \r
609 ; ====================== New Video Mode ====================================\r
610 MODE_L_TEST:\r
611    PUSH VMODE_MODE_L\r
612    CALL SETVIDEOMODE\r
613 \r
614    CALL TEXTTEST\r
615 \r
616    ; Wait for a keypress\r
617    MOV AH,0\r
618    INT 16H\r
619    JMP RESET\r
620 \r
621 ; ====================== New Video Mode ====================================\r
622 MODE_M_TEST:\r
623    PUSH VMODE_MODE_M\r
624    CALL SETVIDEOMODE\r
625 \r
626    CALL TEXTTEST\r
627 \r
628    ; Wait for a keypress\r
629    MOV AH,0\r
630    INT 16H\r
631    JMP RESET\r
632 \r
633 ; ====================== New Video Mode ====================================\r
634 DUAL_TEST:\r
635    CALL DUALTEST\r
636 \r
637 RESET:\r
638    ; Reset the mode and clear the screen\r
639    MOV AX,0003H\r
640    INT 10H\r
641 \r
642    ; Print out the message\r
643    MOV DX,OFFSET MAIN_MSG\r
644    MOV AH,9\r
645    INT 21H\r
646    JMP MAIN_LOOP\r
647 \r
648 ; ====================== New Video Mode ====================================\r
649 QUIT_PROGRAM:\r
650    ; Set the BIOS mode 03h\r
651    MOV AX,0003H\r
652    INT 10H\r
653 \r
654    ; Exit to DOS\r
655    MOV AX,4C00H\r
656    INT 21H\r
657 \r
658 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
659 \r
660 LOADFONT PROC\r
661    PUSH BP\r
662    MOV BP,SP\r
663    PUSHA\r
664  mov dx,GRACON_ADDR                     ;get graphics port\r
665  mov al,5                               ;get write mode reg\r
666  out dx,al                              ;select the reg\r
667  IODELAY                                ;delay a bit\r
668  inc dx                                 ;change DX\r
669  in al,dx                               ;get value\r
670  IODELAY                                ;pause\r
671  mov [oldmode],al                       ;store it\r
672  dec dx                                 ;restore DX\r
673  mov al,6                               ;get misc reg\r
674  out dx,al                              ;select the reg\r
675  IODELAY                                ;delay a bit\r
676  inc dx                                 ;change DX\r
677  in al,dx                               ;get value\r
678  IODELAY                                ;pause\r
679  mov [oldmisc],al                       ;store it\r
680  dec dx                                 ;restore DX\r
681  mov dx,SEQ_ADDR                        ;get sequencer port\r
682  mov al,2                               ;get map mask reg\r
683  out dx,al                              ;select the reg\r
684  IODELAY                                ;delay a bit\r
685  inc dx                                 ;change DX\r
686  in al,dx                               ;get value\r
687  IODELAY                                ;pause\r
688  mov [oldmask],al                       ;store it\r
689  dec dx                                 ;restore DX\r
690  mov al,4                               ;get memory selector reg\r
691  out dx,al                              ;select the reg\r
692  IODELAY                                ;delay a bit\r
693  inc dx                                 ;change DX\r
694  in al,dx                               ;get value\r
695  IODELAY                                ;pause\r
696  mov [oldmem],al                        ;store it\r
697 \r
698  mov dx,GRACON_ADDR                     ;select graphics port\r
699  mov al,5                               ;get write mode reg\r
700  mov ah,[oldmode]                       ;get old value\r
701  and ah,0fch                            ;mask it\r
702  out dx,ax                              ;set new value\r
703  IODELAY                                ;pause\r
704  mov al,6                               ;get misc reg\r
705  mov ah,[oldmisc]                       ;get old value\r
706  and ah,0f1h                            ;mask it\r
707  or ah,4                                ;set a flag\r
708  out dx,ax                              ;set it\r
709  IODELAY                                ;pause\r
710  mov dx,SEQ_ADDR                        ;select sequencer port\r
711  mov al,2                             ;get mask reg\r
712  mov ah,4                               ;get new value\r
713  out dx,ax                              ;set it\r
714  IODELAY                                ;pause\r
715  mov al,4                              ;get memory reg\r
716  mov ah,[oldmem]                        ;get old value\r
717  or ah,4                                ;set flag\r
718  out dx,ax                              ;set value\r
719  IODELAY                                ;pause\r
720 \r
721    PUSH DS\r
722    PUSH ES\r
723 \r
724    MOV AX,[BP+8]\r
725    MOV ES,AX\r
726    MOV DI,[BP+10]\r
727 \r
728    MOV AX,[BP+4]\r
729    MOV DS,AX\r
730    MOV SI,[BP+6]\r
731 \r
732 @@LOOP1:\r
733    PUSH DI\r
734    MOV CL,[BP+12]\r
735 @@LOOP2:\r
736    MOVSB\r
737    DEC CL\r
738    JNZ @@LOOP2\r
739 \r
740    MOV CL,32\r
741    SUB CL,byte ptr [BP+12]\r
742 @@LOOP3:\r
743    MOV AX,00H\r
744    STOSB\r
745    DEC CL\r
746    JNZ @@LOOP3\r
747 \r
748    POP DI\r
749    ADD DI,32\r
750 \r
751    DEC CH\r
752    JNZ @@LOOP1\r
753 \r
754    POP ES\r
755    POP DS\r
756 \r
757  mov dx,GRACON_ADDR                     ;get graphics port\r
758  mov al,5                               ;get 1st reg\r
759  mov ah,[oldmode]                       ;get old value\r
760  out dx,ax                              ;set it\r
761  IODELAY                                ;pause\r
762  mov al,6                               ;get 2nd reg\r
763  mov ah,[oldmisc]                       ;get old value\r
764  out dx,ax                              ;set it\r
765  IODELAY                                ;pause\r
766  mov dx,SEQ_ADDR                        ;get seq port\r
767  mov al,2                               ;get 3rd reg\r
768  mov ah,[oldmask]                       ;get old value\r
769  out dx,ax                              ;set it\r
770  IODELAY                                ;pause\r
771  mov al,4                               ;get 4th reg\r
772  mov ah,[oldmem]                        ;get old value\r
773  out dx,ax                              ;set it\r
774  IODELAY                                ;pause\r
775 \r
776    POPA\r
777    POP BP\r
778    RET 10\r
779 LOADFONT ENDP\r
780 \r
781 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
782 include clear.asm\r
783 include modes.asm\r
784 include tests.asm\r
785 include dual.asm\r
786 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
787 \r
788 END Start\r