<> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>> <> DIRECTORY --Basics USING [], DragOpsCross USING [XopBase, TrapBase, TrapWidthBytes, bytesPerWord, TrapIndex, Word, ProcessorRegister, IFUStackIndex], --Word, wordsPerPage, bytesPerWord, charsPerWord, bitsPerByte, bitsPerCharacter, bitsPerWord, bytesPerPage, logWordsPerPage, logBitsPerByte, logBitsPerChar, logBytesPerWord, logCharsPerWord, logBitsPerWord, logBytesPerPage, PageCount, PageNumber, maxPagesInVM, SixBitIndex, FiveBitIndex, TwoWords, FourBitIndex, Half, ThreeBitIndex, FourHalves, TwoHalves, Byte, ZerosByte, OnesByte, EightBytes, FourBytes, ByteIndex, BytesPerWord, TwoBytes, Comparison, ByteAddress, WordAddress, FieldDescriptor, RegIndex, PadByte, Lit8, Op4, Op8, JDist8, Inst, OIFormat, OQBformat, LRformat, QRformat, ShortRegQR, OBformat, LRBformat, RRformat, ODBformat, LRRBformat, RJBformat, ShortRegRJB, JBBformat, TrapWidthWords, TrapWidthBytes, XopBase, TrapBase, KernalLimit, TrapIndex, StackUnderflowTrap, IFUPageFaultTrap, ResetTrap, IFUStackOverflowTrap, EUStackOverflowTrap, RescheduleTrap, ALUCondFalse, ALUCondEZ, ALUCondLZ, ALUCondLE, ALUCondSpare, ALUCondNE, ALUCondGE, ALUCondGZ, ALUCondOver, ALUCondBC, ALUCondIL, ALUCondDO, ALUCondNotOver, ALUCondNB, ALUCondNI, ModeFault, MemAccessFault, IOAccessFault, EUPageFault, EUWriteFault, AUFault, euStack, euJunk, euToKBus, euMAR, euField, euConstant, euAux, euBogus, euLast, ifuYoungestL, ifuYoungestPC, ifuEldestL, ifuEldestPC, ifuSLimit, ifuBogus, ifuL, ifuS, ifuPC, ifuLast, EURegs, EULegalRegs, IFURegs, IFULegalRegs, StackedStatusWord, IFUStackIndex, IFUStackSize, IFUOverflow, EUStackIndex, EUStackSize, EULocalIndex, EULocals, EUAuxIndex, EUAuxRegs, EUConstIndex, EUConstants, IOLocation, ioRescheduleRequest, ioResetRequest, IOOperand, PCmdFormat, PCmdByteSelect, PCmdClass, PCmdSpace, PCmdDirection DragOpsCrossUtils USING [CardToWord], --InstToBytes, InstToFormat, BytePCToWordAddress, WordAddressToBytePC, IOOperandToCard, CardToIOOperand, FieldDescriptorToCard, CardToFieldDescriptor, 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, XopToBytePC, TrapIndexToBytePC, FieldUnit HandCoding, --Has opcode and register defs. HandCodingPseudos, --Label, SetLabel, GenLabel, GenLabelHere, UseLabel8A, UseLabel8B, UseLabel16, UseLabel32, LReg, PReg, SReg, AddReg, SubReg, SetRegConst, MoveReg, MoveRegI, LRegI, IndexedJump, ProcedureEntry, ProcedureExit, SetupField, ExtractField, ShiftLeft, LoadProcessorReg, StoreProcessorReg, CauseReschedule, CauseReset, GetSPLimit, SetSPLimit, GetYoungestPC, GetYoungestStatus, GetEldestPC, GetEldestStatus, SetYoungestPC, SetYoungestStatus, SetEldestPC, SetEldestStatus, Pause, Halt HandCodingSupport; --Area, GetProc, PutProc, ProcList, NewArea, GenWithArea, Gen1WithArea, ForceOut, GetCurrentArea, LoadArea, GetOutputPC, SetOutputPC, WordAlign, ReserveData, 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]; 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] ~ { IF reg = ifuYoungestL THEN { drLIB[val]; SetYoungestStatus[]; } ELSE { drLIQB[CardToWord[val]]; drSIP[reg]}; }; GenRegRead: PROC [reg: CARDINAL, val: LONG CARDINAL] ~ { rdOK: Label = GenLabel[]; IF reg = ifuYoungestL THEN { GetYoungestStatus[]; drLIB[377B]; drAND[]; } ELSE IF reg = ifuEldestL THEN { GetEldestStatus[]; drLIB[377B]; drAND[]; } ELSE drLIP[reg]; drLIQB[CardToWord[val]]; drRJEBJ[popSrc, belowSrcPop, UseLabel8B[rdOK]]; Pause[]; SetLabel[rdOK]; }; <> <> <> <> <<};>> --area: Area = GetCurrentArea[]; 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 [136..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 [136..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 [136..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 [136..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]; }; }; <> GenEUSL[]; GenIFUSL[]; Halt[177777B]; --Terminate here at the end of the program }; END.