.MCALL .MODULE .MODULE LIBR,VERSION=12,COMMENT= IDENT=NO,MODNAME=LIBR1,GLOBAL=.LIBR1 ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .SBTTL STARTUP AND INITIALIZATION .ENABL GBL ; CER,MAS,JVK,DBB .IIF NDF EIS$ EIS$=0 ;SAY EIS NOT AVAILABLE .IIF NDF FORM$ FORM$=1 ;INCLUDE FORM LIBRARY FUNCTIONALITY ;MAS01 ; EDIT HISTORY: ; ADDITION OF FORM LIBRARY FUNCTIONALITY ;MAS01 ; FIX LOSS OF DEFAULT EXT. AFTER VERSION PRINTED ;MAS03 ; ADD /X SWITCH (DUPLICATE GBS. IN EPT) ;MAS06 ; ADD .ENTER AND .CLOSE ERROR PROTECTION VIOLATION MESSAGES ;MAS07 ; ADD /A SWITCH TO PUT ABSOLUTE GLOBALS IN OBJ EPT ;MAS09 ; MAKE FILE NAME PRINT AS DD:FILNAM.EXT ON ERROR MESSAGES ;MAS10 ; FIX /U SWITCH BUFFER ALLOCATION PROBLEM ;MAS11 ; MULTIPLE BUG FIXES ;JVK01 ; CHANGE DEFAULT MACRO LIBRARY FILE TYPE FROM ".MAC" TO ".MLB" ;DBB01 ; 11 15-May-91 WFG Update version number of all LIBR files ; 12 13-Jan-98 TDS Update all version numbers to 12 for 5.7 ; ;+ ;JVK01+ ;+ ; NOTE: THIS VERSION WILL NOT RUN PROPERLY ON THE RT-11 EMULATOR ON RSTS. ; THERE IS A BUG IN EITHER RSTS OR THE EMULATOR THAT CAUSES AN OVERLAY ; READ ERROR WHEN NO INPUT (SOMETIMES OUTPUT) FILE-SPECS ARE OMITTED ; FROM THE CSIGEN COMMAND LINE. THIS OCCURS WITH THE USE OF THE ; CONTINUATION SWITCH IN LIBR AS NEW COMMANDS LINES ARE INTERPRETED ; USING CSIGEN RATHER THAN CSISPC. THE PROBLEM IS NOT WITH THIS ; UTILITY! IT IS WITH RSTS OR THE EMULATOR. ;- ;JVK01- .SBTTL - MEMORY ORGANIZATION ;+ ; THE LIBR MEMORY USAGE IS AS FOLLOWS AFTER THIS OVERLAY HAS COMPLETED. ; ; LOW ; +-----------------------------------------------+ ; ! PROGRAM ROOT & ACTIVE OVERLAY ! ; *-----------------------------------------------* ; ! DEVICE HANDLERS (WHEN REQUIRED) ! ; *-----------------------------------------------* ; REPLPT->! REPLACE SWITCH AREA ! ; ! END WITH 0 ! ; *-----------------------------------------------* ; UPDPTR->! UPDATE SWITCH AREA ! ; ! END WITH 0 ! ; *-----------------------------------------------* ; FILPT1->! ! ; ! SAVESTATUS AREA ! ; ! ! ; *-----------------------------------------------* ; OBUF-> ! ! ; ! OUTPUT BUFR FOR CHAN 0 & 1 ! ; ! (END OF OBUF IS START OF IBUF) ! ; *-----------------------------------------------* ; IBUF-> ! ! ; ! INPUT BUFR ! ; ! ! ; *-----------------------------------------------* ; DMNLA-> ! DELETE MODULE NAMES LIST IF /D ! ; ! END WITH 0 ! ; *-----------------------------------------------* ; DEPLA-> ! DELETE GLOBAL LIST IF /G ! ; ! END WITH 0 ! ; *-----------------------------------------------* ; EPTST-> ! ! ; ! RESIDENT ENTRY POINT TABLE ! ; ! - - - - - ! ; EPTPTR->! ! ; ! (USR SWAP AREA WHEN REQUIRED 2K) ! ; ! ! ; HIGH-> ! ! ; *-----------------------------------------------* ; ! FOREGROUND JOB IF ANY ! ; *-----------------------------------------------* ; ! RMON ! ; +-----------------------------------------------+ ;- .SBTTL - SYMBOLIC DEFINITIONS STACK= 42 ;CONTAINS INITIAL VALUE OF STACK PTR JSW= 44 ;JOB STATUS WORD GTLIN$= 10 ;GET LINE FROM TTY IN NOT IN @ FILE HIGH== 50 ;CONTAINS HIGHEST USABLE MEMORY ADR ERRBYT==52 ;ERROR BYTE PROTCT==3 ;PROTECTION VIOLATION ERROR CODE RMON= 54 ;START OF RESIDENT MONITOR ADR U$SRLD= 266 ;START OF USR AREA S.VSIZ==10.*2 ;SIZE OF SAVESTATUS BLK (10 WDS) ;ADD 2 WORDS F.LNM== -10. ;OFFSET TO 1ST WD OF FILNAM IN SAVESTATUS AREA .SBTTL - COMMAND STRING SWITCH MASKS ;+ ; THE FOLLOWING ARE GLOBAL MASKS FOR THE "SWITCH" WORD IN THE ROOT SEGMENT ; INDICATING VARIOUS SWITCHES WHICH WERE SPECIFIED IN THE COMMAND STRING ; NO POSITIONAL DEPENDENCIES ARE ASSUMED! ;- SW.X== 1 ;PUT DUPLICATE GBLS AND MOD. NAMES IN EPT SW.C== 2 ;CONTINUE COMMAND ON NEXT LINE SW.D== 4 ;DELETE MODULE FROM LIBRARY FILE SW.E== 10 ;EXTRACT A MODULE FROM A LIBRARY FILE SW.G== 20 ;DELETE GLOBAL (OR SECTION) FROM LIBRARY DIRECTORY .IF NE FORM$ ;MAS01 SW.F== 40 ;FORM LIBRARY FILE TO BE PRODUCED ;MAS01 .ENDC ;MAS01 SW.M== 100 ;MACRO LIBRARY FILE IS TO BE PRODUCED SW.N== 200 ;INCLUDE MODULE NAMES IN EPT SW.P== 400 ;INCLUDE PROGRAM SECTION NAMES IN EPT SW.R== 1000 ;REPLACE MODULE IN LIBRARY FILE SW.S== 2000 ;SQUEEZE THE MACRO'S WHEN BUILDING MACRO FILE(NOT SUPPORTED) SW.U== 4000 ;UPDATE(INSERT & REPLACE) MODULE IN LIBRARY FILE SW.W== 10000 ;WIDE OUTPUT FOR LISTING SW.A== 100000 ;ABSOLUTE GLOBALS IN OBJ EPT ;MAS09 ; INTERNAL FLAG BIT ASSIGNMENTS FG.LST==20000 ;OUTPUT LISTING REQUESTED FG.MOD==40000 ;MODULE NAME ITEM FOUND 1ST IN GSD RECORD(YES=1) .SBTTL - MACRO DEFINITIONS .MCALL .CSISPC,.CSIGEN,.FETCH,.ENTER,.PRINT,.SETTOP,.GTLIN,.SAVES .MCALL .LOOKUP,.WAIT,.DSTATUS .IF Z EIS$ .MACRO SOB A,B DEC A BNE B .ENDM .ENDC .MACRO SWTGEN L .PSECT DPUR1,D .WORD SW.'L .BYTE /2 .BYTE ''L .PSECT LIBR1 SWT.'L: .ENDM .MACRO ERROR$ ERNB,SEV,ETYP,REG .IF NB REG .IIF DIF , MOV REG,R0 .IFF .IIF IDN , CLR R0 .ENDC JSR R5,ERROOT .BYTE ERNB, SEV*200!ETYP .ENDM ;+ ; THIS OVERLAY STARTS UP THE LIBRARIAN BY: ; 1. CLEARING THE IMPURE SECTION ; 2. GET 1ST CMD LINE FETCHING OUTPUT & INPUT HANDLERS ; 3. LOOKUP & SAVESTATUS INPUT FILES ; 4. REMEMBER THE SWITCHES GIVEN ; 5. PROCESS ADDITIONAL INPUT FILES IF ANY ; 6. CALL THE APPROPRIATE SWITCH PROCESSING SUBROUTINE ;- .PSECT IMPUR1,D ERRIDX::.WORD 0 ;ERROR HANDLING INDEX WORD(IN A DATA SECTION) ;MUST BE 1ST PHYSICAL LOCATION OF EACH OVERLAY .ENABL LC .NLIST BEX BADSWT: .NLCSI TYPE=I,PART=PREFIX .ASCII "F-Invalid option: /" SWTBAD: .ASCIZ "X" NOVAL: .NLCSI TYPE=I,PART=PREFIX .ASCII "F-No value allowed: /" SWTNOV: .ASCIZ "X" DELMSG: .ASCII /Module name? /<200> ;NO AUTO CR & LF GBLMSG: .ASCII /Global? /<200> .SBTTL * VERSION IDENTIFICATION CHARACTERS TO PRINT ON NULL INPUT * VERSON::.NLCSI .EVEN .LIST BEX ; CSI DEFAULT EXTENSIONS ARE: DEFEXT: .WORD -1 ;INPUT FILE EXT (OBJ OR MAC OR FRM) .WORD -1 ;LIBR OUTPUT FILE EXT (OBJ OR MLB OR FLB) .RAD50 /LST/ ;LISTING FILE EXT .WORD 0 ;NO 3RD OUTPUT FILE .PSECT DPUR1,D LIMIT: .LIMIT SWTTBL: ;START OF SWITCH TABLE .SBTTL START1:: COMMAND LINE PROCESSING ; R3 IS NORMALLY USED TO -> NEXT FREE LOCATION WORKING UPWARDS .PSECT LIBR1 START1::MOV @#STACK,SP ;IND STACK ADR MOV #IMPURE,R1 ;GET START OF IMPURE SECTION MOV #IMPSIZ/2,R2 ;SIZE OF IMPURE AREA IN WORDS 10$: CLR (R1)+ ;CLEAR SECTION SOB R2,10$ CLRB OCHAN ;OUTPUT STARTS ON CHANNEL 0 MOVB #3,NUMCOL ;DEFAULT COLUMN WIDTH FOR LISTING OUTPUT MOV #128.,DEFMNT ;DEFAULT SIZE OF MACRO NAME TBL MOV LIMIT+2,R3 ;GET END OF CODE ADR .SETTOP R3 ;CAUSES LESS SWAPPING OF KMON ON EXIT .CSISPC #ODBLK,#DEFEXT,#0,#CBUF ;REQUEST LIBRARY COMMAND ;MAS03 BCS BADCMD ;LEGAL COMMAND? TSTB CBUF ;WAS THERE A COMMAND? ;JVK01+ BNE FOO ;IF NE YES $$VR: .PRINT #VERSON ;NO-JUST PRINT VERSION JMP REENTR ;AND RESTART FOO: CLR (PC)+ ;CLEAR FLAG WORD $FDB:: .WORD 0 ;FLAG WORD BIT 15 = 1 IF OUTPUT FILE IND ; BIT 0 = 1 IF INPUT FILE IND TST ODBLK ;WAS OUTPUT ".OBJ" FILE SPECIFIED? BNE 10$ ;IF NE YES TST ODBLK+10. ;OK -- IS THERE A ".LST" FILE BEQ 20$ ;IF EQ NO 10$: BIS #100000,$FDB ;SET BIT 15 INDICATING OUTPUT FILE SPECIED 20$: MOV @#RMON,R0 ;R0 -> START OF RESIDENT MONITOR ;JVK01- MOV U$SRLD(R0),R0 ;ADR WHERE USR WILL LOAD TST -(R0) ;JUST BELOW USR SO WILL NOT SWAP .SETTOP ;REQUEST CORE TO TOP OF USR ; THE ASSOCIATED SWITCHES ARE NOW CHECKED. MOV (SP)+,R2 ;GET THE # OF CMD SWITCHES MOV R3,REPLPT ;IND REPLACE SWITCH AREA CLR @R3 ;TERMINATE LIST MOV R3,R5 ;R5 -> REPLACE AREA WHILE PROCESSING SWITCHES ADD #7*2*2,R3 ;MAX OF 6 FILES + TERMINATOR ; SAME FOR /U CLR (R3)+ ;UPDATE AREA GROWS DOWN & TERMINATE LIST MOV R3,EPTST ;SAVE FREE CORE PTR TST -(R3) ;RESET TO POINT AT /U TERMINATOR ;MAS11 SWLOOP: DEC R2 ;COUNT DOWN SWITCHES BMI SWEND ;NO MORE MOVB @SP,SWTBAD ;SET NAME OF OFFENDER IF BAD MOVB @SP,SWTNOV ;NO VALUE ALLOWED MOV #SWTTBL,R0 ;R0 -> DISPATCH TABLE 10$: MOV (R0)+,R4 ;GET ARGUMENT WORD CLR R1 ;CLEAR FOR NO SIGN EXTEND BISB (R0)+,R1 ; AND GET DISPATCH OFFSET CMPB (R0)+,@SP ;IS THIS THE RIGHT SWITCH? BEQ 20$ ;YES CMP #SWTTBE,R0 ;NO, ARE THERE MORE? BHI 10$ ;YES, TRY FOR MORE .PRINT #BADSWT BR START1 20$: MOV #SWITCH,R0 ;R0 -> TO SET PROPER BITS ASL R1 ;DOUBLE THE DISPATCH OFFSET ADD R1,PC ; AND GOTO SWITCH ROUTINE .ENABL LSB SWTPRO: ;START OF SWITCH PROCESSING AREA SWTGEN C ;CONTINUE MOV R4,EPTPTR ;FORCE "BIC EPTPTR,SWITCH" TO WORK BR 10$ ;PROCESS LIKE OTHERS SWTGEN W ;WIDE LISTING MOVB #6,NUMCOL ;6 COLUMNS FOR WIDE LISTING ; BR 10$ ;GO SET SWITCH BIT & IGNORE VALUE ; SWTGEN / ;ANOTHER FORM OF CONTINUATION .PSECT DPUR1,D .WORD SW.C .BYTE /2 .BYTE '/ .PSECT LIBR1 SWT.CC: SWTGEN A ;INCLUDE ABSOLUTE GLOBALS IN EPT ;MAS09 SWTGEN D ;DELETE MODULES SWTGEN E ;EXTRACT MODULE SWTGEN G ;DELETE GLOBALS SWTGEN N ;INCLUDE MODULE NAMES SWTGEN P ;INCLUDE PROGRAM SECTION NAMES ; SWTGEN S ;SQUEEZE MACRO LIBR 10$: BIS R4,@R0 ;TURN ON SWITCH BIT TST (SP)+ ;DISCARD SWITCH BPL 20$ ;NO VALUE TST (SP)+ ;IGNORE POSSIBLE VALUE 20$: BR SWLOOP SWTGEN X ;DUPLICATE GBLS IN EPT ;MAS06+ BIS #SW.N,@R0 ;ALSO SET /N IF /X SET BR 10$ ;GO SET SWITCH ;MAS06- SWTGEN M ;MACRO LIBRARY BIS R4,@R0 ;SET SW.M TST (SP)+ ;WAS A VALUE GIVEN? BPL 30$ ;NO MOV (SP)+,DEFMNT ;# OF ENTRIES IN MACRO NAME TABLE 30$: BR SWLOOP SWTGEN R ;REPLACE MODULES BIS R4,@R0 ;SET /R BIT TST @SP ;REPLACE VALUE ? BMI BADCMD MOV (SP)+,(R5)+ ;SAVE REPLACE ASSOCIATION CLR @R5 ;TERMINATE REPLACE LIST BR SWLOOP SWTGEN U ;UPDATE BIS R4,@R0 ;SET /U BIT TST @SP ;UPDATE VALUE? BMI BADCMD MOV (SP)+,-(R3) ;SAVE UPDATE ASSOC MOV R3,UPDPTR ;UPDATE PTR LIST & NON-ZERO BR SWLOOP .IF NE FORM$ ;MAS01+ SWTGEN F ;FORM LIBRARY BIS R4,@R0 ;SET SW.F TST (SP)+ ;VALUE GIVEN? BMI BADCMD ;YES INVALID SW. OPTION BR SWLOOP ;NO .ENDC ;MAS01- .DSABL LSB .PSECT DPUR1,D SWTTBE: ;END OF SWITCH TABLE MADE BY 'SWTGEN' .PSECT LIBR1 BADCMD: MOV #NOVAL,R0 ;NO VALUE ALLOWED JMP ERROR ;PRINT MSG & RESTART .SBTTL SWEND TEST ILLEGAL SWITCH COMBINATIONS SWEND: MOV #SWITCH,R5 ;R5 -> SWITCH WORD MOV #DEFEXT,R0 ;R0 -> DEFAULT EXTENSION AREA MOV #^ROBJ,(R0)+ ;ASSUME OBJ LIBRARY FOR CONTINUATION MOV #^ROBJ,@R0 BIT #SW.E,@R5 ;WAS EXTRACT INDICATED? BEQ 10$ ;NO BIT #^CSW.E,@R5 ;ALL OTHER SWITCHES ARE ILLEGAL BNE 20$ ;GIVE ERROR 10$: BIT #SW.M,@R5 ;WAS A MACRO LIBRARY INDICATED? BEQ 30$ ;NO MOV #^RMLB,@R0 ;EXTENSION IS "MLB" FOR OUTPUT FILE ;DBB01 MOV #^RMAC,-(R0) ;EXTENSION IS "MAC" FOR INPUT FILE BIT #^C,@R5 ;ONLY THIS COMBINATION IS ALLOWED BEQ 40$ ;NO ERROR 20$: ERROR$ ERR4,E$F,E$PRT ;ILLEGAL SWITCH COMBINATION 30$: .IF NE FORM$ ;MAS01+ BIT #SW.F,@R5 ;WAS A FORM LIBRARY INDICATED? BEQ 40$ ;NO MOV #^RFLB,@R0 ;EXTENSION IS "FLB" FOR OUTPUT FILE MOV #^RFRM,-(R0) ;EXTENSION IS "FRM" FOR INPUT FILE BIT #^C,@R5 ;ONLY THIS COMBINATION ALLOWED BNE 20$ ;ERROR .ENDC ;MAS01- 40$: MOV EPTST,R3 ;LOW FREE CORE VALUE MOV #ODBLK,R1 ;R1 -> FILE DISCRIPTOR BLK CALL FETCH ;WAS 1ST OUTPUT FILE GIVEN? ADD #6,R1 ;R1 -> FILE EXTENSION CMP #-1,@R1 ;WAS AN EXTENSION GIVEN BNE 60$ ;YES, USE HIS NOT DEFAULT MOV #^ROBJ,@R1 ;ASSUME OBJ BIT #SW.M,@R5 ;MACRO LIBR? BEQ 50$ ;NO MOV #^RMLB,@R1 ;MAKE "MLB" THE EXTENSION ;DBB01 50$: .IF NE FORM$ ;MAS01+ BIT #SW.F,@R5 ;FORM LIBRARY? BEQ 60$ ;NO MOV #^RFLB,@R1 ;MAKE "FLB" EXTENSION .ENDC ;MAS01- 60$: CMP (R1)+,(R1)+ ;R1 -> NEXT FILE SPEC CALL FETCH BEQ 70$ ;NO FILE GIVEN BIS #FG.LST,@R5 ;IND DIRECTORY LISTING REQUESTED 70$: ADD #12.,R1 ;IGNORE 3RD INPUT FILE & PREPARE FOR INPUT FILES ;+ ; THE FOLLOWING CODE FETCHES THE APPROPRIATE HANDLER FOR EACH ; INPUT FILE, AND THEN ASSOCIATES THE SPECIFIED CHANNEL # AND ; FILE THROUGH THE .LOOKUP MACRO. ;- MOV #TEMP+4,R2 ;R2 -> 3 WDS FOR EMT(USE 3RD OUTPUT FILE AREA) ;MAS10 CLR @R2 ;COUNT FOR .LOOKUP CLR -(R2) ;WILL INIT DBLK LATER MOV #400+3,-(R2) ;CHANNEL 3 & CODE 1 80$: ADD #8.,R1 ;R1 -> NEXT INPUT FILE SPEC CALL FETCH BEQ 110$ ;NO FILE GIVEN MOV R1,2(R2) ;ADR OF DEV:FILENAME.EXT MOV R1,R4 ;COPY FOR EXTENSION CHANGING ADD #6,R4 ;R4 -> FILE EXTENSION CMP #-1,@R4 ;WAS AN EXTENSION GIVEN BNE 100$ ;YES, USE HIS NOT DEFAULT MOV #^ROBJ,@R4 ;ASSUME OBJ BIT #SW.M,@R5 ;MACRO LIBR? BEQ 90$ ;NO MOV #^RMAC,@R4 ;MAKE "MAC" THE EXTENSION 90$: .IF NE FORM$ ;MAS01+ BIT #SW.F,@R5 ;FORM LIBRARY? BEQ 100$ ;NO MOV #^RFRM,@R4 ;MAKE "FRM" THE EXTENSION .ENDC ;MAS01- 100$: ; MOV R2,R0 ;R0 -> LOOKUP AREA .LOOKUP R2 ;LOOKUP INPUT FILE BCC 110$ MOV R1,R0 ;COPY FILESPEC PTR ERROR$ ERR1,E$F,E$FIL,R0 ;FILE NOT FOUND 110$: INCB @R2 ;BUMP FOR NEXT CHANNEL CMPB #8.,@R2 ;MORE INPUT CHANNELS? BHIS 80$ ;YES .SBTTL SAVIN SAVESTATUS OF INPUT CHANNELS ;+ ; THE SAVESTATUS AREA STARTS AT HIGH CORE AND MOVES DOWNWARD. ; A CHECK IS MADE SO AS NOT TO OVER RUN HANDLERS. THE SAVESTATUS AREA ; WILL BE MOVED DOWN AFTER ALL CSI INPUT IS DONE. ; SAVESTATUS AREA FORMAT: ; +-------------------------------+ ; F.LNM = -8. ! 4 WD RAD50 FILENAME FOR ERROR ! ;ADDED 2 WORDS ;MAS10 ; !-------------------------------! ; !E! ! ; !-------------------------------! ; ! 5 WD SAVESTATUS BLK ! <- FILPT1 -> 1ST FILE BLK ; +-------------------------------+ ; E SET IF END OF INPUT (BIT 15) ; ; USAGE: ; R4 = HIGH FREE CORE WORKING DOWN ; R3 = LOW FREE CORE WORKING UP ; ; THE SWITCHES HAVE ALL BEEN PROCESSED ON THE CURRENT ; COMMAND STRING. A .WAIT & A .SAVESTATUS ARE NOW DONE ON THE ; INDICATED FILES, AND, IF THE /C SWITCH WAS SPECIFIED, ; ANOTHER COMMAND READ IS DONE. ;- SAVIN: BIS #GTLIN$,@#JSW ;PROMPT ON TTY IN NOT IN @ FILE MOV @#HIGH,R4 ;R4 = HIGHEST USABLE LOCATION MOV #ODBLK+30.+4,R5 ;R5 -> 2ND WD OF 1ST INPUT FILENAME 10$: MOV #TEMP,R1 ;R1 -> 2 WDS EMT AREA FOR .SAVESTATUS ;MAS10 MOV #5*400+3,@R1 ;CHANNEL # & CODE BYTES MOVB @R1,R2 ;STARTING CHANNEL # 20$: .WAIT R2 ;WAS A FILE GIVEN HERE? BCS 70$ ;NO 30$: MOV R4,-(SP) ;DETERMINE IF NEEDED AREA WILL SUB #S.VSIZ,@SP ; MEET HANDLERS CMP (SP)+,R3 ;GROWING DOWN AREA MEETS UP AREA? BHI 50$ ;NO, IT FITS SO CONTINUE MOV @#HIGH,-(SP) ;NEED MORE SPACE, SAVE CURRENT HIGH .SETTOP #-2 ;GET ALL WE CAN CMP @SP,R0 ;DID WE GET MORE THAN BEFORE? BHIS NOROOM ;NO MOV R4,OBLK ;YES, SAVE OLD R4 MOV R0,R4 ;R4 = NEW HIGH LIMIT MOV (SP)+,R0 ;OLD HIGH LIMIT WHERE SAVESTATUS AREA STARTED CMP (R4)+,(R0)+ ;ADD 2 TO R4 & R0 40$: MOV -(R0),-(R4) ;MOVE AREA UP HIGHER CMP OBLK,R0 ;HAVE WE MOVED IT ALL? BLO 40$ ;NO BR 30$ ;TRY AGAIN 50$: BIS #1,$FDB ;SET BIT 0 TO IND. INPUT FILE SPECIFIED ;JVK01 SUB #10.,R4 ;INC SAVESTATUS ADDRESS ;JVK01 MOV R4,2(R1) ;ADR OF CHANNEL STATUS BLK MOVB R2,@R1 ;CHANNEL # IN AREA MOV R1,R0 ;R0 -> AREA FOR EMT .SAVES BCC 60$ ERROR$ ERR5,E$F,E$PRT ; *** SHOULD NOT HAPPEN 60$: CLR -(R4) ;NOT THE LAST FILE MOV 2(R5),-(R4) ;EXTENSION ;MAS10+ MOV @R5,-(R4) ;2ND PART OF FILENAME MOV -2(R5),-(R4) ;1ST PART OF FILENAME MOV -4(R5),-(R4) ;DEVICE NAME 70$: ADD #8.,R5 ;R5 -> NEXT INPUT FILENAME ;JVK01 INCB R2 ;INDEX TO NEXT CHANNEL # ;JVK01 CMPB #8.,R2 ;END OF COMMAND STRING BHIS 20$ ;NO BIT #SW.C,SWITCH ;COMMAND CONTINUATION ? BEQ DIADUN ;NO ; THE USER HAS INDICATED MORE THAN 6 INPUT FILES. BIC EPTPTR,SWITCH ;RESET /C SWITCH, MAYBE NOT IF // .CSIGEN R3,#DEFEXT,,#ODBLK+30. ;REQUEST THE USER TO ENTER CMD MOV R0,R3 ;UPDATE FREE CORE PTR MOV SP,R2 ;SAVE STACK PTR .CSISPC #ODBLK+30.,#DEFEXT,#ODBLK+30. ;CONVERT STRING TO RAD50 MOV R2,SP ;RESTORE STACK PTR MOV #ODBLK+30.+34.,R5 ;R5 -> 2ND WD OF 1ST INPUT FILENAME MOV (SP)+,R2 ;GET THE SWITCH COUNT 80$: BEQ 10$ ;PROCESS LIKE 1ST LINE CMPB #'C,@SP ;COMMAND CONTINUATION ? BEQ 100$ ;YES CMPB #'/,@SP ;// GIVEN ? BEQ 90$ ;YES ERROR$ ERR17,E$W,E$PRT ;ONLY CONTINUATION ALLOWED BR 110$ 90$: BIC #SW.C,SWITCH ;GET US OUT OF INPUT GETTING BR 110$ 100$: BIS #SW.C,SWITCH 110$: TST (SP)+ ;POP THE SWITCH BPL 120$ TST (SP)+ ;REMOVE SWITCH VALUE 120$: DEC R2 ;COUNT DOWN SWITCHES BR 80$ ;CHECK FOR MORE SWITCHES .SBTTL FETCH LOAD DEVICE HANDLERS IF REQUIRED NOROOM: ERROR$ ERR3,E$F,E$PRT ;INSUFFICIENT MEMORY ;+ ; SEE IF HANDLER IS RESIDENT, IF NOT LOAD IT AND CHECK MEMORY LIMITS ; TO SEE IF HANDLER WILL FIT. IF CURRENTLY NOT ENOUGH ROOM THEN TRY ; TO GET MORE. IF NO MORE AVAILABLE GIVE ERROR & EXIT ; ; INPUT: ; R1 -> FILE DISCRIPTOR BLK ; R3 = ADR TO LOAD HANDLERS(FREE CORE PTR) ; ; OUTPUT: ; R3 UPDATED ; Z = 1 IF NO FILE GIVEN AT THIS POSITION ; CLOBBERS R0 ;- FETCH: TST @R1 ;ANY FILE GIVEN HERE? BEQ 30$ ;NO, SO RETURN .DSTATUS #PRAREA,R1 ;DETERMINE SIZE OF HANDLER BCS 40$ ;DEVICE NOT IN SYS TBLS TST PRAREA+4 ;IS HANDLER RESIDENT? BNE 30$ ;YES, DON'T NEED TO LOAD IT 10$: MOV PRAREA+2,R0 ;HANDLER SIZE ADD R3,R0 ;CURRENT HIGH LIMIT TO SIZE CMP @#HIGH,R0 ;WILL HANDLER FIT? BHI 20$ ;YES - DON'T NEED TO TRY FOR USR SPACE MOV @#HIGH,-(SP) ;SAVE OLD HIGH .SETTOP #-2 ;GET ALL WE CAN, MAKE USR SWAP CMP (SP)+,R0 ;DID WE GET MORE THAN BEFORE? BHIS NOROOM ;NO BR 10$ ;YES, CHECK IF IT WILL FIT NOW 20$: .FETCH R3,R1 ;FETCH HANDLER BCS 40$ MOV R0,R3 ;UPDATE FREE CORE PTR 30$: RETURN 40$: ERROR$ ERR2,E$F,E$DEV,R1 ;DEVICE NOT FOUND .SBTTL DIADUN MOVE SAVESTATUS AREA DOWN DIADUN: ROR $FDB ;WAS INPUT FILE SPECIFIED? ;JVK01+ BCS 20$ ;IF CARRY SET YES -- RETURN ROL $FDB ;NO INPUT FILE -- WHAT ABOUT OUTPUT? BPL 10$ ;IF PLUS NO OUTPUT SO GO PRINT VERSION # ERROR$ ERR30,E$F,E$PRT ;PRINT "ILLEGAL INPUT FILE" 10$: TST (SP)+ ;NO FILES INDICATED SO POP RETURN ADDR. JMP $$VR ;AND JUMP TO PRINT VERSION NUMBER 20$: BIS #100000,S.VSIZ-12.(R4) ;SET END OF SAVESTATUS AREA ;JVK01- 30$: MOV (R4)+,(R3)+ ;MOVE ALL FILE BLKS CMP @#HIGH,R4 ;DONE ? BHI 30$ ;NO LOOP MOV R3,R0 ;R3 = 1ST FREE LOC SUB #10.,R0 ;R0 -> 1ST FILE SAVESTATUS INFO MOV R0,FILPT1 ;SAVE ADDR OF 1ST FILE SAVESTATUS INFO ;JVK01 .SBTTL - SET UP BUFFERS & VARIABLES MOV R3,OBUF ;START OF OUTPUT BUFR MOV #512.,R0 ;SIZE OF INPUT BUFR ADD R0,R3 ;SIZE OF OUTPUT BUFR (1 BLK) ;JVK01 MOV R3,IBUF ;START OF INPUT BUFR (ALSO END OF IBUF) ;JVK01 ADD R0,R3 ;UPDATE FREE CORE PTR (BYTES) MOV R3,EPTST ;UPDATE FREE CORE ADR MOV #-1,OBLK ;REL BLK # OF OUTPUT FILE .SBTTL - ENTER OUTPUT FILES CLR OBPTR ;SAY NO FILE OUTPUT MOV #ODBLK,R4 ;R4 -> OUTPUT FILE DISCRIPTOR BLK TST @R4 ;LIBR OUTPUT WANTED? BEQ 40$ ;NO MOV OBUF,OBPTR ;INIT OUTPUT BUFR PTR MOV R4,R1 ;POINT TO FILE NAME ;MAS07 .ENTER #TEMP,#0,R4,ODBLK+8. ;MAS10 BCS 50$ 40$: TST 10.(R4) ;ANY LISTING FILE ? BEQ 70$ ;NO MOV #ODBLK+10.,R1 ;POINT TO FILE NAME ;MAS07 .ENTER #TEMP,#1,R1,ODBLK+18. ;JVK01 BCC 70$ 50$: CMPB #PROTCT,@#ERRBYT ;IS THIS S PROTECTION VIOLATION? ;MAS07+ BNE 60$ ;NE -> NO DIFFERENT ERROR ERROR$ ERR34,E$F,E$FIL,R1 ;PROTECTION ERROR ON ENTER 60$: ERROR$ ERR7,E$F,E$PRT,R1 ;OUTPUT DEVICE FULL ;MAS07- 70$: .SETTOP #-2 ;GLOM ALL AVAILABLE MEMORY .SBTTL - PROMPT FOR MODULES TO DELETE /D ; GET A LIST OF MODULE NAMES TO DELETE FROM THE LIBRARY. BIT #SW.D,SWITCH ;DELETE SWITCH? BEQ 80$ ;NO CALL DELETE ;ENTER MOD TO DELETE .SBTTL - PROMPT FOR GLOBALS TO DELETE /G OR EXTRACT /E ;+ ; GET A LIST OF GLOBAL SYMBOLS TO DELETE FROM THE LIBRARY EPT. ; IF /E THEN LIST IS ROUTINES TO EXTRACT FROM LIBRARY ;- 80$: BIT #SW.G!SW.E,SWITCH ;SWITCH GIVEN? BEQ 90$ ;NO CALL DELEPT ;ENTER EPT TO DELETE .SBTTL /M DISPATCH 90$: BIC #GTLIN$,@#JSW ;ALL INPUT & PROMPTS ARE DONE BIT #SW.M,SWITCH ;CREATE A MACRO LIBRARY? BEQ 100$ ;NO JMP MACLBR ;GOTO MACRO LIBRARY BUILDING OVERLAY 100$: .IF NE FORM$ ;MAS01+ .SBTTL /F DISPATCH BIT #SW.F,SWITCH ;CREATE A FORM LIBRARY? BEQ 110$ ;NO JMP FRMLBR ;GOTO FORM LIBRARY BUILDING OVERLAY .ENDC ;MAS01- .SBTTL /E DISPATCH 110$: BIT #SW.E,SWITCH ;ARE WE DOING EXTRACT ? BEQ 120$ ;NO IF 0 JMP PASS2 ;EXTRACT IS DONE IN PASS2 OVERLAY 120$: TST ODBLK ;IF NO LIBRARY OUTPUT REQUESTED BNE 130$ ; BUT A LISTING WAS REQUESTED TST ODBLK+10. ; GO DIRECTLY TO THE LISTING OUTPUT BEQ 130$ JMP LIST ;ONLY LISTING REQUESTED ; ADDITIONAL SWITCH PROCESSING IF ANY 130$: JMP CREATE ;CREATE LIBR FILE .SBTTL DELETE MODULE OR GLOBAL ROUTINES ;+ ; THIS ROUTINE BUILDS LISTS OF THE SPECIFIED GLOBALS, ; AND MODULES TO BE DELETED FROM THE USER'S LIBRARY FILE. ; THE DELETE LIST FORMAT IS: ; ; WHERE THERE ARE TWO WORDS OF .RAD50 SYMBOL FOLLOWED BY ; A FLAG WORD ; CLOBBERS R2,R3,R4 ;- .ENABL LSB DELETE: MOV #DMNLA,R2 ;DELETE MODULE NAME LIST ADR MOV #DELMSG,R4 ;REQUEST USER TO DELETE MOD NAMES BR 10$ DELEPT: MOV #DEPLA,R2 ;DELETE GLOBAL LIST ADR MOV #GBLMSG,R4 ;REQUEST USER TO DEL ENT POINTS 10$: MOV EPTST,R3 ;GET START OF FREE CORE MOV R3,@R2 ;INIT PROPER LIST ADR 20$: CALL RPACK ;GET USER INPUT BEQ 30$ ;NO MORE INPUT CMP (R3)+,(R3)+ ;ADD 4 TO -> FLAG WD CLR (R3)+ ;INITIALIZE FLAG FOR SYMBOL BR 20$ ;GO FOR MORE 30$: CLR (R3)+ ;TERMINATE LIST MOV R3,EPTST ;UPDATE FREE CORE PTR RETURN .DSABL LSB .SBTTL OV1DUM:: DUMMY ENTRY POINT TO MAKE IT RESIDENT OV1DUM::RTS R5 .SBTTL RPACK PACK RAD50 SYMBOL FROM TTY ;+ ; INPUT: ; R3 -> AREA TO PUT 2-WORDS OF RAD50 FROM TTY ; R4 -> PROMPT MESSAGE ; ; OUTPUT: ; R3 UNCHANGED ; CONDITION CODES SET FROM FIRST RAD50 WORD ; CLOBBERS R0, R1, R2, R5 ;- RPACK: MOV #TEMP,R5 ;R5 -> INPUT LINE TEMP STORAGE AREA ;MAS10 .GTLIN R5,R4 ;PROMPT THE USER & GET A LINE ;REMOVES CR & LF AND LINES ENDS WITH 0 MOV #44,R1 ;R1 = MASK TO CONTROL PACKING 10$: CLR R2 ;R2 = ACCUMULATOR, CLEAR IT 20$: TST R1 ;DID WE ALREADY HIT END OF LINE ? BMI 100$ ;YES, DO NOT GET ANOTHER CHAR 30$: MOVB (R5)+,R0 ;GET ANOTHER CHARACTER, END OF LINE ? BEQ 100$ ;YES, CAN'T GET A CHARACTER SUB #' ,R0 ;CHECK FOR BLANK BEQ 80$ ;YES, USE 0 RAD50 CODE SUB #'$-40,R0 ;CHECK FOR $ BEQ 50$ ;YES, USE 33 RAD50 CODE SUB #'.-'$,R0 ;CHECK FOR . BEQ 40$ ;YES, USE 34 RAD50 CODE SUB #'9+1-'.,R0 ;CHECK FOR NUMERIC ADD #'9+1-'0,R0 ;C=1 IF 0 TO 9 BCC 70$ ;NO, GO TRY FOR ALPHA CMPB (R0)+,(R0)+ ;ADD 2, NUMERIC, ADD DELTA OF 36 40$: INC R0 50$: ADD #33,R0 BR 80$ ;AND PUT IT INTO THE WORD 60$: SUB #20,R0 ;ADJUST DOWN BY 40 FOR LOWER CASE 70$: SUB #20,R0 ;WE SUBTRACTED 60, NOW TRY FOR ALPHA BLE 110$ ;100 OR 140 OR BADDIE CMP #'Z-100,R0 ;TRY ALPHA? BLO 60$ ;NO, BUT MAY BE LOWER CASE 80$: TSTB R1 ;GOT A CHARACTER. ARE WE SKIPPING? BEQ 20$ ;YES, IGNORE IT 90$: ASL R2 ;MULTIPLY ACCUMULATOR BY 50 ASL R2 ASL R2 ADD R2,R0 ;ADDING IN THE CHARACTER ASL R2 ASL R2 ADD R0,R2 ASRB R1 ;SHIFT MASK FOR WHAT TO DO BCC 20$ ;STILL INSIDE A WORD, GET A CHARACTER MOV R2,(R3)+ ;DONE A WORD, GIVE IT TO CALLER BR 10$ ;AND LOOP WITH CLEAN ACCUMULATOR 100$: CLR R0 ;HERE IF GOT END OF LINE BIS #100000,R1 ;SET FLAG SAYING ENF OF LINE FOUND TSTB R1 ;ARE WE STILL WORKING? BNE 90$ ;YES, USE A 0 BYTE FOR BLANK PADDING TST -(R3) ;NO, DONE TST -(R3) ;SET CONDITION CODES RETURN 110$: MOVB (R5)+,R0 ;ERROR, SKIP TO END OF LINE BNE 110$ ERROR$ ERR20,E$W,E$PRT ;ILLEGAL CHARACTER CMPB #4,R1 ;DID WE MOVE R3? BLO RPACK ;NO, RESTART TST -(R3) ;YES, FIX IT TSTB R1 ;WAS THE ERROR DURING SKIP? BNE RPACK ;NO TST -(R3) ;YES, FIX AGAIN BR RPACK .SBTTL PATCH PSECT TO BE USED FOR BUG FIXES .PSECT PATCH ;THIS IS A PATCH PSECT TO BE .BLKW 64. .END