.TITLE DSRDM1 ;SNAPSHOT EXEC INTO "DSRDMP" .IDENT /02/ ;Second RELEASE. .ENABLE LC ; ; DESCRIPTION: ; THIS TASK IS REQUESTED BY, AND ONLY BY, "DSRDMP" TO COPY bits of ; the Exec into A BUFFER WITHIN "DSRDMP". ; ; "DSRDMP" SENDS THIS TASK A Packet THAT CONTAINS THE OFFSET INTO "DSRDMP" ; TO GET THE EXEC COPY. THIS TASK MAPS INTO "DSRDMP" VIA PAR 0/1, AND ; PERFORMS THE COPY. WHEN COMPLETE, A PACKET WITH A COMPLETION CODE IS ; RETURNED TO "DSRDMP". ; ; ; ** WARNING ** THIS IS A PRIVILEGED TASK THAT INHIBITS ALL INTERRUPTS ; DURING THE COPY. ; HISTORY: ; 01 13-DEC-78 D.ALDRIDGE ; 02 29-Jul-80 Phil Stephensen-Payne ; c/o Systime Ltd., ; Concourse Computer Centre, ; 432 Dewsbury Road, ; LEEDS LS11 7DF, ; England. .PAGE ; ; I N T E R N A L M A C R O S ; .MACRO INHIBIT ;INHIBIT ALL INTERRUPTS. MOV @#PS,-(SP) ;SAVE PSW. BIS #340,@#PS ;SET PRIORITY = 7. .ENDM INHIBIT ; ; ; .MACRO ENABLE ;ENABLE INTERRUPTS AGAIN. MOV (SP)+,@#PS ;RESET PSW TO PREVIOUS PRIORITY. .ENDM ENABLE ; ; .MACRO FERR,X,P1,P2,P3,P4 .IIF NB , MOV P1,ARGBLK ;Arguments for insertion .IIF NB , MOV P2,ARGBLK+2 .IIF NB , MOV P3,ARGBLK+4 .IIF NB , MOV P4,ARGBLK+6 MOV #I.'X,R1 ;Address of Error String JMP FERR .ENDM .MACRO DIAG,X,P1,P2,P3,P4 .IIF NB , MOV P1,ARGBLK .IIF NB , MOV P2,ARGBLK+2 .IIF NB , MOV P3,ARGBLK+4 .IIF NB , MOV P4,ARGBLK+6 MOV #I.'X,R1 CALL DIAG .ENDM .PAGE .SBTTL DATA Module Data Base ; ; M O D U L E D A T A B A S E ; .MCALL PCBDF$, HWDDF$,TCBDF$,RCVD$S, SDAT$S, QIOW$S, RCVX$S ; .MCALL FSRSZ$,FINIT$,FDBDF$,FDOP$A,FDAT$A ; for FILES-11 .MCALL FDRC$A,FDBK$A,FDBF$A,NMBLK$ ; .MCALL OPEN$,CLOSE$,GET$,PUT$,READ$,WRITE$ ; .MCALL QIOW$S,EXIT$S,ALUN$S ;general use PCBDF$ M$$MGE=0 ; Always need Memory Management HWDDF$ TCBDF$ ; ; LUNOPR= 1 ;LUN FOR OPERATOR OUTPUT. EFOPR= 1 ;EF FOR OPERATOR OUTPUT. ; UISAR1=UISAR0+2 ; PAR.1 UISDR1=UISDR0+2 ; PDR.1 ; PDRV= 077406 ;VALUE FOR PDR (=4K). ; K4= 4*2048. ;4K IN BYTES. INPLUN=2 ERRLUN=1 ; WORKB: .BLKW 15. ;WORK BUFFER (PACKET BUFFER). ; DSRDMP: .RAD50 \DSRDMP\ ;PACKET ONLY ACCEPTED FROM THIS TASKNAME. F11ACP: .RAD50 /F11ACP/ ; Other task to find in STD F11SIZ: .WORD 0 ; Size of F11ACP F11REL: .WORD 0 ; Relative address of F11ACP F11CHK: .WORD 0 ; 4KW Transfer check for F11ACP ; OFFSET: .BLKW 1 ;OFFSET IN "DSRDMP" TASK TO GET DATA. ; ERRFLG: .BLKW 1 ;FLAG SET IF ERROR DETECTED. ; ADRPAR: .BLKW 2 ;ADDRESS OF PAR USED FOR COPY. ADRPDR: .BLKW 2 ;ADDRESS OF PDR USED FOR COPY. ; SAVPAR: .BLKW 2 ;SAVED PAR. SAVPDR: .BLKW 2 ;SAVED PDR. ; FORPAR: .BLKW 1 ;VALUE FOR PAR USED FOR COPY. FORPDR: .BLKW 1 ;VALUE FOR PDR USED FOR COPY. ; OUTBLK: .BLKB 80. ; To build error message in ARGBLK: .BLKW 4 ; Argument block for $EDMSG FSRSZ$ 1 ; INPFDB: FDBDF$ FDOP$A INPLUN,INPDSD,,FO.RD INPDSD: .WORD DEVL,DEVN .WORD DIRL,DIRN .WORD FILL,FILN DEVN: .ASCII /LB:/ DEVL=.-DEVN DIRN: .ASCII /[1,54]/ DIRL=.-DIRN FILN: .ASCII /RSX11M.STB/ FILL=.-FILN .EVEN ; BUFF: .BLKB 256. ; Buffer for input SYMTAB: CMBEG: .RAD50 /$CMBEG/ CMFIN: .RAD50 /$CMFIN/ DEVTB: .RAD50 /$DEVTB/ EXSIZ: .RAD50 /$EXSIZ/ FMASK: .RAD50 /$FMASK/ SRSTD: .RAD50 /$SRSTD/ PHDR: .RAD50 /P.HDR/ SYMNUM=<.-SYMTAB>/4 .PAGE .SBTTL ASCII Data Strings .NLIST BEX I.TRNC: .ASCIZ /DSRDM1 - Amount to copy is %P bytes - truncated to 120000/ I.NPKT: .ASCIZ /DSRDM1 - No Packet Received from DSRDMP/ I.NDMP: .ASCIZ /DSRDM1 - DSRDMP not active!/ I.NSYM: .ASCIZ /DSRDM1 - Symbol %R%R not in RSX11M.STB/ I.OPNI: .ASCIZ /DSRDM1 - Open Error = %D on RSX11M.STB/ .PAGE .SBTTL Initial Code .LIST BEX ; ; GET BUFFER OFFSET FROM "DSRDMP". ; DSRDM1: ; CALL STBRTN ; Fill in the Exec values CLR ERRFLG ;DEFAULT TO NO ERRORS. RCVD$S #DSRDMP,#WORKB ;GET A PACKET FROM DSRDMP BCC 10$ ; Branch if OK FERR NPKT ; No Packet from DSRDMP ; 10$: MOV WORKB+4,OFFSET ;GET "DSRDMP" ADDRESS TO GET DATA. .PAGE .SBTTL HIGH Mainline Code at Priority 7 ; ; LOCATE TCB, PCB, AND HEADER FOR "DSRDMP". ; INHIBIT ;;INHIBIT INTERRUPTS ;; MOV #F11ACP,R3 ;;Get TCB Address of F11ACP CALL @SRSTD ;; MOV T.PCB(R0),R1 ;; Get the equivalent PCB address 20$: CMP P.TCB(R1),R0 ;;SEARCH LINK OF BEQ 30$ ;; SUB-PARTITIONS MOV P.SUB(R1),R1 ;; FOR OWNER OF BNE 20$ ;; TCB. BR 60$ ;;FAILED TO FIND IT. ; 30$: MOV P.SIZE(R1),F11SIZ ;; Store the size MOV P.REL(R1),F11REL ;; and the address ;; MOV #DSRDMP,R3 ;;GET ADDRESS OF TCB CALL @SRSTD ;; FOR "DSRDMP". BCS 60$ ;;BRANCH IF IT FAILED. ;; MOV T.PCB(R0),R1 ;;GET ADDRESS OF MAIN PCB. BEQ 60$ ;;BRANCH IF NONE. ;; 50$: CMP P.TCB(R1),R0 ;;SEARCH LINK OF BEQ 55$ ;; SUB-PARTITIONS MOV P.SUB(R1),R1 ;; FOR OWNER OF BNE 50$ ;; TCB. BR 60$ ;;FAILED TO FIND IT. ;; 55$: MOV R1,R2 ;; Get Address of Task Header ADD PHDR,R2 ;; MOV (R2),R2 ;; BNE 80$ ;;BRANCH IF OK. ;; ;; 60$: MOV #1,ERRFLG ;;NO TASK ACTIVE JMP COMPL ;; ; ; SET MY ASR.7 = BASE ADDRESS (0) OF "DSRDMP". ; ;; 80$: MOV #PDRV,FORPDR ;;FOR COPY, PDR = MAX SIZE (4K). MOV P.REL(R1),FORPAR ;; PAR = BASE ADDRESS OF "DSRDMP" ;; ; ; PREPARE FOR COPY. ; ;; MOV #UISAR1,ADRPAR ;;START COPY USING MOV #UISDR1,ADRPDR ;; PAR/PDR 1. ;; MOV #020000,R2 ;;ADDRESS OF "DSRDMP", LOCATION 0, VIA ASR.1 ADD OFFSET,R2 ;;ADDRESS TO START PLACING DATA. ; ; DO COPY. ; MOV @ADRPDR,SAVPDR ;;SAVE PDR AND MOV @ADRPAR,SAVPAR ;; PAR. MOV FORPDR,@ADRPDR ;;RESET BOTH MOV FORPAR,@ADRPAR ;; FOR COPY. ; ; First we want to set up the initial values in the table to reflect ; what we are going to copy in there - viz ; 0 - 500 (LOWCR) ; $CMBEG-$CMFIN (SYSCM) ; $DEVTB-@$EXSIZ (SYSTB + Pool) ; 120000-n (F11ACP) ; CLR R3 ;; Initialise total count CLR (R2)+ ;; MOV #500,(R2)+ ;; TST (R2)+ ;; Let DSRDMP calculate the offset ADD #500,R3 ;; Update the total length MOV CMBEG,(R2) ;; SUB (R2)+,R3 ;; Update total MOV CMFIN,(R2) ;; ADD (R2)+,R3 ;; Update total TST (R2)+ ;; MOV DEVTB,(R2) ;; SUB (R2)+,R3 ;; Update total MOV @EXSIZ,(R2) ;; ADD (R2)+,R3 ;; Update total TST (R2)+ ;; MOV #120000,(R2) ;; Assume 20K Executive BIT #FE.EXV,@FMASK ;; Is it? BNE 85$ ;; If NE yes - carry on ;??? MOV #100000,(R2) ;; No - set for 16K Executives ; 85$: MOV (R2)+,(R2) ;; Stuff in next address as well MOV F11SIZ,R1 ;; Get the size of F11ACP ASH #6,R1 ;; Convert to bytes ADD R1,R3 ;; CMP R3,#120000 ;; Room for it all? BLOS 87$ ;; If LOS yes - OK MOV R3,ERRFLG ;; No - Output a diagnostic message SUB #120000,R3 ;; Get how much we can't do SUB R3,R1 ;; and knock if off F11ACP ; 87$: MOV R1,F11SIZ ;; Put it back where it's useful ADD R1,(R2)+ ;; Hence get end address CLR (R2)+ ;; ; ; Now we copy in LOWCR - viz. 0-500 ; CLR R3 ;; Set to zero MOV #500/2,R4 ;; 500 bytes to move ; 90$: MOV (R3)+,(R2)+ ;; Copy a word SOB R4,90$ ;; and so on ; ; Now we copy in SYSCM - viz. $CMBEG-$CMFIN ; MOV CMBEG,R3 ;; Get start address MOV CMFIN,R4 ;; Calculate number of words to move SUB R3,R4 ;; ASR R4 ;; ; 100$: MOV (R3)+,(R2)+ ;; Copy that over SOB R4,100$ ;; ; ; We have now moved everything we need to in low memory (i.e. anything ; that might be mapped by Exec APR 0) so we switch to using APR 0 for ; copying SYSTB & Pool, just in case they are using APR 1 ; ;; MOV SAVPDR,@ADRPDR ;;RESET PDR. MOV SAVPAR,@ADRPAR ;; AND PAR. ;; MOV #UISAR0,ADRPAR ;;RESET COPY PAR/PDR TO MOV #UISDR0,ADRPDR ;; USE PAR/PDR 0. MOV @ADRPDR,SAVPDR ;;SAVE PDR AND MOV @ADRPAR,SAVPAR ;; PAR. ;; SUB #20000,R2 ;; Get amount moved (and new address) MOV DEVTB,R3 ;;ADDRESS OF DATA (EXEC+DSR) TO MOVE. ;; MOV #K4,R4 ;;MAX. BYTES THAT CAN BE MOVED BY APR 0 SUB R2,R4 ;;ADJUST FOR BYTES ALREADY MOVED. ;; MOV @EXSIZ,R5 ;;GET SIZE OF EXEC+DSR, AND SUB R3,R5 ;; ADJUST FOR UNWANTED AREA. ; 110$: MOV FORPDR,@ADRPDR ;;RESET BOTH MOV FORPAR,@ADRPAR ;; FOR COPY. CMP R4,R5 ;;BRANCH IF THERE ARE MORE BYTES TO COPY BLOS 120$ ;; THAN CAN BE DONE VIA SINGLE APR MOV R5,R4 ;;RESET BYTES TO COPY. ;; 120$: MOV R4,-(SP) ;;SAVE NO. BYTES ABOUT TO BE COPIED. ;; ASR R4 ;;CONVERT NO. BYTES TO NUMBER OF WORDS. ;; 140$: MOV (R3)+,(R2)+ ;;COPY UNTIL WE HAVE RUN OUT OF SOB R4,140$ ;; APR, OR COPY COMPLETE. MOV (SP)+,R4 ;;GET BACK NUMBER OF BYTES COPIED SUB R4,R5 ;;ADJUST NUMBER STILL TO COPY BLOS F11 ;;BRANCH IF NO MORE. ;; ADD #200,FORPAR ;;STILL MORE. ADJUST COPY PAR FOR ANOTHER 4K. CLR R2 ;;RESET ADDRESS TO PUT DATA (VIA PAR.0) MOV #K4,R4 ;;MAX BYTES THAT CAN BE MOVED VIA APR.7. BR 110$ ;;GO BACK TO CONTINUE COPY. ; F11: ;;Now copy F11ACP in MOV #UISAR1,ADRPAR+2 ;;RESET COPY PAR/PDR TO MOV #UISDR1,ADRPDR+2 ;; USE PAR/PDR 1. MOV @ADRPDR+2,SAVPDR+2 ;;SAVE PDR AND MOV @ADRPAR+2,SAVPAR+2 ;; PAR. MOV F11REL,@ADRPAR+2 ;; Reset APR1 to point to F11ACP MOV #PDRV,@ADRPDR+2 ;; and map 4KW of it MOV #20000,R3 ;; Initialise R3 to point to the start of it MOV #K4/2,F11CHK ;; Get amount to be copied on this APR NEG R4 ;; Calculate number of bytes left in APR ADD #K4,R4 ;; BEQ 40$ ;; If EQ none - set up for next 4KW ; 5$: CMP R4,F11SIZ ;;BRANCH IF THERE ARE MORE BYTES TO COPY BLOS 10$ ;; THAN CAN BE DONE VIA SINGLE APR MOV F11SIZ,R4 ;;RESET BYTES TO COPY. ; 10$: MOV R4,-(SP) ;;SAVE NO. BYTES ABOUT TO BE COPIED. ;; ASR R4 ;;CONVERT NO. BYTES TO NUMBER OF WORDS. ; 20$: MOV (R3)+,(R2)+ ;;COPY UNTIL WE HAVE RUN OUT OF DEC F11CHK ;;Was that the end of an F11ACP APR? BGT 30$ ;;If GT no - carry on ADD #200,F11REL ;;Yes - reset APR1 to next APR MOV F11REL,@ADRPAR+2 ;; Reset APR1 to point to F11ACP MOV #PDRV,@ADRPDR+2 ;; and map 4KW of it MOV #20000,R3 ;; Initialise R3 to point to the start of it MOV #K4/2,F11CHK ;; Get amount to be copied on this APR ; 30$: SOB R4,20$ ;; APR, OR COPY COMPLETE. SUB (SP)+,F11SIZ ;;Finished? BLOS COMPL ;;BRANCH IF NO MORE. ; 40$: ADD #200,FORPAR ;;STILL MORE. ADJUST COPY PAR FOR ANOTHER 4K. MOV FORPDR,@ADRPDR ;;RESET BOTH MOV FORPAR,@ADRPAR ;; FOR COPY. CLR R2 ;;RESET ADDRESS TO PUT DATA (VIA PAR.0) MOV #K4,R4 ;;MAX BYTES THAT CAN BE MOVED VIA APR.7. BR 5$ ;;GO BACK TO CONTINUE COPY. ; ; COPY IS COMPLETE. ; COMPL: ENABLE ;;RE-ENABLE INTERRUPTS. .PAGE .SBTTL LOW Tidy-Up Code at Priority 0 ; ; ISSUE ERROR IF NEED BE, AND EXIT. ; CLR WORKB ;DEFAULT TO NO ERRORS. TST ERRFLG ;BRANCH IF THAT WAS BEQ FINIS ; TRUE. CMP ERRFLG,#1 ; DSRDMP not found? BNE 10$ ; If NE no - output truncation error FERR NDMP ; Log the error ; 10$: DIAG TRNC,ERRFLG ; ; FINIS: SDAT$S #DSRDMP,#WORKB ;TELL "DSRDMP" ; 20$: RCVX$S ,#WORKB ;AND EXIT. BR 20$ ; .PAGE .SBTTL STBRTN Determine value of Exec Symbols ; ; This is a subroutine to determine various Executive addresses, which does ; not have to be rebuilt for each Executive (I hope!) ; ; STBRTN:: FINIT$ ; MOV #SYMTAB,R1 ; Get address of RAD50 symbol table MOV #SYMNUM,R2 ; And the number of them OPEN$ #INPFDB ; Open the input file BCC 10$ ; If CC OK - carry on MOVB F.ERR(R0),R0 ; Sign-extend error code FERR OPNI,R0 ; Else log an error BR 40$ ; ; 10$: GET$ #INPFDB,#BUFF,#256. BCS 90$ ; If error exit CMP BUFF,#1 ; Right type? BNE 90$ ; If ne no - exit MOV #BUFF+2,R0 ; Look for symbol MOV #15.,R3 ; ; 20$: CMP (R1),(R0) ; This one BNE 30$ ; If ne no - try next CMP 2(R1),2(R0) ; Sure? BNE 30$ ; No - check next one MOV 6(R0),(R1)+ ; Yes - overwrite with address CLR (R1)+ ; and set to next symbol DEC R2 ; Count the one we had BEQ 40$ ; If EQ we've finished - return ; 30$: ADD #8.,R0 ; Set to next one SOB R3,20$ ; Keep trying BR 10$ ; Get next record ; 40$: CLOSE$ #INPFDB ; RETURN ; Return ; 90$: FERR NSYM,(R1),2(R1) ; Output error message .PAGE .SBTTL Error Routines ; FERR: CALL DIAG ; Output the Message CLOSE$ #INPFDB ; MOV #1,WORKB ; Show the error JMP FINIS ; Exit ; DIAG: CALL OUT ; Output QIOW$S #IO.WLB,#ERRLUN,#1,,,,<#OUTBLK,R1,#40> ; Output to TI: RETURN ; Return ; OUT: MOV #OUTBLK,R0 ; Get Buffer for Output MOV #ARGBLK,R2 ; Get Address of any Parameters CALL $EDMSG ; Edit the Message RETURN .END DSRDM1 ;