.TITLE CDDUMP ;** .IDENT /V01.00/ ; ; FACILITY: COMMUNICATIONS DRIVER FOR RSX11-M ; ; ABSTRACT: PRIVILEGED TASK TO GIVE STATUS OF CD DRIVER AND TO ; PRINT OUT THE CD DRIVERS TRACE BUFFER ; AND THE PACKET DESCRIPTOR BLOCKS, EACH WITH ITS ; OWN I/O QUEUE. ; ; AUTHOR Vicky White ; Computing Department, ; Fermi National Accelerator Lab ; -- ADAPTED FROM EVMDUMP TASK OF D.R. BOTTERILL ; ; CREATION DATE: JUNE 29TH 1982 ; ; MODIFIED BY: ; ;** .ENABL LSB .NLIST BEX,MD,CND ; ; .MCALL EXIT$S,ALUN$C,SVTK$C,CALLFT,GMCR$,GLUN$C,TR$DEF .MCALL PUSH,POP,UCBDF$,HWDDF$ .GLOBL UNTNUM ;CD UNIT NUMBER (FOR UCB DATA) .MACRO TR$DEF .ASECT .=0 TR.LEN: .BLKW ;SIZE OF EACH ENTRY IN WORDS TR.NUM: .BLKW ;NUMBER OF ENTRIES IN TABLE TR.PTR: .BLKW ;INDEX OF NEXT ENTRY (0-TR.NUM-1) TR.FRZ: .BLKW ;FREEZE FLAG (NON ZERO IF FROZEN) .BLKW 4 ;TO ALIGN ENTRIES ON 8 WORD BOUNDARY TR.TBL: .BLKW ;START OF TABLE .PSECT .ENDM TR$DEF ; ; MACRO TO FORMAT TRACE PRINT ; TR$DEF ;DEFINE FORMAT OF TRACE COMMON UCBDF$ HWDDF$ ; ; ; DATA STRUCTURES ; PSECT TRACEP CONTAINS ONE WORD PER TRACE CODE - ADDRESS IN PSECT ; TRACED ; PSECT TRACED CONTAINS PAIRS OF WORDS TERMINATED BY A 0 ; WORD 1 = ADDRESS IN PSECT TRACEX OF TEXT ; WORD 2 = FORMAT CODE ; .MACRO TRACEM TEXT,FMT .PSECT TRACEX,OVR TRCTXT = . .ASCII / / .ASCIZ \TEXT\ .PSECT TRACED,OVR .WORD TRCTXT,FMT .ENDM TRACEM .MACRO TRCFMT CODE,TX1,F1,TX2,F2,TX3,F3,TX4,F4,TX5,F5,TX6,F6,TX7,F7,TX8,F8 .IIF GT CODE-TRCMAX, TRCMAX=CODE .PSECT TRACED,OVR TRACPT = . TRACEM ,F1 TRACEM ,F2 TRACEM ,F3 TRACEM ,F4 TRACEM ,F5 TRACEM ,F6 TRACEM ,F7 .WORD 0 .PSECT TRACEP,OVR . = TRACEP+<2*CODE>+4 .WORD TRACPT .ENDM TRCFMT ; D = 1 ;FORMAT CODE - MUST O = 2 ;MATCH ORDER OF PROCES T = 3 ;ADDRESS OF TCB F = 4 ;QIO FUNCTION CODE I = 5 ;IDR S = 6 ;DRIVER STATUS ; ; ROUTINES WHICH HANDLE EACH TYPE OF FORMAT ; PROCES::.WORD DUMFMT,DECFMT,OCTFMT,TCBFMT,FUNFMT,IDRFMT,STAFMT MAXPRS = 7 ; ; .PSECT TRACEP,OVR TRACEP = . TRCMAX = 0 ; TRCFMT -2,,O,,O,,O,,O,,0,,O,,O,,O TRCFMT -1,< TRACE END MARKER> TRCFMT 0,< EMPTY>,O TRCFMT 1,<* INTERRUPT,STATE=>,S,,O,,O,,I,,O TRCFMT 2,< INTERRUPT EXIT,FFL>,O,,S TRCFMT 3,< EXIT FROM DRIVER,FFL>,O,,S TRCFMT 4,< FORK,FFL>,O,,S,,S TRCFMT 7,< TIMER EXIT> TRCFMT 8.,< CDCHK,STATE=>,S,,F,,T,,O,,O TRCFMT 9.,< IOFIN,STATE=>,S,,O,,O,< >,O,,O TRCFMT 10.,< IODON,STATE=>,S,,O,,O,< >,O,,O TRCFMT 11.,< IOALT --- NO LONGER USED >,O TRCFMT 12.,< QUEUE I/O> TRCFMT 13.,< CDINI,STATE=>,S,,O,,O,,O TRCFMT 14.,< GET PACKET, UCB>,O,,F,,T,,S TRCFMT 15.,< CDIDLE ,FFL>,O,,O,,S,,O TRCFMT 16.,< IN FORK CODE,FFL>,O,,S,,S TRCFMT 17.,< DQ PACKET>,O,,D TRCFMT 18.,< Q AST TO TASK>,T,,O,< >,O,< >,O,< >,O,< >,O TRCFMT 19.,<* PWRFAIL ,STATE=>,S,,O,,O,,O,,O TRCFMT 20.,<* RESTART PROT. TIMER> TRCFMT 21.,<* LINK DOWN TIMER> TRCFMT 22.,<* TIMEOUT ,STATE=>,S,,O TRCFMT 23.,< CANCEL, STATE=>,S,,T,,O,,O TRCFMT 25.,< QUEUE PACKET>,O TRCFMT 26.,< DEQ PACKET FROM I/O QUEUE>,O,,F,,T,,O,,O TRCFMT 27.,< GARBAGE LINK CODE>,I,,O,,O,,O,,S TRCFMT 28.,< SEND LINK CODE>,I ; ; MACRO TO DEFINE I/O FUNCTION CODES ; .MACRO FUNCTN NFN,FNC .PSECT FUNCTX FUNCTX = . .ASCIZ \FNC\ .PSECT LISTFN . = LISTFN+<2.*^O> .WORD FUNCTX .IIF LT , MAXCOD-<^O> , MAXCOD = ^O .ENDM FUNCTN ; .PSECT LISTFN LISTFN:: MAXCOD = 0 ; ; LEGAL FUNCTION TABLE ; FUNCTN 0, FUNCTN 1, FUNCTN 2, FUNCTN 7, FUNCTN 30, FUNCTN 31, FUNCTN 32, FUNCTN 35, FUNCTN 36, FUNCTN 37, ; ; MACRO TO FORMAT DATA PRINT ; .PSECT DATAPT DATAPT: .MACRO DATAW DESC .NCHR N, .PSECT DATATX P=. .NLIST .REPT 40.-N .ASCII / / .ENDM .LIST .ASCIZ \DESC\ .PSECT DATAPT .WORD P .ENDM DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW DATAW < - > DATAW < - > DATAW < - > DATAW < - > ; ; MACRO TO FORMAT DEVICE TABLE PRINT ; .PSECT DEVPT DEVPT: NDEV =0 .MACRO DEVW LABEL,DESC NDEV =NDEV+1 .NCHR N, .PSECT DEVTX L =. .NLIST .REPT 40.-N .ASCII / / .ENDM .LIST .ASCIZ \DESC\ .PSECT DEVPT .WORD L LABEL: .WORD .ENDM ; DEVW USTS, DEVW SSTS, DEVW SPKT, DEVW DUCBL, .PSECT ; .MACRO STATE,STA,TEXT ; ; MACRO TO GENERATE A TABLE OF 'STATE' WORDS FOLLOWED BY 4 CHARACTER ; ASCII TEXT. TEXT MUST BE PASSED AS FIXED LENGTH TEXT .WORD STA .ASCII /TEXT/ .ENDM ; .PSECT STATBL STATBL: STATE IDLE, STATE ASTQUE, STATE RECPEN, STATE WTLACK, STATE DISCON, STATE WTPTC, STATE WTPTAK, STATE WTSGAK, STATE WTRCWC, STATE TRANSF, STATE WTXMWC, STATE DOWN, STATE STWAIT, STATE FORKED, STATE WAITEM, STAEND: STATE 0, ; .PSECT IDRTBL IDRTBL: STATE EOM, <:EOM> STATE PTC, <:PTC> STATE ACK, <:ACK> STATE REQLK, <:RLK> STATE START, <:STA> STATE SIGNAL, <:SIG> STATE DELAY, <:DEL> IDREND: .PSECT LUNTT =1 LUNCD =2 LENLIN =80. LINE: .BLKB LENLIN AGE: .WORD CAPCB: .WORD GMCR:: GMCR$ ;MCR COMMAND LINE MASKSR::.WORD ; MSKSET = 1 ;SET UP MSKDAT = 2 ;PRINT UCB MSKTRC = 4 ;PRINT TRACE MSKHLP = 40 ;PRINT HELP INFO MSKPRT = 100 ;PRINT ON LP MSKPDB = 200 ;PRINT PCB CHAINS MSKFRZ = 400 ;FREEZE TRACE MSKUNF =1000 ;UNFREEZE TRACE MSKACT = MSKHLP!MSKTRC!MSKDAT!MSKPDB!MSKFRZ!MSKUNF ;ACTION BITS MSKDFT = MSKTRC!MSKDAT!MSKSET ;DEFAULT = TRACE ; ; EACH BIT SET INVOKES CORRESPONDING ROUTINE ; BITS HANDLED IN ORDER IN TABLE ; MSKTAB:: .WORD MSKPRT,ASNLP ;CHANGE TO LP: .WORD MSKSET,SETUP ;SET UP .WORD MSKTRC,EVMTRC ;LIST TRACE .WORD MSKDAT,EVPDAT ;UNFREEZE TRACE .WORD MSKHLP,HELP ;PRINT HELP INFO .WORD MSKPDB,PDBLST ;LIST PCB CHAIN .WORD MSKFRZ,FREEZE ;FREEZE TRACE .WORD MSKUNF,UNFREZ ;UNFREEZE TRACE .WORD 0 ;END OF TABLE ; ; RECOGNISED MCR COMMANDS ; EACH LETTER CAN SET SEVERAL BITS TO INVOKE SEVERAL ROUTINES ; BUT EACH ROUTINE IS ONLY INVOKED ONCE, EVEN IF BIT SET BY ; SEVERAL COMMANDS ; CMDTAB:: .ASCIZ /A/ .WORD MSKDAT!MSKTRC!MSKSET ;PRINT DATA AND TRACE .ASCIZ /D/ .WORD MSKDAT!MSKSET ;PRINT DATA .ASCIZ /H/ .WORD MSKHLP .ASCIZ /L/ .WORD MSKPRT ;SELECT PRINT ON LP: .ASCIZ /T/ .WORD MSKTRC!MSKSET ;LIST TRACE .ASCIZ /P/ .WORD MSKPDB ;PRINT PCB CHAIN .ASCIZ /F/ ;FREEZE TRACE .WORD MSKFRZ .ASCIZ /U/ .WORD MSKUNF ;UNFREEZE TRACE .ASCIZ / / .WORD 0 .ASCIZ /,/ .WORD 0 .WORD 0 ;END OF TABLE ; ; ; ; DEFINE FORMAT OF TRACE TABLE LENTRC =8192. TR$SIZ: .BLKW ;WORDS/ENTRY TR$NUM: .BLKW ;NUMBER OF ENTRIES TR$PTR: .BLKW ;INDEX (0 TO NUM-1) OF NEXT ENTRY TRCFRZ: .BLKW ;IF NON ZERO TRACE FROZEN DUMMY: .BLKW 4 ;TO ALIGN TABLE ENTRIES ON 8 WORD ;BOUNDARY FOR EASY ANALYSIS ON CRASH TR$TAB: .BLKB LENTRC ;TABLE ; TR$FLG: .WORD ;IF SET GOT COPY OF TRACE TABLE ; ; COPY OF UCB OF CD DRIVER ; LENDAT = 200 DVDATA: .BLKB LENDAT ; .PAGE .SBTTL MAIN PROGRAM ENTRY:: CALLFT FMTLUN,#LUNTT ;SET LUN FOR FMT ROUTINES CALLFT FMTBUF, ;SET FMT BUFFER CALL CHKSYS ;Q.CORRECT SYSTEM BCS 400$ ;CS NO CALL GETDAT TST R0 ;CHECK IF OK BR 499$ 340$: CALLFT FMTA,<<'DRIVER NOT LOADED>> 380$: CALL FMTOUT 400$: EXIT$S ; ; GET MCR COMMAND LINE AND DECODE ; 499$: CALL GETTRC ;COPY ENTIRE TRACE DIR$ #GMCR ;GET MCR COMMAND LINE BCS 76$ ;CS NONE MOV $DSW,R1 ;LENGTH OF COMMAND LINE MOV #GMCR+G.MCRB,R0 ;ADDRESS OF COMMAND LINE 70$: CMPB (R0)+,#<' > ;Q.BLANK BEQ 71$ ;EQ YES SOB R1,70$ ;LOOP BR 76$ ;NO COMMAND 71$: DEC R1 ;COUNT BLANK 72$: MOV #CMDTAB,R2 ;ADDRESS OF POSSIBLE COMMANDS MOVB (R0)+,R3 ;GET NON BLANK CHARACTER 73$: CMPB R3,(R2) ;Q.MATCH BEQ 74$ ;EQ FOUND CMP (R2)+,(R2)+ ;NEXT ENTRY TST (R2) ;Q.END BNE 73$ ;NE NO BR 75$ ;IGNORE IT 74$: BIS 2(R2),MASKSR ;REQUEST PROCESS 75$: SOB R1,72$ BIT #MSKACT,MASKSR ;Q.ANY ACTION OPTIONS SET BNE 77$ ;NE YES 76$: BIS #MSKDFT,MASKSR ;ELSE SET DEFAULT ; ; CALL SUBROUTINES REQUESTED ; 77$: MOV #MSKTAB,R0 78$: BIT (R0),MASKSR ;Q.THIS BIT SET BEQ 79$ ;EQ NO BIC (R0)+,MASKSR ;YES - CLEAR BIT CALL @(R0)+ ;CALL PROCESSOR BR 77$ ;LOOK FOR MORE 79$: CMP (R0)+,(R0)+ ;NEXT ENTRY TST (R0) ;Q. END BNE 78$ ;NE NO ; 80$: EXIT$S .PAGE .SBTTL SUBROUTINES FOR EACH COMMAND INPUT ; ; ; COMMAND L SELECT LP: ; -------------------- ; ASNLP:: ALUN$C LUNTT,LP,0 ;ASSIGN LP: CALLFT FMTA,<14,1> ;FORM FEED RETURN SETUP:: CALL FMTATT ;ATTACH RETURN ; ; DUMP UCB DATA ; ------------- ; EVPDAT: TST DVDATA ;UCB DATA COPIED OK?? BNE 10$ ;BRANCH IF YES CALLFT FMTA,<<' DRIVER NOT IN SYSTEM>> CALL FMTOUT RETURN 10$: CALLFT FMTA,<<'CD DRIVER DATA>> CALL FMTOUT CALL EVMDEV ;DUMP DEVICE TABLES (PART) CALLFT FMTX,<1> CALL FMTOUT CALL CDDAT ;DUMP DATA RETURN ; ; PRINT TRACE ; ---------- ; EVMTRC: TST TR$FLG ;GOT COPY OF TRACE? BNE 419$ ;BRANCH IF YES CALLFT FMTA,<<'TRACE BUFFER NOT IN SYSTEM>> CALL FMTOUT RETURN 419$: CALLFT FMTA,<<'CD DRIVER TRACE>> TST TRCFRZ ;TRACE FROZEN? BEQ 4191$ ;BRANCH IF NOT CALLFT FMTX,5 CALLFT FMTA,<<'- TRACE FROZEN>> 4191$: CALL FMTOUT CLR AGE ;START WITH YOUNGEST ENTRY 420$: MOV TR$PTR,R1 ;INDEX MUL TR$SIZ,R1 ASL R1 ;BYTE OFFSET ADD #TR$TAB,R1 ;ADDRESS OF ENTRY MOVB (R1)+,R2 ;TRACE CODE MOVB (R1)+,R4 ;GET TIME CMP R2,#-1 ;Q.TOO LOW BLT 440$ ;LT YES CMP R2,#TRCMAX ;Q.TOO HIGH BLE 460$ ;LE NO OK 440$: MOV #-2,R2 ;RESET TO ERROR MESSAGE TST TRACPT ;Q.THIS MEESAGE EXISTS BEQ 500$ ;EQ NO TST -(R1) ;POINT BACK TO CODE 460$: ASL R2 ;*2 = OFFSET MOV TRACEP+4(R2),R2 ;GET ADDRESS OF POINTERS BEQ 440$ ;EQ UNKNOWN CALLFT FMTI, ;PRINT TIME 481$: MOV (R2)+,R5 ;GET ADDRESS OF TEXT BEQ 520$ ;EQ END CALLFT FMTA,(R5) ;PRINT DESC MOV (R1)+,R3 ;GET DATA MOV (R2)+,R0 ;GET FORMAT OF ITEM BLT 500$ CMP R0,#MAXPRS ;Q.TOO BIG BGT 500$ ASL R0 PUSH ; CALL FORMAT PROCESSOR WITH R3=DATA. REGISTER PUSH DONE HERE CALL @PROCES(R0) POP BR 481$ 500$: CALLFT FMTA,<<'ERROR>> 520$: CALL FMTOUT 540$: INC AGE ;NEXT ENTRY CMP AGE,TR$NUM ;Q.PRINTED ALL BHI 580$ ;HI YES TST TR$PTR ;Q.BEGINING OF TABLE BNE 560$ ;NE NO MOV TR$NUM,TR$PTR ;YES - SET AFTER END 560$: DEC TR$PTR ;NEXT ENTRY BR 420$ ;LOOP 580$: RETURN ; ; ; SUBROUTINE TO PRINT PDB CHAIN INFORMATION ; ------------------------------------------ ; PDBLST: TST DVDATA ;DRIVER IN SYSTEM? BEQ 801$ ;BRANCH IF NOT JMP 802$ 801$: CALLFT FMTA,<<' DRIVER NOT IN SYSTEM>> BR 857$ 802$: MOV $HEADR,R5 ;ADDRESS OF OUR HEADER MOV H.LUN-4+<4*LUNCD>(R5),R2 ;UCB ADDRESS ADD #U.PTC,R2 ;ADDRESS OF PDB CHAIN HEADER WORD 830$: MOV (R2),R4 ;NEXT PDB IN CHAIN BEQ 850$ MOV R4,R2 ;SAVE START OF PDB BIT #1,R4 ;ODD ADDRESS (MAY HAPPEN IF ;CORRUPTED BY CHANGE IN MIDDLE OF LIST) BNE 855$ MOV (R4)+,R0 ;CHAIN WORD CALLFT FMTA,<<' PDB CHAIN WORD: >> CALLFT FMTO,R0 CALL FMTOUT MOV (R4)+,R0 ;PTC CALLFT FMTA,<<' PTC: >> CALLFT FMTI,R0 CALL FMTOUT MOV (R4)+,R3 ;TCB CALLFT FMTA,<<' TASK :>> CALL TCBFMT ;PRINT NAME CALL FMTOUT MOV (R4)+,R0 ;AST ADDRESS CALLFT FMTA,<<' AST ADDRESS : >> CALLFT FMTO,R0 CALL FMTOUT MOV (R4)+,R0 ;I/O QUEUE LISTHEAD CALLFT FMTA,<<' I/O QUEUE LISTHD : >> CALLFT FMTO,R0 CALL FMTOUT MOV (R4)+,R0 CALLFT FMTX,18. CALLFT FMTA,<<': >> CALLFT FMTO,R0 CALL FMTOUT BR 830$ ; 855$: CALLFT FMTA,<<' CORRUPT CHAIN - STOP>> 857$: CALL FMTOUT 850$: RETURN ; ; SUBROUTINE TO FREEZE TRACE ; -------------------------- ; FREEZE: TST TR$FLG BEQ NOTRC MOV #APR*20000,R1 ;BASE ADDRESS OF TRACE COMMON MOV #1,TR.FRZ(R1) ;SET FREEZE FLAG RETURN ; ; ; SUBROUTINE TO UN-FREEZE TRACE ; ----------------------------- ; UNFREZ: TST TR$FLG BEQ NOTRC MOV #APR*20000,R1 ;BASE ADDRESS OF TRACE COMMON CLR TR.FRZ(R1) ;UNFREEZE TRACE RETURN NOTRC: CALLFT FMTA,<<'NO TRACE BUFFER IN SYSTEM>> CALL FMTOUT .PAGE .SBTTL FORMATTING ROUTINES FOR TRACE ; ; ROUTINES TO PROCESS EACH FORMAT ; DUMFMT::RETURN ; DECFMT::CALLFT FMTI,R3 RETURN ; OCTFMT::CALLFT FMTO,R3 RETURN ; ; **** ASCFMT UNUSED ASCFMT::CALLFT FMTX CALLFT FMTA, RETURN ; TCBFMT::MOV $TSKHD,R0 ;HEAD OF TCB CHAIN 522$: CMP R0,R3 ;Q.TCB FOUND BEQ 523$ ;EQ YES MOV T.TCBL(R0),R0 ;NEXT TCB BNE 522$ ;NE EXISTS CALLFT FMTO,R3 CALLFT FMTA,<<' ?>> RETURN ;GONE AWAY - IGNORE 523$: CALLFT FMTX ADD #T.NAM,R3 CALLFT FMTR,<(R3),6> RETURN ; FNC: .WORD FUNFMT::CALLFT FMTO, CALLFT FMTX MOV R3,FNC ;EXTRACT FN CODE ONLY MOVB FNC+1,R3 CMP R3,#MAXCOD ;Q.VALID ITEM CODE BHI 581$ ;HI NO ASL R3 ;MAKE INDEX MOV LISTFN(R3),R3 ;GET ADDRESS BEQ 581$ ;EQ INVALID CALLFT FMTA,<(R3)> RETURN 581$: CALLFT FMTA,<<'?>> RETURN ; ; ROUTINE TO PRINT OUT STATUS OF DRIVER ; STAFMT: MOV #STATBL,R0 ;TABLE OF STATUS/TEXT 601$: CMP (R0)+,R3 ;MATCH STATUS? BEQ 620$ ADD #4,R0 ;SKIP OVER TEXT CMP R0,#STAEND ;END OF TABLE? BLO 601$ TST (R0)+ ;POINT TO TEXT 620$: ;R0 POINTS TO TEXT CALLFT FMTA,<(R0),#4> RETURN ; ; ROUTINE TO PRINT IDR FORMATTED ; IDRFMT: CALLFT FMTO,R3 CALLFT FMTX,1 CALLFT FMTA,<'(> MOVB R3,R0 ;DATA BYTE BIT #NOTWC,R3 ;CHECK IF WC? BNE 631$ CALLFT FMTA,<'WC=> CALLFT FMTI,R3 BR 650$ 631$: MOV #IDRTBL,R1 ;START OF TABLE OF IDR BITS 640$: MOV (R1)+,R2 ;NEXT BIT MASK BIT R2,R3 ;MATCH ON THIS BIT? BEQ 645$ ;IF NO MATCH SKIP CALLFT FMTA,<(R1),4> ;TYPE OF IDR 645$: ADD #4,R1 ;NEXT ENTRY IN IDR TABLE CMP R1,#IDREND ;END OF TABLE? BLO 640$ ;BRANCH IF NOT AT END 650$: CALLFT FMTA,<')> RETURN .PAGE .SBTTL UTILITY ROUTINES ; ; ROUTINE TO DISPLAY DEVICE INFORMATION ; EVMDEV::MOV #DEVPT,R1 ; MOV #NDEV,R2 ;COUNT 700$: MOV (R1)+,R5 ;POINT TO TEXT CALLFT FMTA,(R5) MOV (R1)+,R5 ;GET DATA CALLFT FMTO,R5 CALL FMTOUT SOB R2,700$ RETURN ; ; ; ROUTINE TO DISPLAY UCB INFORMATION ; CDDAT:: MOV #DVDATA,R0 ;POINT TO DATA MOV #DATAPT,R1 ;POINT TO TEXT MOV DUCBL,R2 ASR R2 ;NO OF WORDS IN UCB 720$: MOV (R1)+,R3 ;POINT TO TEXT CALLFT FMTA,(R3) MOV (R0)+,R5 ;GET DATA CALLFT FMTO,R5 CALL FMTOUT SOB R2,720$ RETURN ; ; ; ROUTINE TO LIST COMMANDS AVAILABLE ; HELP:: CALLFT FMTA,<<'A PRINT ALL>> CALL FMTOUT CALLFT FMTA,<<'D PRINT UCB DATA>> CALL FMTOUT CALLFT FMTA,<<'H HELP>> CALL FMTOUT CALLFT FMTA,<<'L SELECT LP:>> CALL FMTOUT CALLFT FMTA,<<'T PRINT TRACE>> CALL FMTOUT CALLFT FMTA,<<'F FREEZE CD TRACE>> CALL FMTOUT CALLFT FMTA,<<'U UNFREEZE CD TRACE>> CALL FMTOUT CALLFT FMTA,<<'P SHOW PDB CHAIN>> CALL FMTOUT RETURN ; ; ROUTINE TO CHECK THAT TASK WAS BUILT FOR THIS SYSTEM ; OUTPUT CC OK ; CS WRONG ; CHKSYS::MOV #$BTMSK,R0 ;ADDRESS OF BIT MASKS MOV #1,R1 ;VALUE OF FIRST MOV #16.,R2 ;NUMBER 981$: CMP (R0)+,R1 ;Q.CORRECT BNE 989$ ;NE NO ASL R1 ;SHIFT EXPECTATION SOB R2,981$ ;LOOP ; CMP $TKPS-2,#60. ;Q.SECONDS/MINUTE BNE 989$ ;NE NO CMP $TKPS-4,#60. ;Q.MINUTES/HOUR BNE 989$ ;NE NO CMP $TKPS-6,#24. ;Q.HOURS/DAY BNE 989$ ;NE NO ; CLC RETURN ; 989$: CALLFT FMTA,<<'THIS TASK WAS BUILT FOR ANOTHER SYSTEM>> CALL FMTOUT SEC RETURN ; ; ; ROUTINE TO ASSIGN LUN TO A CD UNIT AND GET DEVICE AND UCB DATA ; GETDAT: ALUN$C LUNCD,CD,UNTNUM ;ASSIGN TO CD DRIVER BCC 200$ ;CC OK MOV $DSW,R0 CALLFT FMTA,<<'FAIL TO ASSIGN CD DRIVER. DSW>> CALLFT FMTI,R0 CALL FMTOUT ;PRINT ERROR CODE BR 599$ 200$: MOV $HEADR,R5 ;ADDRESS OF OUR HEADER MOV H.LUN-4+<4*LUNCD>(R5),R5 ;ADDRESS OF CD UCB MOVB U.STS(R5),USTS ;COPY UCB STATUS MOV U.SCB(R5),R4 ;GET SCB ADDRESS MOVB S.STS(R4),SSTS ;COPY SCB STATUS MOV S.PKT(R4),SPKT ;COPY I/O PACKET ADDRESS MOV U.DCB(R5),R3 ;ADDRESS OF CD DCB MOV D.UCBL(R3),DUCBL ;LENGTH OF UCB IN BYTES CALL GETUCB ;COPY UCB DATA TO LOCAL BUFFER MOV #1,R0 ;RETURN SUCCESS RETURN 599$: CLR R0 ;RETURN FAILURE RETURN ; ; ROUTINE TO MAKE A LOCAL COPY OF UCB DATA ; GETUCB: ; COPY UCB DATA TO CDDAT ; 90$ : MOV R5,R2 ;UCB ADDRESS MOV DUCBL,R0 ;LENGTH OF UCB ASR R0 ; - IN WORDS MOV #DVDATA,R4 ;BUFFER FOR COPIED UCB ; +++++ ADD DISABLE INTERRUPTS 201$: MOV (R2)+,(R4)+ ;COPY UCB SOB R0,201$ ; +++++ ENABLE INTERRUPTS ; RETURN ; ; ROUTINE TO COPY ENTIRE TRACE INTO LOCAL BUFFER ; ; .MCALL RDBBK$,WDBBK$,ATRG$,CRAW$,DIR$ ; APR=7 TRCRDB: RDBBK$ 128.,CDTRAC,GEN,,0 ;DEFINE CDTRAC RDB TRCWDB: WDBBK$ APR,128.,0,0,0,,0 ;DEFINE CDTRAC WDB ATTACH: ATRG$ TRCRDB ;ATTACH TO CDTRAC MAP: CRAW$ TRCWDB ;MAP TO CDTRAC GETTRC: DIR$ #ATTACH ;ATTACH TO CDTRAC COMMON REGION BCS 810$ MOV TRCRDB,TRCWDB+W.NRID ;SET REGION ID DIR$ #MAP BCS 810$ INC TR$FLG ;SHOW MAPPED TO COMMON OK ; COPY OF TRACE DATA TO TR$SIZ ; MOV #APR*20000,R2 ;ADDRESS OF TRACE COMMON CDTRAC MOV #TR$SIZ,R4 ;BUFFER TO COPY TRACE INTO MOV TR.NUM(R2),R0 ;NUMBER OF ENTRIES MOV TR.LEN(R2),R1 ;SIZE OF EACH ENTRY IN WORDS MUL R0,R1 ;CALCULATE REAL LENGTH ASL R1 ; IN BYTES CMP R1,#LENTRC ;CHECK IF FITS IN OUR BUFFER BLE GOT ;BRANCH IF OK CALLFT FMTA,<<'WARNING BUFFER TOO SMALL FOR WHOLE TRACE>> CALLFT FMTOUT MOV #LENTRC,R1 GOT: MOV R4,R5 ;CALCULATE END ADDRESS ADD R1,R5 ;R5 = END ADDRESS OF LOCAL BUFFER 800$: MOV (R2)+,(R4)+ ;COPY ENTIRE BUFFER CMP R4,R5 ;CHECK IF REACHED END LOCAL BUFFER BLO 800$ BR 820$ 810$: CALLFT FMTA,<<'NO TRACE BUFFER IN SYSTEM>> CALL FMTOUT 820$: RETURN ; RETURN .END ENTRY