.TITLE LDLIB - LOAD SHAREABLE LIBRARY .IDENT /03/ ;+ ; ;** - LDLIB - LOAD A SHARABLE LIBRARY ; ; THIS TASK RECEIVES MESSAGES FROM REQUESTING TASKS, AND ; USES THE FIRST TWO WORDS OF EACH MESSAGE AS A LIBRARY ; NAME. IF A REGION EXISTS WITH THE LIBRARY NAME, THE ; REQUESTOR IS ATTACHED AND MAPPED TO THE REGION AND A ; RESUME IS DONE FOR THE REQUESTOR. ; ; IF THE REGION DOESN'T ALREADY EXIST, THEN THE LIBRARY ; FILE IS SEARCHED FOR IN DIRECTORY LB:[1,1] IF FOUND, ; AN ATTEMPT IS MADE TO CREATE A REGION AND READ THE LIB. ; INTO MEMORY. THEN A SEND BY REF. AND A RESUME ARE DONE ; AS BEFORE. ; ; THE LIBRARY MAY NOT BE POSITION INDEPENDENT ; ; THE TASK SHOULD BE A SLAVE TASK SO THAT ERRORS MAY BE ; REPORTED TO THE TERMINAL ISSUEING THE REQUEST. ; ; BRIAN S. MCCARTHY 9/21/78 ; ; MODIFIED: ; J. DOWNWARD FIXED UP ERROR HANDELING. ; DEATCH REGION PRIOR TO DOING NEXT ; RECEIVE. ;- .ENABL LC .PAGE ; EXTERNAL MACRO CALLS AND DEFINITION OF LABEL BLOCK OFFSETS .MCALL FDBDF$, FSRSZ$, NMBLK$ .MCALL FDOP$A, FDRC$A, FDBK$A .MCALL OPEN$R, READ$, WAIT$, CLOSE$ .MCALL RDBBK$, WDBBK$ .MCALL CRRG$, ATRG$, CRAW$, SREF$ .MCALL LBLDF$ .MCALL DIR$ .MCALL RSUM$S, RCVX$ .MCALL QIOW$S,EXIT$S,SVTK$S,DTRG$ LBLDF$ ; ERROR MESSAGE MACROS AND DEFINITIONS .MACRO ERRMSG ERRNUM,MSG,PSECT .IIF B,,.MEXIT .NCHR $$$ERL, .PSECT ERR1 $$$ERA = . .ASCII <15><12>\MSG\ .PSECT ERR2 .IF NDF,ERRTB ERRTB: .ENDC .WORD $$$ERA $$$ERN = <. - ERRTB>/2-1 .PSECT ERR3 .IF NDF,ERRLN ERRLN: .ENDC .WORD $$$ERL+2 .PSECT PSECT ERRNUM == $$$ERN .ENDM ERRMSG .MACRO ERROR NUM TRAP NUM .ENDM ERROR ; ; DEFINE ERROR CODES ; ER.ATF=1 ER.OPF=2 ER.RED=3 ER.WAT=4 ER.PIC=5 ER.HDR=6 ER.CRE=7. ER.WND=8. ER.SND=9. ER.RSM=10. ER.CLS=11. ; DEFINE ERROR MESSAGES ERRMSG ER.ATF, ERRMSG ER.OPF, ERRMSG ER.RED, ERRMSG ER.WAT, ERRMSG ER.PIC, ERRMSG ER.HDR, ERRMSG ER.CRE, ERRMSG ER.WND, ERRMSG ER.SND, ERRMSG ER.RSM, ERRMSG ER.CLS, .PAGE ; SET UP TRAP CATCHING TABLE TRPTBL: .BLKW 6 ; NO-OP ALL BUT TRAP SST .WORD ERRORP ; THIS IS WHERE WE TRAP TO .WORD 0 ; ; LOCAL DATA AND DIRECTIVES ; FCS STUFF FSRSZ$ 0 ; READ DATA INTO REGION LIBFDB: FDBDF$ ; RESERVE AN FDB FDRC$A FD.RWM ; DECLARE READ/WRITE ACCESS FDBK$A LIBLAB,512.,,32.,RDSTAT ; BLOCK PARAMETERS FDOP$A 1,LIBDDB,LIBDEF,FO.RD LIBDDB: .WORD SYDEVL,SYDEV,SYUICL,SYUIC,0,0 SYDEV: .ASCII /LB0:/ SYDEVL=.-SYDEV SYUIC: .ASCII /[1,1]/ SYUICL=.-SYUIC .EVEN LIBDEF: NMBLK$ ,TSK ; REGION DIRECTIVES CREATE: CRRG$ LIBRDB WINDOW: CRAW$ LIBWDB ATTACH: ATRG$ LIBRDB DETACH: DTRG$ LIBRDB SEND: SREF$ ,LIBWDB BUFF: .BLKW 8. 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,BUFF ; RECEIVE BUFFER AND DIRECTIVES SNDNAM: .WORD 0,0 ; SENDER TASK NAME LIBNAM: .WORD 0,0 ; LIBRARY NAME .BLKW 11. ; REST OF MESSAGE RCVX: RCVX$ ,SNDNAM ; RECEIVE DATA DIRECTIVE ; 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 ; RECEIVE MESSAGES TILL THERE ARE NONE LDLIB: SVTK$S #TRPTBL,#8. ; SET UP SST TABLE FOR ERROR TRAP ; JGD RECV: DIR$ #RCVX ; TRY TO RECEIVE A MESSAGE ; FILL IN FDB INFO 10$: MOV #LIBFDB,R0 ; GET FDB ADDRESS MOV #LIBNAM,R1 ; GET LIBRARY NAME ADDRESS 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 ; ; 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 40$ ; 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(SO GO CREATE IT FIRST) ERROR ER.ATF ; ELSE FATAL(CAN NOT ATTACH REGION) ; PARITY ERROR,BAD DPB,INVALID NAME, ETC ; OPEN TASK IMAGE FILE AND DETERMINE SIZE 40$: OPEN$R ; OPEN TASK FILE BCC 50$ ; IF CC SUCCESSFUL OPEN ERROR ER.OPF ; ELSE FATAL(CAN NOT OPEN FILE) 50$: READ$ ,,,#BLKNUM ; TRY TO READ BLOCK 0 BCC 55$ ; IF CC OK ERROR ER.RED ; ELSE FATAL(CAN NOT READ FILE) 55$: WAIT$ ; WAIT TIL READ FINISHED BCC 60$ ; IF CC WAIT OK ERROR ER.WAT ; ELSE FATAL(WAIT FAILED) 60$: BIT #TS$PIC,LIBLAB+L$BFLG ; IS LIB PIC (I HOPE NOT) BEQ 70$ ; IF EQ OK ERROR ER.PIC ; ELSE FATAL(LIB IS PIC CODE) 70$: BIT #TS$NHD,LIBLAB+L$BFLG ; IS LIB BUILT /-HD (I HOPE SO) BNE 80$ ; IF NE OK ERROR ER.HDR ; ELSE FATAL(NOT BUILT WITH /-HD) 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 MOVB R1,BUFF+1 ; FILL IN APR NUMBER IN SREF BUFFER CLRB BUFF ; AND CLEAR WINDOW ID ; CALCULATE LOAD SIZE AND CREATE REGION MOV LIBLAB+L$BLDZ,R1 ; GET LOAD SIZE IN 64B BLOCKS MOV R1,LIBWDB+W.NSIZ ; THAT'S WINDOW SIZE, TOO ! TST STFLAG ; LIBRARY ALREADY CREATED ? BNE 90$ ; IF NE YES, SKIP CREATE MOV R1,LIBRDB+R.GSIZ ; LOAD SIZE IS SIZE OF REGION 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 ER.CRE ; ELSE FATAL(CAN NOT CREATE REGION) ; 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 95$ ; IF EQ YES ERROR ER.WND ; ELSE FATAL(CAN NOT CREATE WINDOW OR MAP) 95$: TST STFLAG ; LIB ALREADY IN BNE 120$ ; IF NE YES ; 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 ER.RED ; ELSE FATAL(CAN'T READ LIB IMAGE) 110$: WAIT$ ; WAIT FOR COMPLETION BCC 120$ ; IF CC OPERATION SUCCESSFUL ERROR ER.WAT ; ELSE FATAL(WAIT FAILED) ; SEND REFERENCE BACK W R/O ACCESS 120$: MOV #WS.RED!WS.WRT,LIBWDB+W.NSTS ; SET TO READ/WRITE ACCESS MOV SNDNAM+0,SEND+S.RETN+0 ; FILL TASK NAME INTO MOV SNDNAM+2,SEND+S.RETN+2 ; SEND DIRECTIVE DIR$ #SEND ; SEND BACK REFERENCE BCC 130$ ; IF CC OK ERROR ER.SND ; ELSE FATAL(SEND FAILED) 130$: RSUM$S #SNDNAM ; RESUME SENDER TASK BCC 140$ ; IF CC OK ERROR ER.RSM ; ELSE FATAL(RESUME FAILED) 140$: CLOSE$ #LIBFDB ; CLOSE LIBRARY FILE BCC 150$ ; IF CC OK ERROR ER.CLS ; ELSE FATAL(CLOSE FAILED) 150$: DIR$ #DETACH ; DETACH REGION ; JGD JMP RECV ; AND GO AROUND AGAIN ERRORP: MOV (SP)+,R0 ; QIOW$S #IO.WVB,#2,#2,,,, RSUM$S #SNDNAM ; RESUME SENDER TASK(TRY AND GET IT GOING) EXIT$S ; .END LDLIB