<> <> <> <> <> <> <> <<>> <> <<>> <> <<>> DIRECTORY Basics USING [BITAND, BITSHIFT], CountedVM USING [Handle, Allocate, Free], PrincOps USING [ControlLink, FrameHandle, StateVector], PrincOpsUtils USING [GetReturnFrame], XBus, XOps, TrapSupport USING [opTrapTable]; XBusImpl: CEDAR PROGRAM IMPORTS Basics, CountedVM, XBus, PrincOpsUtils EXPORTS XBus = BEGIN OPEN XOps, XBus; mBusCtl: POINTER = LOOPHOLE[2]; lBusOutData: POINTER = LOOPHOLE[2]; lBusInData: POINTER = LOOPHOLE[2]; mBusAddr: POINTER = LOOPHOLE[3]; lBusAddr: POINTER = LOOPHOLE[3]; timer: LONG POINTER = LOOPHOLE[LONG[64]]; masterClear: LONG POINTER = LOOPHOLE[LONG[13]]; MBusTimeout: PUBLIC SIGNAL = CODE; <> MBusTimeoutTrap: PROC = TRUSTED { frame: PrincOps.FrameHandle; state: RECORD [a: WORD, v: PrincOps.StateVector]; state.v _ STATE; state.v.dest _ PrincOps.ControlLink[frame[frame _ PrincOpsUtils.GetReturnFrame[]]]; frame.pc _ [frame.pc + 2]; -- Advance PC over the 2 bytes of the trapping opcode state.v.stkptr _ state.v.stkptr - 6; --Clear args from the stack MBusTimeout[]; RETURN WITH state.v; }; PCRefreshOn: PUBLIC PROC = { BusMasterWrite[timer+3, 84]; BusMasterWrite[timer+1, 18]; BusMasterWrite[masterClear, 0]; BusMasterWrite[LOOPHOLE[LONG[12]], 0]; BusMasterWrite[LOOPHOLE[LONG[1]], Basics.BITAND[8191, 255]]; BusMasterWrite[LOOPHOLE[LONG[1]], Basics.BITSHIFT[8191, -8]]; BusMasterWrite[LOOPHOLE[LONG[11]], 88]; BusMasterWrite[LOOPHOLE[LONG[10]], 0]; }; <> XReadL: PROC [add: POINTER] RETURNS [WORD] = { RETURN[XBus.ReadL[LOOPHOLE[add]]]; }; XReadM: PROC [add: POINTER] RETURNS [WORD] = { RETURN[XBus.ReadM[LOOPHOLE[add]]]; }; XWriteL: PROC [add: POINTER, data: WORD] = { XBus.WriteL[LOOPHOLE[add], data]; }; XWriteM: PROC [add: POINTER, data: WORD] = { XBus.WriteM[LOOPHOLE[add], data]; }; XWriteMBus: PROC [controlData: WORD, from, to: LONG POINTER, byteInterval, wordCnt: CARDINAL] = { XBus.WriteMBus[controlData, from, to, byteInterval, wordCnt]; }; XReadMBus: PROC [controlData: WORD, to, from: LONG POINTER, byteInterval, wordCnt: CARDINAL] = { XBus.ReadMBus[controlData, to, from, byteInterval, wordCnt]; }; XWriteIBMBus: PROC [controlData: WORD, from, to: LONG POINTER, byteInterval, wordCnt: CARDINAL] = { XBus.WriteIBMBus[controlData, from, to, byteInterval, wordCnt]; }; XReadIBMBus: PROC [controlData: WORD, to, from: LONG POINTER, byteInterval, wordCnt: CARDINAL] = { XBus.ReadIBMBus[controlData, to, from, byteInterval, wordCnt]; }; <> TestWriteSignal: SIGNAL = CODE; TestReadSignal: SIGNAL = CODE; <> MTest: PROC [nSeconds: LONG CARDINAL _ 10] = TRUSTED { vm1, vm2, vm3: CountedVM.Handle _ NIL; writeDataArray: LONG POINTER TO ARRAY [0..32767) OF WORD; readDataArray: LONG POINTER TO ARRAY [0..32767) OF WORD; readDataArrayX: LONG POINTER TO ARRAY [0..1) OF WORD; --extra array for reread writeControlData: CARDINAL _ 8902H; readControlData: CARDINAL _ 8A01H; loopEnd: LONG CARDINAL _ (nSeconds + 1) * 3097 / 10000; --empirical value vm1 _ CountedVM.Allocate[LONG[32767]]; vm2 _ CountedVM.Allocate[LONG[32767]]; vm3 _ CountedVM.Allocate[LONG[1]]; writeDataArray _ vm1.pointer; readDataArray _ vm2.pointer; readDataArrayX _ vm3.pointer; --Breakpoint place FOR I: CARDINAL IN [0..32767) DO writeDataArray[I] _ I; --Initialize the write array readDataArray[I] _ 125252B; --Put benign value in read array ENDLOOP; <> FOR J: LONG CARDINAL IN [0..loopEnd) DO WriteMBus[writeControlData, writeDataArray, LOOPHOLE[10000h], 2, 32767]; ReadMBus[readControlData, readDataArray, LOOPHOLE[10000h], 2, 32767]; FOR I: CARDINAL IN [0..32767) DO writeDataArray[I] _ 0 - I; IF readDataArray[I] # I THEN { <> ReadMBus[readControlData, readDataArrayX, LOOPHOLE[10000h + I + I], 2, 1]; IF readDataArrayX[0] # readDataArray[I] THEN TestReadSignal[] ELSE TestWriteSignal[]; }; ENDLOOP; WriteMBus[writeControlData, writeDataArray, LOOPHOLE[10000h], 2, 32767]; ReadMBus[readControlData, readDataArray, LOOPHOLE[10000h], 2, 32767]; FOR I: CARDINAL IN [0..32767) DO writeDataArray[I] _ I; IF readDataArray[I] # (0 - I) THEN { ReadMBus[readControlData, readDataArrayX, LOOPHOLE[10000h + I + I], 2, 1]; IF readDataArrayX[0] # readDataArray[I] THEN TestReadSignal[] ELSE TestWriteSignal[]; }; ENDLOOP; ENDLOOP; CountedVM.Free[vm1]; CountedVM.Free[vm2]; CountedVM.Free[vm3]; }; PCTest: PROC [nSeconds: LONG CARDINAL _ 10] = TRUSTED { vm1, vm2, vm3: CountedVM.Handle _ NIL; writeDataArray: LONG POINTER TO ARRAY [0..4096) OF WORD; readDataArray: LONG POINTER TO ARRAY [0..4096) OF WORD; readDataArrayX: LONG POINTER TO ARRAY [0..1) OF WORD; --extra array for reread writeControlData: CARDINAL _ 2H; readControlData: CARDINAL _ 1H; loopEnd: LONG CARDINAL _ (nSeconds + 1) * 2; --guess; verify this vm1 _ CountedVM.Allocate[LONG[4096]]; vm2 _ CountedVM.Allocate[LONG[4096]]; vm3 _ CountedVM.Allocate[LONG[1]]; writeDataArray _ vm1.pointer; readDataArray _ vm2.pointer; readDataArrayX _ vm3.pointer; --Breakpoint place FOR I: CARDINAL IN [0..4096) DO readDataArray[I] _ 125252B; writeDataArray[I] _ I; ENDLOOP; <> FOR J: LONG CARDINAL IN [0..loopEnd) DO WriteIBMBus[writeControlData, writeDataArray, LOOPHOLE[0A0000], 1, 4096]; ReadIBMBus[readControlData, readDataArray, LOOPHOLE[0A0000], 1, 4096]; FOR I: CARDINAL IN [0..4096) DO writeDataArray[I] _ 0 - I; --Setup for the loop below IF readDataArray[I] # I THEN { ReadIBMBus[readControlData, readDataArrayX, LOOPHOLE[0A0000 + I + I], 1, 1]; IF readDataArrayX[0] # readDataArray[I] THEN TestReadSignal[] ELSE TestWriteSignal[]; }; ENDLOOP; WriteIBMBus[writeControlData, writeDataArray, LOOPHOLE[0A0000], 1, 4096]; ReadIBMBus[readControlData, readDataArray, LOOPHOLE[0A0000], 1, 4096]; FOR I: CARDINAL IN [0..4096) DO writeDataArray[I] _ I; --Setup for the loop above IF readDataArray[I] # (0 - I) THEN { ReadIBMBus[readControlData, readDataArrayX, LOOPHOLE[0A0000 + I + I], 1, 1]; IF readDataArrayX[0] # readDataArray[I] THEN TestReadSignal[] ELSE TestWriteSignal[]; }; ENDLOOP; ENDLOOP; CountedVM.Free[vm1]; CountedVM.Free[vm2]; CountedVM.Free[vm3]; }; MWriteTest: PROC ~ { first: LONG POINTER = LOOPHOLE[LONG[0]]; last: LONG POINTER = LOOPHOLE[0FFFFEh]; data: WORD; FOR i: LONG POINTER _ first, i+2 WHILE i#last DO XBus.MemWrite[i, 0]; ENDLOOP; FOR i: LONG POINTER _ first, i+2 WHILE i#last DO IF (data _ XBus.MemRead[i])#0 THEN TestWriteSignal; XBus.MemWrite[i, 0FFFFh]; ENDLOOP; FOR i: LONG POINTER _ first, i+2 WHILE i#last DO IF (data _ XBus.MemRead[i])#0FFFFh THEN TestWriteSignal[]; ENDLOOP; }; <> <<>> Initialize: PROC = TRUSTED { TrapSupport.opTrapTable.misc[aWriteMBus] _ LOOPHOLE[MBusTimeoutTrap]; TrapSupport.opTrapTable.misc[aReadMBus] _ LOOPHOLE[MBusTimeoutTrap]; TrapSupport.opTrapTable.misc[aWriteIBMBus] _ LOOPHOLE[MBusTimeoutTrap]; TrapSupport.opTrapTable.misc[aReadIBMBus] _ LOOPHOLE[MBusTimeoutTrap]; }; Initialize[]; END.