//Sun-Proms.bcpl--Sun3MBEthernetboardProms//LastmodifiedFebruary10,19844:00PMbyBoggs//Sun-Rev-B&CadLink-Rev-0boardsrequireahardwarechange:(TXMultibus/Fifointerlock)//isolateU308pin4;connectittoU308pin25(P.Read/)//Otherknownhardwarefixes://isolateU511pin4;connectittoU111pin12(T.AbortAck/)//isolateU513pin2;connectittoU317pin9(TX.Jam)external[Ws;OpenFile;Puts;Closes;Allocate;Free;sysZone]static[memory;mbFile]structureString[lengthbyte;char^1,1byte]manifest[high=1;low=0]//-----------------------------------------------------------------------------------------letSunProms()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=endoffileCloses(mbFile)]//-----------------------------------------------------------------------------------------andDoMemory(name,nAddr,nData,Proc)be//-----------------------------------------------------------------------------------------//nAddrisnumberofaddresses//nDataisnumberofoutputbits[Ws("*N");Ws(name)Puts(mbFile,4)//4=definememorymemory=memory+1Puts(mbFile,memory)Puts(mbFile,nData)ifname>>String.lengthgr1thenfori=1toname>>String.length-1by2doPuts(mbFile,name>>String.char^ilshift8+name>>String.char^(i+1))Puts(mbFile,(name>>String.length&1)eq0?0,name>>String.char^(name>>String.length)lshift8)Puts(mbFile,2)//2=setcurrentmemoryPuts(mbFile,memory)Puts(mbFile,0)//locationcounterp_, 3 @#(,]{ x"&),:.6[D $(|-E.n4w9Z6  Xb9#P$&U* ,~.cV U@b9#P$&U* ,~.c Sb9#P$&U* ,~-PIX"'-196L>& Irr"5'*F]D+Q6!j"C[Af ;?[>"0 /5+[*>l "'&*([&kP%H)V"#!  ""t\    eBfL/')*J '+,R.7 %&([*K,o9')-/    %m y    TVm$2letdata=Allocate(sysZone,(nData+15)/16)foraddr=0tonAddr-1do[Puts(mbFile,1)//1=memorycontentsPuts(mbFile,0)//sourcelinenumberProc(addr,data)fori=0to(nData+15)/16-1doPuts(mbFile,data!i)]Free(sysZone,data)] //-----------------------------------------------------------------------------------------andTX(addr,data)be//-----------------------------------------------------------------------------------------[structureAddr:[blankbit8statebit2timeoutbitinhibitbitreadybitwrdbitjambitcarrierbit]structureData:[nextStatebit2notIdlebitidlebitblankbitloadbitnotGobitgobitblankbit8]manifest[stateIdle=0stateData=1stateCRC=2]letstate=addr<6"$% {`"$ ~c " @gL "~TVm$o3letcarrier=addr<>Data.nextState=nextStatedata>>Data.notIdle=idle?low,highdata>>Data.idle=idle?high,lowdata>>Data.load=load?high,lowdata>>Data.notGo=go?low,highdata>>Data.go=go?high,low] //-----------------------------------------------------------------------------------------andNewTX(addr,data)be//-----------------------------------------------------------------------------------------[structureAddr:[blankbit8statebit2timeoutbitinhibitbitreadybitwrdbitqg/Ep_, #%[Z6'# XVqU?BSB0 QPI/o V#|&3(N/ a#)+k1u7LKRIB0 HF\D/[X##&I)X+=C / ,&*(C .24Af/ !')Af05-?/s &(?. >Bw\5"$%4*{`"$2~c "0gL "~/4 #%+*='# (&q%GB#B0 ! P/ a!$n(,239ZB0  d/[h!#q&>'+.13/ ,&*(.24m/ !')m05-/s &(.  w B0TVm$5[go=notjamifwrdthennextState=stateIdle//endofCRCifjam%timeoutthennextState=stateIdle//catastropheendcase]default:nextState=stateIdle]data>>Data.nextState=nextStatedata>>Data.notIdle=nextStatenestateIdle?low,highdata>>Data.idle=nextStateeqstateIdle?high,lowdata>>Data.done=(nextStateeqstateIdle¬jam)?low,highdata>>Data.load=load?high,lowdata>>Data.abrt=jam?low,highdata>>Data.go=go?high,low] //-----------------------------------------------------------------------------------------andCtrl(addr,data)be//-----------------------------------------------------------------------------------------[structureAddr:[blankbit11Instrbit5]structureData:[BufWEbitRBufCEbit//lowtrueTBufCEbit//lowtrueCReadbit//lowtruePWritebit//lowtruePReadbit//lowtrueTWritebit//lowtrueRReadbit//lowtrueRxOverflowbitTxTimeoutbitRxInterruptbitQEmptybitAckbit//lowtrueResumebitCarryInbitDestHighbitDestLowbit2Functionbit3Sourcebit3BRegbit4ARegbit4Branchbit3qg/Ep_,][/# ""[*.0eZ6/s &(Z6. XVU?BcbHSBPINu#s%d +x.qL~c!b#R )f,KR9 "$* +.14IY"H!F\  DC Af[?l L>[B B'(BK0&B%HB)#B!B  RB BBB' BeBBmBR7oBB BsX xB<! Bx TVm$7timer=9random=10 //BranchConditionCodes(CC)Never=0NonZero=1Zero=2NoCarry8=3Positive=4Negative=5Equal=6Always=7//2901FunctionsRplusS=0SminusR=1RminusS=2RorS=3RandS=4NotRandS=5RxorS=6RxnorS=7//2901SourcesAQ=0AB=1ZQ=2ZB=3ZA=4DA=5DQ=6DZ=7//2901DestinationsQReg=0Nop=1RamA=2RamF=3RamQD=4RamD=5RamQU=6RamU=7]letNext,Branch=0,NeverletCarryIn,Function,Source=nil,nil,nilletAReg,BReg,Destination=nil,nil,nilletResume,Ack,QEmpty=false,false,falseletRxInterrupt,TxTimeout,RxOverflow=false,false,falseletRRead,TWrite,PRead,PWrite,CRead=false,false,false,false,falseletTBufCE,RBufCE,BufWE=false,false,false qg/Ep_7B]BbH[ZAB'g"XBhMVB7UJBxSBQBbGPTB NBD)MB IB'mHB FgB5DB5CBApB?B>!BkB-B+B(B'm &B8%QBkP#B"Bk [BB BdBBnt24t"#&U( !v#[%(.xV "%)  !* (*.X1) %*A,&/376:G s"h$M'+] STVm$8switchonaddr<KS "g% -9/I:HF]DB0D "PCAf"$).Y0>? "g&' -/k>:4+ "g% -O/42:0/5-+B0+';*k.**> (&"$+2/1%H(!% ,.# "!r R:\B0\-#p$)-/v "$).Y0>e "& .N03:oB0- ')  y"$(-e/J  "g& -/TVm$9RBufCE,BufWE,CRead=true,true,trueNext=RxEnd3endcase]caseRxEnd3://rBase_rPut;RxBuf[rPut]_Latch;QEmpty[CarryIn=low;Function=RorS;Source=ZAAReg=rPut;BReg=rBase;Destination=RamFRBufCE,BufWE,CRead=true,true,trueQEmpty=trueNext=RxEnd4endcase]caseRxEnd4://rPut_rPut+1;Return[CarryIn=high;Function=RplusS;Source=ZBAReg=spare;BReg=rPut;Destination=RamFBranch=Alwaysendcase] caseRxReady://Test(rPut-rGet)mod2^11;SetRxOverflow(EQ);Return(EQ);Ack[CarryIn=low;Function=RminusS;Source=ABAReg=rPut;BReg=rGet;Destination=NopRxOverflow,Ack=true,trueBranch=EqualNext=RxReady1endcase]caseRxReady1://count_count+1[CarryIn=high;Function=RplusS;Source=ZBAReg=spare;BReg=count;Destination=RamFNext=RxReady2endcase]caseRxReady2://RxBuf[rPut]_Rx;rPut_rPut+1;Return[CarryIn=high;Function=RplusS;Source=ZAAReg=rPut;BReg=rPut;Destination=RamARBufCE,BufWE,RRead=true,true,trueBranch=Alwaysendcase]casePortReadReq://Port_RxBuf[rGet][CarryIn=low;Function=RorS;Source=ZBAReg=spare;BReg=rGet;Destination=NopRBufCE,PWrite=true,trueqg/Ep_, "$'+]:[Z6XB0X-#M$(c 016VU?"$(-e/JS(!& -o/TQ "$'+PI^CN:LKSIB0I-"$+)HF\~#f%K*/ 1D "g% -O/4CrAf?>(~#f%K*/ 1& "g& ./%H:#! QB0 Q %4&)x,.3~#f%K*/ 1[(!%a ,. "$'+ reoB0 o-"$  "$(-e/J x "g&' -/k sX"TVm$&10Next=PortReadReq1endcase]casePortReadReq1://Test(rGet-Rbase)mod2^11;ClearRxInterrupt(EQ);Return(EQ)[CarryIn=low;Function=RminusS;Source=ABAReg=rGet;BReg=rBase;Destination=NopRxInterrupt=trueBranch=EqualNext=PortReadReq2endcase]casePortReadReq2://rGet_rGet+1;Goto(Idle)[CarryIn=high;Function=RplusS;Source=ZBAReg=spare;BReg=rGet;Destination=RamFNext=Idleendcase] casePortWriteReq://Test(tPut);TxBuf[tPut]_Port;Return(Z);Resume(PortStart)[CarryIn=low;Function=RorS;Source=ZBAReg=PortStart;BReg=tPut;Destination=NopTBufCE,BufWE,PRead=true,true,trueResume=trueBranch=ZeroNext=PortWriteReq1endcase]casePortWriteReq1://tPut_tPut-1;Return(NZ);Goto(TxStart);Resume(PortStart3)[CarryIn=low;Function=SminusR;Source=ZBAReg=PortStart3;BReg=tPut;Destination=RamFResume=trueBranch=NonZeroNext=TxStartendcase]casePortStart://tBase_DataBus[CarryIn=low;Function=RorS;Source=DZAReg=spare;BReg=tBase;Destination=RamFNext=PortStart1endcase]casePortStart1://tPut_tBase[qg/Ep_,: ][Z6B0 Z6-*_-1OX VU@"$+2/1S_ )"&G -/Q qVPIrN: LKSIB0 I-"$a*2 HF]~#f%K*/ 1D "g&' -/kC:Af?>$&&* 2 (&%H"$+2/1# #f%K( 02! Rr:\ B0  !&"e"$(-e/J "g& -/o:   yB0 y w" TVm$11CarryIn=low;Function=RorS;Source=ZAAReg=tBase;BReg=tPut;Destination=RamFNext=PortStart2endcase]casePortStart2://mask_0(maskisinQregister)[CarryIn=low;Function=RandS;Source=ZQAReg=spare;BReg=spare;Destination=QRegNext=PortStart3endcase]casePortStart3://retry_0[CarryIn=low;Function=RandS;Source=ZBAReg=spare;BReg=retry;Destination=RamFNext=PortStart4endcase]casePortStart4://timer_0;Return[CarryIn=low;Function=RandS;Source=ZBAReg=spare;BReg=timer;Destination=RamFBranch=Alwaysendcase] caseTxStart://tGet_tBase;Goto(TxReady)[CarryIn=low;Function=RorS;Source=ZAAReg=tBase;BReg=tGet;Destination=RamFNext=TxReadyendcase]caseTxReady://Tx_TxBuf[tGet];tGet_tGet-1;Ack;Goto(Idle)[CarryIn=low;Function=SminusR;Source=ZAAReg=tGet;BReg=tGet;Destination=RamATBufCE,TWrite=true,trueAck=trueNext=Idleendcase]caseTxAbort://mask_ShiftLeft(mask);Ack[CarryIn=low;Function=RorS;Source=ZQAReg=spare;BReg=spare;Destination=RamQUAck=trueNext=TxAbort1endcaseqg/Ep_,"$(-e/J] "r% -D/)[: Z6XVB0 V!"V$a(m)+-U?S"$).Y0>Q "g& -/PI: NLKRB0 KR "[IH"$).Y0>F\ "g&2 -/vD: C Af?B0 ?!&"$a>: "g& -/9 r7y54*2B02  )$L 0/4"$(-e/J- "r& -{/`+:*=(%GB0%G!& )V,.26D #!"$+2/1 PI !% -.gM"Z: B0!",m"$(-e/J "g& -/ w: TVm$ 12]caseTxAbort1://retry_random&mask;Return(NZ);Goto(TxStart)[CarryIn=low;Function=RandS;Source=AQAReg=random;BReg=retry;Destination=RamFBranch=NonZeroNext=TxStartendcase]caseIdle://random_random+1;Return(NCY8);Goto(TxTimer)[CarryIn=high;Function=RplusS;Source=ZBAReg=spare;BReg=random;Destination=RamFBranch=NoCarry8Next=TxTimerendcase] caseTxTimer://Test(tGet);Return(Neg)[CarryIn=low;Function=RorS;Source=ZBAReg=spare;BReg=tGet;Destination=NopBranch=NegativeNext=TxTimer1endcase]caseTxTimer1://timer_timer-1;Return(Z);SetTxTimeout(Z);Resume(TxTimer4)[CarryIn=low;Function=SminusR;Source=ZBAReg=TxTimer4;BReg=timer;Destination=RamFResume,TxTimeout=true,trueBranch=ZeroNext=TxTimer2endcase]caseTxTimer2://Test(retry);Return(Z)[CarryIn=low;Function=RorS;Source=ZBAReg=spare;BReg=retry;Destination=NopBranch=ZeroNext=TxTimer3endcase]caseTxTimer3://Retry_Retry-1;Return(NZ);Goto(TxStart)[CarryIn=low;Function=SminusR;Source=ZBAReg=spare;BReg=retry;Destination=RamFBranch=NonZeroNext=TxStartendcaseqg/Ep_,]B0] "['|)- 5I [Z6"$).Y0>X9"#' /0VrU?:SQNB0N  ") 3 LKR~#f%K*/ 1I "g( /`1EHrF\:DC Af?B0? $ >>Data.BufWE=BufWE?high,lowdata>>Data.RBufCE=RBufCE?low,highdata>>Data.TBufCE=TBufCE?low,highdata>>Data.CRead=CRead?low,highdata>>Data.PWrite=PWrite?low,highdata>>Data.PRead=PRead?low,highdata>>Data.TWrite=TWrite?low,highdata>>Data.RRead=RRead?low,highdata>>Data.RxOverflow=RxOverflow?high,lowdata>>Data.TxTimeout=TxTimeout?high,lowdata>>Data.RxInterrupt=RxInterrupt?high,lowdata>>Data.QEmpty=QEmpty?high,lowdata>>Data.Ack=Ack?low,highdata>>Data.Resume=Resume?high,lowdata>>Data.CarryIn=CarryIndata>>Data.DestHigh=Destinationrshift2data>>Data.DestLow=Destinationdata>>Data.Function=Functiondata>>Data.Source=Sourcedata>>Data.BReg=BRegdata>>Data.AReg=ARegdata>>Data.Branch=Branchdata>>Data.Next=Nextxor20b]qg/Ep_,]B0] ";$b[Z6"$*J.0XI !% -.VrU@SQBPJN##&LaF$o'hKT?$$,'%IcH"t%mHy^"%F^7"%Dt"%CoT"%Ah l (,:? '+>i N (+/7v-+j*A2!(FTVm$S HELVETICALAUREL/ y#@' + / 2j/53t>P[Ivy]Sun>Sun-Proms.bcpl"Friday, March 29, 1985 9:30 am PST