/* RegTable.CPP version 1.0 by Robert Schmidt of Ztiff Zox Softwear 1993 Defines the member and friend functions of the RegisterTable class declared in RegTable.HPP. */ #include //#include #include "RegTable.hpp" RegisterTable::RegisterTable(istream &ins) { // Read number of registers (first number in file) ins >> registers; // Allocate enough space reg = new NamedRegister[registers]; // Read reg. descriptions for (int i=0; i> reg[i]; // Get current register configuration from VGA, and use as default in(); } void RegisterTable::in() { for (int r = 0; r < registers; r++) reg[r].in(); } void RegisterTable::out() { outportb(0x3d4,0x11); // Ensure CRT regs. 0-7 are writable! int v = inportb(0x3d5); // That is, clear bit 7 of port v &= 0x7f; // 0x3D4, index 0x11. outport(0x3d4,0x11 | (v << 8)); // outport(0x3c4, 0x0100); // reset sequencer for (int r = 0; r < registers; r++) if (reg[r].isEnabled()) reg[r].out(); // outport(0x3c4, 0x0300); // re-reset sequencer outportb(0x3c0, 0x20); // Reenable display data } /* This istream operator >> reads an entire table of Register values into 'this' table. Notes: The stream is read until good() is no longer true. Not good practice, but hey! If the read Register's port and index pair is not found in 'this' table, it is ignored. In effect, only the *values* in the table may change after >>, not port or index numbers. */ istream& operator>> (istream &in, RegisterTable &t) { int r = 0; t.doDisable(); // first disable all registers while (in.good()) { Register temp; in >> temp; int prevr = r; //Search for the correct register position: while (temp.getPort() != t.reg[r].getPort() || temp.getIndex() != t.reg[r].getIndex()) { if (++r >= t.registers) r = 0; if (r == prevr) // Have we looped around once? goto skip; // Register not supported! } // Correct register found, now store the value and enable it. t.reg[r].setValue(temp.getValue()); t.reg[r].doEnable(); // enable this single register skip: } return in; } // This operator << sends all enabled registers in t to the out stream. ostream& operator<< (ostream &out, RegisterTable &t) { for (int r = 0; r < t.registers; r++) if (t.reg[r].isEnabled()) out << Register(t.reg[r]); return out; } void RegisterTable::doEnable() { for (int r=0; r