From: SMTP%"DSJ@WKUVX1.WKU.EDU" 7-FEB-1995 12:49:04.51 To: EVERHART CC: Subj: DECEMBER94.CSR From: DSJ-Mgr@WKUVX1.WKU.EDU Message-Id: <199502071725.MAA23760@mx2.smtp.psi.net> X-FileServer: Digital Systems Journal File Server Date: Tue, 07 Feb 1995 11:25:02 CST Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> Reply-To: DSJ@WKUVX1.WKU.EDU Subject: DECEMBER94.CSR To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : CSR $! By : Hunter Goatley $! Date : 4-JAN-1995 09:15:49.24 $! Using: VMS_SHARE 8.5-1, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! To unpack this archive: $! Minimum of VMS 4.4 (VAX) / OpenVMS 1.0 (Alpha) is required. $! Remove the headers of the first part, up to `cut here' line. $! Execute file as a command procedure. $! $! The following file(s) will be created after unpacking: $! 1. CSR.DSJ;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f="SYS$SCRATCH:."+f$getjpi("","PID")+";" $ if f$trnlnm("SHARE_UNPACK") .nes. "" then $ - f=f$parse("SHARE_UNPACK_TEMP",f) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack:subroutine!P1=file,P2=chksum,P3=attrib,P4=size,P5=fileno,P6=filetotal $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(CURRENT_BUFFER);DELETE(m);EXITIF INDEX( ERASE_LINE,"-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE; PROCEDURE ProcessLine LOCAL c,s,l,b,n,p;s := ERASE_LINE;c := SUBSTR(s,1,1);s := s-c;IF c = "X" THEN SPLIT_LINE; ENDIF;MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1);p := p+1;CASE c FROM ' ' TO '`' ['`'] : COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[' ']: p:=p+1;[INRANGE,OUTRANGE] : COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE;PROCEDURE Decode(b)LOCAL m; POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m); IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")=1 THEN SkipPartSep;ELSE ProcessLine; MOVE_HORIZONTAL(1);ENDIF;ENDLOOP;ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);t:="0123456789ABCDEF";f:=GET_INFO( COMMAND_LINE,"file_name");o:=CREATE_BUFFER(f,f);Decode(o);WRITE_FILE(o, GET_INFO(COMMAND_LINE,"output_file"));QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl='f' 'f'-1 'f' $ fa=f$getdvi(f$parse(f),"ALLDEVNAM") $ Pa=f$getdvi(f$parse(P1),"ALLDEVNAM") $ if fa .eqs. Pa then $ rename &f 'f$parse(P1)' $ if fa .nes. Pa then $ copy &f 'f$parse(P1)' $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' X`20`20`20`20`20IO_ADDR`20=`20`5EX30001234`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20;`20Example`20I/O`20address X`20`20`20`20`20PFN`20`20`20=`20IO_ADDR`20/`20512`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20Compute`20the`20PFN`20of`20IO_ADDR X`20`20`20`20`20OFFSET=`20IO_ADDR`20`26`20VA$M_BYTE`20`20`20`20`20`20`20`20`20; V`20Compute`20byte`20offset`20of`20IO_ADDR X`20`20`20`20`20PTE_BITS=`20PTE$M_VALID!PTE$C_KW!PTE$C_KOWN X X`20`20`20`20`20MOVL`20`20`20`20`20`20`20#1,R2`09`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;`20Ask`20for`201`20page X`20`20`20`20`20JSB`20`20`20`20`20`20`20`20G`5ELDR$ALLOC_PT`20`20`20`20`20`20 V`20`20`20`20`20;`20Allocate`20an`20SPTE X`20`20`20`20`20BLBC`20`20`20`20`20`20`20R0,`20`20`20`20`20`20 V`20;`20`20Failed`20-`20take`20error`20exit X`20`20`20`20`20MOVL`20`20`20`20`20`20`20R1,R3`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;`20Keep`20SPTE`20address`20in`20R3 X`20`20`20`20`20SUBL2`20`20`20`20`20`20G`5EMMG$GL_SPTBASE,R1`20`20`20`20`20`20; V`20Compute`20offset`20in`20page`20table X`20`20`20`20`20ASHL`20`20`20`20`20`20`20#,R1,R1`20`20`20`20`20; V`20PTE`20offset`20to`20byte`20offset X`20`20`20`20`20BISL2`20`20`20`20`20`20#VA$M_SYSTEM,R1`20`20`20`20`20`20`20`20 V`20`20;`20Make`20into`20S0`20address X X`20`20`20`20`20;`20R1`20now`20has`20the`20S0`20address`20of`20the`20page X`20`20`20`20`20;`20R3`20has`20the`20S0`20address`20of`20the`20PTE`20mapping`20 Vthe`20page X X`20`20`20`20`20MOVL`20`20`20`20`20`20`20#PFN,R2`09`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;`20Move`20PFN`20into`20R0 X`20`20`20`20`20BISL`20`20`20`20`20`20`20#PTE_BITS,R2`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20Set`20PTE`20bits X`20`20`20`20`20INVALIDATE_TB`20`20R1,- X`20`20`20`20`20`20`20`20`20`20INST1=`20`20`20`20`20 V`20`20`20;`20Set`20up`20the`20page X`20`20`20`20`20MOVB`20`20`20`20`20`20`20OFFSET(R1),R5`20`20`20`20`20`20`20`20 V`20`20`20`20;`20Read`20the`20BYTE`20at`20IO_ADDR X X== X X X`20`20`20`20`20IO_ADDR`20=`20`5EX30001234 X`20`20`20`20`20PTE_BITS=PTE$M_VALID!PTE$M_ASM!`20- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20PTE$M_WINDOW!PTE$C_KW!PTE$C_KOWN X X`20`20`20`20`20MOVL`20`20`20`20`20`20`20#1,R2`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;`20Ask`20for`201`20page X`20`20`20`20`20JSB`20`20`20`20`20`20`20`20LDR$ALLOC_PT`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20Allocate`20the`20SPTE X`20`20`20`20`20BLBC`20`20`20`20`20`20`20R0,`20`20`20`20`20`20 V`20;`20`20Failed`20-`20take`20error`20exit X`20`20`20`20`20MOVL`20`20`20`20`20`20`20R1,R3`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20;`20Keep`20SPTE`20address`20in`20R3 X`20`20`20`20`20SUBL2`20`20`20`20`20`20MMG$GL_SPTBASE,R1`20`20`20`20`20`20`20 V`20;`20Compute`20offset`20into`20page`20table X`20`20`20`20`20MOVL`20`20`20`20`20`20`20MMG$GL_PTE_OFFSET_TO_VA,R0`20`20`20`20 V;`20Get`20shift`20count X`20`20`20`20`20EVAX_SLL`20`20`20R1,R0,R1`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20PTE`20offset`20to`20byte`20offset X`20`20`20`20`20BISL2`20`20`20`20`20`20#VA$M_SYSTEM,R1`20`20`20`20`20`20`20`20 V`20`20;`20Make`20into`20S0`20virtual`20address X X`20`20`20`20`20;`20R1`20now`20has`20the`20S0`20address`20of`20the`20page X`20`20`20`20`20;`20R3`20now`20has`20the`20S0`20address`20of`20the`20PTE`20mapp Ving`20the`20page X X`20`20`20`20`20MOVL`20`20`20`20`20`20`20#IO_ADDR,R0`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20Get`20physical`20address`20into`20R0 X`20`20`20`20`20MOVL`20`20`20`20`20`20`20MMG$GL_VPN_TO_VA,R2`20`20`20`20`20`20; V`20Get`20PFN`20to`20VA`20shift`20count X`20`20`20`20`20EVAX_SRL`20`20`20R0,R2,R2`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20Get`20PFN`20into`20R2 X`20`20`20`20`20EVAX_SLL`20`20`20R2,PTE$V_PFN,R2`20`20`20`20`20`20`20`20`20`20; V`20Move`20into`20position`20for`20PTE X`20`20`20`20`20EVAX_OR`20`20`20`20R2,#PTE_BITS,(R3)`20`20`20`20`20`20`20`20; V`20Create`20PTE`20in`20page`20table X`20`20`20`20`20TBI_SINGLE`20R1`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;`20Invalidate`20that`20virtual`20page X`20`20`20`20`20MOVL`20`20`20`20`20`20`20MMG$GL_BWP_MASK,R2`20`20`20`20`20`20 V`20;`20Get`20byte-within-page`20mask X`20`20`20`20`20EVAX_AND`20`20`20R0,R2,R2`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20;`20Get`20byte`20offset`20into`20R2 X`20`20`20`20`20ADDL3`20`20`20`20`20`20R1,R2,R0`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20;`20Base`20page`20VA`20+`20offset`20=`20address X`20`20`20`20`20MOVB`20`20`20`20`20`20`20(R0),R5`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20;`20Get`20the`20I/O`20register X X== X X`20`20`20`20`20DPTAB`20`20`20`20`20NAME=XXDRIVER,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20STEP=2,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20UCB_CRAMS=12,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20SMP=YES,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20ADAPTER=EISA,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20MAXUNITS=8,- X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20UCBSIZE=UCB$K_XX_LENGTH X X== X X X#include`20`20cramdef`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Define`20CRAM$`20symbols`20*/ X#include`20`20ucbdef`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Define`20UCB$`20symbols`20*/ X#include`20`20vms_drivers`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20/*`20Driver`20support`20macros`20*/ X X/*`20Define`20some`20useful`20types`20*/ X Xtypedef`20unsigned`20short`20int`20WORD`20`20`20`20`20`20`20`20`20/*`20Define V`20a`20WORD`20(16`20bits)`20*/ Xtypedef`20unsigned`20char`20BYTE;`09`20`20`20`20`20`20`20`20/*`20Define`20a`20 VBYTE`20(8`20bits)`20*/ X X/*`20Define`20constants`20specific`20to`20this`20driver`20*/ X Xenum`20`7B`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Miscellaneous`20constants:`20*/ X`20`20`20`20`20NUMBER_CRAMS=`20`20`202`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Number`20of`20CRAMs`20needed`20*/ X`7D; X X/*`20Define`20external`20driver`20references`20*/ X Xextern`20`20DDT`20driver$ddt;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20/*`20Prototype`20DDT`20*/ Xextern`20`20DPT`20driver$dpt;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20/*`20Prototype`20DPT`20*/ X X/*`20Shortcuts`20for`20some`20of`20the`20external`20references`20*/ X X#define`20_ddt`20`20`20driver$ddt`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V/*`20Abbreviation`20for`20DDT`20*/ X#define`20_dpt`20`20`20driver$dpt`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V/*`20Abbreviation`20for`20DPT`20*/ X X/*`20Offsets`20for`20control`20block`20registers`20*/ X X#define`20REG_ALT_STS`20`20`20`20`20`200x3f6`20`20`20`20`20`20`20`20`20`20/* V`20READ:`20Alternate`20status`20*/ X#define`20REG_DEV_CTL`20`20`20`20`20`200x3f6`20`20`20`20`20`20`20`20`20`20/* V`20WRITE:Device`20control`20*/ X X/*`20Device`20control`20register`20bits`20*/ X Xenum`20ctl_masks`20`7B X`20`20`20`20`20CTL_M_nIEN=`200x01,`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Interrupt`20enable`20*/ X`20`20`20`20`20CTL_M_SRST=`200x02,`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Software`20reset`20bit`20*/ X`20`20`20`20`20CTL_M_MBO`20=`200x04,`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Must`20Be`20One`20*/ X`20`20`20`20`20STS_M_BSY`20=`200x80`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Busy`20*/ X`7D; X X/*`20CRAM`20initialization`20table.`20`20This`20table`20contains`20the`20CSR V`20*/ X/*`20offset,`20the`20CRAM`20command`20and`20the`20byte`20lane`20shift`20value. V`20*/ X Xtypedef`20struct`20`7B X`20`20`20`20`20int`20cmd;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20/*`20Command`20index`20*/ X`20`20`20`20`20int`20offset;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Register`20offset`20*/ X`20`20`20`20`20int`20shift;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Byte`20lane`20shift`20count`20*/ X`7D`20cram_item; X X/*`20Define`20the`20indices`20in`20this`20(and`20the`20UCB)`20table`20*/ X X#define`20RD_ALT_STS`20`200 X#define`20WT_DEV_CTL`20`201 X X#define`20cram_def(cmd,csr)`20CRAMCMD$K_##cmd##32,REG_##csr,((REG_##csr`263)<< V3) X Xcram_item`20`20`20`20`20`20`20cram_init`5BNUMBER_CRAMS`5D`20=`20`7B X`20`20`20`20`20cram_def(RDBYTE,ALT_STS),`20`20`20`20`20`5C X`20`20`20`20`20cram_def(WTBYTE,DEV_CTL)`20`20`20`20`20`20`5C X`20`20`20`20`20`7D; X X/*`20Define`20Device-Dependent`20Unit`20Control`20Block`20with`20extensions`20 V*/ X Xtypedef`20struct`20`7B X`20`20`20`20`20DT_UCB`20`20`20`20`20`20ucb$r_dtucb;`20`20`20`20`20`20`20`20`20 V`20`20/*`20Generic`20UCB`20*/ X`20`20`20`20`20CRAM`20`20`20`20`20`20`20`20*ucb$ps_crams`5BNUMBER_CRAMS`5D;`20 V`20`20`20/*`20Table`20of`20CRAMs`20*/ X`20`7D`20DQ_UCB; X X#define`20ucb$r_dq_ucb`20ucb$r_dtucb.ucb$r_dpucb.ucb$r_erlucb.ucb$r_ucb X#define`20baseucb`20ucb->ucb$r_dq_ucb X X/*`20Define`20macros`20for`20bit`20testing`20*/ X X#define`20IS_SET(reg,bits)`20(`20(reg`20`26`20bits)`20==`20bits`20) X#define`20IS_CLEAR(reg,bits)`20(`20(reg`20`26`20bits)`20==`200`20) X X/*`20Define`20macros`20for`20status`20testing`20*/ X X#define`20$SUCCESS(code)`20`20(`20(code`20`26`20STS$M_SUCCESS)`20==`201) X#define`20$FAIL(code)`20`20`20`20`20(`20(code`20`26`20STS$M_SUCCESS)`20==`200) V X X/*`20Define`20forward`20routines`20*/ X XBYTE`20inp(int`20reg,DQ_UCB`20*ucb); XWORD`20inpw(int`20reg,DQ_UCB`20*ucb); Xvoid`20out(int`20reg,`20BYTE`20data,DQ_UCB`20*ucb); Xvoid`20outw(int`20reg,`20WORD`20data,DQ_UCB`20*ucb); X X/*`20DRIVER$INIT_TABLES`20-`20Initialize`20Driver`20Tables`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20This`20routine`20is`20used`20to`20initialize`20the`20driver`20tables.`20T Vhe`20`20`20`20*/ X/*`20DPT,`20DDT`20and`20FDT`20structures`20are`20set`20up.`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20Return`20value:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20*/ X/*`20`20`20`20`20`20`20`20SS$_NORMAL`20`20`20`20`20`20tables`20successfully`20 Vset`20up`20`20`20`20`20`20`20`20`20`20`20`20*/ X Xint`20driver$init_tables()`20`20`7B X X`09/*`20.`20.`20.`20*/ X X`20`20`20`20ini_dpt_ucb_crams(`26_dpt,NUMBER_CRAMS);`20`20`20/*`20Ask`20for`20 VCRAMs`20*/ X X`09/*`20.`20.`20.`20*/ X X`20`20`20`20return`20SS$_NORMAL;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Return`20with`20success`20*/ X`7D X X/*`20UNIT_INIT_FORK`20-`20Unit`20Initialization`20Fork`20Routine`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20This`20fork`20routine`20does`20the`20bulk`20of`20the`20unit`20init`20work V.`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20fr3`20`20`20`20`20Fork`20routine`20parameter`20(unus Ved)`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20idb`20`20`20`20`20pointer`20to`20the`20IDB`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20`20`20`20`20`20`20`20ucb`20`20`20`20`20pointer`20to`20the`20UCB`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20None.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20Return`20value:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X Xvoid`20unit_init_fork(void`20*fr3,`20IDB`20*idb,`20DQ_UCB`20*ucb)`20`7B X XCRAM`20`20`20`20*cram_ptr;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Pointer`20to`20a`20CRAM`20*/ Xint`20`20`20`20`20index;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Index`20for`20CRAM`20list`20*/ XADP`20`20`20`20`20*adp;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Address`20of`20ADP`20*/ Xint`20`20`20`20`20status;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Return`20status`20value`20*/ X`09 X/*`20Set`20up`20all`20of`20the`20CRAMs`20that`20were`20allocated`20*/ X X`20`20`20`20index`20=`200;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Init`20the`20CRAM`20index`20*/ X`20`20`20`20adp`20=`20baseucb.ucb$ps_adp;`20`20`20`20`20`20`20`20`20`20`20/* V`20Get`20ADP`20address`20*/ X`20`20`20`20cram_ptr`20=`20baseucb.ucb$ps_cram;`20`20`20`20`20/*`20Point`20to V`20first`20CRAM`20*/ X X`20`20`20`20for`20(;`20cram_ptr`20!=`200;`20cram_ptr`20=`20cram_ptr->cram$l_fl Vink)`20`7B X`20`20`20`20`20`20`20`20ucb->ucb$ps_crams`5Bindex`5D`20=`20cram_ptr;`20`20`20 V`20/*`20Set`20up`20UCB`20*/ X`20`20`20`20`20`20`20`20status`20=`20ioc$cram_cmd(cram_init`5Bindex`5D.cmd, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20cram_init`5Bindex`5D.offset, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20adp,`20cram_ptr,`200); X`20`20`20`20`20`20`20`20if`20($FAIL(status))`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Check`20for`20failure`20*/ X`20`20`20`20`20`20`20`20`20`20`20`20return;`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20/*`20Return`20if`20error`20*/ X`20`20`20`20`20`20`20`20cram_ptr->cram$v_der`20=`201;`20`20`20`20`20`20`20/* V`20Disable`20error`20reporting`20*/ X`20`20`20`20`20`20`20`20index++;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Bump`20index`20*/ X`20`20`20`20`7D X X`20`20`20`20return;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20/*`20`20and`20return`20*/ X`7D X X/*`20reset_ctrl`20-`20Reset`20the`20controller`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20This`20routine`20issues`20a`20RESET`20to`20the`20controller.`20`20It`20th Ven`20`20`20`20`20`20*/ X/*`20waits`20for`20the`20BUSY`20bit`20to`20clear.`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20ucb`20`20`20`20`20pointer`20to`20UCB`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20*/ X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20status`20value`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20*/ X/*`20`20`20`20`20`20SS$_NORMAL`20`20`20`20successful`20reset`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20SS$_CTRLERR`20`20`20controller`20failed`20to`20RESET`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X Xint`20reset_ctrl(DQ_UCB`20*ucb)`20`7B X Xint`20`20dev_value;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20/*`20DEV_CTL`20value`20to`20write`20*/ XBYTE`20sts;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Status`20byte`20*/ Xint`20`20loop;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Loop`20counter`20*/ X X/*`20Set`20and`20clear`20the`20RESET`20bit.`20`20It's`20edge`20triggered`20*/ V X X`20`20`20`20dev_value`20=`20CTL_M_MBO`20`7C`20CTL_M_SRST`20`7C`20CTL_M_nIEN; V`20/*`20Set`20bits`20*/ X`20`20`20`20out(WT_DEV_CTL,dev_value,ucb);`20`20`20`20`20`20/*`20Set`20the`20r Veset`20bit`20*/ X`20`20`20`20dev_value`20=`20CTL_M_MBO;`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20/*`20Turn`20off`20RESET`20and`20ints`20on`20*/ X`20`20`20`20out(WT_DEV_CTL,dev_value,ucb);`20`20`20`20`20`20/*`20Set`20the`20r Veset`20bit`20*/ X X/*`20Check`20to`20see`20if`20the`20drive`20is`20ready`20right`20now`20*/ X X`20`20`20`20sts`20=`20inp(RD_ALT_STS,ucb);`20`20`20`20`20`20`20`20`20`20/*`20G Vet`20the`20status`20byte`20*/ X`20`20`20`20if`20(`20IS_CLEAR(sts,STS_M_BSY))`20`20`20`20`20`20`20/*`20If`20no Vt`20busy,`20then`20*/ X`20`20`20`20`20`20`20`20return`20SS$_NORMAL;`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Drive`20is`20ready`20-`20exit`20*/ X X`09/*`20.`20.`20.`20*/ X X`20`20`20`20return`20SS$_NORMAL;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Exit`20with`20success`20*/ X X`7D X X/*`20INP`20-`20This`20routine`20is`20used`20to`20read`20a`20byte`20from`20a`20 VCSR.`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20reg`20`20`20`20`20register`20index`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V*/ X/*`20`20`20`20`20`20`20`20ucb`20`20`20`20`20pointer`20to`20the`20UCB`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20Return`20value:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20*/ X/*`20`20`20`20`20`20`20`20byte`20of`20data`20read`20from`20the`20CSR`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X XBYTE`20inp(int`20reg,DQ_UCB`20*ucb)`20`7B X XCRAM`20*cram_ptr;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Pointer`20to`20CRAM`20*/ Xint`20`20status;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Routine`20status`20*/ XBYTE`20data;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Data`20byte`20*/ X X`20`20`20`20cram_ptr`20=`20ucb->ucb$ps_crams`5Breg`5D;`20`20/*`20Point`20to`20 Vthe`20CRAM`20*/ X`20`20`20`20status`20`20`20=`20ioc$cram_io(cram_ptr);`20`20`20/*`20Read`20the V`20byte`20*/ X`20`20`20`20data`20=`20(cram_ptr->cram$q_rdata`20>>`20cram_init`5Breg`5D.shift V)`20`26`200xFF; X`20`20`20`20return`20data;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20/*`20Return`20the`20value`20*/ X`7D X X/*`20OUT`20-`20This`20routine`20is`20used`20to`20write`20a`20byte`20to`20a`20C VSR.`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20reg`20`20register`20index`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V*/ X/*`20`20`20`20`20`20`20`20data`20data`20byte`20to`20be`20written`20to`20the`20 VCSR`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20ucb`20`20pointer`20to`20the`20UCB`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X Xvoid`20out(int`20reg,BYTE`20data,DQ_UCB`20*ucb)`20`7B X XCRAM`20*cram_ptr;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Pointer`20to`20the`20CRAM`20*/ Xint`20`20status;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Returned`20status`20*/ X X`20`20`20`20cram_ptr`20=`20ucb->ucb$ps_crams`5Breg`5D;`20`20/*`20Get`20correct V`20CRAM`20*/ X`20`20`20`20cram_ptr->cram$q_wdata`20=`20data`20<<`20cram_init`5Breg`5D.shift; V X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20Position`20data`20*/ X`20`20`20`20status`20`20`20=`20ioc$cram_io(cram_ptr);`20`20`20/*`20Perform`20t Vhe`20write`20*/ X`7D X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20 X== X X X#include`20`20ucbdef`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Define`20UCB$`20symbols`20*/ X#include`20`20vms_drivers`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20/*`20Driver`20support`20macros`20*/ X X/*`20Define`20some`20useful`20types`20*/ X Xtypedef`20unsigned`20short`20int`20WORD`20`20`20`20`20`20`20`20`20/*`20Define V`20a`20WORD`20(16`20bits)`20*/ Xtypedef`20unsigned`20char`20BYTE;`20`20`20`20`20`20`20`20`20`20`20`20`20/*`20D Vefine`20a`20BYTE`20(8`20bits)`20*/ X X/*`20Offsets`20for`20control`20block`20registers`20*/ X X#define`20REG_ALT_STS`20`20`20`20`20`200x3f6`20`20`20`20`20`20`20`20`20`20/* V`20READ:`20Alternate`20status`20*/ X#define`20REG_DEV_CTL`20`20`20`20`20`200x3f6`20`20`20`20`20`20`20`20`20`20/* V`20WRITE:Device`20control`20*/ X#define`20MAP_BYTES`20`20`20`20`20`20`20`200x400`20`20`20`20`20`20`20`20`20`20 V/*`20Number`20of`20bytes`20to`20map`20*/ X X/*`20Device`20control`20register`20bits`20*/ X Xenum`20ctl_masks`20`7B X`20`20`20`20`20CTL_M_nIEN=`200x01,`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Interrupt`20enable`20*/ X`20`20`20`20`20CTL_M_SRST=`200x02,`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Software`20reset`20bit`20*/ X`20`20`20`20`20CTL_M_MBO`20=`200x04,`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Must`20Be`20One`20*/ X`20`20`20`20`20STS_M_BSY`20=`200x80`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20Busy`20*/ X`7D; X X/*`20Define`20Device-Dependent`20Unit`20Control`20Block`20with`20extensions`20 V*/ X Xtypedef`20struct`20`7B X`20`20`20`20`20DT_UCB`20`20`20`20`20`20`20`20`20ucb$r_dtucb;`20`20`20`20`20`20 V`20`20/*`20Generic`20UCB`20*/ X`20`20`20`20`20uint64`20`20`20`20`20`20`20`20`20ucb$ps_io_handle;`20`20`20/* V`20I/O`20handle`20*/ X`20`7D`20DQ_UCB; X X#define`20ucb$r_dq_ucb`20ucb$r_dtucb.ucb$r_dpucb.ucb$r_erlucb.ucb$r_ucb X#define`20baseucb`20ucb->ucb$r_dq_ucb X X/*`20Define`20macros`20for`20bit`20testing`20*/ X X#define`20IS_SET(reg,bits)`20(`20(reg`20`26`20bits)`20==`20bits`20) X#define`20IS_CLEAR(reg,bits)`20(`20(reg`20`26`20bits)`20==`200`20) X X/*`20Define`20macros`20for`20status`20testing`20*/ X X#define`20$SUCCESS(code)`20`20(`20(code`20`26`20STS$M_SUCCESS)`20==`201) X#define`20$FAIL(code)`20`20`20`20`20(`20(code`20`26`20STS$M_SUCCESS)`20==`200) V X X/*`20Define`20forward`20routines`20*/ X XBYTE`20inp(int`20reg,`20DQ_UCB`20*ucb); Xvoid`20out(int`20reg,`20BYTE`20data,`20DQ_UCB`20*ucb); X X/*`20UNIT_INIT_FORK`20-`20Unit`20Initialization`20Fork`20Routine`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20This`20fork`20routine`20does`20the`20bulk`20of`20the`20unit`20init`20work V.`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20fr3`20`20`20`20`20Fork`20routine`20parameter`20(unus Ved)`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20idb`20`20`20`20`20pointer`20to`20the`20IDB`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20`20`20`20`20`20`20`20ucb`20`20`20`20`20pointer`20to`20the`20UCB`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20None.`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20Return`20value:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X Xvoid`20unit_init_fork(void`20*fr3,`20IDB`20*idb,`20DQ_UCB`20*ucb)`20`7B X XADP`20`20*adp;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Address`20of`20ADP`20*/ XCRB`20`20*crb;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Address`20of`20CRB`20*/ Xint`20`20node;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Node`20number`20*/ Xuint64`20`20`20`20bus_addr;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Bus`20base`20address`20to`20map`20*/ Xint`20`20status;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Return`20status`20value`20*/ X X/*`20Map`20the`20space`20*/ X X`20`20`20`20adp`20=`20baseucb.ucb$ps_adp;`20`20`20`20`20`20`20`20`20`20`20/* V`20Get`20ADP`20address`20*/ X`20`20`20`20crb`20=`20baseucb.ucb$l_crb;`20`20`20`20`20`20`20`20`20`20`20`20/* V`20Get`20CRB`20address`20*/ X`20`20`20`20node`20=`20crb->crb$l_node;`20`20`20`20`20`20`20`20`20`20`20`20`20 V/*`20Get`20node`20number`20*/ X`20`20`20`20bus_addr`20=`200;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20/*`20Map`20from`20address`200`20*/ X`20`20`20`20status`20=`20ioc$map_io(adp,node,`26bus_addr,MAP_BYTES, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20IOC$K_ VBUS_IO_BYTE_GRAN, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`26ucb V->ucb$ps_io_handle); X`20`20`20`20if`20($FAIL(status))`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Check`20return`20status`20*/ X`20`20`20`20`20`20`20`20return;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20/*`20`20then`20just`20exit`20*/ X`20`20`20`20return;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20/*`20`20and`20return`20*/ X`7D X X/*`20reset_ctrl`20-`20Reset`20the`20controller`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20This`20routine`20issues`20a`20RESET`20to`20the`20controller.`20`20It`20th Ven`20`20`20`20`20`20*/ X/*`20waits`20for`20the`20BUSY`20bit`20to`20clear.`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20ucb`20`20`20`20`20pointer`20to`20UCB`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20*/ X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20status`20value`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20*/ X/*`20`20`20`20`20`20SS$_NORMAL`20`20`20`20successful`20reset`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20SS$_CTRLERR`20`20`20controller`20failed`20to`20RESET`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X Xint`20reset_ctrl(DQ_UCB`20*ucb)`20`7B X Xint`20`20dev_value;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20/*`20DEV_CTL`20value`20to`20write`20*/ XBYTE`20sts;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Status`20byte`20*/ Xint`20`20loop;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Loop`20counter`20*/ X X/*`20Set`20and`20clear`20the`20RESET`20bit.`20`20It's`20edge`20triggered`20*/ V X X`20`20`20`20dev_value`20=`20CTL_M_MBO`20`7C`20CTL_M_SRST`20`7C`20CTL_M_nIEN; V`20/*`20Set`20bits`20*/ X`20`20`20`20out(REG_DEV_CTL,dev_value,ucb);`20`20`20`20`20/*`20Set`20the`20res Vet`20bit`20*/ X`20`20`20`20dev_value`20=`20CTL_M_MBO;`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20/*`20Turn`20off`20RESET`20and`20ints`20on`20*/ X`20`20`20`20out(REGDEV_CTL,dev_value,ucb);`20`20`20`20`20`20/*`20Set`20the`20r Veset`20bit`20*/ X X/*`20Check`20to`20see`20if`20the`20drive`20is`20ready`20right`20now`20*/ X X`20`20`20`20sts`20=`20inp(REG_ALT_STS,ucb);`20`20`20`20`20`20`20`20`20/*`20Get V`20the`20status`20byte`20*/ X`20`20`20`20if`20(`20IS_CLEAR(sts,STS_M_BSY))`20`20`20`20`20`20`20/*`20If`20no Vt`20busy,`20then`20*/ X`20`20`20`20`20`20`20`20return`20SS$_NORMAL;`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Drive`20is`20ready`20-`20exit`20*/ X X`09/*`20.`20.`20.`20*/ X X`20`20`20`20return`20SS$_NORMAL;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20/*`20Exit`20with`20success`20*/ X`7D X X/*`20INP`20-`20This`20routine`20is`20used`20to`20read`20a`20byte`20from`20a`20 VCSR.`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20reg`20`20`20`20`20register`20index`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V*/ X/*`20`20`20`20`20`20`20`20ucb`20`20`20`20`20pointer`20to`20the`20UCB`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ V X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20Return`20value:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20*/ X/*`20`20`20`20`20`20`20`20byte`20of`20data`20read`20from`20the`20CSR`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X XBYTE`20inp(int`20reg,DQ_UCB`20*ucb)`20`7B X XADP`20`20*adp;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Pointer`20to`20ADP`20*/ Xint`20`20status;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Routine`20status`20*/ Xint`20`20data_lw;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20/*`20Returned`20data`20*/ Xint`20`20shift;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Data`20shift`20value`20*/ XBYTE`20data;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Data`20byte`20*/ X X`20`20`20`20adp`20=`20baseucb.ucb$l_adp;`20`20`20`20`20`20`20`20`20`20`20`20/* V`20Get`20the`20ADP`20*/ X`20`20`20`20status`20=`20ioc$read_io(adp,`26ucb->ucb$ps_io_handle, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20reg V,1,`26data_lw);/*`20Read`20the`20byte`20*/ X`20`20`20`20shift`20=`20(reg`20`26`203)`20*`208;`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Compute`20bit`20shift`20*/ X`20`20`20`20data`20=`20(data_lw`20>>`20shift)`20`26`200xFF;`20`20`20/*`20Get V`20data`20into`20low`20byte`20*/ X`20`20`20`20return`20data;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20/*`20Return`20the`20value`20*/ X`7D X X/*`20OUT`20-`20This`20routine`20is`20used`20to`20write`20a`20byte`20to`20a`20C VSR.`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20Input:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20reg`20`20register`20index`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20*/ X/*`20`20`20`20`20`20`20`20data`20data`20byte`20to`20be`20written`20to`20the`20 VCSR`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20ucb`20`20pointer`20to`20the`20UCB`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V*/ X/*`20Output:`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20*/ X/*`20`20`20`20`20`20`20`20none`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20*/ X Xvoid`20out(int`20reg,BYTE`20data,DQ_UCB`20*ucb)`20`7B X XADP`20`20*adp;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20`20/*`20Pointer`20to`20the`20ADP`20*/ Xint`20`20status;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Returned`20status`20*/ Xint`20`20shift;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20`20/*`20Byte`20lane`20shift`20value`20*/ Xint`20`20data_lw;`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20`20`20`20/*`20Data`20to`20be`20written`20*/ X X`20`20`20`20adp`20=`20baseucb.ucb$l_adp;`20`20`20`20`20`20`20`20`20`20`20`20/* V`20Point`20to`20the`20ADP`20*/ X`20`20`20`20shift`20=`20(reg`20`26`203)`20*`208;`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20/*`20Compute`20bit`20shift`20*/ X`20`20`20`20data_lw`20=`20data`20<<`20shift;`20`20`20`20`20`20`20`20`20`20`20 V`20/*`20Position`20data`20*/ X`20`20`20`20status`20=`20ioc$write_io(adp,`26ucb->ucb$ps_io_handle, X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 Vreg,1,`26data_lw);/*`20Write`20the`20data`20*/ X`7D X`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20`20 V`20`20`20`20 $ call unpack CSR.DSJ;1 410785578 "" 41 1 1 $ v=f$verify(v) $ exit