<> <> <> <> <<>> <> DIRECTORY --Basics USING [], DragOpsCross USING [XopBase, TrapBase, TrapWidthBytes, bytesPerWord, TrapIndex, Word, ProcessorRegister, IFUStackIndex], --XopBase, TrapBase, TrapWidthBytes, Inst, wordsPerPage, bytesPerWord, charsPerWord, bitsPerByte, bitsPerCharacter, bitsPerWord, logWordsPerPage, logBitsPerByte, logBitsPerChar, logBytesPerWord, logCharsPerWord, logBitsPerWord, logBytesPerPage, PageCount, PageNumber, maxPagesInVM, SixBitIndex, FiveBitIndex, Word, TwoWords, FourBitIndex, Half, ThreeBitIndex, FourHalves, TwoHalves, Byte, ZerosByte, OnesByte, EightBytes, FourBytes, ByteIndex, BytesPerWord, TwoBytes, Comparison, ByteAddress, WordAddress, FieldDescriptor, TrapWidthWords, KernalLimit, TrapIndex, StackUnderflowTrap, IFUPageFaultTrap, ResetTrap, IFUStackOverflowTrap, EUStackOverflowTrap, RescheduleTrap, ALUCondOver, ALUCondBC, ALUCondIL, ALUCondDO, EUPageFault, EUWriteFault, AUFault, euStack, euJunk, euMAR, euField, euConstant, euAux, euBogus, euLast, ifuXBus, ifuStatus, ifuSLimit, ifuYoungestL, ifuYoungestPC, ifuEldestL, ifuEldestPC, ifuBogus, ifuL, ifuS, ifuPC, ifuLast, IFUStatusRec, IFUStackIndex, IFUStackSize, IFUOverflow, EUStackIndex, EUStackSize, EULocalIndex, EULocals, EUAuxIndex, EUAuxRegs, EUConstIndex, EUConstants, IOLocation, ioRescheduleRequest, ioResetRequest DragOpsCrossUtils USING [CardToWord], --BytePCToWordAddress, WordAddressToBytePC, IOOperandToCard, CardToIOOperand, FieldDescriptorToCard, CardToFieldDescriptor, StatusToWord, WordToStatus, BytesToWord, BytesToHalf, WordToBytes, HalfToBytes, HalvesToWord, WordToHalves, HighHalf, LowHalf, LeftHalf, RightHalf, SwapHalves, WordToInt, IntToWord, WordToCard, HalfToCard, ByteToCard, CardToWord, CardToHalf, CardToByte, DragAnd, DragOr, DragXor, DragNot, VanillaAdd, VanillaSub, AddDelta, HalfNot, HalfAnd, HalfOr, HalfXor, HalfShift, DoubleWordShiftLeft, SingleWordShiftLeft, SingleWordShiftRight, TrapIndexToBytePC, XopToBytePC HandCoding, --Has opcode and register defs. HandCodingPseudos, --GenLabel, GenLabelHere, SetLabel, Halt, Pause, MakeLabelGlobal, UseLabel8B, UseLabel16, UseLabel32, ProcedureEntry, ProcedureExit, EnableTraps, IndexedJump, SetupField, ExtractField, ShiftLeft, LoadProcessorReg, StoreProcessorReg, DisableTraps, CauseReschedule, CauseReset, GetSPLimit, SetSPLimit, GetL, SetL, GetYoungestPC, GetYoungestL, GetEldestPC, GetEldestL, SetYoungestPC, SetYoungestL, SetEldestPC, SetEldestL HandCodingSupport; --Area, GetCurrentArea, ReserveData, SetOutputPC, GetProc, PutProc, ProcList, NewArea, GenWithArea, Gen1WithArea, ForceOut, GetOutputPC, WordAlign, OutputByte, OutputOneByte, OutputAlphaBeta, OutputAlphaBetaGammaDelta, OutputWord GenReg: CEDAR PROGRAM IMPORTS DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport = BEGIN OPEN DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport; Word: TYPE = DragOpsCross.Word; ProcessorRegister: TYPE = DragOpsCross.ProcessorRegister; IFUStackIndex: TYPE = DragOpsCross.IFUStackIndex; ifuSLimit: CARDINAL = LOOPHOLE[ProcessorRegister.ifuSLimit, CARDINAL]; ifuEldestPC: CARDINAL = LOOPHOLE[ProcessorRegister.ifuEldestPC, CARDINAL]; ifuEldestL: CARDINAL = LOOPHOLE[ProcessorRegister.ifuEldestL, CARDINAL]; ifuYoungestPC: CARDINAL = LOOPHOLE[ProcessorRegister.ifuYoungestPC, CARDINAL]; ifuYoungestL: CARDINAL = LOOPHOLE[ProcessorRegister.ifuYoungestL, CARDINAL]; ifuStatus: CARDINAL = LOOPHOLE[ProcessorRegister.ifuStatus, CARDINAL]; All: PROC = { <> FillXop: PROC [inst: CARDINAL, dest: Label] = { SetOutputPC[inst * DragOpsCross.TrapWidthBytes + DragOpsCross.XopBase * DragOpsCross.bytesPerWord]; drJDB[UseLabel16[dest]]; }; <> FillTrap: PROC [tx: DragOpsCross.TrapIndex, dest: Label] = { SetOutputPC[LOOPHOLE[tx, CARDINAL] * DragOpsCross.TrapWidthBytes + DragOpsCross.TrapBase * DragOpsCross.bytesPerWord]; drJDB[UseLabel16[dest]]; }; GenRegWrite: PROC [reg: CARDINAL, val: LONG CARDINAL] ~ { drLIQB[CardToWord[val]]; drSIP[reg]; }; GenRegRead: PROC [reg: CARDINAL, val: LONG CARDINAL] ~ { rdOK: Label = GenLabel[]; drLIP[reg]; drLIQB[CardToWord[val]]; drRJEBJ[popSrc, belowSrcPop, UseLabel8B[rdOK]]; Pause[]; SetLabel[rdOK]; }; area: Area = GetCurrentArea[]; savePC: LONG CARDINAL; start: Label = GenLabel[]; dummy: Label = GenLabel[]; initL: Label = GenLabel[]; enterEUSLTest: Label = GenLabel[]; enterIFUSLTest: Label = GenLabel[]; <> GenEUSL: PROC = { testVal: LONG CARDINAL; SetLabel[enterEUSLTest]; testVal _ 8; GenRegWrite[0, 1]; FOR I: CARDINAL IN [3..127] DO GenRegWrite[I, testVal]; testVal _ IF testVal = 20000000000B THEN 1 ELSE testVal + testVal; ENDLOOP; FOR I: CARDINAL IN [130..131] DO GenRegWrite[I, testVal]; testVal _ IF testVal = 20000000000B THEN 1 ELSE testVal + testVal; ENDLOOP; FOR I: CARDINAL IN [133..159] DO GenRegWrite[I, testVal]; testVal _ IF testVal = 20000000000B THEN 1 ELSE testVal + testVal; ENDLOOP; <> testVal _ 8; GenRegRead[0, 1]; FOR I: CARDINAL IN [3..127] DO GenRegRead[I, testVal]; testVal _ IF testVal = 20000000000B THEN 1 ELSE testVal + testVal; ENDLOOP; FOR I: CARDINAL IN [130..131] DO GenRegRead[I, testVal]; testVal _ IF testVal = 20000000000B THEN 1 ELSE testVal + testVal; ENDLOOP; FOR I: CARDINAL IN [133..159] DO GenRegRead[I, testVal]; testVal _ IF testVal = 20000000000B THEN 1 ELSE testVal + testVal; ENDLOOP; <> drASL[4]; --S _ 5 GenRegWrite[1, 2]; GenRegWrite[2, 4]; GenRegRead[1, 2]; GenRegRead[2, 4]; drASL[255]; --S _ 0 again <> testVal _ 37777777767B; GenRegWrite[0, 37777777776B]; FOR I: CARDINAL IN [3..127] DO GenRegWrite[I, testVal]; testVal _ IF testVal = 17777777777B THEN 37777777776B ELSE testVal + testVal + 1; ENDLOOP; FOR I: CARDINAL IN [130..131] DO GenRegWrite[I, testVal]; testVal _ IF testVal = 17777777777B THEN 37777777776B ELSE testVal + testVal + 1; ENDLOOP; FOR I: CARDINAL IN [133..159] DO GenRegWrite[I, testVal]; testVal _ IF testVal = 17777777777B THEN 37777777776B ELSE testVal + testVal + 1; ENDLOOP; <> testVal _ 37777777767B; GenRegRead[0, 37777777776B]; FOR I: CARDINAL IN [3..127] DO GenRegRead[I, testVal]; testVal _ IF testVal = 17777777777B THEN 37777777776B ELSE testVal + testVal + 1; ENDLOOP; FOR I: CARDINAL IN [130..131] DO GenRegRead[I, testVal]; testVal _ IF testVal = 17777777777B THEN 37777777776B ELSE testVal + testVal + 1; ENDLOOP; FOR I: CARDINAL IN [133..159] DO GenRegRead[I, testVal]; testVal _ IF testVal = 17777777777B THEN 37777777776B ELSE testVal + testVal + 1; ENDLOOP; <> drASL[4]; --S _ 5 GenRegWrite[1, 37777777775B]; GenRegWrite[2, 37777777773B]; GenRegRead[1, 37777777775B]; GenRegRead[2, 37777777773B]; drASL[255]; --S _ 0 again }; <> <> <> <> <> <> <> <> <> <> GenIFUSL: PROC = { GenCallTest: PROC [dest: Label, lVal, rVal: CARDINAL] ~ { drLFC[UseLabel16[dest]]; GenRegRead[ifuYoungestL, rVal]; drRETN[]; Pause[]; SetLabel[dest]; GenRegWrite[ifuYoungestL, lVal]; }; testPCVal, testLVal: LONG CARDINAL; SetLabel[enterIFUSLTest]; <> testPCVal _ 1; testLVal _ 4; GenRegWrite[ifuSLimit, 0]; FOR I: CARDINAL IN IFUStackIndex DO GenRegWrite[ifuEldestPC, testPCVal]; testPCVal _ IF testPCVal = 20000000000B THEN 1 ELSE testPCVal + testPCVal; GenRegWrite[ifuEldestL, testLVal]; testLVal _ IF testLVal = 100B THEN 1 ELSE testLVal + testLVal; ENDLOOP; GenRegRead[ifuSLimit, 0]; FOR I: CARDINAL IN IFUStackIndex DO testLVal _ IF testLVal = 1 THEN 100B ELSE testLVal / 2; GenRegRead[ifuEldestL, testLVal]; testPCVal _ IF testPCVal = 1 THEN 20000000000B ELSE testPCVal / 2; GenRegRead[ifuEldestPC, testPCVal]; ENDLOOP; <> testPCVal _ 37777777776B; testLVal _ 173B; GenRegWrite[ifuSLimit, 177B]; FOR I: CARDINAL IN IFUStackIndex DO GenRegWrite[ifuEldestPC, testPCVal]; testPCVal _ IF testPCVal = 17777777777B THEN 37777777776B ELSE testPCVal + testPCVal + 1; GenRegWrite[ifuEldestL, testLVal]; testLVal _ IF testLVal = 77B THEN 176B ELSE testLVal + testLVal + 1 - 200B; ENDLOOP; GenRegRead[ifuSLimit, 177B]; FOR I: CARDINAL IN IFUStackIndex DO testLVal _ IF testLVal = 176B THEN 77B ELSE testLVal / 2 + 100B; GenRegRead[ifuEldestL, testLVal]; testPCVal _ IF testPCVal = 37777777776B THEN 17777777777B ELSE testPCVal / 2 + 20000000000B; GenRegRead[ifuEldestPC, testPCVal]; ENDLOOP; <> testPCVal _ 200000B; testLVal _ 1; FOR I: CARDINAL IN IFUStackIndex DO youngCall: Label = GenLabel[]; drLFC[UseLabel16[youngCall]]; SetLabel[youngCall]; GenRegWrite[ifuYoungestPC, testPCVal]; testPCVal _ IF testPCVal = 20000000000B THEN 1 ELSE testPCVal + testPCVal; GenRegWrite[ifuYoungestL, testLVal]; testLVal _ IF testLVal = 100B THEN 1 ELSE testLVal + testLVal; ENDLOOP; testPCVal _ 200000B; testLVal _ 1; FOR I: CARDINAL IN IFUStackIndex DO GenRegRead[ifuEldestL, testLVal]; testLVal _ IF testLVal = 100B THEN 1 ELSE testLVal + testLVal; GenRegRead[ifuEldestPC, testPCVal]; testPCVal _ IF testPCVal = 20000000000B THEN 1 ELSE testPCVal + testPCVal; ENDLOOP; <> { Call1: Label = GenLabel[]; Call2: Label = GenLabel[]; Call3: Label = GenLabel[]; Call4: Label = GenLabel[]; Call5: Label = GenLabel[]; Call6: Label = GenLabel[]; Call7: Label = GenLabel[]; Call8: Label = GenLabel[]; Call9: Label = GenLabel[]; Call10: Label = GenLabel[]; Call11: Label = GenLabel[]; Call12: Label = GenLabel[]; Call13: Label = GenLabel[]; Call14: Label = GenLabel[]; Call15: Label = GenLabel[]; EndCallTest: Label = GenLabel[]; drLFC[UseLabel16[Call1]]; drJDB[UseLabel16[EndCallTest]]; SetLabel[Call1]; GenRegWrite[ifuYoungestL, 1]; GenCallTest[Call2, 2, 1]; GenCallTest[Call3, 3, 2]; GenCallTest[Call4, 4, 3]; GenCallTest[Call5, 5, 4]; GenCallTest[Call6, 6, 5]; GenCallTest[Call7, 7, 6]; GenCallTest[Call8, 8, 7]; GenCallTest[Call9, 9, 8]; GenCallTest[Call10, 10, 9]; GenCallTest[Call11, 11, 10]; GenCallTest[Call12, 12, 11]; GenCallTest[Call13, 13, 12]; GenCallTest[Call14, 14, 13]; GenCallTest[Call15, 15, 14]; GenRegRead[ifuYoungestL, 15]; drRETN[]; SetLabel[EndCallTest]; }; }; ProcedureEntry[dummy, 0]; ProcedureExit[0]; <> savePC _ GetOutputPC[area]; FillTrap[ResetTrap, start]; FillXop[0, dummy]; FillXop[377B, dummy]; SetOutputPC[savePC]; ProcedureEntry[initL, 0]; drLIB[1]; SetYoungestL[]; -- L _ 1 on return <> --drLIB[128-16-1]; --SetSPLimit[]; ProcedureExit[0]; WordAlign[area]; SetLabel[start]; --Simulator execution begins here on a Reset. drLFC[UseLabel16[initL]]; --We use this method to initialize L to 1 drASL[255]; --When there is nothing on the stack, S should be at L-1 <> GenEUSL[]; GenIFUSL[]; Halt[177777B]; --Terminate here at the end of the program }; END.