]> 4ch.mooo.com Git - 16.git/blob - 16/keen456/KEEN4-6/ID_VW_A.ASM
extrcted keen code remake
[16.git] / 16 / keen456 / KEEN4-6 / ID_VW_A.ASM
1 ; Catacomb 3-D Source Code\r
2 ; Copyright (C) 1993-2014 Flat Rock Software\r
3 ;\r
4 ; This program is free software; you can redistribute it and/or modify\r
5 ; it under the terms of the GNU General Public License as published by\r
6 ; the Free Software Foundation; either version 2 of the License, or\r
7 ; (at your option) any later version.\r
8 ;\r
9 ; This program is distributed in the hope that it will be useful,\r
10 ; but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
12 ; GNU General Public License for more details.\r
13 ;\r
14 ; You should have received a copy of the GNU General Public License along\r
15 ; with this program; if not, write to the Free Software Foundation, Inc.,\r
16 ; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
17 \r
18 ; ID_VW_A.ASM\r
19 \r
20 IDEAL\r
21 MODEL   MEDIUM,C\r
22 \r
23 INCLUDE "ID_ASM.EQU"\r
24 \r
25 WAITFORVBL      =       1                       ; setting to 0 causes setscreen and waitvbl\r
26                                                         ; to skip waiting for VBL (for timing things)\r
27 \r
28 ;============================================================================\r
29 \r
30 DATASEG\r
31 \r
32 EXTRN   screenseg                       :WORD\r
33 EXTRN   drawofs                         :WORD\r
34 EXTRN   bufferofs                       :WORD\r
35 EXTRN   displayofs                      :WORD\r
36 EXTRN   drawofs                         :WORD\r
37 EXTRN   panadjust                       :WORD\r
38 EXTRN   ylookup                         :WORD\r
39 EXTRN   linewidth                       :WORD\r
40 EXTRN   grsegs                          :WORD\r
41 EXTRN   updateptr                       :WORD\r
42 EXTRN   blockstarts                     :WORD   ;offsets from drawofs for each update block\r
43 EXTRN   fontspace                       :WORD\r
44 EXTRN   fontnumber                      :WORD\r
45 \r
46 \r
47 planemask       db      ?\r
48 planenum        db      ?\r
49 screendest      dw      ?\r
50 linedelta       dw      ?\r
51 \r
52 LABEL shiftdata0 WORD\r
53         dw     0,    1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   11,   12,   13\r
54         dw    14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27\r
55         dw    28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41\r
56         dw    42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55\r
57         dw    56,   57,   58,   59,   60,   61,   62,   63,   64,   65,   66,   67,   68,   69\r
58         dw    70,   71,   72,   73,   74,   75,   76,   77,   78,   79,   80,   81,   82,   83\r
59         dw    84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,   96,   97\r
60         dw    98,   99,  100,  101,  102,  103,  104,  105,  106,  107,  108,  109,  110,  111\r
61         dw   112,  113,  114,  115,  116,  117,  118,  119,  120,  121,  122,  123,  124,  125\r
62         dw   126,  127,  128,  129,  130,  131,  132,  133,  134,  135,  136,  137,  138,  139\r
63         dw   140,  141,  142,  143,  144,  145,  146,  147,  148,  149,  150,  151,  152,  153\r
64         dw   154,  155,  156,  157,  158,  159,  160,  161,  162,  163,  164,  165,  166,  167\r
65         dw   168,  169,  170,  171,  172,  173,  174,  175,  176,  177,  178,  179,  180,  181\r
66         dw   182,  183,  184,  185,  186,  187,  188,  189,  190,  191,  192,  193,  194,  195\r
67         dw   196,  197,  198,  199,  200,  201,  202,  203,  204,  205,  206,  207,  208,  209\r
68         dw   210,  211,  212,  213,  214,  215,  216,  217,  218,  219,  220,  221,  222,  223\r
69         dw   224,  225,  226,  227,  228,  229,  230,  231,  232,  233,  234,  235,  236,  237\r
70         dw   238,  239,  240,  241,  242,  243,  244,  245,  246,  247,  248,  249,  250,  251\r
71         dw   252,  253,  254,  255\r
72 \r
73 LABEL shiftdata1 WORD\r
74         dw     0,32768,    1,32769,    2,32770,    3,32771,    4,32772,    5,32773,    6,32774\r
75         dw     7,32775,    8,32776,    9,32777,   10,32778,   11,32779,   12,32780,   13,32781\r
76         dw    14,32782,   15,32783,   16,32784,   17,32785,   18,32786,   19,32787,   20,32788\r
77         dw    21,32789,   22,32790,   23,32791,   24,32792,   25,32793,   26,32794,   27,32795\r
78         dw    28,32796,   29,32797,   30,32798,   31,32799,   32,32800,   33,32801,   34,32802\r
79         dw    35,32803,   36,32804,   37,32805,   38,32806,   39,32807,   40,32808,   41,32809\r
80         dw    42,32810,   43,32811,   44,32812,   45,32813,   46,32814,   47,32815,   48,32816\r
81         dw    49,32817,   50,32818,   51,32819,   52,32820,   53,32821,   54,32822,   55,32823\r
82         dw    56,32824,   57,32825,   58,32826,   59,32827,   60,32828,   61,32829,   62,32830\r
83         dw    63,32831,   64,32832,   65,32833,   66,32834,   67,32835,   68,32836,   69,32837\r
84         dw    70,32838,   71,32839,   72,32840,   73,32841,   74,32842,   75,32843,   76,32844\r
85         dw    77,32845,   78,32846,   79,32847,   80,32848,   81,32849,   82,32850,   83,32851\r
86         dw    84,32852,   85,32853,   86,32854,   87,32855,   88,32856,   89,32857,   90,32858\r
87         dw    91,32859,   92,32860,   93,32861,   94,32862,   95,32863,   96,32864,   97,32865\r
88         dw    98,32866,   99,32867,  100,32868,  101,32869,  102,32870,  103,32871,  104,32872\r
89         dw   105,32873,  106,32874,  107,32875,  108,32876,  109,32877,  110,32878,  111,32879\r
90         dw   112,32880,  113,32881,  114,32882,  115,32883,  116,32884,  117,32885,  118,32886\r
91         dw   119,32887,  120,32888,  121,32889,  122,32890,  123,32891,  124,32892,  125,32893\r
92         dw   126,32894,  127,32895\r
93 \r
94 LABEL shiftdata2 WORD\r
95         dw     0,16384,32768,49152,    1,16385,32769,49153,    2,16386,32770,49154,    3,16387\r
96         dw 32771,49155,    4,16388,32772,49156,    5,16389,32773,49157,    6,16390,32774,49158\r
97         dw     7,16391,32775,49159,    8,16392,32776,49160,    9,16393,32777,49161,   10,16394\r
98         dw 32778,49162,   11,16395,32779,49163,   12,16396,32780,49164,   13,16397,32781,49165\r
99         dw    14,16398,32782,49166,   15,16399,32783,49167,   16,16400,32784,49168,   17,16401\r
100         dw 32785,49169,   18,16402,32786,49170,   19,16403,32787,49171,   20,16404,32788,49172\r
101         dw    21,16405,32789,49173,   22,16406,32790,49174,   23,16407,32791,49175,   24,16408\r
102         dw 32792,49176,   25,16409,32793,49177,   26,16410,32794,49178,   27,16411,32795,49179\r
103         dw    28,16412,32796,49180,   29,16413,32797,49181,   30,16414,32798,49182,   31,16415\r
104         dw 32799,49183,   32,16416,32800,49184,   33,16417,32801,49185,   34,16418,32802,49186\r
105         dw    35,16419,32803,49187,   36,16420,32804,49188,   37,16421,32805,49189,   38,16422\r
106         dw 32806,49190,   39,16423,32807,49191,   40,16424,32808,49192,   41,16425,32809,49193\r
107         dw    42,16426,32810,49194,   43,16427,32811,49195,   44,16428,32812,49196,   45,16429\r
108         dw 32813,49197,   46,16430,32814,49198,   47,16431,32815,49199,   48,16432,32816,49200\r
109         dw    49,16433,32817,49201,   50,16434,32818,49202,   51,16435,32819,49203,   52,16436\r
110         dw 32820,49204,   53,16437,32821,49205,   54,16438,32822,49206,   55,16439,32823,49207\r
111         dw    56,16440,32824,49208,   57,16441,32825,49209,   58,16442,32826,49210,   59,16443\r
112         dw 32827,49211,   60,16444,32828,49212,   61,16445,32829,49213,   62,16446,32830,49214\r
113         dw    63,16447,32831,49215\r
114 \r
115 LABEL shiftdata3 WORD\r
116         dw     0, 8192,16384,24576,32768,40960,49152,57344,    1, 8193,16385,24577,32769,40961\r
117         dw 49153,57345,    2, 8194,16386,24578,32770,40962,49154,57346,    3, 8195,16387,24579\r
118         dw 32771,40963,49155,57347,    4, 8196,16388,24580,32772,40964,49156,57348,    5, 8197\r
119         dw 16389,24581,32773,40965,49157,57349,    6, 8198,16390,24582,32774,40966,49158,57350\r
120         dw     7, 8199,16391,24583,32775,40967,49159,57351,    8, 8200,16392,24584,32776,40968\r
121         dw 49160,57352,    9, 8201,16393,24585,32777,40969,49161,57353,   10, 8202,16394,24586\r
122         dw 32778,40970,49162,57354,   11, 8203,16395,24587,32779,40971,49163,57355,   12, 8204\r
123         dw 16396,24588,32780,40972,49164,57356,   13, 8205,16397,24589,32781,40973,49165,57357\r
124         dw    14, 8206,16398,24590,32782,40974,49166,57358,   15, 8207,16399,24591,32783,40975\r
125         dw 49167,57359,   16, 8208,16400,24592,32784,40976,49168,57360,   17, 8209,16401,24593\r
126         dw 32785,40977,49169,57361,   18, 8210,16402,24594,32786,40978,49170,57362,   19, 8211\r
127         dw 16403,24595,32787,40979,49171,57363,   20, 8212,16404,24596,32788,40980,49172,57364\r
128         dw    21, 8213,16405,24597,32789,40981,49173,57365,   22, 8214,16406,24598,32790,40982\r
129         dw 49174,57366,   23, 8215,16407,24599,32791,40983,49175,57367,   24, 8216,16408,24600\r
130         dw 32792,40984,49176,57368,   25, 8217,16409,24601,32793,40985,49177,57369,   26, 8218\r
131         dw 16410,24602,32794,40986,49178,57370,   27, 8219,16411,24603,32795,40987,49179,57371\r
132         dw    28, 8220,16412,24604,32796,40988,49180,57372,   29, 8221,16413,24605,32797,40989\r
133         dw 49181,57373,   30, 8222,16414,24606,32798,40990,49182,57374,   31, 8223,16415,24607\r
134         dw 32799,40991,49183,57375\r
135 \r
136 LABEL shiftdata4 WORD\r
137         dw     0, 4096, 8192,12288,16384,20480,24576,28672,32768,36864,40960,45056,49152,53248\r
138         dw 57344,61440,    1, 4097, 8193,12289,16385,20481,24577,28673,32769,36865,40961,45057\r
139         dw 49153,53249,57345,61441,    2, 4098, 8194,12290,16386,20482,24578,28674,32770,36866\r
140         dw 40962,45058,49154,53250,57346,61442,    3, 4099, 8195,12291,16387,20483,24579,28675\r
141         dw 32771,36867,40963,45059,49155,53251,57347,61443,    4, 4100, 8196,12292,16388,20484\r
142         dw 24580,28676,32772,36868,40964,45060,49156,53252,57348,61444,    5, 4101, 8197,12293\r
143         dw 16389,20485,24581,28677,32773,36869,40965,45061,49157,53253,57349,61445,    6, 4102\r
144         dw  8198,12294,16390,20486,24582,28678,32774,36870,40966,45062,49158,53254,57350,61446\r
145         dw     7, 4103, 8199,12295,16391,20487,24583,28679,32775,36871,40967,45063,49159,53255\r
146         dw 57351,61447,    8, 4104, 8200,12296,16392,20488,24584,28680,32776,36872,40968,45064\r
147         dw 49160,53256,57352,61448,    9, 4105, 8201,12297,16393,20489,24585,28681,32777,36873\r
148         dw 40969,45065,49161,53257,57353,61449,   10, 4106, 8202,12298,16394,20490,24586,28682\r
149         dw 32778,36874,40970,45066,49162,53258,57354,61450,   11, 4107, 8203,12299,16395,20491\r
150         dw 24587,28683,32779,36875,40971,45067,49163,53259,57355,61451,   12, 4108, 8204,12300\r
151         dw 16396,20492,24588,28684,32780,36876,40972,45068,49164,53260,57356,61452,   13, 4109\r
152         dw  8205,12301,16397,20493,24589,28685,32781,36877,40973,45069,49165,53261,57357,61453\r
153         dw    14, 4110, 8206,12302,16398,20494,24590,28686,32782,36878,40974,45070,49166,53262\r
154         dw 57358,61454,   15, 4111, 8207,12303,16399,20495,24591,28687,32783,36879,40975,45071\r
155         dw 49167,53263,57359,61455\r
156 \r
157 LABEL shiftdata5 WORD\r
158         dw     0, 2048, 4096, 6144, 8192,10240,12288,14336,16384,18432,20480,22528,24576,26624\r
159         dw 28672,30720,32768,34816,36864,38912,40960,43008,45056,47104,49152,51200,53248,55296\r
160         dw 57344,59392,61440,63488,    1, 2049, 4097, 6145, 8193,10241,12289,14337,16385,18433\r
161         dw 20481,22529,24577,26625,28673,30721,32769,34817,36865,38913,40961,43009,45057,47105\r
162         dw 49153,51201,53249,55297,57345,59393,61441,63489,    2, 2050, 4098, 6146, 8194,10242\r
163         dw 12290,14338,16386,18434,20482,22530,24578,26626,28674,30722,32770,34818,36866,38914\r
164         dw 40962,43010,45058,47106,49154,51202,53250,55298,57346,59394,61442,63490,    3, 2051\r
165         dw  4099, 6147, 8195,10243,12291,14339,16387,18435,20483,22531,24579,26627,28675,30723\r
166         dw 32771,34819,36867,38915,40963,43011,45059,47107,49155,51203,53251,55299,57347,59395\r
167         dw 61443,63491,    4, 2052, 4100, 6148, 8196,10244,12292,14340,16388,18436,20484,22532\r
168         dw 24580,26628,28676,30724,32772,34820,36868,38916,40964,43012,45060,47108,49156,51204\r
169         dw 53252,55300,57348,59396,61444,63492,    5, 2053, 4101, 6149, 8197,10245,12293,14341\r
170         dw 16389,18437,20485,22533,24581,26629,28677,30725,32773,34821,36869,38917,40965,43013\r
171         dw 45061,47109,49157,51205,53253,55301,57349,59397,61445,63493,    6, 2054, 4102, 6150\r
172         dw  8198,10246,12294,14342,16390,18438,20486,22534,24582,26630,28678,30726,32774,34822\r
173         dw 36870,38918,40966,43014,45062,47110,49158,51206,53254,55302,57350,59398,61446,63494\r
174         dw     7, 2055, 4103, 6151, 8199,10247,12295,14343,16391,18439,20487,22535,24583,26631\r
175         dw 28679,30727,32775,34823,36871,38919,40967,43015,45063,47111,49159,51207,53255,55303\r
176         dw 57351,59399,61447,63495\r
177 \r
178 LABEL shiftdata6 WORD\r
179         dw     0, 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216,10240,11264,12288,13312\r
180         dw 14336,15360,16384,17408,18432,19456,20480,21504,22528,23552,24576,25600,26624,27648\r
181         dw 28672,29696,30720,31744,32768,33792,34816,35840,36864,37888,38912,39936,40960,41984\r
182         dw 43008,44032,45056,46080,47104,48128,49152,50176,51200,52224,53248,54272,55296,56320\r
183         dw 57344,58368,59392,60416,61440,62464,63488,64512,    1, 1025, 2049, 3073, 4097, 5121\r
184         dw  6145, 7169, 8193, 9217,10241,11265,12289,13313,14337,15361,16385,17409,18433,19457\r
185         dw 20481,21505,22529,23553,24577,25601,26625,27649,28673,29697,30721,31745,32769,33793\r
186         dw 34817,35841,36865,37889,38913,39937,40961,41985,43009,44033,45057,46081,47105,48129\r
187         dw 49153,50177,51201,52225,53249,54273,55297,56321,57345,58369,59393,60417,61441,62465\r
188         dw 63489,64513,    2, 1026, 2050, 3074, 4098, 5122, 6146, 7170, 8194, 9218,10242,11266\r
189         dw 12290,13314,14338,15362,16386,17410,18434,19458,20482,21506,22530,23554,24578,25602\r
190         dw 26626,27650,28674,29698,30722,31746,32770,33794,34818,35842,36866,37890,38914,39938\r
191         dw 40962,41986,43010,44034,45058,46082,47106,48130,49154,50178,51202,52226,53250,54274\r
192         dw 55298,56322,57346,58370,59394,60418,61442,62466,63490,64514,    3, 1027, 2051, 3075\r
193         dw  4099, 5123, 6147, 7171, 8195, 9219,10243,11267,12291,13315,14339,15363,16387,17411\r
194         dw 18435,19459,20483,21507,22531,23555,24579,25603,26627,27651,28675,29699,30723,31747\r
195         dw 32771,33795,34819,35843,36867,37891,38915,39939,40963,41987,43011,44035,45059,46083\r
196         dw 47107,48131,49155,50179,51203,52227,53251,54275,55299,56323,57347,58371,59395,60419\r
197         dw 61443,62467,63491,64515\r
198 \r
199 LABEL shiftdata7 WORD\r
200         dw     0,  512, 1024, 1536, 2048, 2560, 3072, 3584, 4096, 4608, 5120, 5632, 6144, 6656\r
201         dw  7168, 7680, 8192, 8704, 9216, 9728,10240,10752,11264,11776,12288,12800,13312,13824\r
202         dw 14336,14848,15360,15872,16384,16896,17408,17920,18432,18944,19456,19968,20480,20992\r
203         dw 21504,22016,22528,23040,23552,24064,24576,25088,25600,26112,26624,27136,27648,28160\r
204         dw 28672,29184,29696,30208,30720,31232,31744,32256,32768,33280,33792,34304,34816,35328\r
205         dw 35840,36352,36864,37376,37888,38400,38912,39424,39936,40448,40960,41472,41984,42496\r
206         dw 43008,43520,44032,44544,45056,45568,46080,46592,47104,47616,48128,48640,49152,49664\r
207         dw 50176,50688,51200,51712,52224,52736,53248,53760,54272,54784,55296,55808,56320,56832\r
208         dw 57344,57856,58368,58880,59392,59904,60416,60928,61440,61952,62464,62976,63488,64000\r
209         dw 64512,65024,    1,  513, 1025, 1537, 2049, 2561, 3073, 3585, 4097, 4609, 5121, 5633\r
210         dw  6145, 6657, 7169, 7681, 8193, 8705, 9217, 9729,10241,10753,11265,11777,12289,12801\r
211         dw 13313,13825,14337,14849,15361,15873,16385,16897,17409,17921,18433,18945,19457,19969\r
212         dw 20481,20993,21505,22017,22529,23041,23553,24065,24577,25089,25601,26113,26625,27137\r
213         dw 27649,28161,28673,29185,29697,30209,30721,31233,31745,32257,32769,33281,33793,34305\r
214         dw 34817,35329,35841,36353,36865,37377,37889,38401,38913,39425,39937,40449,40961,41473\r
215         dw 41985,42497,43009,43521,44033,44545,45057,45569,46081,46593,47105,47617,48129,48641\r
216         dw 49153,49665,50177,50689,51201,51713,52225,52737,53249,53761,54273,54785,55297,55809\r
217         dw 56321,56833,57345,57857,58369,58881,59393,59905,60417,60929,61441,61953,62465,62977\r
218         dw 63489,64001,64513,65025\r
219 \r
220 shifttabletable dw      shiftdata0,shiftdata1,shiftdata2,shiftdata3\r
221                 dw      shiftdata4,shiftdata5,shiftdata6,shiftdata7\r
222 \r
223 PUBLIC  shifttabletable\r
224 \r
225 \r
226 ;============================================================================\r
227 \r
228 CODESEG\r
229 \r
230 IFE GRMODE-CGAGR\r
231 INCLUDE "ID_VW_AC.ASM"\r
232 ENDIF\r
233 \r
234 IFE GRMODE-EGAGR\r
235 INCLUDE "ID_VW_AE.ASM"\r
236 ENDIF\r
237 \r
238 IFE GRMODE-VGAGR\r
239 INCLUDE "ID_VW_AV.ASM"\r
240 ENDIF\r
241 \r
242 ;============================================================================\r
243 ;\r
244 ;                           MISC VIDEO ROUTINES\r
245 ;\r
246 ;============================================================================\r
247 \r
248 ;========\r
249 ;\r
250 ; VW_WaitVBL (int number)\r
251 ;\r
252 ;========\r
253 \r
254 PROC    VW_WaitVBL number:WORD\r
255 PUBLIC  VW_WaitVBL\r
256 \r
257 if WAITFORVBL                           ; skip wait if profiling\r
258 \r
259         mov     dx,STATUS_REGISTER_1\r
260 \r
261         mov     cx,[number]\r
262 \r
263 waitvbl1:\r
264         in      al,dx\r
265         test    al,00001000b    ;look for vbl\r
266         jnz     waitvbl1\r
267 \r
268 waitvbl2:\r
269         in      al,dx\r
270         test    al,00001000b    ;look for vbl\r
271         jz      waitvbl2\r
272 \r
273         loop    waitvbl1\r
274 \r
275 endif\r
276 \r
277         ret\r
278 \r
279 ENDP\r
280 \r
281 \r
282 ;===========================================================================\r
283 \r
284 \r
285         MASM\r
286 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r
287 ;\r
288 ; Name: VW_VideoID\r
289 ;\r
290 ; Function:     Detects the presence of various video subsystems\r
291 ;\r
292 ; int VideoID;\r
293 ;\r
294 ; Subsystem ID values:\r
295 ;        0  = (none)\r
296 ;        1  = MDA\r
297 ;        2  = CGA\r
298 ;        3  = EGA\r
299 ;        4  = MCGA\r
300 ;        5  = VGA\r
301 ;       80h = HGC\r
302 ;       81h = HGC+\r
303 ;       82h = Hercules InColor\r
304 ;\r
305 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r
306 \r
307 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r
308 ;\r
309 ; Equates\r
310 ;\r
311 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r
312 VIDstruct       STRUC           ; corresponds to C data structure\r
313 \r
314 Video0Type      DB      ?       ; first subsystem type\r
315 Display0Type    DB      ?       ; display attached to first subsystem\r
316 \r
317 Video1Type      DB      ?       ; second subsystem type\r
318 Display1Type    DB      ?       ; display attached to second subsystem\r
319 \r
320 VIDstruct       ENDS\r
321 \r
322 \r
323 Device0 EQU     word ptr Video0Type[di]\r
324 Device1 EQU     word ptr Video1Type[di]\r
325 \r
326 \r
327 MDA     EQU     1       ; subsystem types\r
328 CGA     EQU     2\r
329 EGA     EQU     3\r
330 MCGA    EQU     4\r
331 VGA     EQU     5\r
332 HGC     EQU     80h\r
333 HGCPlus EQU     81h\r
334 InColor EQU     82h\r
335 \r
336 MDADisplay      EQU     1       ; display types\r
337 CGADisplay      EQU     2\r
338 EGAColorDisplay EQU     3\r
339 PS2MonoDisplay  EQU     4\r
340 PS2ColorDisplay EQU     5\r
341 \r
342 TRUE    EQU     1\r
343 FALSE   EQU     0\r
344 \r
345 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r
346 ;\r
347 ; Program\r
348 ;\r
349 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\r
350 \r
351 Results VIDstruct <>    ;results go here!\r
352 \r
353 EGADisplays     DB      CGADisplay      ; 0000b, 0001b  (EGA switch values)\r
354         DB      EGAColorDisplay ; 0010b, 0011b\r
355         DB      MDADisplay      ; 0100b, 0101b\r
356         DB      CGADisplay      ; 0110b, 0111b\r
357         DB      EGAColorDisplay ; 1000b, 1001b\r
358         DB      MDADisplay      ; 1010b, 1011b\r
359 \r
360 DCCtable        DB      0,0     ; translate table for INT 10h func 1Ah\r
361         DB      MDA,MDADisplay\r
362         DB      CGA,CGADisplay\r
363         DB      0,0\r
364         DB      EGA,EGAColorDisplay\r
365         DB      EGA,MDADisplay\r
366         DB      0,0\r
367         DB      VGA,PS2MonoDisplay\r
368         DB      VGA,PS2ColorDisplay\r
369         DB      0,0\r
370         DB      MCGA,EGAColorDisplay\r
371         DB      MCGA,PS2MonoDisplay\r
372         DB      MCGA,PS2ColorDisplay\r
373 \r
374 TestSequence    DB      TRUE    ; this list of flags and addresses\r
375         DW      FindPS2 ;  determines the order in which this\r
376                         ;  program looks for the various\r
377 EGAflag DB      ?       ;  subsystems\r
378         DW      FindEGA\r
379 \r
380 CGAflag DB      ?\r
381         DW      FindCGA\r
382 \r
383 Monoflag        DB      ?\r
384         DW      FindMono\r
385 \r
386 NumberOfTests   EQU     ($-TestSequence)/3\r
387 \r
388 \r
389 PUBLIC  VW_VideoID\r
390 VW_VideoID      PROC\r
391 \r
392         push    bp      ; preserve caller registers\r
393         mov     bp,sp\r
394         push    ds\r
395         push    si\r
396         push    di\r
397 \r
398         push    cs\r
399         pop     ds\r
400         ASSUME  DS:@Code\r
401 \r
402 ; initialize the data structure that will contain the results\r
403 \r
404         lea     di,Results      ; DS:DI -> start of data structure\r
405 \r
406         mov     Device0,0       ; zero these variables\r
407         mov     Device1,0\r
408 \r
409 ; look for the various subsystems using the subroutines whose addresses are\r
410 ; tabulated in TestSequence; each subroutine sets flags in TestSequence\r
411 ; to indicate whether subsequent subroutines need to be called\r
412 \r
413         mov     byte ptr CGAflag,TRUE\r
414         mov     byte ptr EGAflag,TRUE\r
415         mov     byte ptr Monoflag,TRUE\r
416 \r
417         mov     cx,NumberOfTests\r
418         mov     si,offset TestSequence\r
419 \r
420 @@L01:  lodsb           ; AL := flag\r
421         test    al,al\r
422         lodsw           ; AX := subroutine address\r
423         jz      @@L02   ; skip subroutine if flag is false\r
424 \r
425         push    si\r
426         push    cx\r
427         call    ax      ; call subroutine to detect subsystem\r
428         pop     cx\r
429         pop     si\r
430 \r
431 @@L02:  loop    @@L01\r
432 \r
433 ; determine which subsystem is active\r
434 \r
435         call    FindActive\r
436 \r
437         mov     al,Results.Video0Type\r
438         mov     ah,0    ; was:  Results.Display0Type\r
439 \r
440         pop     di      ; restore caller registers and return\r
441         pop     si\r
442         pop     ds\r
443         mov     sp,bp\r
444         pop     bp\r
445         ret\r
446 \r
447 VW_VideoID      ENDP\r
448 \r
449 \r
450 ;\r
451 ; FindPS2\r
452 ;\r
453 ; This subroutine uses INT 10H function 1Ah to determine the video BIOS\r
454 ; Display Combination Code (DCC) for each video subsystem present.\r
455 ;\r
456 \r
457 FindPS2 PROC    near\r
458 \r
459         mov     ax,1A00h\r
460         int     10h     ; call video BIOS for info\r
461 \r
462         cmp     al,1Ah\r
463         jne     @@L13   ; exit if function not supported (i.e.,\r
464                         ;  no MCGA or VGA in system)\r
465 \r
466 ; convert BIOS DCCs into specific subsystems & displays\r
467 \r
468         mov     cx,bx\r
469         xor     bh,bh   ; BX := DCC for active subsystem\r
470 \r
471         or      ch,ch\r
472         jz      @@L11   ; jump if only one subsystem present\r
473 \r
474         mov     bl,ch   ; BX := inactive DCC\r
475         add     bx,bx\r
476         mov     ax,[bx+offset DCCtable]\r
477 \r
478         mov     Device1,ax\r
479 \r
480         mov     bl,cl\r
481         xor     bh,bh   ; BX := active DCC\r
482 \r
483 @@L11:  add     bx,bx\r
484         mov     ax,[bx+offset DCCtable]\r
485 \r
486         mov     Device0,ax\r
487 \r
488 ; reset flags for subsystems that have been ruled out\r
489 \r
490         mov     byte ptr CGAflag,FALSE\r
491         mov     byte ptr EGAflag,FALSE\r
492         mov     byte ptr Monoflag,FALSE\r
493 \r
494         lea     bx,Video0Type[di]  ; if the BIOS reported an MDA ...\r
495         cmp     byte ptr [bx],MDA\r
496         je      @@L12\r
497 \r
498         lea     bx,Video1Type[di]\r
499         cmp     byte ptr [bx],MDA\r
500         jne     @@L13\r
501 \r
502 @@L12:  mov     word ptr [bx],0    ; ... Hercules can't be ruled out\r
503         mov     byte ptr Monoflag,TRUE\r
504 \r
505 @@L13:  ret\r
506 \r
507 FindPS2 ENDP\r
508 \r
509 \r
510 ;\r
511 ; FindEGA\r
512 ;\r
513 ; Look for an EGA.  This is done by making a call to an EGA BIOS function\r
514 ;  which doesn't exist in the default (MDA, CGA) BIOS.\r
515 \r
516 FindEGA PROC    near    ; Caller:       AH = flags\r
517                         ; Returns:      AH = flags\r
518                         ;               Video0Type and\r
519                         ;                Display0Type updated\r
520 \r
521         mov     bl,10h  ; BL := 10h (return EGA info)\r
522         mov     ah,12h  ; AH := INT 10H function number\r
523         int     10h     ; call EGA BIOS for info\r
524                         ; if EGA BIOS is present,\r
525                         ;  BL <> 10H\r
526                         ;  CL = switch setting\r
527         cmp     bl,10h\r
528         je      @@L22   ; jump if EGA BIOS not present\r
529 \r
530         mov     al,cl\r
531         shr     al,1    ; AL := switches/2\r
532         mov     bx,offset EGADisplays\r
533         xlat            ; determine display type from switches\r
534         mov     ah,al   ; AH := display type\r
535         mov     al,EGA  ; AL := subystem type\r
536         call    FoundDevice\r
537 \r
538         cmp     ah,MDADisplay\r
539         je      @@L21   ; jump if EGA has a monochrome display\r
540 \r
541         mov     CGAflag,FALSE   ; no CGA if EGA has color display\r
542         jmp     short @@L22\r
543 \r
544 @@L21:  mov     Monoflag,FALSE  ; EGA has a mono display, so MDA and\r
545                         ;  Hercules are ruled out\r
546 @@L22:  ret\r
547 \r
548 FindEGA ENDP\r
549 \r
550 ;\r
551 ; FindCGA\r
552 ;\r
553 ; This is done by looking for the CGA's 6845 CRTC at I/O port 3D4H.\r
554 ;\r
555 FindCGA PROC    near    ; Returns:      VIDstruct updated\r
556 \r
557         mov     dx,3D4h ; DX := CRTC address port\r
558         call    Find6845\r
559         jc      @@L31   ; jump if not present\r
560 \r
561         mov     al,CGA\r
562         mov     ah,CGADisplay\r
563         call    FoundDevice\r
564 \r
565 @@L31:  ret\r
566 \r
567 FindCGA ENDP\r
568 \r
569 ;\r
570 ; FindMono\r
571 ;\r
572 ; This is done by looking for the MDA's 6845 CRTC at I/O port 3B4H.  If\r
573 ; a 6845 is found, the subroutine distinguishes between an MDA\r
574 ; and a Hercules adapter by monitoring bit 7 of the CRT Status byte.\r
575 ; This bit changes on Hercules adapters but does not change on an MDA.\r
576 ;\r
577 ; The various Hercules adapters are identified by bits 4 through 6 of\r
578 ; the CRT Status value:\r
579 ;\r
580 ; 000b = HGC\r
581 ; 001b = HGC+\r
582 ; 101b = InColor card\r
583 ;\r
584 \r
585 FindMono        PROC    near    ; Returns:      VIDstruct updated\r
586 \r
587         mov     dx,3B4h ; DX := CRTC address port\r
588         call    Find6845\r
589         jc      @@L44   ; jump if not present\r
590 \r
591         mov     dl,0BAh ; DX := 3BAh (status port)\r
592         in      al,dx\r
593         and     al,80h\r
594         mov     ah,al   ; AH := bit 7 (vertical sync on HGC)\r
595 \r
596         mov     cx,8000h        ; do this 32768 times\r
597 @@L41:  in      al,dx\r
598         and     al,80h  ; isolate bit 7\r
599         cmp     ah,al\r
600         loope   @@L41   ; wait for bit 7 to change\r
601         jne     @@L42   ; if bit 7 changed, it's a Hercules\r
602 \r
603         mov     al,MDA  ; if bit 7 didn't change, it's an MDA\r
604         mov     ah,MDADisplay\r
605         call    FoundDevice\r
606         jmp     short @@L44\r
607 \r
608 @@L42:  in      al,dx\r
609         mov     dl,al   ; DL := value from status port\r
610         and     dl,01110000b    ; mask bits 4 thru 6\r
611 \r
612         mov     ah,MDADisplay   ; assume it's a monochrome display\r
613 \r
614         mov     al,HGCPlus      ; look for an HGC+\r
615         cmp     dl,00010000b\r
616         je      @@L43   ; jump if it's an HGC+\r
617 \r
618         mov     al,HGC  ; look for an InColor card or HGC\r
619         cmp     dl,01010000b\r
620         jne     @@L43   ; jump if it's not an InColor card\r
621 \r
622         mov     al,InColor      ; it's an InColor card\r
623         mov     ah,EGAColorDisplay\r
624 \r
625 @@L43:  call    FoundDevice\r
626 \r
627 @@L44:  ret\r
628 \r
629 FindMono        ENDP\r
630 \r
631 ;\r
632 ; Find6845\r
633 ;\r
634 ; This routine detects the presence of the CRTC on a MDA, CGA or HGC.\r
635 ; The technique is to write and read register 0Fh of the chip (cursor\r
636 ; low).  If the same value is read as written, assume the chip is\r
637 ; present at the specified port addr.\r
638 ;\r
639 \r
640 Find6845        PROC    near    ; Caller:  DX = port addr\r
641                         ; Returns: cf set if not present\r
642         mov     al,0Fh\r
643         out     dx,al   ; select 6845 reg 0Fh (Cursor Low)\r
644         inc     dx\r
645         in      al,dx   ; AL := current Cursor Low value\r
646         mov     ah,al   ; preserve in AH\r
647         mov     al,66h  ; AL := arbitrary value\r
648         out     dx,al   ; try to write to 6845\r
649 \r
650         mov     cx,100h\r
651 @@L51:  loop    @@L51   ; wait for 6845 to respond\r
652 \r
653         in      al,dx\r
654         xchg    ah,al   ; AH := returned value\r
655                         ; AL := original value\r
656         out     dx,al   ; restore original value\r
657 \r
658         cmp     ah,66h  ; test whether 6845 responded\r
659         je      @@L52   ; jump if it did (cf is reset)\r
660 \r
661         stc             ; set carry flag if no 6845 present\r
662 \r
663 @@L52:  ret\r
664 \r
665 Find6845        ENDP\r
666 \r
667 \r
668 ;\r
669 ; FindActive\r
670 ;\r
671 ; This subroutine stores the currently active device as Device0.  The\r
672 ; current video mode determines which subsystem is active.\r
673 ;\r
674 \r
675 FindActive      PROC    near\r
676 \r
677         cmp     word ptr Device1,0\r
678         je      @@L63   ; exit if only one subsystem\r
679 \r
680         cmp     Video0Type[di],4        ; exit if MCGA or VGA present\r
681         jge     @@L63   ;  (INT 10H function 1AH\r
682         cmp     Video1Type[di],4        ;  already did the work)\r
683         jge     @@L63\r
684 \r
685         mov     ah,0Fh\r
686         int     10h     ; AL := current BIOS video mode\r
687 \r
688         and     al,7\r
689         cmp     al,7    ; jump if monochrome\r
690         je      @@L61   ;  (mode 7 or 0Fh)\r
691 \r
692         cmp     Display0Type[di],MDADisplay\r
693         jne     @@L63   ; exit if Display0 is color\r
694         jmp     short @@L62\r
695 \r
696 @@L61:  cmp     Display0Type[di],MDADisplay\r
697         je      @@L63   ; exit if Display0 is monochrome\r
698 \r
699 @@L62:  mov     ax,Device0      ; make Device0 currently active\r
700         xchg    ax,Device1\r
701         mov     Device0,ax\r
702 \r
703 @@L63:  ret\r
704 \r
705 FindActive      ENDP\r
706 \r
707 \r
708 ;\r
709 ; FoundDevice\r
710 ;\r
711 ; This routine updates the list of subsystems.\r
712 ;\r
713 \r
714 FoundDevice     PROC    near    ; Caller:    AH = display #\r
715                         ;            AL = subsystem #\r
716                         ; Destroys:  BX\r
717         lea     bx,Video0Type[di]\r
718         cmp     byte ptr [bx],0\r
719         je      @@L71   ; jump if 1st subsystem\r
720 \r
721         lea     bx,Video1Type[di]       ; must be 2nd subsystem\r
722 \r
723 @@L71:  mov     [bx],ax ; update list entry\r
724         ret\r
725 \r
726 FoundDevice     ENDP\r
727 \r
728 IDEAL\r
729 \r
730 \r
731 \r
732 END\r