.TITLE LDLIB - LOAD SHARABLE LIBRARY SUBROUTINE .IDENT /01/ ;+ ; ;** - LDLIB - LOAD A SHARABLE LIBRARY ; ; THIS SUBROUTINE IS CALLED IN ORDER TO LOAD A SHARABLE ; LIBRARY INTO A DYNAMIC PARTITION. IF THE LIBRARY IS ALREADY ; LOADED, THE TASK ATTACHES TO THE LIBRARY AND MAPS IT. ; ; USAGE: ; ; CALL LDLIB (LUN,LIB,IDS1,IDS2) ; ; WHERE: ; LUN - IS THE LOGIGAL UNIT NUMBER TO USE TO ; READ THE LIBRARY IN ; LIB - IS THE RAD50 LIBRARY NAME ; IDS1 - IS THE STATUS RETURN ; IDS1 = 1 IF LOAD SUCCESSFUL ; IDS1 < 0 IF LOAD FAILED ; IDS2 = DSW OR F.ERR IF APPROPRIATE ; ; **************************************************************** ; * * ; * ************* N O T E ************** * ; * * ; * THIS SUBROUTINE CANNOT BE IN A LIBRARY * ; * * ; **************************************************************** ;- .PAGE ; CALL MACROS .MCALL FDBDF$,FDRC$A,FDBK$A,FDOP$A,NMBLK$,FSRSZ$ .MCALL SETF$,CLEF$,CRRG$,CRAW$,RDBBK$,WDBBK$,ATRG$ .MCALL READ$,WAIT$,DIR$,OPEN$R,WSIG$S,LBLDF$,CLOSE$ ; LOCAL DATA AND DIRECTIVES ; FCS STUFF FSRSZ$ 0 ; DEFINE LABEL BLOCK OFFSETS LBLDF$ LIBFDB: FDBDF$ ;RESERVE AN FDB FDRC$A FD.RWM ;DECLARE READ/WRITE ACCESS FDBK$A LIBLAB,512.,,32.,RDSTAT ;BLOCK PARAMETERS FDOP$A 0,LIBDDB,LIBDEF,FO.RD LIBDDB: .WORD SYDEVL,SYDEV,SYUICL,SYUIC,0,0 SYDEV: .ASCII /SY0:/ SYDEVL=.-SYDEV SYUIC: .ASCII /[1,1]/ SYUICL=.-SYUIC .EVEN LIBDEF: NMBLK$ ,TSK ; DIRECTIVES TO WORK WITH EVENT FLAGS SET: SETF$ 64. CLR: CLEF$ 64. ; REGION DIRECTIVES CREATE: CRRG$ LIBRDB WINDOW: CRAW$ LIBWDB ATTACH: ATRG$ LIBRDB LIBRDB: RDBBK$ 0,,GEN,RS.MDL!RS.ATT!RS.DEL!RS.WRT!RS.RED,0 LIBWDB: WDBBK$ 0,0,0,0,0,WS.64B!WS.WRT!WS.MAP,0 ; TASK IMAGE FILE BLOCK NUMBER STFLAG: .WORD 0 BLKNUM: .WORD 0,1 RDSTAT: .WORD 0,0 ; LABEL BLOCK BUFFER LIBLAB: .BLKB 512. .PAGE .SBTTL MAIN LINE CODE ; LOCAL MACRO TO REPORT ERRORS .MACRO ERROR ERRNO,PARAM MOV ERRNO,R0 .IF NB PARAM MOV PARAM,R1 .ENDC JMP ERRORP .ENDM LDLIB:: CMPB #4,(R5) ;INSURE THAT THERE ARE 3 PARAMS BEQ 10$ ;IF EQ YES ERROR #-1 ;IF NE ERROR ; FILL IN FDB INFO 10$: MOV #LIBFDB,R0 ;GET FDB ADDRESS MOV @2(R5),F.LUN(R0) ;FILL IN LOGIGAL UNIT NUMBER MOV 4(R5),R1 ;GET ADDRESS OF LIBRARY NAME MOV (R1),LIBDEF+N.FNAM ;FILL IN TASK MOV (R1)+,LIBRDB+R.GNAM ;AND REGION MOV (R1),LIBDEF+N.FNAM+2 ;NAMES MOV (R1),LIBRDB+R.GNAM+2 ; ; SYNCHRONIZE WITH OTHER LOADERS 20$: DIR$ #SET ;SET FLAG 64. TO ENTER CODE CMP #IS.CLR,$DSW ;WAS THE FLAG CLEAR BEQ 30$ ;IF YEA THEN WE GOT IT WSIG$S ;WAIT A WHILE BR 20$ ;AND TRY AGAIN ; TRY TO ATTACH REGION 30$: DIR$ #ATTACH ;TRY TO ATTACH TO REGION MOV #1,STFLAG ;ASSUME LIB. ALREADY EXISTS CMP #IS.SUC,$DSW ;WAS ATTACH SUCCESSFUL BEQ 80$ ;IF EQ YES CLR STFLAG ;LIB DOESNT' EXIST CMP #IE.PNS,$DSW ;WAS IT JUST BECAUSE IT AIN'T THERE BEQ 40$ ;IF EQ YES ERROR #-2,$DSW ;ELSE FATAL ; OPEN TASK IMAGE FILE AND DETERMINE SIZE 40$: OPEN$R ;OPEN TASK FILE BCC 50$ ;IF CC SUCCESSFUL OPEN ERROR #-3,LIBFDB+F.ERR ; ELSE FATAL 50$: READ$ ,,,#BLKNUM ;TRY TO READ BLOCK 0 BCC 55$ ;IF CC OK ERROR #-4,LIBFDB+F.ERR ; ELSE FATAL 55$: WAIT$ ;WAIT TIL READ FINISHED BCC 60$ ;IF CC WAIT OK ERROR #-5,LIBFDB+F.ERR ;ELSE FATAL 60$: BIT #TS$PIC,LIBLAB+L$BFLG ;IS LIB PIC (I HOPE NOT) BEQ 70$ ;IF EQ OK ERROR #-6 ;ELSE FATAL 70$: BIT #TS$NHD,LIBLAB+L$BFLG ;IS LIB BUILT /-HD (I HOPE SO) BNE 80$ ;IF NE OK ERROR #-7 ;ELSE FATAL 80$: MOV LIBLAB+L$BSA,R1 ;GET PARTITION BASE ADDRESS SWAB R1 ;CHANGE BYTES ASR R1 ;CHANGE ASR R1 ; V.A. ASR R1 ; INTO ASR R1 ; APR ASR R1 ; NUMBER BIC #177770,R1 ;CLEAR OUT CRUD MOVB R1,LIBWDB+W.NAPR ;AND STORE IN WINDOW BLOCK ; CALCULATE LOAD SIZE AND CREATE REGION MOV LIBLAB+L$BLDZ,R1 ;GET LOAD SIZE IN 64B BLOCKS MOV R1,LIBRDB+R.GSIZ ;THAT'S SIZE OF REGION, TOO! MOV R1,LIBWDB+W.NSIZ ;AND WINDOW SIZE ASL R1 ;CONVERT TO 32B BLOCKS ASL R1 ; " 16 ASL R1 ; " 8 ASL R1 ; " 4 ASL R1 ; " 2 ASL R1 ; " 1 MOV R1,LIBFDB+F.BKDS ;SET SIZE TO LOAD ; CREATE REGION DIR$ #CREATE ;EXECUTE CREATE CMP #IS.SUC,$DSW ;DID IT WORK BEQ 90$ ;IF EQ YES ERROR #-8.,$DSW ;ELSE FATAL ; REGION IS UP, MAP IT 90$: MOV LIBRDB+R.GID,LIBWDB+W.NRID ;COPY REGION ID DIR$ #WINDOW ;CREATE WINDOW AND MAP CMP #IS.SUC,$DSW ;DID IT WORK BEQ 100$ ;IF EQ YES ERROR #-9.,$DSW ;ELSE FATAL TST STFLAG ;LIB ALREADY IN BNE 120$ ;IF NE NO ; READ IN TASK IMAGE 100$: MOV LIBWDB+W.NBAS,LIBFDB+F.BKDS+2 ADD LIBLAB+L$BBLK,BLKNUM+2 READ$ ,,,#BLKNUM ;READ FILE BCC 110$ ;DID IT WORK ERROR #-10.,LIBFDB+F.ERR ;ELSE FATAL 110$: WAIT$ ;WAIT FOR COMPLETION BCC 120$ ;IF CC OPERATION SUCCESSFUL ERROR #-11.,LIBFDB+F.ERR ;ELSE FATAL 120$: DIR$ #CLR ;CLEAR FLAG AND LET OTHERS GO MOV #1,@6(R5) ;SET SUCCESS RETURN ;BACK TO CALLER ERRORP: MOV R0,@6(R5) ;RETURN STATUS 1 MOV R1,@10(R5) ;AND 2 CLOSE$ #LIBFDB ;CLOSE UP FILE RETURN .END