<> <> DIRECTORY DragOpsCross, DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport, Rope; DDKBusTest: CEDAR PROGRAM IMPORTS DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport = BEGIN OPEN DragOpsCrossUtils, HandCoding, HandCodingPseudos, HandCodingSupport; instrSize: AuxRegSpec = [aux[10]]; -- must contain the length of trapping instructns underflowHandler: AuxRegSpec = [aux[12]]; All: PROC = { GenLSUnderflowKernel: PROC RETURNS [ lsUnderflowKernel: Label ] = { sLimitValue: [0..128) = 16; <> underflowTrap: Label; lsUnderflowKernel _ GenLabelHere[]; -- one frame on IFU stack drLIB[sLimitValue]; drSIP[DragOpsCross.ProcessorRegister[ifuSLimit].ORD]; GetEldestPC[]; -- pops IFU stack to EU stack top drSFC[]; -- Call caller's return PC (underflowTrap pushed onto IFU stack) underflowTrap _ GenLabelHere[]; -- no frames on stack drROR[c: pushDst, a: const0, b: underflowHandler]; drSFC[]; drJB[UseLabel8A[underflowTrap]]}; FillTrap: PROC [ trap: DragOpsCross.TrapIndex, label: Label ] = { oldPC: LONG CARDINAL = GetOutputPC[]; SetOutputPC[DragOpsCrossUtils.TrapIndexToBytePC[trap]]; drJDB[UseLabel16[label]]; -- go to trap handler SetOutputPC[oldPC]}; <> LSUnderflowKernel: Label = GenLSUnderflowKernel[]; Start: Label = GenLabel[]; FillTrap[ResetTrap, Start ]; <> SetLabel[ Start ]; -- gets here from reset in kernel mode with traps off <<>> <> drLFC[UseLabel16[ LSUnderflowKernel ]]; <<>> <> drLIQB[ CardToWord[000000000H]]; SetEldestPC[]; GetEldestPC[]; drLIQB[ CardToWord[055555555H]]; SetEldestPC[]; GetEldestPC[]; drLIQB[ CardToWord[0FFFFFFFFH]]; SetEldestPC[]; GetEldestPC[]; drLIQB[ CardToWord[0AAAAAAAAH]]; SetEldestPC[]; GetEldestPC[]; drLIQB[ CardToWord[000000000H]]; <<>> <> Halt[0FFFFH]}; -- end of test END.