// DMisc-Proms.bcpl -- Dicentra Miscellaneous board Proms // Last modified January 18, 1984 8:56 PM by Boggs // To make a new .MB file: // Edit this file; then FTP it to the "Dicentra Proms" disk // type "BCPL DMiscProms.bcpl" to compile it // type "BLDR DMiscProms" to load it // type "DMiscProms" to run it and produce DMiscProms.mb 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 DMiscProms() be //----------------------------------------------------------------------------------------- [ mbFile = OpenFile("DMisc-Proms.mb") DoMemory("Cmd", 512, 8, Cmd) DoMemory("Int", 32, 8, Int) DoMemory("ZBus", 512, 24, ZBus) 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 Cmd(addr, data) be //----------------------------------------------------------------------------------------- [ manifest // zCmd values [ noCmd = 0 byteRead = 1 byteWrite = 2 wordRead = 3 wordWrite = 4 intAck = 5 init = 6 ] structure Addr: [ blank bit 7 BdSel bit IORC bit //low true IOWC bit //low true Adr bit 4 //low true INIT bit //low true blank bit ] structure Data: [ zCmd bit 3 blank bit 3 ReadHigh bit ReadLow bit blank bit 8 ] let BdSel = addr<>Data.zCmd = zCmd data>>Data.ReadHigh = ReadHigh? high, low data>>Data.ReadLow = ReadLow? high, low ] //----------------------------------------------------------------------------------------- and Int(addr, data) be //----------------------------------------------------------------------------------------- // This needs work before it is suitable for multiple Misc boards. // IntChan bits are currently ignored. [ structure Addr: [ blank bit 11 Int0 bit //low true SCCInt bit //low true CIOInt bit //low true IntChan bit 2 ] structure Data: [ IntOut0 bit //low true IntOut1 bit //low true IntOut2 bit //low true IntOut3 bit //low true IntOut4 bit //low true IntOut5 bit //low true IntOut6 bit //low true IntOut7 bit //low true blank bit 8 ] let Int0 = addr<>Data.IntOut0 = Int0? low, high data>>Data.IntOut1 = high data>>Data.IntOut2 = high data>>Data.IntOut3 = high data>>Data.IntOut4 = SCCInt? low, high data>>Data.IntOut5 = high data>>Data.IntOut6 = high data>>Data.IntOut7 = CIOInt? low, high ] //----------------------------------------------------------------------------------------- and ZBus(addr, data) be //----------------------------------------------------------------------------------------- [ manifest [ // zCmd values noCmd = 0 byteRead = 1 byteWrite = 2 wordRead = 3 wordWrite = 4 intAck = 5 init = 6 // FSM states; 12 free: 52-63. idle0 = 0; idle1 = 1; idle2 = 2; idle3 = 3 init0 = 4; init1 = 5; init2 = 6; init3 = 7 byte0 = 8; byte1 = 9; byte2 = 10; byte3 = 11; byte4 = 12; byte5 = 13 byteEnd = 14; byteEnd0 = 15; byteEnd1 = 16; byteEnd2 = 17; byteEnd3 = 18 intAck0 = 19; intAck1 = 20; intAck2 = 21; intAck3 = 22 word0 = 23; word1 = 24; word2 = 25; word3 = 26 wordEnd = 27; wordEnd0 = 28; wordEnd1 = 29; wordEnd2 = 30; wordEnd3 = 31 // 20 dally states implies 5 zClk cycles. // The sixth + 200 ns is in the idle loop and the AS part of the next ref. dallyFirst = 32; dallyLast = dallyFirst+19 ] structure Addr: [ blank bit 7 CurState bit 6 zCmd bit 3 ] structure Data: [ NextState bit 6 ReadDatH bit //low true ReadDatL bit //low true WriteDatH bit //low true zXACK bit //low true zIntA bit //low true zCS bit //low true zClk bit //voltage zRW bit //voltage zAS bit //low true zDS bit //low true ] let CurState = addr<>Data.NextState = NextState data>>Data.ReadDatH = ReadDatH? low, high data>>Data.ReadDatL = ReadDatL? low, high data>>Data.WriteDatH = WriteDatH? low, high data>>Data.zXACK = zXACK? low, high data>>Data.zIntA = zIntA? low, high data>>Data.zCS = zCS? low, high data>>Data.zClk = zClk data>>Data.zRW = zRW data>>Data.zAS = zAS? low, high data>>Data.zDS = zDS? low, high ]