<> <> <> <> <> <<>> DIRECTORY Ascii, Basics, GPIB, Process, RefText, Rope, XBus; GPIBImpl: CEDAR MONITOR IMPORTS Basics, Process, RefText, Rope, XBus EXPORTS GPIB = BEGIN OPEN Basics, Rope; <> controller: GPIB.DeviceAddr _ 0; <> statusWord: WORD _ 0000H; BusEND: WORD = LOOPHOLE[BITSHIFT[1, 13]]; SRQI: WORD = LOOPHOLE[BITSHIFT[1, 12]]; GPIBBaseAddr: LONG POINTER = LOOPHOLE[LONG[8000H]]; -- current setting for Multibus monitorStatusWord: BOOL _ TRUE; --for debugging swRegister: WORD _ statusWord; --for debugging maxBytes: CARDINAL = LAST[CARDINAL]/4; smallBuf: NAT = 16; bigBuf: NAT = GPIB.maxReadBuffer; <<*** Level 1: Implementation of GPIB.mesa ***>> <<>> InitializeController: PUBLIC PROC RETURNS [open: BOOL] = { [] _ Init[]; open _ TRUE; }; FinalizeController: PUBLIC PROC = { SetIdle[] }; SRQAsserted: PUBLIC PROC RETURNS [asserted: BOOL] = { asserted _ FALSE; IF swRegister # 0 THEN { swRegister _ 0H; asserted _ TRUE; }; }; <<>> <> Command: PUBLIC PROC [sendMsg: Rope.ROPE] = { sendBuffer: REF TEXT _ RefText.ObtainScratch[bigBuf]; sendBuffer _ RefText.AppendRope[sendBuffer, sendMsg]; [] _ Cmd[sendBuffer]; RefText.ReleaseScratch[sendBuffer]; }; DevicesClear: PUBLIC PROC = { [] _ LCmd[LIST[GPIB.devicesClear, GPIB.UnListen]]}; GoToLocal: PUBLIC PROC = { [] _ LCmd[LIST[GPIB.goToLocal, GPIB.UnListen]]}; GroupExecuteTrigger: PUBLIC PROC = { [] _ LCmd[LIST[GPIB.groupExecuteTrigger, GPIB.UnListen]]}; InterfaceClear: PUBLIC PROC = {[] _ Clear[]}; LocalLockout: PUBLIC PROC = { [] _ LCmd[LIST[GPIB.localLockout, GPIB.UnListen]]}; RemoteEnable: PUBLIC PROC = {[] _ SetRemote[TRUE]}; <> <<>> SelectedDeviceClear: PUBLIC PROC [device: GPIB.DeviceAddr]= { [] _ LCmd[LIST[GPIB.UnListen, GetLAD[device], GPIB.selectedDeviceClear, GPIB.UnListen]]}; SelectedGoToLocal: PUBLIC PROC [device: GPIB.DeviceAddr] = { [] _ LCmd[LIST[GPIB.UnListen, GetLAD[device], GPIB.goToLocal, GPIB.UnListen]]}; SelectedExecuteTrigger: PUBLIC PROC [device: GPIB.DeviceAddr] = { [] _ LCmd[LIST[GPIB.UnListen, GetLAD[device],GPIB.groupExecuteTrigger,GPIB.UnListen]]}; SelectedGroupEnableTrigger: PUBLIC PROC [device: GPIB.DeviceAddr] = {ERROR}; SelectedRemoteEnable: PUBLIC PROC [device: GPIB.DeviceAddr] = { [] _ SetRemote[TRUE]; [] _ LCmd[LIST[GPIB.UnListen, GetLAD[device], GetTAD[device], GPIB.UnListen]]; }; <<>> <> <<>> ParallelPollConfigure: PUBLIC PROC [device: GPIB.DeviceAddr] = { [] _ LCmd[LIST[GPIB.UnListen, GPIB.parallelPollConfigure, GPIB.parallelPollEnable, GPIB.UnListen]]; }; ParallelPollUnconfigure: PUBLIC PROC = { [] _ LCmd[LIST[GPIB.UnListen, GPIB.parallelPollConfigure, GPIB.parallelPollDisable, GPIB.UnListen]]; }; SelectedParallelPollConfigure: PUBLIC PROC [device: GPIB.DeviceAddr] = { [] _ LCmd[LIST[GPIB.UnListen, GetLAD[device], GPIB.parallelPollConfigure, GPIB.parallelPollEnable, GPIB.UnListen]]; }; SelectedParallelPollUnconfigure: PUBLIC PROC [device: GPIB.DeviceAddr] = { [] _ LCmd[LIST[GPIB.UnListen, GetLAD[device], GPIB.parallelPollConfigure, GPIB.parallelPollDisable, GPIB.UnListen]]; }; <> <<>> PollDevice: PUBLIC PROC [device: GPIB.DeviceAddr, labels: GPIB.SRQLabels] = {ERROR}; SelectedReadSerialPoll: PUBLIC PROC [device: GPIB.DeviceAddr] RETURNS [statusByte: CHAR] = { [] _ LCmd[LIST[GPIB.UnListen, GPIB.serialPollEnable, GetTAD[device], GetLAD[controller]]]; [statusByte, ] _ DataByteRead[]; [] _ LCmd[LIST[GPIB.serialPollDisable, GPIB.UnTalk]]; }; ReadStatusByte: PUBLIC PROC [device: GPIB.DeviceAddr] RETURNS [char: CHAR] = { [] _ LCmd[LIST[GPIB.UnListen, GetTAD[device], GetLAD[controller]]]; [char, ] _ DataByteRead[! ABORTED => CONTINUE]; [] _ LCmd[LIST[GPIB.UnTalk]]; }; ReadDevice: PUBLIC PROC [device: GPIB.DeviceAddr, terminator: GPIB.Terminator _ EOI] RETURNS [recvMsg: Rope.ROPE, end: BOOL] = { <> sendBuffer: REF TEXT _ RefText.ObtainScratch[smallBuf]; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnListen]; sendBuffer _ RefText.AppendChar[sendBuffer, GetTAD[device]]; sendBuffer _ RefText.AppendChar[sendBuffer, GetLAD[controller]]; [] _ Cmd[sendBuffer]; [recvMsg, , end] _ DataRead[terminator ! ABORTED => CONTINUE]; sendBuffer.length _ 0; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnTalk]; [] _ Cmd[sendBuffer]; RefText.ReleaseScratch[sendBuffer]; }; ReadOnInterrupt: PUBLIC PROC [device: GPIB.DeviceAddr, recvMsg: Rope.ROPE, labels: GPIB.SRQLabels] = {ERROR}; WriteDevice: PUBLIC PROC [device: GPIB.DeviceAddr, sendMsg: Rope.ROPE] = { <> sendBuffer: REF TEXT _ RefText.ObtainScratch[smallBuf]; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnListen]; sendBuffer _ RefText.AppendChar[sendBuffer, GetLAD[device]]; sendBuffer _ RefText.AppendChar[sendBuffer, GetTAD[controller]]; [] _ Cmd[sendBuffer]; [] _ DataWrite[sendMsg ! ABORTED => CONTINUE]; sendBuffer.length _ 0; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnListen]; [] _ Cmd[sendBuffer]; RefText.ReleaseScratch[sendBuffer]; }; dev: GPIB.DeviceAddr; buffer: Rope.ROPE _ NIL; bufferEmptyCV, bufferFullCV: CONDITION; bufferEmpty: BOOL _ TRUE; WriteDeviceBuffered: PUBLIC ENTRY PROC [device: GPIB.DeviceAddr, sendMsg: Rope.ROPE, hold: BOOL] = { ENABLE UNWIND => NULL; UNTIL bufferEmpty DO WAIT bufferEmptyCV; ENDLOOP; dev _ device; buffer _ sendMsg; bufferEmpty _ FALSE; BROADCAST bufferFullCV; IF hold THEN UNTIL bufferEmpty DO WAIT bufferEmptyCV; ENDLOOP; }; BufferToDevice: ENTRY PROC = { ENABLE UNWIND => NULL; open: REF TEXT _ NEW[TEXT[smallBuf]]; close: REF TEXT _ NEW[TEXT[smallBuf]]; close _ RefText.AppendChar[close, GPIB.UnListen]; DO WHILE bufferEmpty DO WAIT bufferFullCV; ENDLOOP; open.length _ 0; open _ RefText.AppendChar[open, GPIB.UnListen]; open _ RefText.AppendChar[open, GetLAD[dev]]; open _ RefText.AppendChar[open, GetTAD[controller]]; [] _ Cmd[open]; [] _ DataWrite[buffer ! ABORTED => CONTINUE]; [] _ Cmd[close]; bufferEmpty _ TRUE; BROADCAST bufferEmptyCV; ENDLOOP; }; <<>> <> WriteDeviceInitial: PUBLIC ENTRY PROC [device: GPIB.DeviceAddr, sendMsg: Rope.ROPE] = BEGIN ENABLE UNWIND => NULL; sendBuffer: REF TEXT _ RefText.ObtainScratch[bigBuf]; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnListen]; sendBuffer _ RefText.AppendChar[sendBuffer, GetLAD[device]]; sendBuffer _ RefText.AppendChar[sendBuffer, GetTAD[controller]]; [] _ Cmd[sendBuffer]; sendBuffer.length _ 0; [] _ DataWrite[sendMsg, TRUE, FALSE ! ABORTED => CONTINUE]; RefText.ReleaseScratch[sendBuffer]; END; WriteDeviceContinued: PUBLIC ENTRY PROC [device: GPIB.DeviceAddr, sendMsg: Rope.ROPE, last: BOOL] = BEGIN ENABLE UNWIND => NULL; sendBuffer: REF TEXT _ RefText.ObtainScratch[bigBuf]; [] _ DataWrite[sendMsg, FALSE, last ! ABORTED => CONTINUE]; RefText.ReleaseScratch[sendBuffer]; END; WriteDeviceBlock: PUBLIC ENTRY UNSAFE PROC [device: GPIB.DeviceAddr, lp: LONG POINTER, quadWordCnt: CARDINAL, last: BOOL] = TRUSTED BEGIN OPEN Basics; ENABLE UNWIND => NULL; dataWord: MACHINE DEPENDENT RECORD [a,b: CHAR] _ LOOPHOLE [lp^]; IF quadWordCnt < 1 THEN quadWordCnt _ 1; FOR i: CARDINAL IN [0 .. quadWordCnt-1) DO XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; ENDLOOP; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; lp _ lp + 1; dataWord _ LOOPHOLE [lp^]; XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.a, CARDINAL]]; IF last THEN WriteReg[auxmr, sendEOI]; -- EOI with last byte XBus.IOWrite[GPIBBaseAddr, LOOPHOLE[dataWord.b, CARDINAL]]; END; WriteDMABlock: PUBLIC UNSAFE PROC [device: GPIB.DeviceAddr, multiBusAddress: LONG POINTER TO WORD, -- For Lupine -- byteCnt: CARDINAL, last: BOOL] = TRUSTED BEGIN i: INTEGER; bp: Basics.BytePair; md: MACHINE DEPENDENT RECORD [b1, b0, b3, b2: BYTE]; i _ 0 - LOOPHOLE[byteCnt, INTEGER]; byteCnt _ LOOPHOLE[i, CARDINAL]; bp _ LOOPHOLE[byteCnt]; WriteReg[bcr0, LOOPHOLE[bp.low]]; WriteReg[bcr1, LOOPHOLE[bp.high]]; md _ LOOPHOLE[multiBusAddress]; WriteReg[acr0, LOOPHOLE[md.b0]]; WriteReg[acr1, LOOPHOLE[md.b1]]; WriteReg[acr2, LOOPHOLE[md.b2]]; IF last THEN WriteReg[ccfr, sendEOI]; WriteReg[imr1, LOOPHOLE[0]]; WriteReg[cr1, LOOPHOLE[0Bh]]; -- ~MIE, *Burst, ~CBRE, SC, 22.4 to 25.6 timeout WriteReg[imr2, LOOPHOLE[20H]]; -- DMAO WriteReg[cr0, LOOPHOLE[(IF last THEN 052H ELSE 012H)]]; WriteReg[cr0, LOOPHOLE[(IF last THEN 053H ELSE 013H)]]; END; ReadDeviceInitial: PUBLIC ENTRY PROC [ device: GPIB.DeviceAddr] = BEGIN sendBuffer: REF TEXT _ RefText.ObtainScratch[smallBuf]; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnListen]; sendBuffer _ RefText.AppendChar[sendBuffer, GetTAD[device]]; sendBuffer _ RefText.AppendChar[sendBuffer, GetLAD[controller]]; [] _ Cmd[sendBuffer]; RefText.ReleaseScratch[sendBuffer]; WriteReg[auxmr, goToStandby]; -- if controller active state, go to standby [] _ ReadRegL[sr]; END; ReadDMABlock: PUBLIC UNSAFE PROC [device: GPIB.DeviceAddr, multiBusAddress: LONG POINTER TO WORD, -- For Lupine -- byteCnt: CARDINAL, last: BOOL _ FALSE] = TRUSTED BEGIN i: INTEGER; bp: Basics.BytePair; md: MACHINE DEPENDENT RECORD [b1, b0, b3, b2: BYTE]; i _ 0 - LOOPHOLE[byteCnt, INTEGER]; byteCnt _ LOOPHOLE[i, CARDINAL]; bp _ LOOPHOLE[byteCnt]; WriteReg[bcr0, LOOPHOLE[bp.low]]; WriteReg[bcr1, LOOPHOLE[bp.high]]; md _ LOOPHOLE[multiBusAddress]; WriteReg[acr0, LOOPHOLE[md.b0]]; WriteReg[acr1, LOOPHOLE[md.b1]]; WriteReg[acr2, LOOPHOLE[md.b2]]; IF last THEN WriteReg[ccfr, sendEOI]; WriteReg[imr1, LOOPHOLE[10H]]; -- Setup as listener WriteReg[cr1, LOOPHOLE[4Bh]]; -- ~MIE, Burst, ~CBRE, SC, 22.4 to 25.6 timeout WriteReg[imr2, LOOPHOLE[10H]]; -- DMAI WriteReg[cr0, LOOPHOLE[02H]]; -- DMA en WriteReg[cr0, LOOPHOLE[03H]]; -- GO END; ReadDMADone: PUBLIC PROC [device: GPIB.DeviceAddr] = BEGIN sendBuffer: REF TEXT _ RefText.ObtainScratch[smallBuf]; sendBuffer _ RefText.AppendChar[sendBuffer, GPIB.UnListen]; [] _ Cmd[sendBuffer]; RefText.ReleaseScratch[sendBuffer]; END; CheckDMADone: PUBLIC PROC RETURNS [BOOL] = BEGIN foo: CARDINAL _ ReadRegL[sr]; foo _ Basics.BITAND[foo, 80h]; Process.CheckForAbort[]; RETURN [foo # 0]; END; <> <<>> GetLAD: PRIVATE PROC [device: GPIB.DeviceAddr] RETURNS [CHAR] = { IF device > 30 THEN ERROR; RETURN [LOOPHOLE[device+32]]; -- ASCII Listen adr }; GetTAD: PRIVATE PROC [device: GPIB.DeviceAddr] RETURNS [CHAR] = { IF device > 30 THEN ERROR; RETURN [LOOPHOLE[device+64]]; -- ASCII Talk adr }; BufferSW: PRIVATE PROC = { IF statusWord # 0 THEN swRegister _ statusWord; }; <<*** Level 2: Board-specific Procedures ***>> <<>> << NEC 7210 M a s k s a n d R e g i s t e r s>> <> powerOn: CHAR = 000C; -- AUX-PON chipReset: CHAR = 002C; -- AUXCR sendEOI: CHAR = 006C; -- AUXSEOI takeAsynchControl: CHAR = 021C; -- AUXTCA goToStandby: CHAR = 020C; -- AUXGTS executeParaPoll: CHAR = 035C; -- AUX-EPP setIFC: CHAR = 036C; -- AUXSIFC clearIFC: CHAR = 026C; -- AUXCIFC setREN: CHAR = 037C; -- AUX-SREN clearREN: CHAR = 027C; -- AUXCREN <