]> 4ch.mooo.com Git - 16.git/blob - 16/tauron/ASM_SRC/MODES.ASM
added another library ^^
[16.git] / 16 / tauron / ASM_SRC / MODES.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 \r
18 SETVIDEOMODE PROC\r
19    PUSH BP\r
20    MOV BP,SP\r
21 \r
22    MOV AX,word ptr [BP+4]\r
23    MOV Mode.videomode, AX\r
24    CMP AX,VMODE_00H\r
25    JE SET00H\r
26    CMP AX,VMODE_03H\r
27    JE SET03H\r
28    CMP AX,VMODE_04H\r
29    JE SET04H\r
30    CMP AX,VMODE_06H\r
31    JE SET06H\r
32 ;   CMP AX,VMODE_07H\r
33 ;   JE SET07H\r
34    CMP AX,VMODE_0DH\r
35    JE SET0DH\r
36    CMP AX,VMODE_0EH\r
37    JE SET0EH\r
38 ;   CMP AX,VMODE_0FH\r
39 ;   JE SET0FH\r
40    CMP AX,VMODE_10H\r
41    JE SET10H\r
42    CMP AX,VMODE_11H\r
43    JE SET11H\r
44    CMP AX,VMODE_12H\r
45    JE SET12H\r
46    CMP AX,VMODE_13H\r
47    JE SET13H\r
48    CMP AX,VMODE_CHAIN4\r
49    JE SETCHAIN4\r
50    CMP AX,VMODE_MODE_X\r
51    JE SETMODE_X\r
52    CMP AX,VMODE_MODE_A\r
53    JE SETMODE_A\r
54    CMP AX,VMODE_MODE_B\r
55    JE SETMODE_B\r
56    CMP AX,VMODE_MODE_C\r
57    JE SETMODE_C\r
58    CMP AX,VMODE_MODE_D\r
59    JE SETMODE_D\r
60    CMP AX,VMODE_MODE_E\r
61    JE SETMODE_E\r
62    CMP AX,VMODE_MODE_F\r
63    JE SETMODE_F\r
64    CMP AX,VMODE_MODE_G\r
65    JE SETMODE_G\r
66    CMP AX,VMODE_MODE_H\r
67    JE SETMODE_H\r
68    CMP AX,VMODE_MODE_I\r
69    JE SETMODE_I\r
70    CMP AX,VMODE_MODE_J\r
71    JE SETMODE_J\r
72    CMP AX,VMODE_MODE_K\r
73    JE SETMODE_K\r
74    CMP AX,VMODE_MODE_L\r
75    JE SETMODE_L\r
76    CMP AX,VMODE_MODE_M\r
77    JE SETMODE_M\r
78    JMP SET_OUT\r
79 \r
80 SET00H:\r
81    MOV SI,OFFSET MODE00H\r
82    CALL SETMODE\r
83 \r
84    PUSH 16                 ; Bytes per character\r
85    PUSH 0                  ; Offset of font in Video Memory\r
86    PUSH 0A000H\r
87    PUSH FONT_8x14_OFF      ; Offset of Font in BIOS\r
88    PUSH 0C000H\r
89    CALL LOADFONT\r
90    CALL SETPALETTE16\r
91    MOV Mode.mode_width,40;\r
92    MOV Mode.mode_height,25;\r
93    MOV Mode.width_bytes,1000;\r
94    MOV Mode.colors,16;\r
95    MOV Mode.attrib,TVU_TEXT;\r
96    JMP SET_OUT\r
97 \r
98 SET03H:\r
99    MOV SI,OFFSET MODE03H\r
100    CALL SETMODE\r
101 \r
102    PUSH 16                ; Bytes per character\r
103    PUSH 0                  ; Offset of font in Video Memory\r
104    PUSH 0A000H\r
105    PUSH FONT_8x14_OFF      ; Offset of Font in BIOS\r
106    PUSH 0C000H\r
107    CALL LOADFONT\r
108 ;   CALL SETPALETTE16\r
109    MOV Mode.mode_width,80;\r
110    MOV Mode.mode_height,25;\r
111    MOV Mode.width_bytes,2000;\r
112    MOV Mode.colors,16;\r
113    MOV Mode.attrib,TVU_TEXT;\r
114    JMP SET_OUT\r
115 \r
116 SET04H:\r
117    MOV SI,OFFSET MODE04H\r
118    CALL SETMODE\r
119    CALL SETPALETTE4\r
120    MOV Mode.mode_width,320;\r
121    MOV Mode.mode_height,200;\r
122    MOV Mode.width_bytes,65535;\r
123    MOV Mode.colors,4;\r
124    MOV Mode.attrib,TVU_GRAPHICS;\r
125    OR Mode.attrib,TVU_B8000_ADDR\r
126    JMP SET_OUT\r
127 \r
128 SET06H:\r
129    MOV SI,OFFSET MODE06H\r
130    CALL SETMODE\r
131    CALL SETPALETTE4\r
132    MOV Mode.mode_width,640;\r
133    MOV Mode.mode_height,200;\r
134    MOV Mode.width_bytes,16384;\r
135    MOV Mode.colors,4;\r
136    MOV Mode.attrib,TVU_GRAPHICS;\r
137    OR Mode.attrib,TVU_B8000_ADDR\r
138    OR Mode.attrib,TVU_PLANAR\r
139    JMP SET_OUT\r
140 \r
141 SET07H:\r
142    MOV SI,OFFSET MODE07H\r
143    CALL SETMODE\r
144 \r
145    PUSH 16                ; Bytes per character\r
146    PUSH 0                  ; Offset of font in Video Memory\r
147    PUSH 0A000H\r
148    PUSH FONT_8x14_OFF      ; Offset of Font in BIOS\r
149    PUSH 0C000H\r
150    CALL LOADFONT\r
151    MOV Mode.mode_width,80;\r
152    MOV Mode.mode_height,25;\r
153    MOV Mode.width_bytes,2000;\r
154    MOV Mode.colors,2;\r
155    MOV Mode.attrib,TVU_TEXT\r
156    OR Mode.attrib,TVU_MONOCHROME\r
157    JMP SET_OUT\r
158 \r
159 SET0DH:\r
160    MOV SI,OFFSET MODE0DH\r
161    CALL SETMODE\r
162    CALL SETPALETTE16\r
163    MOV Mode.mode_width,320;\r
164    MOV Mode.mode_height,200;\r
165    MOV Mode.width_bytes,8000;\r
166    MOV Mode.colors,16;\r
167    MOV Mode.attrib,TVU_GRAPHICS;\r
168    OR Mode.attrib,TVU_PLANAR\r
169    JMP SET_OUT\r
170 \r
171 SET0EH:\r
172    MOV SI,OFFSET MODE0EH\r
173    CALL SETMODE\r
174    CALL SETPALETTE16\r
175    MOV Mode.mode_width,640;\r
176    MOV Mode.mode_height,200;\r
177    MOV Mode.width_bytes,16000;\r
178    MOV Mode.colors,16;\r
179    MOV Mode.attrib,TVU_GRAPHICS;\r
180    OR Mode.attrib,TVU_PLANAR\r
181    JMP SET_OUT\r
182 \r
183 SET0FH:\r
184    MOV SI,OFFSET MODE0FH\r
185    CALL SETMODE\r
186    MOV Mode.mode_width,640;\r
187    MOV Mode.mode_height,350;\r
188    MOV Mode.width_bytes,28000;\r
189    MOV Mode.colors,2;\r
190    MOV Mode.attrib,TVU_GRAPHICS\r
191    OR Mode.attrib,TVU_MONOCHROME\r
192    JMP SET_OUT\r
193 \r
194 SET10H:\r
195    MOV SI,OFFSET MODE10H\r
196    CALL SETMODE\r
197    CALL SETPALETTE16\r
198    MOV Mode.mode_width,640;\r
199    MOV Mode.mode_height,350;\r
200    MOV Mode.width_bytes,28000;\r
201    MOV Mode.colors,16;\r
202    MOV Mode.attrib,TVU_GRAPHICS;\r
203    OR Mode.attrib,TVU_PLANAR\r
204    JMP SET_OUT\r
205 \r
206 SET11H:\r
207    MOV SI,OFFSET MODE11H\r
208    CALL SETMODE\r
209    CALL SETPALETTE16\r
210    MOV Mode.mode_width,640;\r
211    MOV Mode.mode_height,480;\r
212    MOV Mode.width_bytes,38400;\r
213    MOV Mode.colors,2;\r
214    MOV Mode.attrib,TVU_GRAPHICS;\r
215    OR Mode.attrib,TVU_PLANAR\r
216    JMP SET_OUT\r
217 \r
218 SET12H:\r
219    MOV SI,OFFSET MODE12H\r
220    CALL SETMODE\r
221    CALL SETPALETTE16\r
222    MOV Mode.mode_width,640\r
223    MOV Mode.mode_height,480\r
224    MOV Mode.width_bytes,38400\r
225    MOV Mode.colors,16\r
226    MOV Mode.attrib,TVU_GRAPHICS\r
227    OR Mode.attrib,TVU_PLANAR\r
228    JMP SET_OUT\r
229 \r
230 SET13H:\r
231    MOV SI,OFFSET MODE13H\r
232    CALL SETMODE\r
233    CALL SETPALETTE256\r
234    MOV Mode.mode_width,320;\r
235    MOV Mode.mode_height,200;\r
236    MOV Mode.width_bytes,64000;\r
237    MOV Mode.colors,256;\r
238    MOV Mode.attrib,TVU_GRAPHICS;\r
239    JMP SET_OUT\r
240 \r
241 SETCHAIN4:\r
242    MOV SI,OFFSET CHAIN4\r
243    CALL SETMODE\r
244    CALL SETPALETTE256\r
245    MOV Mode.mode_width,320;\r
246    MOV Mode.mode_height,200;\r
247    MOV Mode.width_bytes,16000;\r
248    MOV Mode.colors,256;\r
249    MOV Mode.attrib,TVU_GRAPHICS;\r
250    OR Mode.attrib,TVU_UNCHAINED\r
251    JMP SET_OUT\r
252 \r
253 SETMODE_X:\r
254    MOV SI,OFFSET CHAIN4\r
255    CALL SETMODE\r
256 \r
257    MOV DX,MISC_ADDR\r
258    MOV AX,0E3H\r
259    OUT DX,AL\r
260 \r
261    MOV DX,CRTC_ADDR\r
262 \r
263    ; turn off write protect\r
264    MOV AX,02C11H\r
265    OUT DX,AX\r
266    ; vertical total\r
267    MOV AX,00D06H\r
268    OUT DX,AX\r
269    ; overflow register\r
270    MOV AX,03E07H\r
271    OUT DX,AX\r
272    ; vertical retrace start\r
273    MOV AX,0EA10H\r
274    OUT DX,AX\r
275    ; vertical retrace end AND wr.prot\r
276    MOV AX,0AC11H\r
277    OUT DX,AX\r
278    ; vertical display enable end\r
279    MOV AX,0DF12H\r
280    OUT DX,AX\r
281    ; start vertical blanking\r
282    MOV AX,0E715H\r
283    OUT DX,AX\r
284    ; end vertical blanking\r
285    MOV AX,00616H\r
286    OUT DX,AX\r
287 \r
288    CALL SETPALETTE256\r
289    MOV Mode.mode_width,320;\r
290    MOV Mode.mode_height,240;\r
291    MOV Mode.width_bytes,19200;\r
292    MOV Mode.colors,256;\r
293    MOV Mode.attrib,TVU_GRAPHICS\r
294    OR Mode.attrib,TVU_UNCHAINED\r
295    JMP SET_OUT\r
296 \r
297 SETMODE_A:\r
298    MOV SI,OFFSET CHAIN4\r
299    CALL SETMODE\r
300 \r
301    ; turn off double scanning mode\r
302    MOV DX,CRTC_ADDR\r
303    MOV AX,9\r
304    OUT DX,AL\r
305    INC DX\r
306    IN AL,DX\r
307    AND AL,0E0h\r
308    OUT DX,AL\r
309 \r
310    ; change the vertical resolution flags to 350\r
311    MOV DX,03CCH\r
312    IN AL,DX\r
313    AND AL,02Fh\r
314    OR AL,80h\r
315    MOV DX,MISC_ADDR\r
316    OUT DX,AL\r
317 \r
318    MOV DX,CRTC_ADDR\r
319    ; turn off write protect\r
320    MOV AX,02C11H\r
321    OUT DX,AX\r
322    ; vertical total\r
323    MOV AX,0BF06H\r
324    OUT DX,AX\r
325    ; overflow register\r
326    MOV AX,01F07H\r
327    OUT DX,AX\r
328    ; vertical retrace start\r
329    MOV AX,08310H\r
330    OUT DX,AX\r
331    ; vertical retrace end AND wr.prot\r
332    MOV AX,08511H\r
333    OUT DX,AX\r
334    ; vertical display enable end\r
335    MOV AX,05D12H\r
336    OUT DX,AX\r
337    ; start vertical blanking\r
338    MOV AX,06315H\r
339    OUT DX,AX\r
340    ; end vertical blanking\r
341    MOV AX,0BA16H\r
342    OUT DX,AX\r
343 \r
344    CALL SETPALETTE256\r
345 \r
346    MOV Mode.mode_width,320;\r
347    MOV Mode.mode_height,350;\r
348    MOV Mode.width_bytes,28000;\r
349    MOV Mode.colors,256;\r
350    MOV Mode.attrib,TVU_GRAPHICS\r
351    OR Mode.attrib,TVU_UNCHAINED\r
352    JMP SET_OUT\r
353 \r
354 SETMODE_B:\r
355    MOV SI,OFFSET CHAIN4\r
356    CALL SETMODE\r
357 \r
358    ; turn off double scanning mode\r
359    MOV DX,CRTC_ADDR\r
360    MOV AX,9\r
361    OUT DX,AL\r
362    INC DX\r
363    IN AL,DX\r
364    AND AL,0E0h\r
365    OUT DX,AL\r
366 \r
367    ; change the vertical resolution flags to 400\r
368    MOV DX,03CCH\r
369    IN AL,DX\r
370    AND AL,02Fh\r
371    OR AL,40h\r
372    MOV DX,MISC_ADDR\r
373    OUT DX,AL\r
374 \r
375    CALL SETPALETTE256\r
376 \r
377    MOV Mode.mode_width,320;\r
378    MOV Mode.mode_height,400;\r
379    MOV Mode.width_bytes,32000;\r
380    MOV Mode.colors,256;\r
381    MOV Mode.attrib,TVU_GRAPHICS\r
382    OR Mode.attrib,TVU_UNCHAINED\r
383    JMP SET_OUT\r
384 \r
385 SETMODE_C:\r
386    MOV SI,OFFSET CHAIN4\r
387    CALL SETMODE\r
388 \r
389    ; turn off double scanning mode\r
390    MOV DX,CRTC_ADDR\r
391    MOV AX,9\r
392    OUT DX,AL\r
393    INC DX\r
394    IN AL,DX\r
395    AND AL,0E0h\r
396    OUT DX,AL\r
397 \r
398    ; change the vertical resolution flags to 480\r
399    MOV DX,03CCH\r
400    IN AL,DX\r
401    AND AL,02Fh\r
402    OR AL,0C0h\r
403    MOV DX,MISC_ADDR\r
404    OUT DX,AL\r
405 \r
406    MOV DX,CRTC_ADDR\r
407    ; turn off write protect\r
408    MOV AX,02C11H\r
409    OUT DX,AX\r
410    ; vertical total\r
411    MOV AX,00D06H\r
412    OUT DX,AX\r
413    ; overflow register\r
414    MOV AX,03E07H\r
415    OUT DX,AX\r
416    ; vertical retrace start\r
417    MOV AX,0EA10H\r
418    OUT DX,AX\r
419    ; vertical retrace end AND wr.prot\r
420    MOV AX,0AC11H\r
421    OUT DX,AX\r
422    ; vertical display enable end\r
423    MOV AX,0DF12H\r
424    OUT DX,AX\r
425    ; start vertical blanking\r
426    MOV AX,0E715H\r
427    OUT DX,AX\r
428    ; end vertical blanking\r
429    MOV AX,00616H\r
430    OUT DX,AX\r
431 \r
432    CALL SETPALETTE256\r
433 \r
434    MOV Mode.mode_width,320;\r
435    MOV Mode.mode_height,480;\r
436    MOV Mode.width_bytes,38400;\r
437    MOV Mode.colors,256;\r
438    MOV Mode.attrib,TVU_GRAPHICS\r
439    OR Mode.attrib,TVU_UNCHAINED\r
440    JMP SET_OUT\r
441 \r
442 SETMODE_D:\r
443    MOV SI,OFFSET MODE13H\r
444    CALL SETMODE\r
445 \r
446    ; Turn off Chain 4\r
447    MOV DX,SEQ_ADDR\r
448    MOV AX,0604H\r
449    OUT DX,AX\r
450    ; Activate a synchronous reset\r
451    MOV AX,0100H\r
452    OUT DX,AX\r
453    ; Select 28 mhz pixel clock\r
454    MOV DX,MISC_ADDR\r
455    MOV AL,067H\r
456    OUT DX,AL\r
457    ; Release synchronous reset\r
458    MOV DX,SEQ_ADDR\r
459    MOV AX,0300H\r
460    OUT DX,AX\r
461 \r
462    ; change the vertical resolution flags to 400\r
463    MOV DX,03CCH\r
464    IN AL,DX\r
465    AND AL,02Fh\r
466    OR AL,40h\r
467    MOV DX,MISC_ADDR\r
468    OUT DX,AL\r
469    CALL SETPALETTE256\r
470 \r
471    MOV DX,CRTC_ADDR\r
472    ; turn off write protect\r
473    MOV AX,02C11H\r
474    OUT DX,AX\r
475 \r
476    MOV AX,06B00H\r
477    OUT DX,AX\r
478    MOV AX,05901H\r
479    OUT DX,AX\r
480    MOV AX,05A02H\r
481    OUT DX,AX\r
482    MOV AX,08E03H\r
483    OUT DX,AX\r
484    MOV AX,05E04H\r
485    OUT DX,AX\r
486    MOV AX,08A05H\r
487    OUT DX,AX\r
488    MOV AX,00008H\r
489    OUT DX,AX\r
490    MOV AX,0C009H\r
491    OUT DX,AX\r
492    MOV AX,0000AH\r
493    OUT DX,AX\r
494    MOV AX,0000BH\r
495    OUT DX,AX\r
496    MOV AX,0000CH\r
497    OUT DX,AX\r
498    MOV AX,0000DH\r
499    OUT DX,AX\r
500    MOV AX,0000EH\r
501    OUT DX,AX\r
502    MOV AX,0000FH\r
503    OUT DX,AX\r
504    MOV AX,0AC11H\r
505    OUT DX,AX\r
506    MOV AX,02D13H\r
507    OUT DX,AX\r
508    MOV AX,00014H\r
509    OUT DX,AX\r
510    MOV AX,0E317H\r
511    OUT DX,AX\r
512    MOV AX,0FF18H\r
513    OUT DX,AX\r
514 \r
515    CALL SETPALETTE256\r
516 \r
517    MOV Mode.mode_width,360;\r
518    MOV Mode.mode_height,200;\r
519    MOV Mode.width_bytes,18000;\r
520    MOV Mode.colors,256;\r
521    MOV Mode.attrib,TVU_GRAPHICS\r
522    OR Mode.attrib,TVU_UNCHAINED\r
523    JMP SET_OUT\r
524 \r
525 \r
526 SETMODE_E:\r
527    MOV SI,OFFSET MODE13H\r
528    CALL SETMODE\r
529 \r
530    ; Turn off Chain 4\r
531    MOV DX,SEQ_ADDR\r
532    MOV AX,0604H\r
533    OUT DX,AX\r
534    ; Activate a synchronous reset\r
535    MOV AX,0100H\r
536    OUT DX,AX\r
537    ; Select 28 mhz pixel clock\r
538    MOV DX,MISC_ADDR\r
539    MOV AL,067H\r
540    OUT DX,AL\r
541    ; Release synchronous reset\r
542    MOV DX,SEQ_ADDR\r
543    MOV AX,0300H\r
544    OUT DX,AX\r
545 \r
546    ; change the vertical resolution flags to 480\r
547    MOV DX,03CCH\r
548    IN AL,DX\r
549    AND AL,02Fh\r
550    OR AL,0C0h\r
551    MOV DX,MISC_ADDR\r
552    OUT DX,AL\r
553    CALL SETPALETTE256\r
554 \r
555    MOV DX,CRTC_ADDR\r
556    ; turn off write protect\r
557    MOV AX,02C11H\r
558    OUT DX,AX\r
559 \r
560    MOV AX,06B00H\r
561    OUT DX,AX\r
562    MOV AX,05901H\r
563    OUT DX,AX\r
564    MOV AX,05A02H\r
565    OUT DX,AX\r
566    MOV AX,08E03H\r
567    OUT DX,AX\r
568    MOV AX,05E04H\r
569    OUT DX,AX\r
570    MOV AX,08A05H\r
571    OUT DX,AX\r
572    MOV AX,00D06H\r
573    OUT DX,AX\r
574    MOV AX,03E07H\r
575    OUT DX,AX\r
576    MOV AX,00008H\r
577    OUT DX,AX\r
578    MOV AX,0C009H\r
579    OUT DX,AX\r
580    MOV AX,0000AH\r
581    OUT DX,AX\r
582    MOV AX,0000BH\r
583    OUT DX,AX\r
584    MOV AX,0000DH\r
585    OUT DX,AX\r
586    MOV AX,0000CH\r
587    OUT DX,AX\r
588    MOV AX,0000EH\r
589    OUT DX,AX\r
590    MOV AX,0000FH\r
591    OUT DX,AX\r
592    MOV AX,0EA10H\r
593    OUT DX,AX\r
594    MOV AX,0AC11H\r
595    OUT DX,AX\r
596    MOV AX,0DF12H\r
597    OUT DX,AX\r
598    MOV AX,02D13H\r
599    OUT DX,AX\r
600    MOV AX,00014H\r
601    OUT DX,AX\r
602    MOV AX,0E715H\r
603    OUT DX,AX\r
604    MOV AX,00616H\r
605    OUT DX,AX\r
606    MOV AX,0E317H\r
607    OUT DX,AX\r
608    MOV AX,0FF18H\r
609    OUT DX,AX\r
610 \r
611    CALL SETPALETTE256\r
612 \r
613    MOV Mode.mode_width,360;\r
614    MOV Mode.mode_height,240;\r
615    MOV Mode.width_bytes,21600;\r
616    MOV Mode.colors,256;\r
617    MOV Mode.attrib,TVU_GRAPHICS\r
618    OR Mode.attrib,TVU_UNCHAINED\r
619    JMP SET_OUT\r
620 \r
621 SETMODE_F:\r
622    MOV SI,OFFSET MODE13H\r
623    CALL SETMODE\r
624 \r
625    ; Turn off Chain 4\r
626    MOV DX,SEQ_ADDR\r
627    MOV AX,0604H\r
628    OUT DX,AX\r
629    ; Activate a synchronous reset\r
630    MOV AX,0100H\r
631    OUT DX,AX\r
632    ; Select 28 mhz pixel clock\r
633    MOV DX,MISC_ADDR\r
634    MOV AL,067H\r
635    OUT DX,AL\r
636    ; Release synchronous reset\r
637    MOV DX,SEQ_ADDR\r
638    MOV AX,0300H\r
639    OUT DX,AX\r
640 \r
641    ; change the vertical resolution flags to 350\r
642    MOV DX,03CCH\r
643    IN AL,DX\r
644    AND AL,02Fh\r
645    OR AL,080h\r
646    MOV DX,MISC_ADDR\r
647    OUT DX,AL\r
648    CALL SETPALETTE256\r
649 \r
650    MOV DX,CRTC_ADDR\r
651    ; turn off write protect\r
652    MOV AX,02C11H\r
653    OUT DX,AX\r
654 \r
655    MOV AX,06B00H\r
656    OUT DX,AX\r
657    MOV AX,05901H\r
658    OUT DX,AX\r
659    MOV AX,05A02H\r
660    OUT DX,AX\r
661    MOV AX,08E03H\r
662    OUT DX,AX\r
663    MOV AX,05E04H\r
664    OUT DX,AX\r
665    MOV AX,08A05H\r
666    OUT DX,AX\r
667    MOV AX,0BF06H\r
668    OUT DX,AX\r
669    MOV AX,01F07H\r
670    OUT DX,AX\r
671    MOV AX,00008H\r
672    OUT DX,AX\r
673    MOV AX,04009H\r
674    OUT DX,AX\r
675    MOV AX,0000AH\r
676    OUT DX,AX\r
677    MOV AX,0000BH\r
678    OUT DX,AX\r
679    MOV AX,0000DH\r
680    OUT DX,AX\r
681    MOV AX,0000CH\r
682    OUT DX,AX\r
683    MOV AX,0000EH\r
684    OUT DX,AX\r
685    MOV AX,0000FH\r
686    OUT DX,AX\r
687    MOV AX,08310H\r
688    OUT DX,AX\r
689    MOV AX,08511H\r
690    OUT DX,AX\r
691    MOV AX,05D12H\r
692    OUT DX,AX\r
693    MOV AX,02D13H\r
694    OUT DX,AX\r
695    MOV AX,00014H\r
696    OUT DX,AX\r
697    MOV AX,06315H\r
698    OUT DX,AX\r
699    MOV AX,0BA16H\r
700    OUT DX,AX\r
701    MOV AX,0E317H\r
702    OUT DX,AX\r
703    MOV AX,0FF18H\r
704    OUT DX,AX\r
705 \r
706    CALL SETPALETTE256\r
707 \r
708    MOV Mode.mode_width,360;\r
709    MOV Mode.mode_height,350;\r
710    MOV Mode.width_bytes,31500;\r
711    MOV Mode.colors,256;\r
712    MOV Mode.attrib,TVU_GRAPHICS\r
713    OR Mode.attrib,TVU_UNCHAINED\r
714    JMP SET_OUT\r
715 \r
716 SETMODE_G:\r
717    MOV SI,OFFSET MODE13H\r
718    CALL SETMODE\r
719 \r
720    ; Turn off Chain 4\r
721    MOV DX,SEQ_ADDR\r
722    MOV AX,0604H\r
723    OUT DX,AX\r
724    ; Activate a synchronous reset\r
725    MOV AX,0100H\r
726    OUT DX,AX\r
727    ; Select 28 mhz pixel clock\r
728    MOV DX,MISC_ADDR\r
729    MOV AL,067H\r
730    OUT DX,AL\r
731    ; Release synchronous reset\r
732    MOV DX,SEQ_ADDR\r
733    MOV AX,0300H\r
734    OUT DX,AX\r
735 \r
736    ; change the vertical resolution flags to 400\r
737    MOV DX,03CCH\r
738    IN AL,DX\r
739    AND AL,02Fh\r
740    OR AL,040h\r
741    MOV DX,MISC_ADDR\r
742    OUT DX,AL\r
743 \r
744    MOV DX,CRTC_ADDR\r
745    ; turn off write protect\r
746    MOV AX,02C11H\r
747    OUT DX,AX\r
748 \r
749    MOV AX,06B00H\r
750    OUT DX,AX\r
751    MOV AX,05901H\r
752    OUT DX,AX\r
753    MOV AX,05A02H\r
754    OUT DX,AX\r
755    MOV AX,08E03H\r
756    OUT DX,AX\r
757    MOV AX,05E04H\r
758    OUT DX,AX\r
759    MOV AX,08A05H\r
760    OUT DX,AX\r
761    MOV AX,00008H\r
762    OUT DX,AX\r
763    MOV AX,04009H\r
764    OUT DX,AX\r
765    MOV AX,0000AH\r
766    OUT DX,AX\r
767    MOV AX,0000BH\r
768    OUT DX,AX\r
769    MOV AX,0000DH\r
770    OUT DX,AX\r
771    MOV AX,0000CH\r
772    OUT DX,AX\r
773    MOV AX,0000EH\r
774    OUT DX,AX\r
775    MOV AX,0000FH\r
776    OUT DX,AX\r
777    MOV AX,0AC11H\r
778    OUT DX,AX\r
779    MOV AX,02D13H\r
780    OUT DX,AX\r
781    MOV AX,00014H\r
782    OUT DX,AX\r
783    MOV AX,0E317H\r
784    OUT DX,AX\r
785    MOV AX,0FF18H\r
786    OUT DX,AX\r
787 \r
788    CALL SETPALETTE256\r
789 \r
790    MOV Mode.mode_width,360;\r
791    MOV Mode.mode_height,400;\r
792    MOV Mode.width_bytes,36000;\r
793    MOV Mode.colors,256;\r
794    MOV Mode.attrib,TVU_GRAPHICS\r
795    OR Mode.attrib,TVU_UNCHAINED\r
796    JMP SET_OUT\r
797 \r
798 SETMODE_H:\r
799 \r
800    MOV SI,OFFSET MODE13H\r
801    CALL SETMODE\r
802 \r
803    ; Turn off Chain4\r
804    MOV DX,SEQ_ADDR\r
805    MOV AX,0604H\r
806    OUT DX,AX\r
807 \r
808    ; Activate a synchronous reset\r
809    MOV AX,0100H\r
810    OUT DX,AX\r
811 \r
812    ; Select 28 mhz pixel clock\r
813    MOV DX,MISC_ADDR\r
814    MOV AL,067H\r
815    OUT DX,AL\r
816 \r
817    ; Release synchronous reset\r
818    MOV DX,SEQ_ADDR\r
819    MOV AX,0300H\r
820    OUT DX,AX\r
821 \r
822    ; change the vertical resolution flags to 480\r
823    MOV DX,03CCH\r
824    IN AL,DX\r
825    AND AL,02Fh\r
826    OR AL,0C0h\r
827    MOV DX,MISC_ADDR\r
828    OUT DX,AL\r
829 \r
830 \r
831    MOV DX,CRTC_ADDR\r
832    ; turn off write protect\r
833    MOV AX,02C11H\r
834    OUT DX,AX\r
835 \r
836    MOV AX,06B00H\r
837    OUT DX,AX\r
838    MOV AX,05901H\r
839    OUT DX,AX\r
840    MOV AX,05A02H\r
841    OUT DX,AX\r
842    MOV AX,08E03H\r
843    OUT DX,AX\r
844    MOV AX,05E04H\r
845    OUT DX,AX\r
846    MOV AX,08A05H\r
847    OUT DX,AX\r
848    MOV AX,00D06H\r
849    OUT DX,AX\r
850    MOV AX,03E07H\r
851    OUT DX,AX\r
852    MOV AX,00008H\r
853    OUT DX,AX\r
854    MOV AX,04009H\r
855    OUT DX,AX\r
856    MOV AX,0000AH\r
857    OUT DX,AX\r
858    MOV AX,0000BH\r
859    OUT DX,AX\r
860    MOV AX,0000DH\r
861    OUT DX,AX\r
862    MOV AX,0000CH\r
863    OUT DX,AX\r
864    MOV AX,0000EH\r
865    OUT DX,AX\r
866    MOV AX,0000FH\r
867    OUT DX,AX\r
868    MOV AX,0EA10H\r
869    OUT DX,AX\r
870    MOV AX,0AC11H\r
871    OUT DX,AX\r
872    MOV AX,0DF12H\r
873    OUT DX,AX\r
874    MOV AX,02D13H\r
875    OUT DX,AX\r
876    MOV AX,00014H\r
877    OUT DX,AX\r
878    MOV AX,0E715H\r
879    OUT DX,AX\r
880    MOV AX,00616H\r
881    OUT DX,AX\r
882    MOV AX,0E317H\r
883    OUT DX,AX\r
884    MOV AX,0FF18H\r
885    OUT DX,AX\r
886 \r
887    CALL SETPALETTE256\r
888 \r
889    MOV Mode.mode_width,360;\r
890    MOV Mode.mode_height,480;\r
891    MOV Mode.width_bytes,43200;\r
892    MOV Mode.colors,256;\r
893    MOV Mode.attrib,TVU_GRAPHICS\r
894    OR Mode.attrib,TVU_UNCHAINED\r
895    JMP SET_OUT\r
896 \r
897 SETMODE_I:\r
898    MOV SI,OFFSET MODE10H\r
899    CALL SETMODE\r
900 \r
901    MOV DX,03CCH\r
902    IN AL,DX\r
903    AND AL,03FH\r
904    OR AL,40H\r
905 \r
906    MOV DX,03C2H\r
907    OUT DX,AL\r
908 \r
909    MOV DX,CRTC_ADDR\r
910    MOV AX,9C10H\r
911    OUT DX,AX\r
912    IODELAY\r
913 \r
914    MOV AX,8311H\r
915    OUT DX,AX\r
916    IODELAY\r
917 \r
918    MOV AX,8F12H\r
919    OUT DX,AX\r
920    IODELAY\r
921 \r
922    MOV AX,9615H\r
923    OUT DX,AX\r
924    IODELAY\r
925 \r
926    MOV AX,0B916H\r
927    OUT DX,AX\r
928    IODELAY\r
929 \r
930    CALL SETPALETTE16\r
931    MOV Mode.mode_width,640;\r
932    MOV Mode.mode_height,400;\r
933    MOV Mode.width_bytes,32000;\r
934    MOV Mode.colors,16;\r
935    MOV Mode.attrib,TVU_GRAPHICS\r
936    OR Mode.attrib,TVU_PLANAR\r
937    JMP SET_OUT\r
938 \r
939 SETMODE_J:\r
940    MOV SI,OFFSET MODEJ\r
941    CALL SETMODE\r
942    CALL SETPALETTE16\r
943 \r
944    PUSH 8                 ; Bytes per character\r
945    PUSH 0                  ; Offset of font in Video Memory\r
946    PUSH 0A000H\r
947    PUSH FONT_8x8_OFF      ; Offset of Font in BIOS\r
948    PUSH 0C000H\r
949    CALL LOADFONT\r
950 \r
951    MOV Mode.mode_width,80;\r
952    MOV Mode.mode_height,43;\r
953    MOV Mode.width_bytes,3440;\r
954    MOV Mode.colors,16;\r
955    MOV Mode.attrib,TVU_TEXT\r
956    JMP SET_OUT\r
957 \r
958 SETMODE_K:\r
959    MOV SI,OFFSET MODEK\r
960    CALL SETMODE\r
961    CALL SETPALETTE16\r
962 \r
963    PUSH 8                 ; Bytes per character\r
964    PUSH 0                  ; Offset of font in Video Memory\r
965    PUSH 0A000H\r
966    PUSH FONT_8x8_OFF      ; Offset of Font in BIOS\r
967    PUSH 0C000H\r
968    CALL LOADFONT\r
969 \r
970    MOV Mode.mode_width,80;\r
971    MOV Mode.mode_height,50;\r
972    MOV Mode.width_bytes,4000;\r
973    MOV Mode.colors,16;\r
974    MOV Mode.attrib,TVU_TEXT\r
975    JMP SET_OUT\r
976 \r
977 SETMODE_L:\r
978    MOV SI,OFFSET MODE_L\r
979    CALL SETMODE\r
980    CALL SETPALETTE16\r
981 \r
982    PUSH 8                 ; Bytes per character\r
983    PUSH 0                  ; Offset of font in Video Memory\r
984    PUSH 0A000H\r
985    PUSH FONT_8x8_OFF      ; Offset of Font in BIOS\r
986    PUSH 0C000H\r
987    CALL LOADFONT\r
988 \r
989    MOV Mode.mode_width,40;\r
990    MOV Mode.mode_height,43;\r
991    MOV Mode.width_bytes,3440;\r
992    MOV Mode.colors,16;\r
993    MOV Mode.attrib,TVU_TEXT\r
994    JMP SET_OUT\r
995 \r
996 SETMODE_M:\r
997    MOV SI,OFFSET MODEM\r
998    CALL SETMODE\r
999    CALL SETPALETTE16\r
1000 \r
1001    PUSH 8                 ; Bytes per character\r
1002    PUSH 0                  ; Offset of font in Video Memory\r
1003    PUSH 0A000H\r
1004    PUSH FONT_8x8_OFF      ; Offset of Font in BIOS\r
1005    PUSH 0C000H\r
1006    CALL LOADFONT\r
1007 \r
1008    MOV Mode.mode_width,40;\r
1009    MOV Mode.mode_height,50;\r
1010    MOV Mode.width_bytes,4000;\r
1011    MOV Mode.colors,16;\r
1012    MOV Mode.attrib,TVU_TEXT\r
1013 \r
1014 SET_OUT:\r
1015 \r
1016    POP BP\r
1017    RET 2\r
1018 SETVIDEOMODE ENDP\r
1019 \r
1020 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
1021 \r
1022    PUBLIC SETMODE\r
1023 SETMODE PROC\r
1024 \r
1025    ; Send MISC regs\r
1026    MOV DX,MISC_ADDR\r
1027    MOV AL,[SI]\r
1028    OUT DX,AL\r
1029    IODELAY\r
1030    INC SI\r
1031 \r
1032    MOV DX,STATUS_ADDR\r
1033    MOV AL,[SI]\r
1034    OUT DX,AL\r
1035    IODELAY\r
1036    INC SI\r
1037 \r
1038    ; Send SEQ regs\r
1039    MOV CX,0\r
1040 REG_LOOP:\r
1041    MOV DX,SEQ_ADDR\r
1042    MOV AL,CL\r
1043    OUT DX,AL\r
1044    IODELAY\r
1045 \r
1046    MOV DX,SEQ_ADDR\r
1047    INC DX\r
1048    MOV AL,[SI]\r
1049    OUT DX,AL\r
1050    IODELAY\r
1051    INC SI\r
1052    INC CX\r
1053    CMP CL,5\r
1054    JL REG_LOOP\r
1055 \r
1056    ; Clear Protection bits\r
1057    MOV AH,0EH\r
1058    MOV AL,11H\r
1059    AND AH,7FH\r
1060    MOV DX,CRTC_ADDR\r
1061    OUT DX,AX\r
1062    IODELAY\r
1063 \r
1064    ; Send CRTC regs\r
1065    MOV CX,0\r
1066 REG_LOOP2:\r
1067    MOV DX,CRTC_ADDR\r
1068    MOV AL,CL\r
1069    OUT DX,AL\r
1070    IODELAY\r
1071 \r
1072    MOV DX,CRTC_ADDR\r
1073    INC DX\r
1074    MOV AL,[SI]\r
1075    OUT DX,AL\r
1076    IODELAY\r
1077 \r
1078    INC SI\r
1079    INC CX\r
1080    CMP CL,25\r
1081    JL REG_LOOP2\r
1082 \r
1083    ; Send GRAPHICS regs\r
1084    MOV CX,0\r
1085 REG_LOOP3:\r
1086    MOV DX,GRACON_ADDR\r
1087    MOV AL,CL\r
1088    OUT DX,AL\r
1089    IODELAY\r
1090 \r
1091    MOV DX,GRACON_ADDR\r
1092    INC DX\r
1093    MOV AL,[SI]\r
1094    OUT DX,AL\r
1095    IODELAY\r
1096 \r
1097    INC SI\r
1098    INC CX\r
1099    CMP CL,9\r
1100    JL REG_LOOP3\r
1101 \r
1102    MOV DX,STATUS_ADDR\r
1103    IN AL,DX\r
1104    IODELAY\r
1105 \r
1106    ; Send ATTRCON regs\r
1107    MOV CX,0\r
1108 REG_LOOP4:\r
1109    MOV DX,ATTRCON_ADDR\r
1110    IN AX,DX\r
1111 \r
1112    MOV AL,CL\r
1113    OUT DX,AL\r
1114    IODELAY\r
1115 \r
1116    MOV AL,[SI]\r
1117    OUT DX,AL\r
1118    IODELAY\r
1119 \r
1120    INC SI\r
1121    INC CX\r
1122    CMP CL,21\r
1123    JL REG_LOOP4\r
1124 \r
1125    MOV AL,20H\r
1126    OUT DX,AL\r
1127    IODELAY\r
1128 \r
1129    RET\r
1130 SETMODE ENDP\r
1131 \r
1132 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
1133 ; Assumes [bp+4] = color\r
1134 ; Assumes [bp+6] = r value\r
1135 ; Assumes [bp+8] = g value\r
1136 ; Assumes [bp+10] = b value\r
1137    PUBLIC SETPAL\r
1138 SETPAL PROC\r
1139    PUSH BP\r
1140    MOV BP,SP\r
1141    PUSHA\r
1142 \r
1143    MOV AX,WORD PTR [BP+4]\r
1144    ; Send color\r
1145    MOV DX,03C8H\r
1146    OUT DX,AL\r
1147 \r
1148    ; Write R value\r
1149    MOV DX,03C9H\r
1150    MOV AL,BYTE PTR [BP+6]\r
1151    OUT DX,AL\r
1152 \r
1153    ; Write G value\r
1154    MOV DX,03C9H\r
1155    MOV AL,BYTE PTR [BP+8]\r
1156    OUT DX,AL\r
1157 \r
1158    ; Write B value\r
1159    MOV DX,03C9H\r
1160    MOV AL,BYTE PTR [BP+10]\r
1161    OUT DX,AL\r
1162 \r
1163    POPA\r
1164    POP BP\r
1165    RET 8\r
1166 SETPAL ENDP\r
1167 \r
1168 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
1169 \r
1170 SETPALETTE4 PROC\r
1171    PUSH 0\r
1172    PUSH 0\r
1173    PUSH 0\r
1174    PUSH 0\r
1175    CALL SETPAL\r
1176 \r
1177    PUSH 42\r
1178    PUSH 42\r
1179    PUSH 0\r
1180    PUSH 1\r
1181    CALL SETPAL\r
1182 \r
1183    PUSH 42\r
1184    PUSH 0\r
1185    PUSH 42\r
1186    PUSH 2\r
1187    CALL SETPAL\r
1188 \r
1189    PUSH 63\r
1190    PUSH 63\r
1191    PUSH 63\r
1192    PUSH 3\r
1193    CALL SETPAL\r
1194 \r
1195    RET\r
1196 SETPALETTE4 ENDP\r
1197 \r
1198 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
1199 \r
1200 SETPALETTE16 PROC\r
1201 \r
1202    MOV SI,OFFSET PALETTE\r
1203    MOV CX,16\r
1204    MOV DX,0\r
1205 PAL_LOOP:\r
1206    PUSH WORD PTR [SI+2]\r
1207    PUSH WORD PTR [SI+1]\r
1208    PUSH WORD PTR [SI]\r
1209    PUSH DX\r
1210    CALL SETPAL\r
1211 \r
1212    INC DX\r
1213    ADD SI,3\r
1214    LOOP PAL_LOOP\r
1215 \r
1216    RET\r
1217 SETPALETTE16 ENDP\r
1218 \r
1219 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
1220 \r
1221 SETPALETTE256 PROC\r
1222 \r
1223    MOV SI,OFFSET PALETTE\r
1224    MOV CX,256\r
1225    MOV DX,0\r
1226 PAL_LOOP2:\r
1227    PUSH WORD PTR [SI+2]\r
1228    PUSH WORD PTR [SI+1]\r
1229    PUSH WORD PTR [SI]\r
1230    PUSH DX\r
1231    CALL SETPAL\r
1232 \r
1233    INC DX\r
1234    ADD SI,3\r
1235    LOOP PAL_LOOP2\r
1236 \r
1237    RET\r
1238 SETPALETTE256 ENDP\r
1239 \r
1240 ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r