]> 4ch.mooo.com Git - 16.git/blob - 16/tweak16/REGTABLE.CPP
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / tweak16 / REGTABLE.CPP
1 /*\r
2         RegTable.CPP version 1.0\r
3         by Robert Schmidt of Ztiff Zox Softwear 1993\r
4         \r
5         Defines the member and friend functions of the RegisterTable class\r
6                 declared in RegTable.HPP.\r
7 */\r
8 \r
9 #include <dos.h>\r
10 //#include <conio.h>\r
11 #include "RegTable.hpp"\r
12 \r
13 \r
14 RegisterTable::RegisterTable(istream &ins)\r
15         {\r
16         // Read number of registers (first number in file)\r
17         ins >> registers;\r
18         // Allocate enough space\r
19         reg = new NamedRegister[registers];\r
20         // Read reg. descriptions\r
21         for (int i=0; i<registers; i++)\r
22                 ins >> reg[i];\r
23         // Get current register configuration from VGA, and use as default\r
24         in();\r
25         }\r
26 \r
27 \r
28 void RegisterTable::in()\r
29         {\r
30         for (int r = 0; r < registers; r++)\r
31                 reg[r].in();\r
32         }\r
33 \r
34 void RegisterTable::out()\r
35         {\r
36         outportb(0x3d4,0x11);                           // Ensure CRT regs. 0-7 are writable!\r
37         int v = inportb(0x3d5);                         //      That is, clear bit 7 of port\r
38         v &= 0x7f;                                                      //      0x3D4, index 0x11.\r
39         outport(0x3d4,0x11 | (v << 8));\r
40 \r
41 //      outport(0x3c4, 0x0100);                         // reset sequencer\r
42 \r
43         for (int r = 0; r < registers; r++)\r
44                 if (reg[r].isEnabled())\r
45                         reg[r].out();\r
46 \r
47 //      outport(0x3c4, 0x0300);                         // re-reset sequencer\r
48         outportb(0x3c0, 0x20);                          // Reenable display data\r
49         }\r
50 \r
51 /*\r
52         This istream operator >> reads an entire table of Register values\r
53         into 'this' table.\r
54         Notes:\r
55                 The stream is read until good() is no longer true.  Not good\r
56                         practice, but hey!\r
57                 If the read Register's port and index pair is not found in 'this'\r
58                         table, it is ignored.\r
59                 In effect, only the *values* in the table may change after >>,\r
60                         not port or index numbers.\r
61 */\r
62 \r
63 istream& operator>> (istream &in, RegisterTable &t)\r
64         {\r
65         int r = 0;\r
66         t.doDisable();                                                  // first disable all registers\r
67         while (in.good())\r
68                 {\r
69                 Register temp;\r
70                 in >> temp;\r
71         \r
72                 int prevr = r;\r
73         \r
74                 //Search for the correct register position:\r
75                 while (temp.getPort() != t.reg[r].getPort() ||\r
76                         temp.getIndex() != t.reg[r].getIndex())\r
77                         {\r
78                         if (++r >= t.registers)\r
79                                 r = 0;\r
80                         if (r == prevr)                                 // Have we looped around once?\r
81                                 goto skip;                                      //      Register not supported!\r
82                         }\r
83                 // Correct register found, now store the value and enable it.\r
84                 t.reg[r].setValue(temp.getValue());\r
85                 t.reg[r].doEnable();                            // enable this single register\r
86         skip:\r
87                 }\r
88         return in;\r
89         }\r
90 \r
91 \r
92 //      This operator << sends all enabled registers in t to the out stream.\r
93 \r
94 ostream& operator<< (ostream &out, RegisterTable &t)\r
95         {\r
96         for (int r = 0; r < t.registers; r++)\r
97                 if (t.reg[r].isEnabled())\r
98                         out << Register(t.reg[r]);\r
99         return out;\r
100         }\r
101 \r
102 void RegisterTable::doEnable()\r
103         {\r
104         for (int r=0; r<registers; r++)\r
105                 reg[r].doEnable();\r
106         }\r
107 \r
108 void RegisterTable::doDisable()\r
109         {\r
110         for (int r=0; r<registers; r++)\r
111                 reg[r].doDisable();\r
112         }\r
113 \r
114 \r
115 Register *RegisterTable::getRegister(unsigned p, unsigned char i)\r
116         {\r
117         for (int r = 0; r < registers; ++r)\r
118                 if (reg[r].getPort() == p && reg[r].getIndex() == i)\r
119                         return &reg[r];\r
120         return 0;\r
121         }\r
122 \r
123 \r