<> <> <> <> <> <> <<>> <> DragOpsCross: CEDAR DEFINITIONS = BEGIN <> wordsPerPage: CARDINAL = 1024; bytesPerWord: CARDINAL = 4; charsPerWord: CARDINAL = 4; bitsPerByte: CARDINAL = 8; bitsPerCharacter: CARDINAL = 8; bitsPerWord: CARDINAL = bitsPerByte*bytesPerWord; bytesPerPage: CARDINAL = wordsPerPage*bytesPerWord; logWordsPerPage: CARDINAL = 10; -- LogBase2[wordsPerPage] logBitsPerByte: CARDINAL = 3; --LogBase2[bitsPerByte] logBitsPerChar: CARDINAL = 3; --LogBase2[bitsPerCharacter] logBytesPerWord: CARDINAL = 1; --LogBase2[bytesPerWord] logCharsPerWord: CARDINAL = 1; --LogBase2[bytesPerWord] logBitsPerWord: CARDINAL = logBitsPerByte + logBytesPerWord; logBytesPerPage: CARDINAL = logBytesPerWord + logWordsPerPage; PageCount: TYPE = INT; <> PageNumber: TYPE = INT; <> maxPagesInVM: PageCount = LONG[4]*LONG[1024]*LONG[1024]; <<22-bit page index>> SixBitIndex: TYPE = [0..64); FiveBitIndex: TYPE = [0..32); Word: TYPE = PACKED ARRAY FiveBitIndex OF BOOL; ZerosWord: Word = LOOPHOLE[LONG[0]]; <> OnesWord: Word = LOOPHOLE[LONG[-1]]; <> TwoWords: TYPE = ARRAY [0..1] OF Word; FourBitIndex: TYPE = [0..16); Half: TYPE = PACKED ARRAY FourBitIndex OF BOOL; ZerosHalf: Half = LOOPHOLE[0]; OnesHalf: Half = LOOPHOLE[-1]; ThreeBitIndex: TYPE = [0..7]; FourHalves: TYPE = ARRAY [0..3] OF Half; TwoHalves: TYPE = ARRAY [0..1] OF Half; Byte: TYPE = PACKED ARRAY ThreeBitIndex OF BOOL; ZerosByte: Byte = LOOPHOLE[0]; OnesByte: Byte = LOOPHOLE[377B]; EightBytes: TYPE = PACKED ARRAY [0..7] OF Byte; FourBytes: TYPE = PACKED ARRAY ByteIndex OF Byte; ByteIndex: TYPE = [0..bytesPerWord); BytesPerWord: NAT = 4; TwoBytes: TYPE = PACKED ARRAY [0..1] OF Byte; Comparison: TYPE = MACHINE DEPENDENT {less(0), equal(1), greater(2)}; <> ByteAddress: TYPE = RECORD [Word]; <> WordAddress: TYPE = RECORD [Word]; <> <> <> <<>> FieldDescriptor: TYPE = MACHINE DEPENDENT RECORD [ reserved: [0..7] _ 0, <> insert: BOOL _ FALSE, <> mask: [0..32] _ 32, <<32-mask gives start pos of 1s in the mask (mask = 0 => no 1s)>> shift: [0..32] _ 0 <> ]; <> <<(wizards only, current opcode assignments are probably wrong)>> <<>> <> RegIndex: TYPE = [0..16); <> PadByte: TYPE = [0..255]; <> Lit8: TYPE = [0..255]; <<8-bit literal or displacement>> Op4: TYPE = [0..15]; <<4-bit opcode>> Op8: TYPE = [0..255]; <<8-bit opcode>> JDist8: TYPE = [0..255]; <> Inst: TYPE = MACHINE DEPENDENT { <> <<000 => 1 byte (1 byte traps)>> <<001 => 5 bytes [040B..077B]>> <<01- => 1 byte [100B..177B]>> <<10- => 2 bytes [200B..277B]>> <<11- => 3 bytes [300B..377B]>> <> <<0------- PC + stack JS>> <<10------ PC + alphaS JB>> <<110----- PC + alphaBetaS JDB and LFC>> <<111----- PC + betaS RJB's and JBB's>> <<>> <> dTrap (000B), <<>> <> dLC0 (20B), dLC1, dLC2, dLC3, dLC4, dLC5, dLC6, dLC7, <<>> <> x060B (060B), dDFC, dLIQB, x063B, x064B, x065B, dJ5, dJQB, <<>> <> dOR (100B), dAND, dRX, dBC, dADD, dSUB, dLADD, dLSUB, dDUP (110B), dDIS, x112B, dEXDIS, dSFC, dSFCI, dRETN, x117B, x120B (120B), x121B, x122B, x123B, dKFC, x125B, dJ1, dJS, <<>> <> dLR0 (140B), dLR1, dLR2, dLR3, dLR4, dLR5, dLR6, dLR7, dLR8 (150B), dLR9, dLR10, dLR11, dLR12, dLR13, dLR14, dLR15, dSR0 (160B), dSR1, dSR2, dSR3, dSR4, dSR5, dSR6, dSR7, dSR8 (170B), dSR9, dSR10, dSR11, dSR12, dSR13, dSR14, dSR15, <> dQOR (200B), dQAND, dQRX, dQBC, dQADD (204B), dQSUB, dQLADD, dQLSUB, <<>> <> dALS (210B), dAL, dASL, dAS, dCST, x215B, dRET, dRETK, dLIP (220B), dSIP, dLIB, x223B, dADDB, dSUBB, dJ2, dJB, dRB (230B), dWB, dRSB, dWSB, x234B, x235B, x236B, dPSB, <<>> <> dLRI0 (240B), dLRI1, dLRI2, dLRI3, dLRI4, dLRI5, dLRI6, dLRI7, dLRI8 (250B), dLRI9, dLRI10, dLRI11, dLRI12, dLRI13, dLRI14, dLRI15, dSRI0 (260B), dSRI1, dSRI2, dSRI3, dSRI4, dSRI5, dSRI6, dSRI7, dSRI8 (270B), dSRI9, dSRI10, dSRI11, dSRI12, dSRI13, dSRI14, dSRI15, <> dROR (300B), dRAND, dRRX, dRBC, dRADD (304B), dRSUB, dRLADD, dRLSUB, dRXOR (310B), x311B, dRFU, x313B, dRVADD (314B), dRVSUB, dRUADD, dRUSUB, <<>> <> dLGF (320B), dLFC, dLIDB, x323B, dADDDB (324B), dSUBDB, dJ3, dJDB, dRAI (330B), dWAI, dRRI, dWRI, dIOS (334B), dIOL, dION, x337B, <> x340B (340B), dRJEB, dRJLB, dRJLEB, x344B (344B), dRJNEB, dRJGEB, dRJGB, x350B (350B), dRJNEBJ, dRJGEBJ, dRJGBJ, x354B (354B), dRJEBJ, dRJLBJ, dRJLEBJ, <> dJEBB (360B), dJNEBB, dJEBBJ, dJNEBBJ, x364B (364B), x365B, x366B, x367B, <> dSHL (370B), dSHR, dSHD, dFSDB, x374B (374B), x375B, x376B, x377B}; dFirst: Inst = FIRST[Inst]; dLast: Inst = LAST[Inst]; <> OIformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, pad: PadByte _ 0 ]; <> OQBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, b0,b1,b2,b3: Lit8, pad: PadByte _ 0 ]; <> LRformat: TYPE = MACHINE DEPENDENT RECORD [ op: Op4, reg: RegIndex, pad: PadByte _ 0 ]; <> QRformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, aOp: ShortRegQR, opt,aux: BOOL, reg: RegIndex ]; ShortRegQR: TYPE = MACHINE DEPENDENT { topAtop(0), -- C: [S], A: [S], B: general pushAtop(1), -- C: [S+1]+, A: [S], B: general pushA0(2), -- C: [S+1]+, A: c0, B: general pushA1(3)}; -- C: [S+1]+, A: c1, B: general <> <<>> <> OBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, lit: Lit8 ]; <> LRBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Op4, reg: RegIndex, lit: Lit8 ]; <> RRformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, aOpt,cOpt,bOpt,aux: BOOL, b: RegIndex, c,a: RegIndex, pad: PadByte _ 0 ]; <> ODBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, lit0: Lit8, lit1: Lit8, pad: PadByte _ 0 ]; <> LRRBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, disp: Lit8, reg1,reg2: RegIndex, pad: PadByte _ 0 ]; <> RJBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, aOp: ShortRegRJB, opt,aux: BOOL, reg: RegIndex, dist: JDist8, pad: PadByte _ 0 ]; ShortRegRJB: TYPE = MACHINE DEPENDENT { c0(0), -- constant 0 c1(1), -- constant 1 top(2), -- [S] popTop(3)}; -- [S]- <> <<>> <> JBBformat: TYPE = MACHINE DEPENDENT RECORD [ op: Inst, lit: Lit8, dist: JDist8, pad: PadByte _ 0 ]; <> <> TrapWidthWords: NAT = 4; <> TrapWidthBytes: NAT = TrapWidthWords*bytesPerWord; <> XopBase: LONG CARDINAL = 1000000B; <> TrapBase: LONG CARDINAL = XopBase+256*TrapWidthWords; <> KernalLimit: LONG CARDINAL = 100000000B; <> TrapIndex: TYPE = MACHINE DEPENDENT { <> <> <> <<>> StackUnderflowTrap (00B), -- called if RET* or ALS and IFU stack is empty IFUPageFaultTrap (01B), -- called when IFU gets a page fault ResetTrap (07B), -- transfered to (no call) when RESET is asserted IFUStackOverflowTrap (10B), -- called when IFU stack fills EUStackOverflowTrap (11B), -- called when SP goes beyond SPlim RescheduleTrap (12B), -- called when RESCHEDULE is acknowledged <> <Rosemary>Dragon.mesa. The traps that the current instruction set sees are starred (**). Most of the other conditions are used to influence conditional jumps. These traps are not maskable.>> ALUCondFalse (20B), -- ALU fault FALSE ALUCondEZ (21B), -- ALU fault = (zero) ALUCondLZ (22B), -- ALU fault < (zero) ALUCondLE (23B), -- ALU fault <= (zero) AddressCheckFault (24B), -- Kernel address from user mode (see PBus cmd) ALUCondNE (25B), -- ALU fault = (zero) ALUCondGE (26B), -- ALU fault >= (zero) ALUCondGZ (27B), -- ALU fault > (zero) ALUCondOver (30B), -- ALU fault overflow ** ALUCondBC (31B), -- ALU fault bounds check ** ALUCondIL (32B), -- ALU fault illegal Lisp number ** ALUCondDO (33B), -- ALU Division Overflow ** ALUCondNotOver (34B), -- ALU fault NOT overflow ALUCondNB (35B), -- ALU fault NOT bounds check ALUCondNI (36B), -- ALU fault NOT illegal Lisp number ModeFault (37B), -- Kernel instruction attempted in user mode << (must be 37B, see McCreight)>> <> <> EUPageFault (41B), -- when DPbus indicates EU Cache page fault EUWriteFault (42B), -- when DPbus indicates EU Cache write protect fault AUFault (43B)}; -- when DPbus indicates AU fault <> <> <<>> <> ProcessorRegister: TYPE = MACHINE DEPENDENT { euStack (0), -- beginning of EU Stack euJunk (128), -- the non-matching EU register euToKBus (129), -- send result on K bus to IFU euMAR (130), -- MemoryAddressRegister euField (131), -- Field register euConstant (132), -- Base of EU constant registers (12 regs) euAux (144), -- Base of EU aux registers (16 regs) euBogus (160), -- [euBogus..euLast] not legal (NA) (80 regs) euLast (239), -- last possible EU reg (NA) <> ifuYoungestL (240), -- youngest L in IFU stack ifuYoungestPC (241), -- youngest PC in IFU stack ifuEldestL (242), -- eldest L in IFU stack ifuEldestPC (243), -- eldest PC in IFU stack (rd removes, wt adds) ifuStatus (244), -- IFU status ifuSLimit (245), -- stack limit register <> ifuBogus (246), -- [ifuBogus..ifuLast] are not legal (NA) ifuL (252), -- current L register (NA) ifuS (253), -- current S register (NA) ifuPC (254), -- current program counter (NA) ifuLast (255) -- last possible IFU reg (NA) }; EURegs: TYPE = ProcessorRegister[euStack..euLast]; EULegalRegs: TYPE = ProcessorRegister[euStack..euBogus); <> IFURegs: TYPE = ProcessorRegister[ifuYoungestL..ifuLast]; IFULegalRegs: TYPE = ProcessorRegister[ifuYoungestL..ifuBogus); <> <> IFUStatusRec: TYPE = MACHINE DEPENDENT RECORD [ pad0 (0:00..07): [0..255] _ 0, pad1 (0:08..15): [0..255] _ 0, version (0:16..23): [0..255] _ 0, -- IFU version number spareKeep (0:24..24): BOOL _ FALSE, -- when writing, keep old value spareBit (0:25..25): BOOL _ FALSE, -- not used right now userModeKeep (0:26..26): BOOL _ FALSE, -- when writing, keep old value userMode (0:27..27): BOOL _ FALSE, -- TRUE => user, FALSE => kernel trapsEnabledKeep (0:28..28): BOOL _ FALSE, -- when writing, keep old value trapsEnabled (0:29..29): BOOL _ FALSE, -- TRUE => traps enabled rescheduleKeep (0:30..30): BOOL _ FALSE, -- when writing, keep old value reschedule (0:31..31): BOOL _ FALSE -- TRUE => reschedule pending ]; <> IFUStackIndex: TYPE = [0..IFUStackSize); IFUStackSize: NAT = 15; <> IFUOverflow: NAT = 12; <> <> EUStackIndex: TYPE = [0..EUStackSize); EUStackSize: NAT = 128; <<>> <> EULocalIndex: TYPE = [0..EULocals); EULocals: NAT = 16; <<>> <> EUAuxIndex: TYPE = [0..EUAuxRegs); EUAuxRegs: NAT = 16; <<>> <> EUConstIndex: TYPE = [0..EUConstants); EUConstants: NAT = 12; <> <> IOLocation: TYPE = LONG CARDINAL; <> <> ioRescheduleRequest: IOLocation = 1000000B; <> ioResetRequest: IOLocation = 1000001B; <> IOOperand: TYPE = MACHINE DEPENDENT RECORD [ pDataA: Byte _ ZerosByte, -- IO address or address offset pCmd: PCmdFormat _ [] -- PBus command ]; PCmdFormat: TYPE = MACHINE DEPENDENT RECORD [ register: PCmdRegister _ first, mode: PCmdMode _ any, addressChecks: PCmdAddressChecks _ none, direction: PCmdDirection _ read ]; PCmdRegister: TYPE = MACHINE DEPENDENT { <> first (00B), last (37B) }; PCmdMode: TYPE = MACHINE DEPENDENT {any(0), kernelOnly(1)}; PCmdAddressChecks: TYPE = MACHINE DEPENDENT {none(0), kernelIfFirst16M(1)}; PCmdDirection: TYPE = MACHINE DEPENDENT {read(0), write(1)}; END.