<> <> <> <> <<>> <> DIRECTORY Basics USING [BITXOR], DragOpsCross USING [XopBase, TrapBase, TrapWidthBytes, bytesPerWord, TrapIndex, Word], --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 GenLICJ: CEDAR PROGRAM IMPORTS Basics, DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport = BEGIN OPEN DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport; Word: TYPE = DragOpsCross.Word; 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]]; }; area: Area = GetCurrentArea[]; oldPC: LONG CARDINAL; start: Label = GenLabel[]; dummy: Label = GenLabel[]; const0OK: Label = GenLabel[]; enterLIQBTest: Label = GenLabel[]; enterLIDBTest: Label = GenLabel[]; enterLIBTest: Label = GenLabel[]; enterJEBTest: Label = GenLabel[]; <> <<>> <> <<>> GenLI: PROC = { <> TestE1: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drRJEB[left: topSrc, right: belowSrc, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] = [s-1] but RJEB didn't jump. SetLabel[ok1]; <> drRJNEB[left: popSrc, right: belowSrcPop, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] = [s-1] but RJNEB jumped. <> SetLabel[ok2]; }; <> TestE2: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drJ1[]; --No-op to preserve alignment drRAND[c: const1, a: topSrc, b: popSrc]; <> drRJEBJ[left: topSrc, right: const1, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] = const1 but RJEBJ didn't jump. SetLabel[ok1]; <> drRJNEBJ[left: popSrc, right: const1, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] = const1 but RJNEB jumped. <> SetLabel[ok2]; }; <> TestNE1: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drRJNEB[left: topSrc, right: belowSrc, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] # [s-1] but RJNEB didn't jump. SetLabel[ok1]; <> drRJEB[left: popSrc, right: belowSrcPop, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] # [s-1] but RJEB jumped. <> SetLabel[ok2]; }; <> TestNE2: PROC [] ~ { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; bad1: Label _ GenLabel[]; drJ1[]; --No-op to preserve word alignment drRAND[c: const1, a: topSrc, b: popSrc]; drRJNEBJ[left: topSrc, right: const1, dist: UseLabel8B[ok1]]; Pause[]; --Bug: [s] # const1 but RJNEBJ didn't jump. SetLabel[ok1]; <> drRJEBJ[left: popSrc, right: const1, dist: UseLabel8B[bad1]]; drJB[UseLabel8A[ok2]]; SetLabel[bad1]; Pause[]; --Bug: [s] # const1 but RJEBJ jumped. <> SetLabel[ok2]; }; GenLIQBTest: PROC [value: LONG CARDINAL] = { w: Word _ CardToWord[value]; <> nw: Word _ CardToWord[LOOPHOLE[- LOOPHOLE[value, INT] - 1, LONG CARDINAL]]; z: Word _ CardToWord[0]; nz: Word _ CardToWord[37777777777B]; <> drLIQB[w]; drLIQB[w]; TestE1[]; drLIQB[w]; drLIQB[z]; TestNE1[]; drLIQB[z]; drLIQB[w]; TestNE1[]; drLIQB[nw]; drLIQB[nz]; TestNE1[]; drLIQB[nz]; drLIQB[nw]; TestNE1[]; drLIQB[nw]; drLIQB[nw]; TestE1[]; <> drLIQB[w]; drLIQB[w]; TestE2[]; drLIQB[w]; drLIQB[z]; TestNE2[]; drLIQB[z]; drLIQB[w]; TestNE2[]; drLIQB[nw]; drLIQB[nz]; TestNE2[]; drLIQB[nz]; drLIQB[nw]; TestNE2[]; drLIQB[nw]; drLIQB[nw]; TestE2[]; }; <> GenLIDBTest: PROC [value: CARDINAL] = { w: Word _ CardToWord[LONG[value]]; drLIDB[value]; drLIQB[w]; TestE1[]; }; <> GenLIBTest: PROC [value: CARDINAL] = { drLIB[value]; drLIDB[value]; TestE1[]; }; <> GenJEBTest: PROC [value: CARDINAL] = { ok1: Label _ GenLabel[]; ok2: Label _ GenLabel[]; ok3: Label _ GenLabel[]; ok4: Label _ GenLabel[]; bad: Label _ GenLabel[]; notValue: CARDINAL _ Basics.BITXOR[value, 377B]; drLIB[value]; drJEBB[value, UseLabel8B[ok1]]; Pause[]; --JEBB should have jumped but didn't SetLabel[ok1]; drLIB[value]; drJNEBB[0, UseLabel8B[ok2]]; Pause[]; --JNEBB should have jumped but didn't SetLabel[ok2]; drLIB[value]; drJEBB[0, UseLabel8B[bad]]; drLIB[value]; drJNEBB[value, UseLabel8B[bad]]; drLIB[notValue]; drJEBBJ[377B, UseLabel8B[bad]]; drLIB[notValue]; drJNEBBJ[notValue, UseLabel8B[bad]]; drLIB[notValue]; drJEBBJ[notValue, UseLabel8B[ok3]]; Pause[]; --JEBBJ should have jumped but didn't SetLabel[ok3]; drLIB[notValue]; drJNEBBJ[377B, UseLabel8B[ok4]]; SetLabel[bad]; Pause[]; SetLabel[ok4]; }; val: LONG CARDINAL _ 1; hval: CARDINAL _ 1; bval: CARDINAL _ 1; jval: CARDINAL _ 1; WordAlign[area]; SetLabel[enterLIQBTest]; <> drJ1[]; drJ1[]; drJ1[]; UNTIL val = 0 DO GenLIQBTest[val]; val _ val + val; ENDLOOP; SetLabel[enterLIDBTest]; UNTIL hval = 0 DO GenLIDBTest[hval]; hval _ hval + hval; ENDLOOP; SetLabel[enterLIBTest]; UNTIL bval = 400B DO GenLIBTest[bval]; bval _ bval + bval; ENDLOOP; SetLabel[enterJEBTest]; UNTIL jval = 400B DO GenJEBTest[jval]; jval _ jval + jval; ENDLOOP; }; SetLabel[dummy]; Pause[]; Pause[]; Pause[]; Pause[]; Pause[]; Halt[123B]; <> oldPC _ GetOutputPC[area]; FillTrap[ResetTrap, start]; FillXop[0, dummy]; FillXop[377B, dummy]; SetOutputPC[oldPC]; WordAlign[area]; SetLabel[start]; --Simulator execution begins here on a Reset. drASL[255]; --When there is nothing on the stack, S should be at L-1 drLC0[]; drJEBB[0, UseLabel8B[const0OK]]; Pause[]; --const0 wrong SetLabel[const0OK]; <<**Don't bum this instruction; code alignment is important here.**>> drJDB[UseLabel16[enterLIQBTest]]; GenLI[]; Halt[177777B]; --Terminate here at the end of the program }; END.