// Sun-Proms.bcpl -- Sun 3 MB Ethernet board Proms // Last modified February 10, 1984 4:00 PM by Boggs // Sun-Rev-B & CadLink-Rev-0 boards require a hardware change: (TX Multibus/Fifo interlock) // isolate U308 pin 4; connect it to U308 pin 25 (P.Read/) // Other known hardware fixes: // isolate U511 pin 4; connect it to U111 pin 12 (T.AbortAck/) // isolate U513 pin 2; connect it to U317 pin 9 (TX.Jam) external [ Ws; OpenFile; Puts; Closes; Allocate; Free; sysZone ] static [ memory; mbFile ] structure String [ length byte; char^1,1 byte ] manifest [ high = 1; low = 0 ] //----------------------------------------------------------------------------------------- let SunProms() be //----------------------------------------------------------------------------------------- [ mbFile = OpenFile("Sun-Proms.mb") DoMemory("TX", 256, 8, TX) DoMemory("NewTX", 256, 8, NewTX) DoMemory("Ctrl", 32, 40, Ctrl) Puts(mbFile, 0) //0 = end of file Closes(mbFile) ] //----------------------------------------------------------------------------------------- and DoMemory(name, nAddr, nData, Proc) be //----------------------------------------------------------------------------------------- // nAddr is number of addresses // nData is number of output bits [ Ws("*N"); Ws(name) Puts(mbFile, 4) //4 = define memory memory = memory +1 Puts(mbFile, memory) Puts(mbFile, nData) if name>>String.length gr 1 then for i = 1 to name>>String.length-1 by 2 do Puts(mbFile, name>>String.char^i lshift 8 + name>>String.char^(i+1)) Puts(mbFile, (name>>String.length & 1) eq 0? 0, name>>String.char^(name>>String.length) lshift 8) Puts(mbFile, 2) //2 = set current memory Puts(mbFile, memory) Puts(mbFile, 0) //location counter let data = Allocate(sysZone, (nData+15)/16) for addr = 0 to nAddr-1 do [ Puts(mbFile, 1) //1 = memory contents Puts(mbFile, 0) //source line number Proc(addr, data) for i = 0 to (nData+15)/16 -1 do Puts(mbFile, data!i) ] Free(sysZone, data) ] //----------------------------------------------------------------------------------------- and TX(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 8 state bit 2 timeout bit inhibit bit ready bit wrd bit jam bit carrier bit ] structure Data: [ nextState bit 2 notIdle bit idle bit blank bit load bit notGo bit go bit blank bit 8 ] manifest [ stateIdle = 0 stateData = 1 stateCRC = 2 ] let state = addr<>Data.nextState = nextState data>>Data.notIdle = idle? low, high data>>Data.idle = idle? high, low data>>Data.load = load? high, low data>>Data.notGo = go? low, high data>>Data.go = go? high, low ] //----------------------------------------------------------------------------------------- and NewTX(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 8 state bit 2 timeout bit inhibit bit ready bit wrd bit jam bit carrier bit ] structure Data: [ nextState bit 2 notIdle bit idle bit done bit //low true load bit abrt bit //low true go bit blank bit 8 ] manifest [ stateIdle = 0 stateData = 1 stateCRC = 2 ] let state = addr<>Data.nextState = nextState data>>Data.notIdle = nextState ne stateIdle? low, high data>>Data.idle = nextState eq stateIdle? high, low data>>Data.done = (nextState eq stateIdle & not jam)? low, high data>>Data.load = load? high, low data>>Data.abrt = jam? low, high data>>Data.go = go? high, low ] //----------------------------------------------------------------------------------------- and Ctrl(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 11 Instr bit 5 ] structure Data: [ BufWE bit RBufCE bit //low true TBufCE bit //low true CRead bit //low true PWrite bit //low true PRead bit //low true TWrite bit //low true RRead bit //low true RxOverflow bit TxTimeout bit RxInterrupt bit QEmpty bit Ack bit //low true Resume bit CarryIn bit DestHigh bit DestLow bit 2 Function bit 3 Source bit 3 BReg bit 4 AReg bit 4 Branch bit 3 Next bit 5 //msb is low true blank bit 8 ] manifest [ // instruction addresses Init1 = 0 Init2 = 1 Init3 = 2 RxEnd1 = 3 RxEnd2 = 4 RxEnd3 = 5 RxEnd4 = 6 RxReady1 = 7 RxReady2 = 10b PortReadReq1 = 11b PortReadReq2 = 12b PortWriteReq1 = 13b PortStart = 20b PortStart1 = 14b PortStart2 = 15b PortStart3 = 21b PortStart4 = 16b TxStart = 17b TxAbort1 = 22b TxTimer = 23b TxTimer1 = 24b TxTimer2 = 25b TxTimer3 = 26b TxTimer4 = 27b // Startup addresses RxReady = 30b RxEnd = 31b TxReady = 32b TxAbort = 33b PortWriteReq = 34b PortReadReq = 35b Init = 36b Idle = 37b // Register names spare = 0 rBase = 1 rGet = 2 rPut = 3 count = 4 tBase = 5 tGet = 6 tPut = 7 retry = 8 timer = 9 random = 10 // Branch Condition Codes (CC) Never = 0 NonZero = 1 Zero = 2 NoCarry8 = 3 Positive = 4 Negative = 5 Equal = 6 Always = 7 // 2901 Functions RplusS = 0 SminusR = 1 RminusS = 2 RorS = 3 RandS = 4 NotRandS = 5 RxorS = 6 RxnorS = 7 // 2901 Sources AQ = 0 AB = 1 ZQ = 2 ZB = 3 ZA = 4 DA = 5 DQ = 6 DZ = 7 // 2901 Destinations QReg = 0 Nop = 1 RamA = 2 RamF = 3 RamQD = 4 RamD = 5 RamQU = 6 RamU = 7 ] let Next, Branch = 0, Never let CarryIn, Function, Source = nil, nil, nil let AReg, BReg, Destination = nil, nil, nil let Resume, Ack, QEmpty = false, false, false let RxInterrupt, TxTimeout, RxOverflow = false, false, false let RRead, TWrite, PRead, PWrite, CRead = false, false, false, false, false let TBufCE, RBufCE, BufWE = false, false, false switchon addr<>Data.BufWE = BufWE? high, low data>>Data.RBufCE = RBufCE? low, high data>>Data.TBufCE = TBufCE? low, high data>>Data.CRead = CRead? low, high data>>Data.PWrite = PWrite? low, high data>>Data.PRead = PRead? low, high data>>Data.TWrite = TWrite? low, high data>>Data.RRead = RRead? low, high data>>Data.RxOverflow = RxOverflow? high, low data>>Data.TxTimeout = TxTimeout? high, low data>>Data.RxInterrupt = RxInterrupt? high, low data>>Data.QEmpty = QEmpty? high, low data>>Data.Ack = Ack? low, high data>>Data.Resume = Resume? high, low data>>Data.CarryIn = CarryIn data>>Data.DestHigh = Destination rshift 2 data>>Data.DestLow = Destination data>>Data.Function = Function data>>Data.Source = Source data>>Data.BReg = BReg data>>Data.AReg = AReg data>>Data.Branch = Branch data>>Data.Next = Next xor 20b ]