Allow disk devices to specify their own boot requirements
This commit is contained in:
parent
09e5a97765
commit
6be79ae756
4 changed files with 67 additions and 45 deletions
|
|
@ -950,9 +950,26 @@ var PDP11 = {
|
|||
}
|
||||
};
|
||||
|
||||
PDP11.RX11.RX01 = ["DX", 77, 1, 26, 128, 0];
|
||||
PDP11.RK11.RK05 = ["RK", 203, 2, 12, 512, PDP11.RK11.RKDS.RK05 | PDP11.RK11.RKDS.SOK | PDP11.RK11.RKDS.RRDY];
|
||||
PDP11.RL11.RL02K = ["RL", 512, 2, 40, 256, PDP11.RL11.RLMP.GS_ST.LOCKON | PDP11.RL11.RLMP.GS_BH | PDP11.RL11.RLMP.GS_HO];
|
||||
PDP11.RX11.RX01 = [
|
||||
"DX",
|
||||
77, 1, 26, 128, // disk geometry (CHSN: cylinders, heads, sectors/track, and bytes/sector)
|
||||
1, 0, 0, 128, // boot code location (cylinder, head, sector index (NOT sector number), and number of bytes)
|
||||
0 // default drive status
|
||||
];
|
||||
|
||||
PDP11.RK11.RK05 = [
|
||||
"RK",
|
||||
203, 2, 12, 512, // disk geometry (CHSN: cylinders, heads, sectors/track, and bytes/sector)
|
||||
0, 0, 0, 512, // boot code location (cylinder, head, sector index (NOT sector number), and number of bytes)
|
||||
PDP11.RK11.RKDS.RK05 | PDP11.RK11.RKDS.SOK | PDP11.RK11.RKDS.RRDY
|
||||
];
|
||||
|
||||
PDP11.RL11.RL02K = [
|
||||
"RL",
|
||||
512, 2, 40, 256, // disk geometry (CHSN: cylinders, heads, sectors/track, and bytes/sector)
|
||||
0, 0, 0, 256, // boot code location (cylinder, head, sector index (NOT sector number), and number of bytes)
|
||||
PDP11.RL11.RLMP.GS_ST.LOCKON | PDP11.RL11.RLMP.GS_BH | PDP11.RL11.RLMP.GS_HO
|
||||
];
|
||||
|
||||
PDP11.ACCESS.READ_WORD = PDP11.ACCESS.WORD | PDP11.ACCESS.READ; // formerly READ_MODE (2)
|
||||
PDP11.ACCESS.READ_BYTE = PDP11.ACCESS.BYTE | PDP11.ACCESS.READ; // formerly READ_MODE (2) | BYTE_MODE (1)
|
||||
|
|
|
|||
|
|
@ -555,12 +555,16 @@ class DriveController extends Component {
|
|||
* NOTE: We initialize the following drive properties to their MAXIMUMs; disks may have
|
||||
* these or SMALLER values (subject to the limits of what the controller supports, of course).
|
||||
*/
|
||||
drive.sName = configDrive[0] + iDrive;
|
||||
drive.nCylinders = configDrive[1];
|
||||
drive.nHeads = configDrive[2];
|
||||
drive.nSectors = configDrive[3];
|
||||
drive.cbSector = configDrive[4];
|
||||
drive.status = configDrive[5];
|
||||
drive.sName = configDrive[i++] + iDrive;
|
||||
drive.nCylinders = configDrive[i++];
|
||||
drive.nHeads = configDrive[i++];
|
||||
drive.nSectors = configDrive[i++];
|
||||
drive.cbSector = configDrive[i++];
|
||||
drive.iCylinderBoot = configDrive[i++];
|
||||
drive.iHeadBoot = configDrive[i++];
|
||||
drive.iSectorBoot = configDrive[i++];
|
||||
drive.cbSectorBoot = configDrive[i++];
|
||||
drive.status = configDrive[i++];
|
||||
|
||||
/*
|
||||
* The next group of properties are set by various controller command sequences.
|
||||
|
|
@ -817,7 +821,7 @@ class DriveController extends Component {
|
|||
* a READY state is assured, and the readData() call shouldn't do anything to change that.
|
||||
*/
|
||||
this.cpu.setReset(0, true);
|
||||
var err = this.readData(drive, 0, 0, 0, 512, 0x0000, 2);
|
||||
var err = this.readData(drive, drive.iCylinderBoot, drive.iHeadBoot, drive.iSectorBoot, drive.cbSectorBoot, 0x0000, 2);
|
||||
if (err) {
|
||||
this.notice("Unable to read the boot sector (" + err + ")");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@ class RX11 extends DriveController {
|
|||
* @param {Object} drive
|
||||
* @param {number} iCylinder
|
||||
* @param {number} iHead
|
||||
* @param {number} iSector (0-based)
|
||||
* @param {number} iSector
|
||||
* @param {number} nWords
|
||||
* @param {number} addr
|
||||
* @param {number} inc (normally 2, unless inhibited, in which case it's 0)
|
||||
|
|
@ -293,15 +293,15 @@ class RX11 extends DriveController {
|
|||
var iDrive = (this.regRXCS & RX11.RXCS.UNIT)? 1 : 0;
|
||||
var drive = this.aDrives[iDrive];
|
||||
var disk = drive && drive.disk;
|
||||
var iCylinder = this.regRXTA & RX11.RXTA.MASK, iHead = 0, iSector = this.regRXSA & RX11.RXSA.MASK;
|
||||
var iCylinder = this.regRXTA & RX11.RXTA.MASK, iHead = 0, nSector = this.regRXSA & RX11.RXSA.MASK;
|
||||
|
||||
this.regRXES &= ~(RX11.RXES.CRC | RX11.RXES.PARITY | RX11.RXES.DEL | RX11.RXES.DRDY);
|
||||
|
||||
if (disk) {
|
||||
this.regRXES |= RX11.RXES.DRDY;
|
||||
if (this.messageEnabled()) this.printMessage(this.type + ".readSector(" + iCylinder + ":" + iHead + ":" + iSector + ")", true, true);
|
||||
this.assert(iSector); // RX sector numbers (unlike RK and RL) are supposed to be 1-based
|
||||
var sector = disk.seek(iCylinder, iHead, iSector, true);
|
||||
if (this.messageEnabled()) this.printMessage(this.type + ".readSector(" + iCylinder + ":" + iHead + ":" + nSector + ")", true, true);
|
||||
this.assert(nSector); // RX sector numbers (unlike RK and RL) are supposed to be 1-based
|
||||
var sector = disk.seek(iCylinder, iHead, nSector, true);
|
||||
if (sector) {
|
||||
var i = 0, nBytes = this.abBuffer.length;
|
||||
while (i < nBytes) {
|
||||
|
|
@ -334,15 +334,15 @@ class RX11 extends DriveController {
|
|||
var iDrive = (this.regRXCS & RX11.RXCS.UNIT)? 1 : 0;
|
||||
var drive = this.aDrives[iDrive];
|
||||
var disk = drive && drive.disk;
|
||||
var iCylinder = this.regRXTA & RX11.RXTA.MASK, iHead = 0, iSector = this.regRXSA & RX11.RXSA.MASK;
|
||||
var iCylinder = this.regRXTA & RX11.RXTA.MASK, iHead = 0, nSector = this.regRXSA & RX11.RXSA.MASK;
|
||||
|
||||
this.regRXES &= ~(RX11.RXES.CRC | RX11.RXES.PARITY | RX11.RXES.DEL | RX11.RXES.DRDY);
|
||||
|
||||
if (disk) {
|
||||
this.regRXES |= RX11.RXES.DRDY;
|
||||
if (this.messageEnabled()) this.printMessage(this.type + ".writeSector(" + iCylinder + ":" + iHead + ":" + iSector + ")", true, true);
|
||||
this.assert(iSector); // RX sector numbers (unlike RK and RL) are supposed to be 1-based
|
||||
var sector = disk.seek(iCylinder, iHead, iSector, true);
|
||||
if (this.messageEnabled()) this.printMessage(this.type + ".writeSector(" + iCylinder + ":" + iHead + ":" + nSector + ")", true, true);
|
||||
this.assert(nSector); // RX sector numbers (unlike RK and RL) are supposed to be 1-based
|
||||
var sector = disk.seek(iCylinder, iHead, nSector, true);
|
||||
if (sector) {
|
||||
if (fDeleted) sector.deleted = true;
|
||||
var i = 0, nBytes = this.abBuffer.length;
|
||||
|
|
|
|||
Loading…
Reference in a new issue