{ File name: Boot.dfn Description: Definitions for Initial microcode, Last Edited: Fiala 5-Sep-86 11:07:58 Removed def for uE3FF now in Dandelion.dfn Fiala 25-Jul-86 14:27:28 Fiala 9-Sep-86 15:15:33 Move display IOPage defn's to Dandelion.dfn Fiala 12-Jan-87 14:54:04 Added def for cedarGermAnyPilotDisk for Cedar 7.0. Copyright (C) 1986 by Xerox Corporation. All rights reserved. } { +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Subroutines from CoreInitial.mc mapZap returns - Link 0; relative to miscRet RtnBLT returns - Link 0; relative to subrRet +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ } MacroDef[RtnMapZap, at[#1,10,miscRet]]; {CoreInitial} MacroDef[RtnBLT, at[#1,10,subrRet]]; {CoreInitial, SAx000Initial, EtherInitial, TridentInitial} Set[L0.BLTr0, 00]; Set[L0.BLTr1, 01]; Set[L0.BLTr2, 02]; Set[L0.BLTr3, 03]; Set[L0.BLTr4, 04]; Set[L0.BLTr5, 05]; Set[L0.BLTr6, 06]; Set[L0.BLTr7, 07]; Set[L0.BLTr8, 08]; Set[L0.BLTr9, 09]; Set[L0.vmSetup, 0A]; Set[L0.BLTrB, 0B]; Set[L0.garbageLoop, 0C]; Set[L0.mgLoop, 0D]; Set[L0.vswap, 0E]; Set[L0.germExch, 0F]; Set[ProtectStart, 0], Set[ProtectFence, 0FF]; RegDef[uESubBoot, U, 0DE]; {Howard's subBoot} RegDef[uTMErRst, U, 0B9]; {MagTape} RegDef[uStartActive, U, 0E3]; {LSEP} RegDef[uDisableLSEP, U, 0E5]; {LSEP} { Virtual Memory Parameterization } Set[X32kb, 04000]; Set[X64kb, 08000]; Set[X128kb, 10000]; Set[VMMSize, X32kb]; {Uncomment the appropriate Virt. Mem. size} {Set[VMMSize, X64kb];} {Uncomment the appropriate Virt. Mem. size} {Set[VMMSize, X128kb];} {Uncomment the appropriate Virt. Mem. size} Set[MapRealAddrLow, 0]; Set[MapRealAddrHigh, 1]; IfEqual[VMMSize, X32kb,Set[FirstRealPageToMap, 40],]; {this is the } IfEqual[VMMSize, X64kb,Set[FirstRealPageToMap, 80],]; {next page after} IfEqual[VMMSize, X128kb,Set[FirstRealPageToMap, 00],]; {the memory map ends} IfEqual[VMMSize, X32kb,Set[FirstRealPageToMapHigh, 1],]; IfEqual[VMMSize, X64kb,Set[FirstRealPageToMapHigh, 1],]; IfEqual[VMMSize, X128kb,Set[FirstRealPageToMapHigh, 2],]; Set[IOPageVirtual, 0FF]; Set[IOPageVirtualHigh, 0]; Set[VMM22Bit, 40]; Set[VMM23Bit, 80]; Set[VMM24Bit, 100]; IfEqual[VMMSize, X32kb,Set[mapPages, VMM22Bit],]; {number pages dedicated to map} IfEqual[VMMSize, X64kb,Set[mapPages, VMM23Bit],]; {number pages dedicated to map} IfEqual[VMMSize, X128kb,Set[mapPages, 00],]; {number pages dedicated to map} { Notice that these values are left rotated into the high byte and a 1 is then subtracted from the resulting value; hence we have 3FFF, 7FFF, & FFFF. } Set[virtualIOPage, 0FF]; {virtual page number of IO page} Set[vacant, 60]; {map flags for a vacant page} Set[present, 10]; {map flags for a referenced and present page} Set[IOPage.VMMSize, 6F]; Set[CTClrMEr, 9]; {ClearMemError bit (used in MagTapeInit in InitDLion)} Set[CHeadMsk, 0F9]; {Mask used to detect Read operations.} Set[CSA1MaxSectTst, 239'D]; Set[CSA4MaxSectTst, 227'D]; {256 - number of sectors in a track = 256-16-1 = 239 for the SA1000. Used to cause PgCarryBr <=> sector number+UMaxSectTst+1 >= 256. The "+1" comes from the fact that a U register is being stored in the same instruction as the test is being done.} Set[CSA4ErrMsk, 3F]; {256 - number of sectors in a track = 256-28-1 = 227 for the SA4000. Used to cause PgCarryBr <=> sector number+UMaxSectTst+1 >= 256. The "+1" comes from the fact that a U register is being stored in the same instruction as the test is being done.} Set[CAddrMkHi, 0A1]; {constants which define the address mark for the SA1000} Set[CSA1ErrMsk, 7F]; {mask used to turn off irrelevant error flags in raw status for the SA4000 drive (does not include Header Tag)} Set[CAddrMkLo, 041]; {Boot Time Error Codes} Set[bootDeviceError, 1]; Set[bootNullGerm, 2]; Set[bootBrokenChain, 3]; {boot chain broken} Set[bootIllegalCommand, 4]; {IOP sent illegal command} Set[bootTrap, 5]; {trapped through control store 0} Set[bootNoDiagnostics, 6]; Set[bootNoEmulator, 7]; Set[bootNoGerm, 8]; Set[IdleLoc, 1], Set[Maintenance1Loc, 2], Set[Maintenance2Loc, 3], Set[Maintenance3Loc, 4]; Set[ErrorHandlerLoc, 100]; {** this stuff is specific to PrincOps version! ** look in the device specific initial code to see how this is used to construct the virtual address of the germ} Set[germPageHigh, 0]; Set[germPageLow, 1]; Set[cedarGermPageHigh, 3E]; Set[cedarGermPageLow, 2]; Set[germRequest, 0F0]; {360'b offset from germ start} Set[cedar.Request.Action, Add[germRequest, 0]]; Set[cedar.Request.deviceType, Add[germRequest, 1]]; Set[cedar.Request.devOrd, Add[germRequest, 2]]; Set[cedar.Request.BootFileNumber, Add[germRequest, 3]]; Set[cedar.Request.NetworkNumber, Add[germRequest, 4]]; Set[cedar.Request.HostNumber, Add[germRequest, 5]]; Set[cedarGermSAx000, 3]; Set[cedarGermEthernet, 5]; Set[cedarGermAnyPilotDisk, 100'b]; Set[inLoad, 0]; Set[bootPhysicalVolume, 2]; Set[diskDeviceOrdinal, 0]; Set[ethernetDeviceOrdinal, 0]; Set[Off, 0]; Set[EnableReceive, 1]; Set[EnableTransmit, 1]; Set[EnableTransmitLastWord, 3]; Set[EnableTransmitDefer, 5]; Set[InitialCountdown, 14]; {14 hex = 20 decimal, 20 x 51.2 us ~ 1 ms for delay before retransmission} Set[Other, 0]; Set[UnderRun, 1]; Set[Collision, 2]; Set[CollisionUnderRun, 3]; { ********************************************* Def's removed from SAx000Initial.mc ********************************************* } {disk definitions} Set[SA1000FindSectCmd, 20]; {null findSectorCmd for SA1000} Set[SA1000HeaderLoopMsk,43]; {have SA1000 reject Label and Data fields when looking for Headers} Set[stepBit, 80]; {KControl bits, low byte} Set[inBit, 40]; Set[firmwareEnable, 20]; Set[SA4FindSect, 6]; Set[SA1FindSect, 0]; Set[driveSelectBit, 4]; {KControl bits, high byte} Set[faultClearBit, 2]; Set[track00Bit, 2]; {KStatus bits, high byte} Set[seekCompleteBit, 4]; Set[badBits, 3F]; {IOCB status error indicators} Set[verifyBit, 1]; {IOCB page offsets} Set[statusAddr, 3]; {status word} { 4 not used, used to be pointer to next IOCB, always 0} Set[seekAddr, 5]; {pointer to seek IOCB} Set[transferAddr, 6]; {pointer to transfer IOCB} Set[vrrAddr, 7]; {pointer to vrr parameter area} Set[vvrAddr, 8]; {pointer to vrr parameter area} Set[headerAddr, 9]; {header -- 2 words} Set[labelAddr, 0B]; {label -- 0A words} Set[labelPageLow, 10]; {low 16 bits of file page number} Set[miscBitsAddr, 11]; {filePageHi[0..6], unused[0..5], immutable[0], temporary[0], zeroSize[0]} Set[bootLink, 13]; {disk address of next run of pages in boot file} Set[labelSize, 0A]; {parameter area offsets} Set[sectors, 0]; {number of sectors to transfer} Set[headerLoopMsk, 6]; {specifies non-fatal errors when looking for a header} Set[dataPage, 0D]; {page number of data area in main storage} Set[haltWord, 0F]; {requires head in high 5 bits} Set[findWord, 10]; {requires head in high 5 bits} {transfer IOCB offsets} Set[parameters, 1]; {pointer to parameter area} {seek IOCB offsets} Set[cylinders, 0]; {-(number of cylinders to move heads)} Set[stepHigh, 6]; {set step level high} Set[stepLow, 8]; {set step level low} {Miscellaneous disk constants} Set[SA1000HeadCount, Sub[4,1]]; Set[SA4000HeadCount, Sub[4,1]]; Set[Q2040HeadCount, Sub[8,1]]; Set[Q2080HeadCount, Sub[7,1]]; {physical volume boot files} { useful data formats extracted from Boot.mesa BootFileType: TYPE= {hardMicrocode, softMicrocode, germ, pilot, debugger, debugee}; DiskFileID: TYPE= RECORD[fID: File.ID, firstPage: File.PageNumber, da: DiskAddress]; PVBootFiles: POINTER TO ARRAY BootFileType[hardMicrocode..pilot] OF DiskFileID= 2; After reading from the disk, PVBootFiles moved to memory location 2 } Set[bootingInfo, 8]; {origin of PVBootFiles in physical volume root page} Set[DiskFileIDSize, 9]; {number of words in DiskFileID} Set[bootingInfoSize, Mul[DiskFileIDSize, 4]]; {size of PVBootFiles} { things salted away in page 0 } Set[availableDevices, 0]; {devices available for booting, set up by Phase 0} Set[bootReadyFlag, 1]; {non-zero indicates boot file is ready} Set[hardFileID, 2]; {hard microcode DiskFileID, copied from physical volume root page} Set[emulatorFileID, 0B]; {emulator microcode DiskFileID, copied from physical volume root page} Set[germFileID, 14]; {germ DiskFileID, copied from physical volume root page} Set[bootFileID, 1D]; {working DiskFileID, copied from one of the above fileID's} Set[bootPage, 22]; Set[bootDiskAddr, 24]; Set[labelTemplate, 26]; {template label used by boot loading routines} { ********************************************* Def's for *Trident*.mc ********************************************* } { ********************************************* Def's from TridentInitial.mc ********************************************* } {word offsets} {into Working Page} Set[WPinitCSB, 48]; Set[WPrdLblCtl, 42]; Set[WPverLblCtl, 46]; Set[WPvrrLabelParam, 40]; Set[WPvvrLabelParam, 44]; {into IOCBs} Set[IOCBcHeader, 0]; {clientHeader} Set[IOCBcHeaderCyl, 0]; {clientHeader.cylinder} Set[IOCBcHeaderHS, 1]; {clientHeader.head§or} Set[IOCBdataPtrLo, 4]; Set[IOCBtries, 6]; Set[IOCBpageCount, 7]; Set[IOCBcStatus, 8]; {Controller Status} Set[IOCBdStatus, 9]; {Disk Status} Set[IOCBdHeader, 0A]; Set[IOCBdiskAdr, 0E]; Set[IOCBfilePageLo, 0F]; Set[IOCBseekDrive, 11]; Set[IOCBseekCyl, 12]; Set[IOCBseekHead, 13]; Set[IOCBhdrCtl, 16]; Set[IOCBlabelParam, 18]; Set[IOCBdataCtl, 1E]; Set[IOCBlabelParam, 18]; Set[IOCBlabelErrMask, 1B]; Set[IOCBclientLabel, 20]; Set[IOCBcLblFilePageLo, 25]; Set[IOCBcLblFilePageHi, 26]; Set[IOCBcLblBootLink, 28]; Set[IOCBcLblBootLink1, 29]; Set[IOCBdiskLabel, 30]; Set[IOCBdLblBootLink, 38]; {values} Set[vDStatusEndCyl, 40]; Set[vDStatusAnyAtten, 80]; Set[vCStatusLastField, 6]; {Last Field Mask} Set[vCStatusDataField, 6]; Set[vCStatusLblField, 4]; Set[vCStatusVerErrLRot8, 8]; Set[vCmdTagHd, 40]; Set[vCmdHd5, 5]; Set[vCmdTagCtl, 20]; Set[vCmdResetRecal, 0A]; Set[vLabelSize, 0A]; Set[vT300Heads, 19'd]; Set[vT80Heads, 5]; Set[vSecsPerTrack, 30'd]; {physical volume boot files} {useful data formats extracted from Boot.mesa BootFileType: TYPE= {hardMicrocode, softMicrocode, germ, pilot, debugger, debugee}; DiskFileID: TYPE= RECORD[fID: File.ID, firstPage: File.PageNumber, da: DiskAddress]; PVBootFiles: POINTER TO ARRAY BootFileType[hardMicrocode..pilot] OF DiskFileID= 2; After reading from the disk, PVBootFiles moved to memory location 2} Set[bootingInfo, 8]; {origin of PVBootFiles in physical volume root page} Set[DiskFileIDSize, 9]; {number of words in DiskFileID} Set[bootingInfoSize, Mul[DiskFileIDSize, 4]]; {size of PVBootFiles} {things salted away in page 0} Set[availableDevices, 0]; {devices available for booting, set up by Phase 0} Set[bootReadyFlag, 1]; {non-zero indicates boot file is ready} Set[hardFileID, 2]; {hard microcode DiskFileID, copied from physical volume root page} Set[emulatorFileID, 0B]; {emulator microcode DiskFileID, copied from physical volume root page} Set[germFileID, 14]; {germ DiskFileID, copied from physical volume root page} Set[bootFileID, 1D]; {working DiskFileID, copied from one of the above fileID's} Set[bootPage, 22]; Set[bootDiskAddr, 24]; Set[labelTemplate, 26]; {template label used by boot loading routines}