]> 4ch.mooo.com Git - 16.git/blob - 16/modex16/modex16.c
new file: 16/modex16/TEST.EXE
[16.git] / 16 / modex16 / modex16.c
1 #include <dos.h>\r
2 #include <string.h>\r
3 #include <mem.h>\r
4 #include <conio.h>\r
5 #include "modex16.h"\r
6 \r
7 \r
8 byte far* VGA=(byte far*) 0xA0000000;   /* this points to video memory. */\r
9 \r
10 static void\r
11 vgaSetMode(byte mode)\r
12 {\r
13   union REGS regs;\r
14 \r
15   regs.h.ah = SET_MODE;\r
16   regs.h.al = mode;\r
17   int86(VIDEO_INT, &regs, &regs);\r
18 }\r
19 \r
20 \r
21 /* -========================= Entry  Points ==========================- */\r
22 void\r
23 modexEnter() {\r
24     word i;\r
25     dword far*ptr=(dword far*)VGA;      /* used for faster screen clearing */\r
26     word CRTParms[] = {\r
27         0x0d06,         /* vertical total */\r
28         0x3e07,         /* overflow (bit 8 of vertical counts) */\r
29         0x4109,         /* cell height (2 to double-scan */\r
30         0xea10,         /* v sync start */\r
31         0xac11,         /* v sync end and protect cr0-cr7 */\r
32         0xdf12,         /* vertical displayed */\r
33         0x0014,         /* turn off dword mode */\r
34         0xe715,         /* v blank start */\r
35         0x0616,         /* v blank end */\r
36         0xe317          /* turn on byte mode */\r
37     };\r
38     int CRTParmCount = sizeof(CRTParms) / sizeof(CRTParms[0]);\r
39 \r
40     /* TODO save current video mode and palette */\r
41     vgaSetMode(VGA_256_COLOR_MODE);\r
42 \r
43     /* disable chain4 mode */\r
44     outpw(SC_INDEX, 0x0604);\r
45 \r
46     /* synchronous reset while setting Misc Output */\r
47     outpw(SC_INDEX, 0x0100);\r
48 \r
49     /* select 25 MHz dot clock & 60 Hz scanning rate */\r
50     outp(MISC_OUTPUT, 0xe3);\r
51 \r
52     /* undo reset (restart sequencer) */\r
53     outpw(SC_INDEX, 0x0300);\r
54 \r
55     /* reprogram the CRT controller */\r
56     outp(CRTC_INDEX, 0x11); /* VSync End reg contains register write prot */\r
57     outp(CRTC_DATA, 0x7f);  /* get current write protect on varios regs */\r
58 \r
59     /* send the CRTParms */\r
60     for(i=0; i<CRTParmCount; i++) {\r
61         outpw(CRTC_INDEX, CRTParms[i]);\r
62     }\r
63 \r
64     /* clear video memory */\r
65     outpw(SC_INDEX, 0x0f02);\r
66     for(i=0; i<0x8000; i++) {\r
67         ptr[i] = 0x0000;\r
68     }\r
69 }\r
70 \r
71 \r
72 void\r
73 modexLeave() {\r
74     /* TODO restore original mode and palette */\r
75     vgaSetMode(TEXT_MODE);\r
76 }\r
77 \r
78 \r
79 void\r
80 modexShowPage(page_t page) {\r
81     word high_address;\r
82     word low_address;\r
83 \r
84     high_address = HIGH_ADDRESS | ((word)(page) & 0xff00);\r
85     low_address  = LOW_ADDRESS  | ((word)(page) << 8);\r
86 \r
87     /* wait for appropriate timing */\r
88     while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE));\r
89     outpw(CRTC_INDEX, high_address);\r
90     outpw(CRTC_INDEX, low_address);\r
91 \r
92     /*  wait for one retrace */\r
93     while (!(inp(INPUT_STATUS_1) & VRETRACE)); \r
94 }\r
95 \r
96 \r
97 void\r
98 modexPanPage(page_t *page, int dx, int dy) {\r
99     /* TODO figure out how the $@#! you do horizontal panning */\r
100     *page += dy * SCREEN_WIDTH;\r
101 }\r
102 \r
103 \r
104 void\r
105 modexSelectPlane(byte plane) {\r
106     outp(SC_INDEX, MAP_MASK);          /* select plane */\r
107     outp(SC_DATA,  plane);\r
108 }\r
109 \r
110 \r
111 void\r
112 modexClearRegion(page_t page, int x, int y, int w, int h, byte color) {\r
113     byte plane;\r
114     word endx = x + w;\r
115     word endy = y + h;\r
116     word dx, dy;\r
117 \r
118     /* TODO Make this fast.  It's SLOOOOOOW */\r
119     for(plane=0; plane < 4; plane++) {\r
120         modexSelectPlane(PLANE(plane+x));\r
121         for(dx = x; dx < endx; dx+=4) {\r
122             for(dy=y; dy<endy; dy++) {\r
123                 page[PAGE_OFFSET(dx, dy)] = color;\r
124             }\r
125         }\r
126     }\r
127 }\r