// DCP-Proms.bcpl -- Dicentra Central Processor Proms // Loaded with DCP-Multibus.bcpl // Last modified October 23, 1983 7:40 PM by Boggs external [ Ws; OpenFile; Puts; Closes; Allocate; Free; sysZone; Multibus ] static [ memory; mbFile ] structure String [ length byte; char^1,1 byte ] manifest [ high = 1; low = 0 ] //----------------------------------------------------------------------------------------- let DCPProms() be //----------------------------------------------------------------------------------------- [ mbFile = OpenFile("DCP-Proms.mb") DoMemory("Stack", 512, 8, Stack) DoMemory("IB", 512, 8, IB) DoMemory("ALUHigh", 512, 8, ALUHigh) DoMemory("FX", 512, 8, FX) DoMemory("FYZ", 512, 8, FYZ) DoMemory("FY1", 512, 8, FY1) DoMemory("FY2", 512, 8, FY2) DoMemory("FZ1", 512, 8, FZ1) DoMemory("FZ2", 512, 8, FZ2) DoMemory("CPBank3632", 512, 8, CPBank3632) DoMemory("CPBank2732", 512, 8, CPBank2732) DoMemory("Trap", 512, 8, Trap) DoMemory("Multibus", 512, 24, Multibus) 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 (not used) 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 (not used) Proc(addr, data) for i = 0 to (nData+15)/16 -1 do Puts(mbFile, data!i) ] Free(sysZone, data) ] //----------------------------------------------------------------------------------------- and Stack(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 StackP bit 4 PopX bit PopZ bit PushX bit PushY bit PushZ bit ] structure Data: [ StackTrap bit blank bit 3 StackP bit 4 blank bit 8 ] let PopX = addr<>Data.StackP = StackP data>>Data.StackTrap = StackTrap? high, low ] //----------------------------------------------------------------------------------------- and IB(addr, data) be //----------------------------------------------------------------------------------------- [ manifest [ // instruction buffer states ibEmpty = 0 ibByte = 1 ibFull = 2 ibWord = 3 ] structure Addr: [ blank bit 7 IBDisp bit ReadIB bit WriteIB bit IBPtrGetsWord bit IBPtrGetsByte bit EnC2Funs bit Interrupt bit InIBPtr bit 2 unused bit ] structure Data: [ GoodIBDisp bit IBEmpty bit //low true IBRefillTrap bit ReadIB0 bit //low true ReadIB1 bit //low true WriteIBFront bit OutIBPtr bit 2 blank bit 8 ] let IBDisp = addr<>Data.IBEmpty = OutIBPtr eq ibEmpty? low, high data>>Data.IBRefillTrap = IBRefillTrap? high, low data>>Data.GoodIBDisp = GoodIBDisp? high, low data>>Data.ReadIB0 = ReadIB0? low, high data>>Data.ReadIB1 = ReadIB1? low, high data>>Data.WriteIBFront = WriteIBFront? high, low data>>Data.OutIBPtr = OutIBPtr ] //----------------------------------------------------------------------------------------- and ALUHigh(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 paS0 bit paS1 bit paS2 bit paF1 bit paF2 bit pMem bit Cycle3 bit Cycle2 bit blank bit ] structure Data: [ aSh0 bit aSh1 bit aSh2 bit aFh1 bit aFh2 bit ReadMD bit //low true blank bit 2 blank bit 8 ] let paS0 = addr<>Data.aSh0 = (pMem & Cycle3? false, paS0)? high, low data>>Data.aSh1 = (pMem & Cycle3? true, paS1)? high, low data>>Data.aSh2 = (pMem & Cycle3? true, paS2)? high, low data>>Data.aFh1 =(pMem & Cycle3? true, paF1)? high, low data>>Data.aFh2 =(pMem & Cycle3? true, paF2)? high, low data>>Data.ReadMD = pMem & Cycle2? low, high ] //----------------------------------------------------------------------------------------- and FX(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 pfX bit 4 blank bit 5 ] structure Data: [ blank bit WriteRH bit Shift bit //low true CycleX bit //low true CInGetsPC16X bit //low true MapRefX bit //low true PopX bit PushX bit blank bit 8 ] let FX = addr<>Data.WriteRH = FX eq 9? high, low data>>Data.Shift = FX eq 10? low, high data>>Data.CycleX = FX eq 11? low, high data>>Data.CInGetsPC16X = FX eq 12? low, high data>>Data.MapRefX = FX eq 13? low, high data>>Data.PopX = FX eq 14? high, low data>>Data.PushX = FX eq 15? high, low ] //----------------------------------------------------------------------------------------- and FYZ(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 pfS01 bit 2 pfS23 bit 2 pfZ01 bit 2 = [ pfZ0 bit pfZ1 bit ] pfY0 bit pfY1 bit blank bit ] structure Data: [ Zero bit //low true IB bit //low true Rot bit //low true Byte bit //low true Const bit //low true FourBitBr bit //low true TwoBitBr bit //low true OneBitBr bit //low true blank bit 8 ] let pfS01 = addr<>Data.Zero = (pfS23 eq 1 % (pfS23 eq 3 & pfZ0))? low, high data>>Data.IB = (pfS23 eq 3 & pfZ01 eq 3)? low, high data>>Data.Rot = (pfS23 eq 0 & pfZ01 eq 3)? low, high data>>Data.Byte = pfS01 eq 3? low, high data>>Data.Const = pfS23 eq 1? low, high data>>Data.FourBitBr = (pfS01 eq 0 & pfY0 & not pfY1)? low, high data>>Data.TwoBitBr = (pfS01 eq 0 & pfY0)? low, high data>>Data.OneBitBr = (pfS01 eq 0 & not pfY0)? low, high ] //----------------------------------------------------------------------------------------- and FY1(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 pfY bit 4 pfS01 bit 2 blank bit 3 ] structure Data: [ WriteDebA bit //low true WriteExtCtrl bit ClrIntTrap bit //low true IBDisp bit SetInterrupt bit WriteStkP bit WriteIB bit CycleY bit //low true blank bit 8 ] let pfY = addr<>Data.WriteDebA = (pfS01 eq 2 & pfY eq 0)? low, high data>>Data.WriteExtCtrl = (pfS01 eq 2 & pfY eq 1)? high, low data>>Data.ClrIntTrap = (pfS01 eq 1 & pfY eq 2)? low, high data>>Data.IBDisp = (pfS01 eq 1 & pfY eq 3)? high, low data>>Data.SetInterrupt = (pfS01 eq 1 & pfY eq 4)? high, low data>>Data.WriteStkP = (pfS01 eq 1 & pfY eq 5)? high, low data>>Data.WriteIB = (pfS01 eq 1 & pfY eq 6)? high, low data>>Data.CycleY = (pfS01 eq 1 & pfY eq 7)? low, high ] //----------------------------------------------------------------------------------------- and FY2(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 pfY bit 4 pfS01 bit 2 blank bit 3 ] structure Data: [ blank bit MapRefY bit //low true blank bit PushY bit IORefY bit //low true WriteBank bit BHEN bit RawRef bit blank bit 8 ] let pfY = addr<>Data.MapRefY = (pfS01 eq 1 & pfY eq 9)? low, high data>>Data.PushY = (pfS01 eq 1 & pfY eq 11)? high, low data>>Data.IORefY = ((pfS01 eq 1 % pfS01 eq 2) & pfY eq 12)? low, high data>>Data.WriteBank = (pfS01 eq 1 & pfY eq 13)? high, low data>>Data.BHEN = (pfS01 eq 2 & (pfY eq 12 % pfY eq 14 % pfY eq 15))? low, high data>>Data.RawRef = ((pfS01 eq 1 % pfS01 eq 2) & pfY eq 14)? high, low ] //----------------------------------------------------------------------------------------- and FZ1(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 pfZ bit 4 pfS23 bit 2 blank bit 3 ] structure Data: [ ADR0 bit IBPtrGetsByte bit IBPtrGetsWord bit CInGetsPC16Z bit //low true IORefZ bit //low true PopZ bit PushZ bit AltUAddr bit blank bit 8 ] let pfZ = addr<>Data.ADR0 = (pfS23 eq 3 & pfZ eq 0)? high, low data>>Data.IBPtrGetsByte = (pfS23 eq 0 & pfZ eq 1)? high, low data>>Data.IBPtrGetsWord = (pfS23 eq 0 & pfZ eq 2)? high, low data>>Data.CInGetsPC16Z = (pfS23 eq 0 & pfZ eq 3)? low, high data>>Data.IORefZ = (pfS23 eq 3 & pfZ eq 7)? low, high data>>Data.PopZ = (pfS23 eq 0 & pfZ eq 5)? high, low data>>Data.PushZ = (pfS23 eq 0 & pfZ eq 6)? high, low data>>Data.AltUAddr = (pfS23 eq 0 & pfZ eq 7)? high, low ] //----------------------------------------------------------------------------------------- and FZ2(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 pfZ bit 4 pfS23 bit 2 blank bit 3 ] structure Data: [ ReadDebB bit //low true ReadExtStat bit //low true ReadMisc bit //low true ReadRH bit //low true blank bit ReadIB bit blank bit IBHigh bit //low true blank bit 8 ] let pfZ = addr<>Data.ReadDebB = (pfS23 eq 3 & pfZ eq 8)? low, high data>>Data.ReadExtStat = (pfS23 eq 3 & pfZ eq 6)? low, high data>>Data.ReadMisc = (pfS23 eq 3 & pfZ eq 10)? low, high data>>Data.ReadRH = (pfS23 eq 3 & pfZ eq 11)? low, high data>>Data.ReadIB = (pfS23 eq 3 & pfZ eq 13)? high, low data>>Data.IBHigh = (pfS23 eq 3 & pfZ eq 15)? low, high ] //----------------------------------------------------------------------------------------- and CPBank3632(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 Bank bit 4 UseRom bit blank bit 4 ] structure Data: [ Rom0CE bit //high true, aka CS2 Rom0OE bit //low true, aka CS1 Rom1CE bit //high true, aka CS2 Rom1OE bit //low true, aka CS1 MapFlags bit 2 blank bit 2 blank bit 8 ] let Bank = addr<>Data.Rom0CE = Rom0CE? high, low data>>Data.Rom0OE = Rom0OE? low, high data>>Data.Rom1CE = Rom1CE? high, low data>>Data.Rom1OE = Rom1OE? low, high data>>Data.MapFlags = MapFlags ] //----------------------------------------------------------------------------------------- and CPBank2732(addr, data) be //----------------------------------------------------------------------------------------- [ structure Addr: [ blank bit 7 Bank bit 4 UseRom bit blank bit 4 ] structure Data: [ Rom0CE bit //low true Rom0OE bit //low true Rom1CE bit //low true Rom1OE bit //low true MapFlags bit 2 blank bit 2 blank bit 8 ] let Bank = addr<>Data.Rom0CE = Rom0CE? low, high data>>Data.Rom0OE = Rom0OE? low, high data>>Data.Rom1CE = Rom1CE? low, high data>>Data.Rom1OE = Rom1OE? low, high data>>Data.MapFlags = MapFlags ] //----------------------------------------------------------------------------------------- and Trap(addr, data) be //----------------------------------------------------------------------------------------- [ manifest [ // These bits appear inverted on X[8-9] when fZ = XLow_Misc. // If X[8-9] = zero then a control store parity error occured. stateIBEmpty = 0 stateStack = 1 stateInit = 2 stateNoTrap = 3 stateParity = 3 ] structure Addr: [ blank bit 7 CurrentState bit 2 TrapIn bit IBEmptyTrap bit //low true StackTrap bit InitTrap bit //low true ParityTrap bit ClrIntTrap bit //low true Cycle1 bit ] structure Data: [ NextState bit 2 Trap bit ParityLED bit //low true ForceBank0 bit blank bit 3 blank bit 8 ] let CurrentState = addr<>Data.NextState = NextState data>>Data.ParityLED = ParityTrap? low, high data>>Data.ForceBank0 = (Trap & ParityTrap) % InitTrap? high, low data>>Data.Trap = Trap? high, low ]