{Dicentra.df, HGM, 18-Feb-84 23:31:19} {R AND RH REGISTER DEFINITIONS Since there are no task specific registers in the machine, task identifiers are not bound to the register numbers with which they are shown. Q is reserved for the Emulator Task. Also, the stackP, STK, ib, and pc16 registers are reserved for the Emulator task.} {REGISTERS 0 - 6: EMULATOR} RegDef[TOS, R, 0]; RegDef[Hold, R, 0]; {BBLoops} RegDef[Rbb0, R, 0]; {BitBlt and TextBlt} RegDef[VS, R, 0]; {BitBlt} RegDef[Mask2, R, 0]; {BitBlt} RegDef[rhMDS, RH, 0]; {VA of 64K aligned MDS} RegDef[rhVS, RH, 0]; {BitBlt uses fact that rhVS = rhMDS} RegDef[T, R, 1]; RegDef[Save, R, 1]; {BitBlt} RegDef[VD, R, 1]; {BitBlt} RegDef[Rbb1, R, 1]; {BitBlt and TextBlt} RegDef[Mask1, R, 1]; {BitBlt} RegDef[rhT, RH, 1]; {temporary} RegDef[rhVD, RH, 1]; {BitBlt} RegDef[TT, R, 2]; RegDef[Src, R, 2]; {BitBlt} RegDef[Rbb2, R, 2]; {BitBlt and TextBlt Rbb2 must equal TT to share MaskTbl} RegDef[Temp, R, 2]; {BitBlt} RegDef[TempDelta, R, 2]; {BitBlt} RegDef[rhTT, RH, 2]; {temporary} RegDef[rhType, RH, 2]; {BitBlt} RegDef[L, R, 3]; RegDef[Dst, R, 3]; {BitBlt} RegDef[TempBpl, R, 3]; {BitBlt} RegDef[Rbb3, R, 3]; {BitBlt and TextBlt} RegDef[rhL, RH, 3]; {local frame (RA, extended by rhL=real rhMDS)} RegDef[rhWho, RH, 3]; {BitBlt} RegDef[G, R, 4]; RegDef[SrcA, R, 4]; {BitBlt} RegDef[Rbb4, R, 4]; {BitBlt and TextBlt} RegDef[rhG, RH, 4]; {global frame (RA, extended by rhG=real rhMDS)} RegDef[rhSrcA, RH, 4]; {BitBlt} RegDef[PC, R, 5]; RegDef[DstA, R, 5]; {BitBlt} RegDef[rhPC, RH, 5]; {word address of next inst (RA, extended by rhPC=real UvChigh)} RegDef[rhDstA, RH, 5]; {BitBlt} RegDef[Rx, R, 6]; RegDef[Lcount, R, 6]; {BitBlt} RegDef[TempB, R, 6]; {BitBlt} RegDef[rhRx, RH, 6]; {temporary} RegDef[rhRet, RH, 6]; {BitBlt} {REGISTERS 7 - E: Interrupt processing} RegDef[SCC, R, 08]; RegDef[SCCh, RH, 08]; RegDef[IOCB, R, 09]; RegDef[IOCBh, RH, 09]; RegDef[CSB, R, 0A]; RegDef[CSBh, RH, 0A]; RegDef[Buffer, R, 0B]; RegDef[BufferH, RH, 0B]; RegDef[state, R, 0C]; RegDef[count, R, 0D]; RegDef[rhInt, RH, 0D]; {Don't smash this in the phone lines} RegDef[Rio, R, 0E]; RegDef[rhRio, RH, 0E]; RegDef[temp, R, 0E]; RegDef[tempH, RH, 0E]; {For mapping things} {REGISTER F: Kernel} RegDef[rK, R, 0F]; RegDef[RHrK, RH, 0F]; {The allocation of Link registers: # task L0 Emulator L1 Emulator L2 Emulator L3 Emulator L4 SDLC } {U REGISTER DEFINITIONS Registers indicated by ** contain Emulator state and must not be modified.} {U REGISTER BLOCK 0 -- EMULATOR STACK} RegDef[uBlock0, U, 0]: RegDef[uStack1, U, 1]; RegDef[uStack2, U, 2]; RegDef[UBitBltArg, U, 2]; {BitBlt} RegDef[uStack3, U, 3]; RegDef[UHeight, U, 3]; {BitBlt} RegDef[uStack4, U, 4]; RegDef[UDstVALo, U, 4]; {BitBlt} RegDef[uStack5, U, 5]; RegDef[UDstBit, U, 5]; {BitBlt} RegDef[uStack6, U, 6]; RegDef[USrcVALo, U, 6]; {BitBlt} RegDef[uStack7, U, 7]; RegDef[USrcBit, U, 7]; {BitBlt} RegDef[uStack8, U, 8]; RegDef[UGray, U, 8]; {BitBlt -- shares with USrcBpl} RegDef[USrcBpl, U, 8]; {BitBlt -- shares with UGray} RegDef[uStack9, U, 9]; RegDef[UDstBpl, U, 9]; {BitBlt} RegDef[uStackA, U, 0A]; RegDef[UrhVS, U, 0A]; {BitBlt} RegDef[uStackB, U, 0B]; RegDef[UrhVD, U, 0B]; {BitBlt} RegDef[uStackC, U, 0C]; RegDef[UFlags, U, 0C]; {BitBlt} RegDef[uStackD, U, 0D]; RegDef[UWidth, U, 0D]; {BitBlt} RegDef[uStackE, U, 0E]; RegDef[uStackF, U, 0F]; {U REGISTER BLOCK 1 -- EMULATOR} RegDef[uHeaderBlock, UY, 1]: RegDef[uBlock1, U, 10]: RegDef[uWP, U, 10]; {** wakeups pending, rA = T} RegDef[UvC, U, 11]; {** rA = T low half of code (VA, extended by UvChigh)} RegDef[uPCCross, U, 12]; {**} RegDef[uPPMask, U, 13]; {** rA = T, constant = E000} RegDef[uWW, U, 14]; RegDef[u3FFF, U, 15]; {** constant, rA = T} RegDef[uPMask, U, 16]; {** rA = T; constant = 1FF8} RegDef[UXferType, U, 17]; {type of Xfer in progress} RegDef[uWDC, U, 18]; {** wakeup disable counter} RegDef[uFrame, U, 19]; {rA = T} RegDef[UGsave, U, 19]; RegDef[uDestLo, U, 1A]; {rA = T; destination link of Xfer in progress} RegDef[uPsbLink, U, 1B]; {rA = T, fZ = ←RH} RegDef[UvLPhigh, U, 1B]; RegDef[uT, U, 1C]; {rA = T} RegDef[uTemp, U, 1D]; {rA = T, fZ = ←ib} RegDef[UrhMDSsave, U, 1E]; RegDef[uDestHighSave, U, 1F]; {Block} {U REGISTER BLOCK 2 -- EMULATOR} RegDef[uBlock2, U, 20]: RegDef[uXTS, U, 20]; {** Xfer Trap Status} RegDef[UvG, U, 21]; {** rA = TT, global frame address (VA)} RegDef[UvChigh, U, 22]; {** rA = TT, high address bits of code segment (VA)} RegDef[UvMDS, U, 23]; {** rA = TT; MDS pointer (VA)} RegDef[uSourceHighSaveTemp, U, 24]; {Block} RegDef[uTT, U, 24]; {rA = TT; Temp} RegDef[uFaultParm0, U, 26]; {** rA = TT; fault parameter} RegDef[uTTemp, U, 27]; {rA = TT} RegDef[uSourceHighSave, U, 27]; {rA = TT = 2. } RegDef[UBrkByte, U, 28]; {** loaded by LST, used by Xfer} RegDef[uTrapParm0, U, 29]; {**} RegDef[uTicks, U, 2A]; RegDef[uDestHi, U, 2A]; RegDef[UvL, U, 2B]; {** rA = TT, fZ = ←RH; local frame address (VA)} RegDef[Ufsi, U, 2C]; {rA = TT; temp used in Xfer} RegDef[UvPCpage, U, 2D]; {** rA = TT, fZ = ←ib; (PC page address)} RegDef[uSourceLo, U, 2E]; {rA = TT} RegDef[u7FF, U, 2F]; {** constant} {U REGISTER BLOCK 3 -- EMULATOR} RegDef[uBlock3, U, 30]; RegDef[UQSave, U, 31]; {BitBlt temp} RegDef[uStackPSave, U, 31]; {used by Block rA = L = 3} RegDef[uPTC, U, 32]; {** Process Tick Count} RegDef[uStkDepth, U, 33] {temp in Process, Xfer} RegDef[UWidthM1, U, 34]; {BitBlt temp} RegDef[Umask1, U, 35]; {BitBlt temp} RegDef[u1FFF, U, 36]; {** constant} RegDef[uFaultParm1, U, 37]; {fault parameter} RegDef[Umask2, U, 37]; {BitBlt temp} RegDef[UmaskL, U, 38]; {BitBlt temp} RegDef[uPSB, U, 39]; {** Current PSB} RegDef[ULsave, U, 3A]; {rA = L = 3. fZ = ErrnIBnStkp = A} RegDef[UrL, U, 3B]; {rA = L, fZ = ←RH} RegDef[UrhLsave, U, 3B]; {bank 3, 'B' = ← rh } RegDef[UrLHi, U, 3C]; RegDef[uCrSaveStkp, U, 3E]; {**} RegDef[uTickCount, U, 3F]; {** process tick interval} {U REGISTER BLOCK 4 -- EMULATOR} RegDef[uBlock4, U, 40]: RegDef[uCrSaveTOS, U, 40]; {**} RegDef[uCrSavePC, U, 41]; {**} RegDef[UvQ1Hi, U, 42]; RegDef[UXsave, U, 42]; {BitBlt temp} RegDef[UvQ1, U, 43]; RegDef[UVSsave, U, 43]; {BitBlt temp} RegDef[UvQ2Hi, U, 44]; RegDef[USrcVALoSav, U, 44]; {BitBlt temp} RegDef[UvQ2, U, 45]; {rA = G} RegDef[UvQTempHi, U, 46]; RegDef[UvQTemp, U, 47]; RegDef[uIntLevel, U, 48]; {rA = G; used in interrupts} RegDef[UrG, U, 4B]; {rA = G, fZ = ←RH} RegDef[UrhGsave, U, 4B]; {rA = G, fZ = ←RH} RegDef[UrGHi, U, 4C]; RegDef[uTrapParm1, U, 4D]; {Xfer trap parameter} RegDef[uTrapParm2, U, 4E]; {Xfer trap parameter} {U REGISTER BLOCK 5 -- EMULATOR} RegDef[uBlock5, U, 50]: RegDef[UrPC, U, 5B]; {rA = PC, fZ = ←RH} RegDef[UrhPCsave, U, 5B]; {rA = PC, fZ = ←RH} RegDef[UrPCHi, U, 5C]; RegDef[UDstVALoSav, U, 5C]; {BitBlt temp} RegDef[UreturnPC, U, 5D]; {rA = PC, fZ = ←ib} RegDef[UWidthW, U, 5D]; {BitBlt temp} RegDef[uPCValid, U, 5E]; {** rA = PC; flag for faults} {U REGISTER BLOCK 6 -- EMULATOR} RegDef[uBlock6, U, 60]; RegDef[ULcntsav, U, 60]; {BitBlt temp rA = Lcount} RegDef[uRx, U, 60]; {Xfer temp rA = Rx} RegDef[u8000, U, 61]; {** rA = Rx; constant = 8000} RegDef[uPMask2, U, 62]; {** rA = Rx; constant = 1FF8} RegDef[uXferType, U, 63]; {Type of Xfer, rA = Rx} RegDef[uRetC, U, 66]; {Xfer Temp, rA = Rx} RegDef[uSourceLowSave, U, 66]; {used by Block rA = Rx = 6} RegDef[uRetPChi, U, 67]; {Xfer Temp, rA = Rx} RegDef[uSourceOffset, U, 6A]; {used by Block rA = Rx = 6. } RegDef[uDestLowSave, U, 6B]; {Block} {U REGISTER BLOCK 7} {U REGISTER BLOCK 8} {U REGISTER BLOCK 9} {U REGISTER BLOCK A} {U REGISTER BLOCK B} {U REGISTER BLOCK C} {U REGISTER BLOCK D} RegDef[uInterruptMasks, UY, 0D]: RegDef[uNxmExpected, U, 0D0]; RegDef[uMP, U, 0D1]; {Current value of MP} RegDef[uInts, U, 0D2]; {Interrupts from last time we looked} RegDef[u800, U, 0D3]; RegDef[u1000, U, 0D4]; RegDef[u9000, U, 0D5]; RegDef[uPhoneCSB, U, 0D6]; RegDef[uPhoneFlag, U, 0D7]; {#0 => Use microcode} RegDef[uInt0Mask, U, 0D8]; RegDef[uInt1Mask, U, 0D9]; RegDef[uInt2Mask, U, 0DA]; RegDef[uInt3Mask, U, 0DB]; RegDef[uIntPhone, U, 0DC]; RegDef[uInt5Mask, U, 0DD]; RegDef[uInt6Mask, U, 0DE]; RegDef[uInt7Mask, U, 0DF]; {U REGISTER BLOCK E -- EMULATOR, KERNEL} RegDef[uPFlags, U, 0EB]; {Emulator -- fZ = ←RH; flags for process} RegDef[UKSaveDisp, U, 0EF]; {U REGISTER BLOCK F -- EMULATOR, KERNEL} RegDef[UPCsave, U, 0F0]; {Emulator} RegDef[UrefillType, U, 0F1]; {BitBlt} RegDef[uKSaveQ, U, 0F6]; RegDef[uKernAC, U, 0F7]; RegDef[u1F, U, 0FB]; {01F'x} RegDef[uRegsKern, U, 0FC]; RegDef[uKAddr, U, 0FC]; RegDef[uKCount, U, 0FD]; RegDef[UKernMD, U, 0FE]; RegDef[UBreakID, U, 0FF]; {UBreakID[0-3] = rK} RegDef[UKTemp, U, 0FF]; {UBreakID = UKTemp} {KERNEL Author: R. Garner Created: 4 Oct 79, Last Edited: R. Garner, October 28, 1980 2:16 PM} Set[KBufferLoc, 0FF4]; {First location of overlay area, had better be even!} Set[KBufferEnd, 0FFF]; Set[GetIOPByteLoc, 0FD0]; Set[KBufferExtenLoc, Add[GetIOPByteLoc, 8]]; Set[KBufferExtenEnd, Add[GetIOPByteLoc, 0F]]; Set[KWaitLoc, 0FE0]; Set[K1EntryLoc, 0F80]; Set[K2EntryLoc, 0FBF]; Set[K3EntryLoc, 0FCF]; Set[KcLoc, 0FA0]; {WriteLink exploits the fact that IA.7=0} Set[K1ELoc, 0FB8]; Set[KBELoc, 0FB9]; {Magic locations in ControlStore} Set[BankSwitchingLoc, 300];