;FAST.MAC, IMPLEMENTS MOVE AND DUP COMMANDS SUBTTL D BURT APR 11,75 FOR SCAN VER 7(541) ;ASSEMBLES WITH MACTEN,UUOSYM, LOCAL SEGMENT CONTROL (HILOW.MAC), SCAN MACROS SEARCH MACTEN,UUOSYM,HILOW,SCNMAC ;LOADS WITH SCAN, WILD, HELPER .TEXT /REL:SCAN,REL:WILD,REL:HELPER/ ; [40] ;[COMMENT TO ORIGINAL VERSION, SEE REVISION HISTORY] ;THIS ROUTINE IS A TEST VERSION OF A COMMAND SCANNER FOR FAST.MAC ;A FAST DISK FILE MOVER. IT MAY EVOLVE INTO FAST OR BE REWRITTEN ;DEPENDING ON THE GENERAL CLEANLINESS IT ENDS UP WITH. SOLE FUNCTION ;AT THIS TIME IS GET GET FAMILAR WITH SCAN/WILD CALL AND PARAMETER ;CONVENTIONS ; PLACED IN PRODUCTION 7 MAY,75 AS SEEMED VALID FOR SOME ; TASKS EVEN IF NOT REALLY NICE CODE. IF REWRITE OCCURS, ; WILDCARDING NEEDS MUCH ATTENTION, AND ADDITIONAL ADVANTAGE ; COULD BE TAKEN OF SCAN/WILD/HELPER ROUTINES ;VERSION INFO FSTVER==1 ;MAJOR VERSION FSTMIN==0 ;NO MINOR FSTEDT==41 ;EDIT LEVEL FSTWHO==2 ;NON-DEC CUSP ;[21] GENERATE TITLE AND VERSION .JBVER==137 LOC .JBVER VRSN. FST TITLE. (FST,FAST,) ; ESTABLISH SEGMENT CONTROL BEFORE ANY RELOC CODE $HILOW $LOW BEGINL: ;[25]START OF LOW SEG (RELOCATABLE FOR DIE) $HIGH BEGINH: ;[25]START OF HIGH SEC (RELOCATABLE FOR DIE) SUBTTL CONTENTS ;DEFINITIONS 1 ; CONTENTS 2 ; EDITS AND OBJECTIVES 3 ; AC DEFINITIONS 4 ; OPDEFS AND MACROS 5 ; DIE 5 ; TYPE$ 5 ; SCAN INTERFACE 9 ; FLAGS 10 ; PARAMETERS 11 ;MAJOR MODULES 12 ; START 12 ; INITL 13 ; INSPLP 14 ; DOWILD 15 ; FASTMV 16 ;MINOR MODULES 17 ; FOR INITL 17 ; CHKSTR 17 ; FOR INSPLP 18 ; SETISP 18 ; FOR DOWILD 19 ; OPNLKP 19 ; SETOSP 19 ; OPNENT 20 ; CHKIDN 20 ; DELFIL 21 ; SETEXT 21 ; INFORM 22 ; FOR FASTMV 23 ; CMPMOV 23 ; RESETI 24 ; RESETO 25 ; CALLED BY SCAN 26 ; ALLIN 26 ; ALLOUT 26 ; MISCELLANEOUS 27 ; CLRFLG 27 ; GETCOR 27 ; IMPLEMENT TYPE$ 28 ; DIE 31 ;STORAGE 32 SUBTTL EDITS AND OBJECTIVES ;[REVISION HISTORY] ;1 INITIAL EDIT LEVEL ;2 7 MAY,75/DVB ; ADDED HELPER CALL IN .TSCAN ARG BLOCK (%TSCAN), ; ALSO STANDARD VERSION INFO ;3 28 JAN,75/DVB(AT STC) ; PRESERVE PROT, CREA, ETC IN COPY, ALSO ALLOW ; MULTIPLE INPUT CALLS IN ONE OF FOLLOWING FORMATS- ; 1) *.*=A,B,C ; 2) =A,B,C (IMPLIES 1 ACTUALLY) ; ALSO INCLUDES DYNAMIC BUFFERS SINCE CORE ROUTINES NEEDED ANYWAY. ;4 4 FEB,75/DVB ; MINOR CLEANUP OF SLOPPY CODE. ERROR ROUTINES (PARTULARLY DISK ERRORS) ; NEED MUCH WORK WHEN I AM IN THE MOOD. ;5 2 MARCH,76/DVB ; FIXED BUG CAUSING MISSING EXTENTIONS (BAD CONDITION TEST FOR HAKSPC) ; AND ALTERED LOGIC OF SPEC HACKING. NEW DEFINITION IS ; OUTPUT FILE.EXT MAY BE OMMITTED IF IT IS IDENTICAL TO INPUT. ;6 9 JUN,76/DVB (BUG 1) ; CORRECTED SETZ DNSPCT IN INITL TO SETZM. WAS CAUSING IMMEDIATE ; RETURN FROM INSPLP IF NEW COMMAND HAD FEWER SPECS ; THAN LAST, ONLY PARTIAL COMPLETION OTHERWISE ;7 11 JUN,76/DVB ; ADDED SEGMENT CONTROL (USING HILOW) AND FORMALIZED BUG/EDIT ; LISTS. ALL EDITS ARE INDEXED TO OBJECTIVES AND VICE VERSA ; WHERE OBJECTIVES SHOW PROBLEM AND EDIT LIST CAN SHOW HOW FIXED. ;10 13 JUN,76/DVB (BUG 11) ; FIXED ALOCIN TO ALLOCATE INLEN, NOT INLEN+2. VERY TRANSPARENT ; TO EVERYONE. ;11 13 JUN,76/DVB (BUG 4 AND 10) ; ADD CLRFLG ROUTINE TO RESET ALLOCATION, INPUT SPEC COUNT WHENEVER ; .TSCAN RESTARTS ;12 13 JUN,76/DVB (BUG 13) ; MAKE %LOKUP AND %ENTER LENGTH EXTLEN+1, NOT EXTLEN ;13 13 JUN,76/DVB (PARTIAL FOR BUG 6) ; MAKE SETEXT SMART ENOUGH NOT TO WRITE OVER DATA PUT IN ENTER ; BLOCK BY SCAN SO SWITCHES FOR /VER, /ESTIMATE ETC WORK ;14 13 JUN,76/DVB (BUG 2,3 AND 14) ; ADDED NEW DEFAULTERS SETISP, SETOSP. SETISP ASSUMES EVERYTHING ; MISSING IS WILD (EXCEPT FOR REAL NULL EXT, IE .) AND SETOSP ; ASSUMES ANYTHING MISSING SHOULD COME FROM INPUT. THIS MEANS ; MANY THINGS ARE EASY, BUT YOU HAVE TO WATCH IT IF YOU WANT ; TO USE POWER OF CANONICAL FORM DEFAULTING TO HAVE NOTHING ; MISSING IN OUTPUT OR IT COMES FROM INPUT ;15 13 JUN,76/DVB (BUG 5(PARTIAL) AND 6) ; ADDED LOCAL SWITCHES. FIRST BATCH HAS ONLY /OKERR, /NOOKERR ; AND /INFORM. /NOOKERR SAYS STOP ON I/O ERRORS (DEFAULT) ; /OKERR SAYS KEEP GOING BUT GIVE MESSAGE. ALLOWS COPY OF FILES ; WITH A BAD BLOCK OR TWO ; /INFORM:KEYWD TYPES EACH FILE IN ONE OF THREE FLAVORS ; NONE IS INITIAL VALUE, NO TYPEOUT ; FAST IS DEFAULT FOR /INFORM, TYPES NAME.EXT ; SLOW TYPES NAME.EXT[PATH]=STR:NAME.EXT[PATH],SIZE IN BLOCKS ;16 13 JUN,76/DVB (BUG 15) ; ADDED CHKIDN TO SEE IF IDENTICAL SPECS IN AND OUT, ABORT IF SO ;17 13 JUN,76/DVB (BUG 12) ; ADDED CCL ENTRY AND SUPPORT FOR TWO RESCAN COMMANDS ; .MOVE OSPEC=ISPEC/SW,ISPEC/SW ; .HOLD ISPEC/SW,ISPEC/SW ; MOVE IS FAST WITH RESCAN CAPABILITY ; HOLD IS IDENTICAL EXCEPT OUTPUT SPEC DEFAULTS TO WRK:= ; ALSO HOLD DEFAULTS TO /INFORM:FAST ;20 14 JUN,76/DVB (BUG 17) ; TEST FOR NULL FILE IN FASTMV AND RETURN IF SO, ; ALSO BE SURE FILES CLOSE ON ALL BRANCHES THAT DONT RESTART ;21 14 JUN,76/DVB (BUG 20) ; INCORPORATED TITLE. IN MACTEN (LOCAL ONLY) ;22 16 JUN,76/DVB (BUG 23) ; FIX CHKIDN TO DO RESET CHANNEL INSTEAD OF CLOSE SO DONT ; SUPERCEDE FILES WITH ZERO LENGTH VERSION. ;23 17 JUN,76/DVB (BUG 7) ; QUOTA FOR SYSTEM UFD'S IS 377777,777777. MAKE SPECIAL TEST. ;24 22 JUN,76/DVB (BUG 32) ; ANOTHER STAB AT EDIT 16,22. USE CLOSE WITH NEW COPY DISCARDED ; RATHER THAN OLD (CL.RST) AS RESDV. SAYS HE IS UNIMPLEMENTED. ;25 6 JUNE,76/DVB (BUG 5, ALSO EDIT 5) ; ADDED TYPE$ MACRO AND TYPER ROUTINE FOR IMPROVED ERROR ; MESSAGE CAPABILITY. CONVERTED MOST ERRORS TO NEW CALL ;26 6 JUNE,76/DVB (BUG 26) ; REWORKED START AND INTERNAL RESTART CODE. ISCAN ONLY CALLED ONCE ; UNLESS USERS ^C START'S. REINITIALIZE INTERNALLY BY CALLING ; RESTRT ;27 6 JUNE,76/DVB (PARTIAL BUG 26 AND 22) ; ADDED 'DUPLICATE' AS RESCAN COMMAND. PERFORMS FUNCTION 'MOVE' ; USED TO. MOVE IS NOW 'MOVE AND DELETE' AS THIS SEEMS MORE NATURAL ; ADDED FLAGS MOV,DUP AND HLD, RESEQUENCED TESTS TO FIX BUG 22 ; AND ADDED /MODE SWITCH SO CAN MOVE OR HOLD WITHOUT CCL MODE ;30 9 JUL,76/DVB (BUG 16) ; CHECK FOR UFD ON HOLD STR BEFORE SETTING UP FIRST SPEC. ; SEQUENCE IS 1)OPEN STR 2)GET PATH FOR STR 3)LOOKUP UFD FOR ; DEFAULT PPN ON STR. IF ALL WINS WE ASSUME WE CAN GO. ;31 9 JUL,76/DVB (BUG 33) ; WILD REPORTS ENTER FAILURE AS THOUGH WERE IN E+4 BUT IS REALLY ; IN E+3 SO MOVE IT FIRST ;32 10 JULY,76/DVB (BUG 34) ; CLEAN UP AND REORGANIZE CODE INTO GENERALLY 1 PAGE ROUTINES ; NO FUNCTIONAL CHANGES BUT BETTER TEST FOR ALLOWING FOR FIRST ; RIB IN CMPMOV AND BETTER MESSAGE IF NOT ENOUGH CORE FOR BUFFER ; ADDED OPNLKP, OPNENT, CMPMOV, RESETI, RESETO, CHANGED GETCOR ; ARGS AND MOVED MINOR MODULES TO APPROPRIATE SECTIONS ;33 10 JULY,76/DVB (BUG 27) ; ADDED CALL TO .CHKTM TO VERIFY /BEFORE,/AFTER ;34 11 JULY,76/DVB (BUG 35) ; ADDED $P TO CDF MESSAGE TO SHOW DIRECTORY OF FILE ; ALSO ADD PPN TO /I:F IFF PPN IS NOT OURS ;35 28-JUL-76/RWS (BUG 36) ; FIX FAST INFORM BUG ;36 17-NOV-76/DVB (BUG 37) ; INCREASE BUFFER SIZE SINCE BIG BUFFERS ARE FASTER THAN CLUSTER ; SIZE ONES (BUT NEVER LESS THAN 1 CLUSTER) ;37 17-NOV-76/DVB (BUG 37) ; CORRECT POINTER AT OFILLS ;40 4-MAR-77/RWS (BUG 43) ; CHANGE THE DEFAULT ON THE INFORM SWITCH TO BE SLOW WHEN NO ; MODIFIER IS GIVEN AND USE SCAN %7C, WHICH ALLOWS PROTECTION ; CODES OF THE FORM ;[END REVISION HISTORY] PAGE ;SO CAN APPEND TO WORK BOTH EDITS AND OBJECTIVES ;[REVISION OBJECTIVES (UNIMPLEMENTED WHEN PRECEDED BY *)] ;1 28 APR,76/DVB (EDIT 6) ; CONSTRUCT WRK:=WRK: WINS ONCE, NEVER TRANSFERS DATA ; AFTER THAT BUT NO ERROR MESSAGE! ;2 6 JUNE,76/DVB (EDIT 14) ; OLD CONSTRUCT STR:=STR: FAILS, STR:=STR:*.* OK ; THIS WILL BREAK OLD CTL FILES ;3 7 JUNE,76/DVB (EDIT 14) ; CONSTRUCT WRK:=MASTER FAILS, SHOULD IMPLY MASTER.* LIKE ; DIRECT DOES. USE MASTER. FOR NULL EXT ;4 10 JUNE,76/DVB (EDIT 11) ; CONSTRUCT WRK:=FILE.A WHEN FILE.A IS ON DSKB AND SEARCH ; LIST IS DSKB,WRK COPIES FILE TO WRK, THEN SUPERCEEDES IT ; THERE! I MAY NOT HAVE ALL THE INFO YET. ;5 10 JUNE,75/DVB (EDIT 6 PARTIAL, ALSO EDIT 25) ; ERROR MESSAGES NEED CLEANUP, IN SOME CASES MUCH MORE DETAIL (SUCH ; AS I/O ERRORS. MIGHT WANT TO USE (OR OVERHAUL) $MSG LIKE EBCOPY. ;6 10 JUNE,76/DVB (EDIT 13, 15) ; NEED LOCAL SWITCHES (FOR "IGNORE I/O ERROR, ETC) AND IMPLEMENT ; SOME STANDARD ONES WE IGNORE (/PROTECT ETC.) ;7 10 JUNE,76/DVB (EDIT 23) ; NEED BETTER TESTING FOR QUOTA/SPACE. CANNOT MOVE INTO UFD CREATED ; BY CREDIR OR SYSTEM UFD ON STR NOT MOUNTED FOR JOB ;10 13 JUNE,76/DVB (EDIT 11) ; FOUND PROBLEM IN BUG 4, ACTUALLY CAUSED BY HAVING ALOCKT AND/OR ; INSPCT WRONG IF SCAN GETS ERROR AND LOOPS IN .TSCAN WITHOUT COMMING ; BACK TO US TO CLEAR THEM. ERROR DEPENDS ON WHERE BAD SWITCH SEEN ;11 13 JUN,76/DVB (EDIT 10) ; CORRECT ALLOCATION FOR SPECS TO INLEN, NOT INLEN+2 (WHO KNOWS WHY) ;12 13 JUN,76/DVB (EDIT 17) ; ALLOW RESCAN, ETC SO CAN MAKE MONITOR COMMAND ;13 13 JUN,76/DVB (EDIT 11) ; NOTICED THAT BLOCK FOR LOOKUPS AND ENTERS 1 TO SMALL, USING ; EXTLEN BUT NEEDS OFFSET FOR WORD ZERO (COULD RESULT IN ; BAD .ISCAN CALL OR FUNNY DEFAULT EXTENTION) ;14 13 JUN,76/DVB (EDIT 14) ; IN ADDITION TO BUGS 2 AND 3, STR1:.EX1=STR:.EXT SHOULD BEHAVE LIKE ; DIRECT ALONG WITH ALL OTHER PERMUTATIONS OF THIS PARTICULAR GAME. ;15 6 SEPT,76/DVB ; USE CONTNS TECO MACRO TO BUILD CURRENT TABLE OF CONTENTS AND ; MAKE IT POSSIBLE TO KEEP IT THAT WAY. ;16 6 SEPT,76/DVB ; WHEN NOT ENOUGH SPACE IN QUOTA OR FREE, INPUT STRUCTURE IS NAMED, ; NOT OUTPUT STRUCTURE WITH SPACE PROBLEM. ; LEADS ME TO A NEW DEFINTION OF DEFAULTING. ; FIRST: ALL MISSING INPUT SPECS ARE REPLACED BY * ; THEN: ALL MISSING OUTPUT SPECS ARE REPLACED BY CORRESPONDING INPUT ; IF THIS RESULTS IN ILLEGAL WILDCARDING I PROBABLY DONT WANT TO DO ; IT ANYWAY ;15 JUN 13,76/DVB (EDIT 16) ; BUG 4 IS REAL, IF NO STR ON OUTPUT WILD WILL SCAN SEARCH LIST ; AND FIND FILES WE JUST PUT THERE. ONLY CURE I CAN SEE IS ; DEFENSIVE CODE TO SEE IF INSPEC AND OUTSPEC ARE IDENTICAL ;16 14 JUL,76/DVB (EDIT 30, IMPLIED MOUNT REJECTED) ; IN HOLD, IF WRK NOT MOUNTED, USER GETS TRASHY ERRORS. SHOULD TEST ; SEARCH LIST, IF NOT THERE MOUNT IT AS PASSIVE DEVICE OR PROVIDE CLEAN ERROR ;17 14 JUL,76/DVB (EDIT 20) ; DIE ON INTERNAL ERROR TRANSFERING A NULL FILE (IE, 0 WORDS). ; FASTMV CREATES AN IOLIST WITH A ZERO WORD COUNT AND SYSTEM ; GETS ADDRESS CHECK (UNLESS PATH. FAILS FIRST). ;20 14 JUN,76/DVB (EDIT 21) ; USE TITLE. MACRO SINCE IT IS NOW IN MACTEN AND GENERATES NICE ; TITLES WITH VERSION NUMBERS IN THEM. ;*21 14 JUN,76.DVB ; .HOLD CANNOT USE ANY OUTPUT SWITCHES LIKE /VER, /ERSUP, ETC. ; ERROR ILLEGAL OUTPUT SWITCH ON AN INPUT FILE OR SOMETHING ;22 14 JUN,76/DVB (EDIT 27) ; /INFORM:SLOW OR /I:NONE CANNOT BE GIVEN ON A .HOLD. THE ; USER SWITCH IS IGNORED AND A /I:F IS ALWAYS DONE ;23 16 JUN,76/DVB (EDIT 22) ; EDIT 16 CORRECTLY LOCATES ATTEMPT TO SUPERCEDE FILE WITH ITSELF ; AND ABORTS. UNFORTUNATLY IT CLOSES FILE THAT HAS BEEN ENTERED SO ; LEAVES OUTPUT FILE ZERO BLOCKS. ;24 21 JUN,76/DVB (EDIT 26) ; ERRORS THAT ABORT FAST ALWAYS RETURN TO NON-CCL MODE (BECAUSE ; THEY DO INTERNAL RESET) IRSPECTIVE OF ENTRY TYPE. IN FACT, ENTIRE ; RE-INITIALIZATION IS PRETTY MESSY CODE. ;25 21 JUN,76/DVB (SUPERCEEDED BY BUG 32) ; CAN GET TO INTERNAL ERROR IF NO DISK SPACE. POSSIBLE ENTER FAILS ; OR SOMETHING UNEXPECTED LIKE THAT. ;26 21 JUN,76/DVB (PARTIAL EDIT 27) ; REX SUGGESTS 'MOVE AND DELETE' MODE (FROM DSKCPY BY BANKS). ; ALSO ABILITY TO MODIFY EXTENDED PARAMETERS WITHOUT MOVING FILE ; MIGHT BE NICE (FOR SET VERSION, POSSIBLY OTHERS). ;27 21 JUN,76/DVB (EDIT 33) ; NEED /BEFORE/SINCE CAPABILITY SO CAN CONVIENTLY MOVE BACK ; ONLY DATA THAT WAS CHANGED AFTER BEING STASHED AWAY. ; PERHAPS A 'MERGE' MODE THAT PUTS LATEST OF TWO SETS OF FILES ; TOGETHER IN ONE PLACE AND DELETES OLDER ONE ;30 21 JUN,76/DVB (RETRACTED) ; OBSERVED 30 BLOCK ALLOCATIONS OCCURING IN A MOVE WITH DDBDPY. ; BETTER VERIFY THAT .RBEST IS BEING SET UP CORRECTLY. (COULD ; HAVE BEEN PARTIAL ALLOCATION BUT I DONT THINK SO). ; WAS ACTUALLY SETTING .RBEST BUT MONITOR DOESNT USE IT (6 JUN,76) ;*31 21 JUN,76 ; OBSERVED THAT I WAS ABLE TO SUPERCEDE A FILE ON DSKB (WHERE ; DSK=DSKB,FENCE) WITH FILE.EXT/VER:N=DSKB:FILE.EXT! WHAT HAPPENED IN ; PATH UUO??? SHOULD FIND THIS BUG THEN FIX IT SO IF SWITCH IS ; GIVEN THAT REQUIRES COPY WE GO AHEAD AND DO IT ANYWAY (SEE BUG 26 ALSO) ;32 22 JUN,76/DVB (EDIT 24) ; RESDV. UUO FAILING (WAS WORKING EARLIER?). CLOSE CHN,CL.RST ; SHOULD HAVE SAME EFFECT. BAD CODE DID NOT ALLOW FOR ERROR ; RETURN ON RESDV. AND OLD SUPERCEED AFTER MOVE WAS BACK, ; THIS TIME ENDING WITH AN IO.BKT AFTER SUPERCEED? ;33 9 JULY,76/DVB (EDIT 31) ; GET GARBAGE' FROM LOOKUP/ENTER FAILURES. NUMBER OF ERROR ; IS VERY WRONG ;34 10 JULY,76/DVB (EDIT 32) ; LISTING IS GETTING VERY DISORGANIZED ;35 11 JULY,76/DVB (EDIT 34) ; DELETE FAILURE SHOULD ALSO TYPE PPN AS MAY NOT BE IN USERS DIRECTORY ;36 28-JUL-76/RWS (EDIT 35) ; /INFORM:FAST WAS OUTPUTTING THE FAST BLOCK INCORRECTLY; THE ; POINTER TO THE PATH BLOCK WAS BEING OUTPUT INSTEAD OF THE ; PATH ITSELF ;37 17-NOV-76/DVB (EDIT 36) ; SIMPLE DUMP MODE I/O PROGRAM RUNS TWO TO SIX TIMES FASTER ; (IN TERMS OF BLOCKS MOVED/SECOND CLOCK TIME ANYWAY, NO CPU CHANGE) ; WITH 10K'ISH BUFFERS THAN WITH TYPICAL CLUSTER SIZE ONES (.7 ; TO 1.4K). AMAZINGLY ENOUGH, SO DOES FAST, SO TRADE CORE FOR ; SPEED SINCE THAT IS NAME OF GAME IN THIS PROGRAM ;40 17-NOV-76/DVB (EDIT 37) ; REPORT WRONG STRUCTURE (IE, INPUT, NOT OUTPUT) WHEN NOT ; ENOUGH QUOTA TO MOVE A FILE. ;*41 17-NOV-76/DVB ; INCORRECT HANDLING OF SFD'S. GENERALLY MOVE ONLY FIRST FILE ; OF SFD AND QUIT WHEN FROM AND TO AN SFD (WORKS OK FROM SFD TO ; UFD AND VICE VERSA) ;*42 17-NOV-76/DVB ; ON SOME OCCASIONS WE QUIT AFTER FIRST BLOCK OF UFD IF IT HAS MORE ; THAN 1 BLOCK (IE, ONLY DO FIRST 63 FILES). DETAILS UNKNOWN! ;43 4-MAR-77/RWS ; CHANGE THE DEFAULT INFORM TO SLOW IF NO MODIFIER ON THE SWITCH ;[END REVISION OBJECTIVES] SUBTTL DEFINITIONS ;AC'S ;SCAN COMPATIBLE F==0 ;FLAGS T1==1 ;TEMPORARY T2==2 T3==3 T4==4 P1==5 ;PERMENANT P2==6 P3==7 P4==10 P==17 ;STACK SUBTTL OPDEFS AND MACROS ;[25]USED IN PLACE OF HALTS OPDEF DIE [PUSHJ P,BUG] ;CALL HANDLER FOR GRACEFUL CRASH ;[25]TYPEOUT MACRO SIMILAR TO THAT IN EBCOPY BUT A BIT MORE FLEXIBLE ; ;WILL INSERT ONE OR MORE VARIABLE STRINGS IN A FIXED TEXT STRING OUTPUT ;TO THE TTY WITH CONTROL OVER VERBO PREFIXES AND CONTINUATIONS ;SUBSTITUTION FORMATS INCLUDE TYPING A LOCATION IN OCTAL, DECIMAL, ;SIXBIT, SIXBIT (LEFT HALF ONLY), ASCIZ STRING, OR PPN. ; ;TYPE$ MACRO IS CALLED WITH ; TYPE$ (HEADER,PFX,SUBS,,TRAILER,SCHR,RETURN) ; WHERE: ; HEADER A CODE FOR THE TYPE OF HEADER TO BE SUPPLIED; ; N NOTHING SPECIAL PRECEDES (IE, THIS IS A CONTINUATION) ; F FATAL, ? PRECEDES ; W WARNING, % PRECEDES ; I INFORMATION, [ PRECEDES ; NOTE, F,W, AND I REQUIRE MESSAGE PREFIX AND WILL ; OUTPUT 6 CHR ERROR IDENTIFIER (3 PROGRAM 3 ERROR) ; T TAB PRECEDES ; PFX A UNIQUE THREE LETTER PREFIX FOR THIS ERROR (VERIFIED UNIQUE) ; REQUIRED FOR F, W, AND I, MUST NOT BE PRESENT FOR OTHERS ; SUBS TYPE OF SUSBTITUTION TO BE DONE; ; $N NONE ; $O TYPE T1 IN OCTAL ; $D TYPE T1 IN DECIMAL ; $S TYPE T1 IN SIXBIT ; $A ASCIZ POINTED BY T1 ; $L TYPE T1 IN SIXBIT (LEFT HALF ONLY) ; $P TYPE T1 AS A PPN ; $I INDIRECT VIA T1, T1 CONTAINS COUNT,,ADDRESS ; WHERE COUNT IS THE NUMBER OF SUBSTITUTIONS AND ; ADDRESS POINTS TO ARG LIST FOR SUBSTITUTIONS ; OF 1 WORD EACH, FORMAT IS CODE IN HIGH 9 BITS AND ; ADDRESS IN LOW 24 (E EVALUATED), MAY BE GENERATED WITH ; SUBS @ADDRESS(INDEX) ; SINCE SUBSTITUTION CODES ARE OPDEFED. ; TEXT(IN BRACKETS IF ANY COMMAS OR NON-SIXBIT CHRS), ; ALL OCCURANCES OF + IN TEXT WILL CAUSE SUBSTITUTION. ; IF MORE +'S THAN SUBSTITUTION ARGUMENTS, LAST ONE ; REPEATS. IF LESS, EXCESS ARE IGNORED. DONT USE ; BACKSLASH IN TEXT AS IS DELIMITER FOR SIXBIT IN MACRO. ; TRAILER TYPE OF ENDING STRING, CRLF OR NONE, ASSUMED ; IF MISSING (NORMALY) ; SCHR CHR TO USE AS DELIMITER INSTEAD OF + IN TEXT STRING ; RETURN POP OR END FOR POPJ BACK (PAST CALL) OR EXIT, POPJ ASSUMED ; IF MISSING (NORMALLY) ;CONTINUED NEXT PAGE ;FROM PREV PAGE ; ;EXAMPLE OF ONE SUBSTITUTION ; MOVE T1,[SIXBIT/STR/] ; TYPE$ (F,NSL,$O,) ; ;EXAMPLE OF MULTIPLE SUBSTITUTIONS ; MOVE T1,[2,,LIST] ;SET UP FOR CALL ; TYPE (F,CFF,$I,) ;LIST: $S [SIXBIT/FILE/] ; $L [SIXBIT/EXT/] ; ;EXAMPLE OF CONTINUATION ; MOVE T1,CURSTR ; TYPE$ (I,SLL,$S,,NONE) ; MOVE T1,FRESPC ; IDIV T1,BLKSIZ ; TYPE$ (N,,$D,) ; ;EXAMPLE OF CATASTROPHIC ERROR WITH IMMEDIATE EXIT ; TYPE$ (F,IAE,$N,,,,END) ;EXAMPLE OF USER DELIMITER ; MOVE T1,[2,,LIST] ; TYPE$ (N,,$I,,,?) ;LIST: $D [LOWPGS] ; $D [HIPGS] ;MACRO VERIFIES: ; HEADER ARGUMENT IS VALID (IE, F,I,W,N) ; IF PFX REQUIRED (F,W,I) THAT IT IS UNIQUE. ALSO DEFINES $$$'PFX ; AT CURRENT LOCATION FOR CREF. NO TEST OF PFX IF NOT REQUIRED. ; SUBSTITUTION CODE IS VALID ($A,$S,ECT) ; TRAILER IS ASSUMED UNLESS 'NONE' IS STATED, NO OTHER TEST. ; RETURN IS ASSUMED POPJ UNLESS 'END' IS STATED, NO OTHER TEST. ;CONTINUED NEXT PAGE ;FROM PREV PAGE ;BASIC MACRO (SELECTS CALL TO VERSION WITH OR WITHOUT PFX) DEFINE TYPE$ (HEADER,PFX,SUBS,TEXT,TRAILER,SCHR,RETURN),< .XCREF TYPE$.==-1 IFIDN
,,TRAILER,SCHR,RETURN) TYPE$.==0> IFIDN
,,TRAILER,SCHR,RETURN) TYPE$.==0> IFIDN
,,TRAILER,SCHR,RETURN) TYPE$.==0> IFL TYPE$.,,TRAILER,SCHR,RETURN)> .CREF > ;END TYPE$ ;CALLED FROM TYPE$ IF NO PREFIX NEEDED (NORMALLY CONTINUATION) ;GENERATES CALL TO HANDLER AND 1ST AND 2ND ARG WORDS DEFINE TYPE$C (HEADER,SUBS,TEXT,TRAILER,SCHR,RETURN),< PUSHJ P,TYPER TYPE$1 (RETURN,TRAILER,HEADER) TYPE$2 (SUBS,SCHR,) > ;END TYPE$C ;CALLED FROM TYPE$ IF PREFIX NEEDED (IE, FATAL, WARNING OR INFO) ;FIRST CHECKS THAT PFX IS IN FACT UNIUQE, THEN ;GENERATES CALL TO HANDLER AND 1ST AND 2ND ARG WORDS DEFINE TYPE$H (HEADER,PFX,SUBS,TEXT,TRAILER,SCHR,RETURN),< IF1,> .CREF $$$'PFX==. .XCREF PUSHJ P,TYPER TYPE$1 (RETURN,TRAILER,HEADER,PFX) TYPE$2 (SUBS,SCHR,) > ;END TYPE$H ;FROM PREV PAGE ;CALLED FROM TYPE$H OR TYPE$C TO GENERATE FIRST ARG WORD ;FIRST WORD OF CALL, FORMAT ; BITS CONTENTS ; 0-8 CAIA SO CAN SKIP IN SKIP OUT (FAKE 1 WORD CALL) ; 9-12 CODE FOR HEADER 0=NONE, 1=FATAL, 2=WARN, 3=INFORM ; 4=TAB ; 13 ALWAYS Z ; 14-15 CODE FOR RETURN 0=POPJ, 1=EXIT IMMEDIATLY ; 16-17 CODE FOR TRAILER 0=CRLF, 1=NONE ; 18-35 SIXBIT/PFX/ (0 FOR HEADER NONE) DEFINE TYPE$1 (RETN,TRAIL,HEAD,PFX),< TYPE$R==-1 IFIDN <>, IFIDN , IFIDN , IFL TYPE$R, TYPE$T==-1 IFIDN <>, IFIDN , IFIDN , IFL TYPE$T, TYPE$L==-1 IFIDN , IFIDN , IFIDN , IFIDN , IFIDN , IFL TYPE$L, XWD 304B26!B30!B33!B35,(SIXBIT/PFX/) > ;END TYPE$1 ;CALLED FROM TYPE$C AND TYPE$H TO GENERATE SECOND WORD OF ARGS ;SECOND WORD OF CALL ;FORMAT BIT CONTENTS ; 0-8 CODE FOR TYPE OF SUBSTITUTION ; 0=NONE ($N) (NO SUBS CALL IS MADE, +'S ARE TYPED) ; 1=OCTAL ($O) ; 2=DECIMAL($D) ; 3=SIXBIT($S) ; 4=ASCIZ($A) ; 5=SIXBIT($L) (LEFT HALF ONLY) ; 100=INDIRECT(I) (T1 POINTS TO BLOCK 1 WORD/SUBSTITUTION) ; 9-10 UNUSED ; 11-17 ASCII CHR FOR SUBSTITUTION ; 18-35 ADDRESS OF ASCIZ/TEXT/ DEFINE TYPE$2 (SUBS,SCHR,TEXT),< TYPE$X=="SCHR" TYPE$Y==_<-^D27> TYPE$Z==[ASCIZ\TEXT\] XWD ,TYPE$Z > ;END TYPE$2 ;OPDEFS FOR CODES TO SUBSTITUTION TYPES OPDEF $N [Z] OPDEF $O [1B8] OPDEF $D [2B8] OPDEF $S [3B8] OPDEF $A [4B8] OPDEF $L [5B8] OPDEF $P [6B8] OPDEF $I [100B8] SUBTTL SCAN INTERFACE [15];LOCAL SCAN SWITCHES ;NOTE THAT /TYPE, /ERROR ASSUME LAST VALUE SEEN IN COMMAND ;STRING AND APPLY FOR ALL OF THAT COMMAND AND UNTIL CHANGED DEFINE SWTCHS,< ;; PROCEED ON ERROR SWITCH, INITALLY OFF, TURN OFF WITH NOOKERR SN OKERR,LS.ERR,FS.NCM ;; INFORM LEVEL, INITIAL NONE, DEFAULT SLOW [40] SL INFORM,LS.INF,INF,INFSLO,FS.NCM ;; [27]/MODE SO CAN GET MOVE AND HOLD WITHOUT CCL SL MODE,LS.MOD,MOD,MODDUP,FS.NCM > ;END SWTCHS ; DEFINE KEYS KEYS (INF,) KEYS (MOD,) ;[27] ;GENERATE SWITCH TABLES DOSCAN(FAST) SUBTTL FLAGS ;[27]FLAGS IN LEFT HALF OF F, SET/RESET AT TOP LEVEL FT.DUP==1B1 ;DUP MODE IN EFFECT FT.MOV==1B2 ;MOVE MODE IN EFFECT FT.HLD==1B3 ;HOLD MODE IN EFFECT FT.HDR==1B4 ;HEADER IS TYPED SUBTTL PARAMETERS ;PARAMETERS INLEN==32 ;INPUT STRING ARG BLOCK LENGTH FOR SCAN OUTLEN==32 ;OUTPUT STRING ARG BLOCK LENGTH FOR SCAN LKWLEN=5 ;LENGTH OF .LKWLD ARG BLOCK SCWLEN==4 ;LENGTH OF .SCWLD ARG BLOCK EXTLEN==.RBEST ;LENGTH OF EXTENDED LOOKUP/ENTER BLOCKS DEVLEN==6 ;LENGTH OF DSKCHR ARG BLOCK WLDCHN==10 ;CHANNEL FOR WILD TO USE IN ITS TRICKS SPCCNT==^D30 ;MAX NUMBER OF INPUT SPECS IN ONE LINE (A=B,C,D) PDLEN==100 ;STACK LENGTH (60 IS NOT ENOUGH) MINBLK==^D40 ;[36]MINIMUM BLOCKS TO TRANSFER IN ONE BUFFER ICH==1 ;INPUT CHANNEL OCH==2 ;OUTPUT CHANNEL HLDSTR==SIXBIT/WRK/ ;OUTPUT STR IF /HOLD SUBTTL MAJOR MODULES ;PUT CODE IN HIGH SEGMENT $HIGH ;[26]INITIAL START ;[26]CCLFLG IS LOADED -1, SOSA ON NORMAL ENTRY, SETZM ON CCL ENTRY ;IF USER ^C START'S, WE WILL ALWAYS COME BACK NON-CCL MODE (CCLFLG < 0) START:: SOSA CCLFLG ;[17][26]NORMAL START, DECREMENT CCLFLG SETZM CCLFLG ;[17][26]CCL START, ZERO FLAG RESET ;CLEAR WORLD MOVE T1,.JBFF ;GET START OF FREE SPACE SKIPN SAVFF ;FIRST START? MOVEM T1,SAVFF ;SET TO STARTING VALUE JRST STRT01 ;[26]AND MOVE ON ;HERE AFTER FATAL ERROR TO RESET WHOLE WORLD OR EXIT IF CCL[26] RESTRT: SKIPL CCLFLG ;[26]ARE WE CCL? JRST QUIT ;[26]YES, GIVE UP STRT01: SETZ F, ;[27]CLEAR ALL FLAGS SETOM LF.ERR ;[15]SET INITIAL (NONE SEEN) VALUES.. SETOM LF.INF ;[15]FOR SWITCHES SETOM LS.MOD ;[27].. MOVE P,[IOWD PDLEN,PDL] ;SET UP PDL MOVE T1,RSCLST ;[17]GET RESCAN LIST READY SKIPGE CCLFLG ;[17][26]ARE WE CCL MODE? SETZ T1, ;[17]NO, VANILLA MOVEM T1,%ISCAN ;[17]SAVE WHATEVER TURNED UP MOVE T1,[5,,%ISCAN] ;NOW SCAN CALL PUSHJ P,.ISCAN## ;INITIALIZE SKIPGE CCLFLG ;ARE WE IN CCL MODE? JRST STRT02 ;[27]NO, DEAL WITH THAT AOJ T1, ;[27]YES,INC ISCAN MODE TO AGREE WITH /MODE MOVEM T1,LS.MOD ;[27]SAVE MODE FROM ISCAN JRST INITL ;GO START UP SPECS STRT02: TXO F,FT.DUP ;[27]SET UP DEFAULT MODE JRST INITL ;[27]AND GO START UP ;[26]HERE TO START A LINE OF INPUT INITL: MOVE T1,SAVFF ;RESET .JBFF TO MOVEM T1,.JBFF ;WHAT WE STARTED WITH TXZ F,FT.HDR ;[17,27]NO HEADER YET SETZM DNSPCT ;[6]HAVENT DONE ANY INPUT SPECS YET MOVE T1,[XWD 10,%TSCAN] PUSHJ P,.TSCAN## ;AND CALL TRADITIONAL SCANNER SKIPGE T2,LS.MOD ;[27]GET MODE IF SET JRST INIT01 ;[27]NO, MOVE ON MOVSI T1,(1B4) ;[27]GET A 1 BIT IN FT.HLD-1 ROT T1,(T2) ;[27]PLACE THE BIT FOR PROPER MODE TXZ F,FT.DUP!FT.MOV!FT.HLD ;[27]CLEAR OLD MODE .. IOR F,T1 ;[27]AND MAKE THAT OUR MODE INIT01: MOVEI T1,INFFAS ;[17]DEFAULT FAST INFO MODE SKIPL LS.INF ;[15]DID USER SET /INFORM? MOVE T1,LS.INF ;[27]YES, USE IT MOVEM T1,LF.INF ;[15]STORE RESULT IN PERMENANT FLAG SKIPL T1,LS.ERR ;[15]GET CURRENT ERROR SWITCH IF SET MOVEM T1,LF.ERR ;[15]ONE GIVEN SETOM LS.MOD ;[27]CLEAR MODE FOR NEXT PASS TXNE F,FT.HLD ;[30]IF WE ARE IN HOLD MODE PUSHJ P,CHKSTR ;[30]VERIFY STR IS MOUNTED (SKIP IF NOT) PUSHJ P,INSPLP ;GO PROCESS THE SPECS SKIPGE CCLFLG ;[17][26]IF NOT CCL, JRST INITL ;LOOP FOR NEXT REQUEST QUIT: RESET ;[17][26]CREAM ALL I/O SO WE CAN EXIT 1, ;[17]EXIT WITHOUT MESSAGE ;HERE TO LOOP OVER A LINE OF INPUT ;NOTE THAT THIS MAY BE UP TO SPCCNT INPUT SPECIFICATIONS WITH AN UNKNOWN ;NUMBER OF WILD FILES FOR EACH. INSPLP: AOS T1,DNSPCT ;COUNT ONE WE ARE ABOUT TO DO CAMLE T1,INSPCT ;DONE? POPJ P, ;DONE, RETURN FOR NEXT USER LINE HRL T1,SPCLST-1(T1) ;GET POINTER TO SPEC BLOCK HRRI T1,INSPEC ;POINT TO CONSTANT LOCS AND BLT T1,INSPEC+INLEN-1 ;COPY IN ARGS PUSHJ P,SETISP ;[14]FILL IN HOLES IN INPUT SPEC SETZM LKWP3 ;CLEAR POINTER TO ALREADY SCANNED LIST PUSHJ P,DOWILD ;DO ALL WILDCARDS FOR THIS SPEC JRST INSPLP ;AND TRY AGAIN ;HERE TO PROCESS ALL (POSSIBLLY WILD) FILES THAT MATCH THIS INSPEC ;[25]CORRECTED ALL LABELS TO BE SEQUENTIAL DOWILD: TXNN F,FT.HLD ;[17][27]ARE WE IN "HOLD" MODE JRST DOWI01 ;[17]NO, VANILLA THINGS THEN MOVSI T1,(SIXBIT/WRK/) ;[17]YES, FAKE OUTPUT STR MOVEM T1,OUTBLK+.FXDEV ;[17].. DOWI01: MOVE T1,[LKWLEN,,%LKWLD] ;SET UP CALL PUSHJ P,.LKWLD## ;CALL WILD CARD LOOKUP POPJ P, ;DONE ALL FILES THAT MATCH AOJN T2,DOWI04 ;[25]INPUT NOT DISK DEVICE MOVEM T1,INPDVC ;SAVE THE DEVCHR WORD PUSHJ P,OPNLKP ;[32]GO DO OPEN/LOOKUP ON INPUT JRST DOWI03 ;[32]INPUT ERROR, TRY NEXT FILE PUSHJ P,.CHKTM## ;[33]LET WILD CHECK /BEFORE/SINCE JRST DOWI03 ;[33]DOESN'T APPLY, TRY NEXT MOVE T1,[OUTBLK,,OUTSPE] ;[14]COPY IN OUTPUT SPEC BLT T1,OUTSPE+OUTLEN-1 ;[14](FRESH COPY CAUSE MAY HAVE BEEN HACKED) PUSHJ P,SETOSP ;[14]HACK THE OUTPUT SPEC IF NECESSARY MOVE T1,[SCWLEN,%SCWLD] ;CALL .SCWLD TO SET UP PUSHJ P,.SCWLD## ;OUTPUT JRST DOWI03 ;TRY NEXT AOJN T2,DOWI05 ;[25]OUTPUT NOT TO DISK MOVEM T1,OUTDVC ;SAVE OUTPUT DEVCHR WORD PUSHJ P,SETEXT ;SET UP EXTENDED ARGS PUSHJ P,OPNENT ;[32]DO OPEN/ENTER ON OUTPUT JRST DOWI03 ;[32]ERROR, TRY NEXT FILE MOVE T1,%OPENI+1 ;[16]GET INPUT STR CAME T1,%OPENO+1 ;[16]SAME AS OUTPUT? JRST DOWI02 ;[16]NO, COMMON SAFE CASE PUSHJ P,CHKIDN ;[16]YES, BE SURE NOT IDENTICAL FILE JRST DOWI02 ;[16]NOT SAME, PRESS ON CLOSE ICH, ;[16]SAME, FORGET IT CLOSE OCH,CL.RST ;[24]CLOSE WITH NEW COPY DISCARDED JRST DOWI03 ;[16]TRY NEXT FILE DOWI02: SKIPL LF.INF ;[15]DID A /INFORM SWITCH GET SET PUSHJ P,INFORM ;[15]YES, CALL INFORMER PUSHJ P,FASTMV ;DO MOVE JRST DOWI03 ;[32]ERROR IN MOVE OR SETUP, FILES CLOSED CLOSE OCH, ;NICE!, NICE! TXNE F,FT.MOV ;[27]ARE WE IN MOVE MODE? PUSHJ P,DELFIL ;[27]YES, DELETE FILE NOW CLOSE ICH, ;[20]CLOSE HIM TOO ;HERE AT END OF LOOP ON EACH WILD RETURN DOWI03: JRST DOWILD ;[14]GOT THAT ONE [25,32];HERE WHEN INPUT IS NOT A DISK DEVICE, TRY NEXT FILE DOWI04: MOVE T1,%OPENI+1 ;GET INPUT DEVICE NAME TYPE$ (F,IND,$S,) JRST DOWI03 ;TRY NEXT ONE ;[25,32]HERE WHEN OUTPUT IS NOT A DISK DEVICE, QUIT DOWI05: MOVE T1,%OPENO+1 ;GET OUTPUT STR NAME TYPE$ (F,OND,$S,) SETZM INSPCT ;BLOW OFF SPEC COUNT SO WE QUIT POPJ P, ;AND RETURN FROM DOWILD ;HERE TO SET UP AND DO THE MOVE ON THE DEVICE FASTMV: SKIPG %LOKUP+.RBSIZ ;[32]GET FILE SIZE IN WORDS JRST .POPJ1 ;[20,32]NOTHING THERE, JUST RETURN PUSH P,.JBFF ;[32]SAVE .JBFF TO START SO CAN REALLOCATE PUSHJ P,CMPMOV ;[32]COMPUTE MOVE PARAMETERS JRST FAST05 ;[32]ERROR IN PARAMETERS, ABORT ;[32] HERE AFTER SETUP WITH: ; WRDCLS: SIZE OF CLUSTER IN WORDS, SMALLER OF INPUT OR OUTPUT STR(WAS INPCLS[32]) ; BLKCLS: SIZE OF CLUSTER IN BLOCKS, SMALLER OF TWO AS ABOVE ; IOLIST: XWD Z,,BUFFER AS ALLOCATED BY GETCOR ; XFERS: COUNT OF TRANSFERS, ZERO NOW ; T2/WRDCLS LESS 200 (ALLOWING FOR FIRST RIB) ; T3/SIZE OF FILE IN WORDS(WAS T4[32]) FAST01: CAML T2,T3 ;MORE THAN 1 CLUSTER LEFT MOVE T2,T3 ;NO, USE ACTUAL SIZE SUB T3,T2 ;SUBTRACT THIS BUFFER MOVNI T2,(T2) ;NEGATE AND HRLM T2,ILIST ;PUT IN IO LIST IN ICH,ILIST ;GET A BUFFER CAIA ;SKIP IS ERROR JRST FAST06 ;[15,32]INPUT I/O ERROR FAST02: OUT OCH,ILIST ;AND WRITE IT CAIA ;NON-SKIP NORMALLY JRST FAST10 ;[15,32]OUTPUT I/O ERROR FAST03: MOVE T2,WRDCLS ;RESET XFER SIZE AOS XFERS ;[15]COUNT TRANSFERS JUMPN T3,FAST01 ;[32]GET NEXT IF ANY LEFT FAST04: POP P,.JBFF ;[32]RESTORE .JBFF AND JRST CPOPJ1 ;[32]GIVE GOOD RETURN ;[32]HERE IF ABORT DURING SETUP FAST05: POP P,.JBFF ;RESTORE .JBFF FOR NEXT FILE CLOSE OCH,CL.RST ;DISCARD OUTPUT FILE CLOSE ICH, ;CLOSE INPUT POPJ P, ;AND ERROR RETURN ;[15,32]HERE IF INPUT I/O ERROR FAST06: GETSTS ICH,T1 ;GET STATUS TRNE T1,20000 ;EOF? JRST FAST02 ;YES, DO LAST WRITE SKIPLE LF.ERR ;ARE WE IGNORING ERRORS? JRST FAST07 ;NO TRY RECOVERY TYPE$ (F,IER,$O,);[25] JRST RESTRT ;[26]KISS OF DEATH FAST07: PUSHJ P,RESETI ;[32]RESET INPUT JRST FAST02 ;AND BACK FOR NEXT ;[15,32]HERE IF OUTPUT I/O ERROR FAST10: GETSTS OCH,T1 ;GET STATUS SKIPLE LF.ERR ;ARE WE IGNORING ERRORS? JRST FAST11 ;NO, TRY TO RECOVER TYPE$ (F,OER,$O,);[25] JRST RESTRT ;[26]KISS OF DEATH FAST11: PUSHJ P,RESETO ;[32]RESET OUTPUT AND MESSAGE JRST FAST03 ;AND CARRY ON SUBTTL MINOR MODULES ;SUBROUTINES FOR INITL ;[30]HERE TO SEE IF STR IS MOUNTED FOR /HOLD CHKSTR: MOVEI T1,.IODMP ;USE DUMP MODE AND AVOID HEADERS MOVEM T1,%OPENI ;.. MOVE T1,[HLDSTR] ;SET UP STR NAME MOVEM T1,%OPENI+1 ;.. MOVEM T1,%IPATH ;ALSO FOR PATH IF NEEDED SETZM %OPENI+2 ;NO IBUF/OBUF OPEN ICH,%OPENI ;TRY TO OPEN STR JRST CHKS02 ;LOST IT ALREADY MOVE T1,[10,,%IPATH] ;SET UP FOR INPUT PATH. T1, ;PATH JRST CHKS02 ;SO MUCH FOR THAT MOVEI T1,3 ;SET COUNT OF ENTER ARGS MOVEM T1,%LOKUP ;.. MOVE T1,%IPATH+2 ;GET DEFAULT PPN FOR WRK: MOVEM T1,%LOKUP+.RBNAM ;AS FILE NAME MOVE T1,[1,,1] ;PPN IS MFD MOVEM T1,%LOKUP+.RBPPN ;.. MOVSI T1,(SIXBIT/UFD/) ;EXTENTION UFD MOVEM T1,%LOKUP+.RBEXT LOOKUP ICH,%LOKUP ;TRY FOR THE UFD JRST CHKS02 ;NO LUCK CHKS01: MOVEI T1,ICH ;SET UP CHANNEL NO RESDV. T1, ;AND RELEASE IT JFCL ;OK, OK POPJ P, ;BACK CONVINCED UFD IS THERE CHKS02: MOVE T1,[HLDSTR] ;SET UP FOR ERROR TYPE$ (F,SMM,$S,) AOS (P) ;SET FOR SKIP RETURN IF ERROR JRST CHKS01 ;RELEASE CHANNEL IF NECESSARY ;SUBROUTINES FOR INSPLP ;[14]SUBROUTINE TO FILL IN HOLES IN INPUT SPEC WITH WILD CARDS ALWAYS SETISP: MOVSI T1,120000 ;GET A SIXBIT "*" READY MOVE T2,[FX.NUL] ;AND NULL EXT BIT SKIPE INSPEC+.FXNAM ;NAME MISSING JRST SETI01 ;NO, PRESS ON MOVEM T1,INSPEC+.FXNAM ;YES, PUT IN THE * SETZM INSPEC+.FXNMM ;ZERO MASK IN THIS CASE TDNN T2,INSPEC+.FXMOD ;IS NULL EXT ON (NO EXT EITHER?) JRST SETI02 ;NO, HE DID SOMETHING EXPLICIT TDZ T2,INSPEC+.FXMOD ;YES, ASSUME .* AND TURN IT OFF MOVEM T1,INSPEC+.FXEXT ;MAKE IT SO JRST SETI02 ;PRESS ON SETI01: TDNN T2,INSPEC+.FXMOD ;IS NULL EXT ON? JRST SETI02 ;NO, HE TYPED WHAT HE WANTS THEN MOVEM T1,INSPEC+.FXEXT ;YES, MAKE IT ".*" TDZ T2,INSPEC+.FXMOD ;AND TURN IT OFF SETI02: ;DO DIRECTORY TOO LATER POPJ P, ;ALL DONE ;SUBROUTINES FOR DOWILD ;[32]SUBROUTINE TO OPEN AND LOOKUP INPUT FILE OPNLKP: MOVEI T1,17 ;WE WILL BE IN DUMP MODE HRRM T1,%OPENI SETZM %OPENI+2 ;NO BUFFERS OPEN ICH,%OPENI ;DO OPEN INPUT JRST OPNL01 ;LOST, DEAL WITH ERROR LOOKUP ICH,%LOKUP ;AND LOOKUP JRST OPNL02 ;ERROR AGAIN JRST CPOPJ1 ;WON, GOOD RETURN OPNL01: PUSHJ P,E.DFO## ;CALL OPEN ERROR ROUTINE IN SCAN POPJ P, ;AND ERROR RETURN OPNL02: MOVE T1,%LOKUP+.RBEXT ;[31]MOVE ERROR CODE MOVEM T1,.RBPRV ;[31]TO WHERE SCAN THINKS IT IS PUSHJ P,E.DFL## ;SCAN LOOKUP ERROR (ON INSPEC) POPJ P, ;GIVE ERROR RETURN ;[14]SUBROUTINE TO HACK OUTPUT SPEC TO AGREE WITH INPUT SETOSP: MOVE T2,[FX.NUL] ;GET NULL EXT TEST READY SKIPE OUTSPE+.FXNAM ;NAME MISSING JRST SETO01 ;NO, CHECK EXT MOVE T1,INSPEC+.FXNAM ;YES, GET INPUT NAME AND MOVEM T1,OUTSPE+.FXNAM ;STUFF IT IN MOVE T1,INSPEC+.FXNMM ;MASK ALSO MOVEM T1,OUTSPE+.FXNMM ;.. TXNN F,FT.HLD ;[17][27]DONT TEST IN HOLD MODE TDNE T2,OUTSPE+.FXMOD ;IS NULL EXT ON (NO EXT EITHER?) CAIA ;[17]NULL EXT (OR HOLD MODE) JRST SETO02 ;NO, HE DID SOMETHING EXPLICIT MOVE T1,INSPEC+.FXEXT ;SHOULD AGREE WITH INPUT THEN MOVEM T1,OUTSPE+.FXEXT ;MAKE IT SO TDNE T2,INSPEC+.FXMOD ;IF INPUT HAS NULL EXT TDOA T2,OUTSPE+.FXMOD ;SO SHOULD WE TDZ T2,OUTSPE+.FXMOD ;ELSE WE SHOULDN'T JRST SETO02 ;PRESS ON SETO01: TDNN T2,INSPEC+.FXMOD ;IS NULL EXT ON? JRST SETO02 ;NO, HE TYPED WHAT HE WANTS THEN MOVE T1,INSPEC+.FXEXT ;GET WHATEVER INPUT IS USING MOVEM T1,OUTSPE+.FXEXT ;.. TDNE T2,INSPEC+.FXMOD ;INCLUDING TDOA T2,OUTSPE+.FXMOD ;NOTHING AT ALL TDZ T2,OUTSPE+.FXMOD ;OR WHATEVER SETO02: ;DO DIRECTORY TOO LATER POPJ P, ;ALL DONE ; STILL IN SUBROUTINES FOR DOWILD ;[32]SUBROUTINE TO OPEN AND ENTER OUTPUT FILE OPNENT: MOVEI T1,17 ;DUMP MODE HRRM T1,%OPENO OPEN OCH,%OPENO ;TRY AND OPEN JRST OPNE01 ;LOST, REPORT ERROR ENTER OCH,%ENTER JRST OPNE02 ;FAILED ENTER... JRST CPOPJ1 ;WON, GOOD RETURN ;HERE IF OPEN FAILED ON OUTPUT OPNE01: PUSHJ P,E.SCO## ;LET SCAN DO THE WORK TYPING POPJ P, ;AND ERROR RETURN OPNE02: MOVE T1,%ENTER+.RBEXT ;[31]MOVE ENTER ERROR MOVEM T1,%ENTER+.RBPRV ;[31]FOR SCAN PUSHJ P,E.SCL## ;WILD LOOKUP/ENTER ERROR ;BASED ON .SCWLD CALL POPJ P, ;AND ERROR RETURN ;[16]HERE TO VERIFY WE ARENT JUST OVERWRITING THE SAME FILE CHKIDN: MOVE T1,%LOKUP+.RBNAM ;GET FILE NAME IN CAME T1,%ENTER+.RBNAM ;COMPARE TO OUT POPJ P, ;DIFFERENT, WE ARE OK HLRZ T1,%LOKUP+.RBEXT ;GET EXTENTION HLRZ T2,%ENTER+.RBEXT ;FOR BOTH CAIE T1,(T2) ;SAME AGAIN? POPJ P, ;NO ;LOOKS BLACK, CHECK PATHS TO BE SURE MOVEI T1,ICH MOVEM T1,%IPATH ;[TW] RESET CHAN NO IN PATH BLOCK MOVE T1,[10,,%IPATH] ;SET UP FOR INPUT PATH. T1, ;PATH DIE ;[25]CANT FAIL! MOVEI T1,OCH MOVEM T1,%OPATH ;[TW] MOVE T1,[10,,%OPATH] ;AND OUTPUT PATH. T1, DIE ;[25]AGAIN MOVE T2,[-6,,2] ;SET UP AOBJN FOR SCAN(PAST CHN & FLAGS) CHKI01: MOVE T1,%IPATH(T2) ;GET AN ARG CAME T1,%OPATH(T2) ;SAME? POPJ P, ;NO, QUIT AOBJN T2,CHKI01 ;YES, LOOK AT NEXT CPOPJ1: AOS (P) ;SAME FILE, GIVE ERROR RETURN POPJ P, ; STILL IN SUBROUTINES FOR DOWILD ;[27]ROUTINE TO DELETE FILE ON INPUT CHANNEL DELFIL: MOVE T1,%LOKUP+.RBNAM ;GET FILE MOVEM T1,DELAR1 ;AND SAVE IN CASE ERROR MOVE T1,%LOKUP+.RBEXT ;GET EXT MOVEM T1,DELAR2 ;.. MOVE T1,%LOKUP+.RBPPN ;.. MOVEM T1,DELAR3 ;.. SETZM %LOKUP+.RBNAM ;ZAP NAME.. SETZM %LOKUP+.RBEXT ;..EXTENTION.. SETZM %LOKUP+.RBPPN ;..AND PPN RENAME ICH,%LOKUP ;DO THE RENAME CAIA ;WHOOPS POPJ P, ;DONE, RETURN MOVE T1,[4,,DELLST] ;SET UP POINT TO LIST TYPE$ (W,CDF,$I,) POPJ P, ;HOLD LIST AND VALUES FOR ERROR CDF DELLST: $S %OPENI+1 ;POINT TO DEVICE, $S DELAR1 ;AND SAVED FILE... $L DELAR2 ;..EXT $P DELAR3 ;AND PPN $LOW ;ARGS IN LOW SEG DELAR1: Z ;HOLD FILE DURING DELETE DELAR2: Z ;HOLD EXT DELAR3: Z ;HOLD PPN $HIGH ;BACK TO HIGH SEG ;[3]HERE TO MOVE EXTENDED LOOKUP ARGS FROM INPUT TO OUTPUT LOOKUP BLOCK SETEXT: HRRZ T1,%LOKUP+.RBEXT ;GET HIGH ORDER DATE TRZ T1,077777 ;CLOBBER ACCESS SO GET TODAY HRRM T1,%ENTER+.RBEXT ;AND STORE MOVE T1,%LOKUP+.RBPRV ;[13]GET PRIV WORD (PROTECTION REALLY) LDB T2,[POINT 9,%ENTER+.RBPRV,8] ;[13]GET USER PROTECTION MOVEM T1,%ENTER+.RBPRV ;[13]PUT IN OLD VALUE SKIPE T2 ;[13]BUT IF USER GAVE NEW PROT DPB T2,[POINT 9,%ENTER+.RBPRV,8] ;[13]PUT IT BACK MOVE T1,%LOKUP+.RBSIZ ;[13]GET SIZE IN WORDS LSH T1,-7 ;[13]CONVERT TO BLOCKS AOJ T1, ;[13]+1 FOR PROBABLE REMAINDER SKIPN %ENTER+.RBEST ;[13]USER ESTIMATE? MOVEM T1,%ENTER+.RBEST ;[13]NO, USE ACTUAL SIZE MOVE T1,%LOKUP+.RBVER ;[13]GET OLD VERSION SKIPN %ENTER+.RBVER ;[13]USER VERSION? MOVEM T1,%ENTER+.RBVER ;[13]NO, USER OLD ONE IF ANY POPJ P, ;DONE ; STILL IN SUBROUTINES FOR DOWILD ;[15]HERE IF /INFORM HAS BEEN GIVEN (MOVED IN [32]) INFORM: MOVE T1,LF.INF ;GET INFORM LEVEL CAIN T1,INFNON ;IF IT IS "NONE" POPJ P, ;FORGET IT TXNE F,FT.HDR ;[17,27]FIRST TIME THUR? JRST INFO01 ;[17]NO, JUST DO FILE MOVEI T1,[ASCIZ/HOLD/] ;[17]ASSUME HOLD MODE TXNE F,FT.DUP ;[27]IF DUP OR MOVE.. MOVEI T1,[ASCIZ/DUP/] TXNE F,FT.MOV ;[27]..CORRECT ASSUMPTION MOVEI T1,[ASCIZ/MOVE/] TYPE$ (N,,$A,<+:>,NONE) ;[17][25]SEND IT AWAY TXO F,FT.HDR ;[17,27]REMEMBER LEADIN DONE MOVE T1,LF.INF ;[27]REGET INFORM LEVEL CAIN T1,INFSLO ;[27]IF SLOW WE SHOULD... PUSHJ P,.TCRLF ;[27]FINISH OFF LINE HERE INFO01: CAIE T1,INFFAS ;[27]FAST? JRST INFO02 ;[17]NO, MUST BE SLOW MOVE T1,[3,,IFILLS] ;[25,27]SET UP LIST POINTER TYPE$ (T,,$I,<+:+.+>,NONE) ;[25,34] MOVEI T1,%LOKUP+.RBPPN ;[35]GET THE POINTER TO PPN BLOCK PUSHJ P,.TDIRB## ;[35]GO TYPE THE PATH PJRST .TCRLF ;[34]END HERE INFO02: MOVEI T1,%OPENO ;SET UP OPEN AND MOVEI T2,%ENTER ;ENTER BLOCK PUSHJ P,.TOLEB## ;SEND THAT MOVEI T1,"=" ;[25]GET DELIMITER PUSHJ P,.TCHAR ;[25]SEND IT PUSH P,%OPENI+1 ;SAVE THE GENERIC DEVICE NAME MOVEI T1,ICH ;SO WE CAN DEVNAM T1, ;GET THE PHYSICAL NAME DIE ;[25]??? MOVEM T1,%OPENI+1 ;FAKE OUT SCAN MOVEI T1,%OPENI ;REDO FOR INPUT SIDE MOVEI T2,%LOKUP ;.. PUSHJ P,.TOLEB ;.. POP P,%OPENI+1 ;PUT OPEN BLOCK BACK TOGETHER TYPE$ (N,,$N,<, >,NONE) ;[25] MOVE T1,%LOKUP+.RBSIZ ;GET SIZE TRZE T1,177 ;EVEN? ADDI T1,200 ;NO, TAKE TO NEXT BIGGEST PUSHJ P,.TBLOK## ;FOR SIZE PUSHJ P,.TCRLF ;[25]FINISH OFF LINE POPJ P, ;DONE ;[27]ARG LIST FOR INFORM:F IFILLS: $S %OPENI+1 ;STR NAME $S %LOKUP+.RBNAM ;FILE NAME $L %LOKUP+.RBEXT ;FILE EXT ;SUBROUTINES FOR FASTMV ;[32]HERE TO COMPUTE MOVE PARAMETERS ;[32]THIS WAS INLINE CODE IN FASTMV CMPMOV: ;GET STR CHARACTERISTICS MOVE T1,%OPENI+1 ;INPUT DEVICE NAME MOVEM T1,%DVCHR ;IN DEVCHR BLOCK MOVE T1,[DEVLEN,,%DVCHR] ;FOR THE DSKCHR T1, ;DSKCHR UUO DIE ;[25]ALREADY VERIFIED AS DSK! LDB T1,[POINT 9,%DVCHR+.DCUCH,8] ;GET BLOCKS/CLUSTER MOVEM T1,INPCLS ;SAVE CLUSTER SIZE MOVE T1,%OPENO+1 ;OUTPUT DEVICE NAME MOVEM T1,%DVCHR ;IN DEVCHR BLOCK MOVE T1,[DEVLEN,,%DVCHR] ;FOR THE DSKCHR T1, ;DSKCHR UUO DIE ;[25]ALREADY VERIFIED AS DSK LDB T1,[POINT 9,%DVCHR+.DCUCH,8] ;GET BLOCKS/CLUSTER MOVEM T1,OUTCLS ;SAVE OUTPUT CLUSTER SIZE ;COMPUTE OUTPUT FILE SIZE MOVE T1,%LOKUP+.RBSIZ ;GET FILE SIZE IN WORDS IDIVI T1,200 ;AS BLOCKS SKIPE T2 ;REMAINDER AOJ T1, ;YES, ROUND UP ADDI T1,2 ;FOR RIBS PUSH P,T1 ;SAVE THIS A SEC IDIV T1,OUTCLS ;DIVIDE BY CLUSTER SIZE POP P,T1 ;GET BACK SIZE ADDI T1,(T2) ;MAKE EVEN CLUSTER ;CHECK AGAINST QUOTA MOVE T2,%DVCHR+.DCUFT ;GET QUOTA CAME T2,[377777,777777] ;[23]CREDIR OR SYSTEM UFD? CAMN T2,[400000,,0] ;OR UNKNOWN QUOTA JRST CMPM01 ;TRY ANYWAY CAMLE T1,T2 ;NEED MORE THAN QUOTA? JRST CMPM02 ;COMPLAIN CAMLE T1,%DVCHR+.DCFCT ;LESS THAN TOTAL FCFS JRST CMPM03 CMPM01: ;FILE WILL FIT, SET UP XFER PARMS MOVE T1,INPCLS ;GET THE INPUT CLUSTER (BLOCKS) CAMLE T1,OUTCLS ;SAME FOR BOTH STRS? MOVE T1,OUTCLS ;NO, USE SMALLER CAIGE T1,MINBLK ;[36]IF LESS THAN MIN BLOCKS/XFR MOVEI T1,MINBLK ;[36]USE MINIMUM INSTEAD MOVEM T1,BLKCLS ;[15]SAVE BLOCKS/CLUSTER IMULI T1,200 ;NOW WORDS MOVEM T1,WRDCLS ;SAVE AS WORDS/CLUSTER PUSHJ P,GETCOR ;TRY AND ALLOCATE BUFFER FOR CLUSTER JRST CMPM04 ;LOST, REPORT ERROR SOJ T2, ;MAKE IOWD OF ADDRESS AND HRRM T2,ILIST ;PUT IN IO LIST MOVE T3,%LOKUP+.RBSIZ ;SIZE OF FILE IN WORDS FOR FASTMV MOVE T4,WRDCLS ;GET CLUSTER SIZE IN WORDS MOVE T2,T4 ;ASSUME SIZE FIRST XFER SAME SUBI T4,200 ;SIZE OF FIRST CLUSTER (LESS RIB) CAMLE T3,T4 ;IS FILE MORE THAN 1 CLUSTER? SUBI T2,200 ;YES, ADJUST SIZE OF FIRST ONE THEN ;HAVE FILE SIZE WRDS IN T3, FIRST XFER IN T2 JRST CPOPJ1 ;SKIP RETURN FOR OK ;STILL IN CMPMOV ;[32]HERE IF QUOTA TO SMALL ON OUTPUT FOR FILE ;[32]WAS NOQOTA CMPM02: TYPE$ (F,QTS,$N,,NONE);[25] SKIPA ;FALL INTO ... ;[32]HERE IF FREE SPACE TO SMALL ON OUTPUT ;[32]WAS NOFREE CMPM03: TYPE$ (F,FTS,$N,,NONE);[25] MOVE T1,[3,,OFILLS] ;[25]SET UP LIST FOR STR:FILE.EXT TYPE$ (N,,$I,<+: FOR +.+>);[25] POPJ P, ;ERROR RETURN ;[32]HERE IF CANNOT ALLOCATE CORE FOR BUFFER ;[32]WAS NOFREE CMPM04: PUSH P,T1 ;SAVE REQUEST MOVE T1,.JBFF ;[25]GET FIRST FREE IDIVI T1,1000 ;[25]MAKE PAGES SKIPE T2 ;[25]REMAINDER? AOJ T1, ;[25]YES, UP ONE TYPE$ (F,CAB,$D,,NONE) POP P,T2 ;[32]RESTORE REQUEST IDIVI T2,1000 ;[32]MAKE PAGES SKIPE T3 ;[32]ANY REMAINDER? AOJ T2, ;[32]YES, ROUND UP ADDI T1,(T2) ;[32]NOW TOTAL REQUIRED TYPE$ (N,,$D,<+ REQUIRED>) JRST RESTRT ;[16]RESTART ;[25]ARG LIST FOR QTS, FTS ERRORS OFILLS: $S %OPENO+1 ;[36]STR NAME $S %ENTER+2 ;FILE NAME $L %ENTER+3 ;FILE EXT ;[32]HERE ON INPUT ERROR TO TYPE MESSAGE AND RESET STATUS ;[32]WAS LYING AROUND NEAR MOVLOP RESETI: MOVEM T1,IOERA1 ;[25]SAVE STATUS FIRST ARG SLOT MOVE T1,XFERS ;GET COUNT MOVED IMUL T1,BLKCLS ;CONVER TO BLOCKS MOVEM T1,IOERA2 ;[25]SAVE IN ARG 2 AOS IOERA2 ;[25]BUT MAKE INTO FIRST MOVED ADD T1,BLKCLS ;NOW UPPER LIMIT MOVEM T1,IOERA3 ;[25]SAVE AS THIRD ARG MOVE T1,[3,,IOERA0] ;[25]SET UP LIST TO ARGS TYPE$ (W,IES,$I,);[25] MOVE T1,IOERA1 ;[25]GET BACK STATUS TRZ T1,740000 ;CLEAR ALL ERROR BITS SETSTS ICH,(T1) ;AND RESET STATUS POPJ P, ; STILL IN FASTMV SUBROUTINES ;[32]HERE TO TYPE MESSAGE AND RESET OUTPUT STATUS ON ERROR RECOVERY ;[32]WAS LYING AROUND NEAR FASTMV RESETO: MOVEM T1,IOERA1 ;[25]SAVE STATUS FIRST ARG SLOT MOVE T1,XFERS ;GET COUNT MOVED IMUL T1,BLKCLS ;CONVER TO BLOCKS MOVEM T1,IOERA2 ;[25]SAVE IN ARG 2 AOS IOERA2 ;[25]BUT MAKE INTO FIRST MOVED ADD T1,BLKCLS ;NOW UPPER LIMIT MOVEM T1,IOERA3 ;[25]SAVE AS THIRD ARG MOVE T1,[3,,IOERA0] ;[25]SET UP LIST TO ARGS TYPE$ (W,OES,$I,);[25] MOVE T1,IOERA1 ;[25]GET BACK STATUS TRZ T1,740000 ;CLEAR ALL ERROR BITS SETSTS OCH,(T1) ;AND RESET STATUS POPJ P, ;BACK TO TRY NEXT ;[25]ARGS FOR IES, OES MESSAGES ;LIST THAT DEFINES SUBSTITUTION AND ARG LOCATION IS FIXED, LEAVE HI IOERA0: $O IOERA1 ;OCTAL STATUS IN IOERA1 $D IOERA2 ;DECIMAL BLOCKS A2 AND A3 $D IOERA3 ;BUT DATA MUST BE LOW SEG $LOW IOERA1: Z ;FOR STATUS IOERA2: Z ;FOR FIRST BLOCK IOERA3: Z ;FOR LAST BLOCK $HIGH ;[32]SUBROUTINES CALLED FROM SCAN, NOT US ;[3]SUBROUTINE TO ALLOCATE BLOCKS FOR INPUT SPECS (32 WORD CHUNKS) ;RETURNS T1=ADDRESSS, T2=LENGTH, NO RETURN ON ERROR (LIKE NO CORE) ;[32]CHANGED ARGS TO COMFORM TO GETCOR CHANGE ALLIN: MOVEI T1,INLEN ;[10,32]AMOUNT WE NEED PUSHJ P,GETCOR ;SET IT UP DIE ;[32]DIRE STRAIGHTS IF CANT GET A FEW WORDS AOS T1,INSPCT ;[32]GET NEW COUNT CAIL T1,SPCCNT ;[32]ARE WE OVER MAX? JRST ALLI01 ;[25]YES, COMPLAIN MOVEM T2,SPCLST-1(T1) ;[32]SAVE POINTER TO SPEC AND MOVE T1,T2 ;[32]SET UP ADDRESS FOR SCAN MOVEI T2,INLEN ;[10,32]RESTORE LENGTH POPJ P, ;AND RETURN HAPPY ALLI01: MOVEI T1,SPCCNT ;[32]GET MAX ALLOWED TYPE$ (F,TIS,$D,);[25] JRST RESTRT ;[26]SEE IF SHOULD GIVE HIM ANOTHER CHANCE ;SUBROUTINE TO ALLOCATE OUTSPEC BLOCK FOR SCAN ;ONLY 1 CALL ALLOWED ALLOUT: SKIPE ALOTCK ;FIRST CALL? JRST ALLO01 ;[25]NO, ABORT SETOM ALOTCK ;REMEMBER CALL MOVEI T1,OUTBLK MOVEI T2,OUTLEN CPOPJ: POPJ P, ALLO01: TYPE$ (F,OSA,$N,);[25] JRST RESTRT ;[26,25] ;[32]MISCELLANEOUS UTILITY ROUTINES ;[11]SUBROUTINE TO CLEAR INSPCT AND ALOTCK WHENEVER .TSCAN STARTS SCANNING CLRFLG: SETZM ALOTCK ;CLEAR ALLOCATED OUTPUT SPEC SETZM INSPCT ;ZERO INPUT SPEC COUNT SETOM LS.ERR ;[15]CLEAR /INFORM AND SETOM LS.INF ;[15]/INFORM SO SCAN ALOWS NEW VALUES POPJ P, ;BACK TO SCAN ;[3]SUBROUTINE TO ALLOCATE CORE ;[32]CALLING CONVENTION REVERSED IN THIS EDIT ;CALL WITH T1=WORDS REQUIRED, SKIP RETURNS WITH T1 UNCHANGED ;AND T2=STARTING ADDRESS IF SUCESSFULL, NON-SKIP IF LOSES. GETCOR: MOVE T2,T1 ;[32]GET REQUEST IN T2 HRRZ T1,.JBFF ;[32]FIRST FREE ADDI T1,-1(T2) ;[32]NEW HIGHEST USED CAMG T1,.JBREL ;NEED MORE? JRST GETC01 ;NO, THIS IS ENOUGH PUSH P,T1 ;SAVE THIS SO CORE T1, ;ASK FOR MORE JRST GETC02 ;[32]LOST, SET UP ERROR RETURN POP P,T1 ;OK, GET BACK ADDRESS GETC01: EXCH T1,.JBFF ;SAVE NEW HIGHEST USED AND ;GET USERS FIRST LOC AOS .JBFF ;NOW NEW FIRST FREE EXCH T1,T2 ;[32]PUT REQUEST BACK IN 1,ADDRESS IN 2 JRST .POPJ1## ;BACK HAPPY GETC02: POP P,(P) ;[32]DISCARD NEW ADDRESS EXCH T1,T2 ;[32]RESTORE REQUEST POPJ P, ;[32]AND ERROR RETURN ;ROUTINE TO IMPLEMENT TYPE$ CALLS ;CALL WAS ; MOVE T1,[VALUE] ;OR MOVE T1,[COUNT,,LIST] ; PUSHJ P,TYPER ; BYTE (9)CAIA(4)HEADER(1)Z(2)RETN,TRAILER(18)SIXBIT/PFX/ ; BYTE (9)SUBS(2)0(7)SCHR(18)ADDRESS ;LIST: SUBS ADDRESS ; SUBS ADDRESS ;COUNT TIMES $LOW ;GO TO LOW SEG AND DEFINE STORAGE FOR ARGS AND AC'S TYPBLK: BLOCK 17 ;HOLDS ALL AC'S BUT P TYPAR1: Z ;HOLDS FIRST ARG TYPAR2: Z ;HOLDS SECOND ARG INFFLG: Z ;FLAG FOR CLOSING ] AT END -1 IF TRUE TYPADD: Z ;HOLDS ADDRESS OF ASCIZ STRING TYPCNT: Z ;COUNT OF INDIRECT ARGUMENTS TYPOUT: Z ;PUT ADDRESS OF TYPEOUT ROUTINE HERE ELSE OUTCHR $HIGH ;BACK FOR CODE TYPER: MOVEM 0,TYPBLK ;SAVE AC 0 MOVE 0,[1,,TYPBLK+1] ;THEN BLT ALL AC'S... BLT 0,TYPBLK+16 ;..BUT P INTO SAVE AREA MOVE T1,[IOWD 3,TYPAR1] ;MAKE POINTER TO ARG SAVE AREA PUSH T1,@(P) ;SAVE FIRST ARG AOS (P) ;POINT TO SECOND ARG PUSH T1,@(P) ;AND PUT IT IN TOO AOS (P) ;SET UP FOR NORMAL RETURN HLLZ P2,TYPAR1 ;GET BASIC CODES LSH P2,^D9 ;IGNORE THE CAIA SETZ P1, ;AND CLEAR GARBAGE LSHC P1,4 ;PICK UP HEADER CODE JUMPE P1,TYPE01 ;NO VERBO THINGS MOVE T1,MSGCHR-1(P1) ;GET LEADIN CHR PUSHJ P,.TCHAR ;CALL THE CHRACTER OUTPUTTER CAIN P1,4 ;IF NOT TAB ONLY JRST TYPE01 ;IT IS, QUIT HERE SETZM INFFLG ;CLEAR INFO ONLY FLAG FOR END CAIN P1,3 ;IS IT INFO? SETOM INFFLG ;YES, REMEMBER IT FOR END THEN HRLZI T1,(SIXBIT/FST/) ;SET UP PROGRAM ID HRR T1,TYPAR1 ;AND ERROR CODE IN CALL+1 PUSHJ P,.TSIXN ;TYPE THE SIXBIT PUSHJ P,.TTABC ;AND A TAB ;CONTINUED NEXT PAGE (AT TYPE01) ;HERE WITH PREFIX TYPED AS REQUESTED, SET UP FOR SUBSTITUTION TYPE01: MOVE P2,TYPAR2 ;GET CALL + 2 HRRZI P3,(P2) ;GET ADDRESS OF TEXT HRLI P3,440700 ;TURN INTO BYTE POINTER MOVEM P3,TYPADD ;SAVE POINTER TO TEXT STRING HLRZ P4,P2 ;GET OTHER HALF READY TRZ P4,777600 ;ZAP ALL BUT SUBS CHR SKIPN P4 ;WAS THERE ONE? MOVEI P4,"+" ;NO, USE + THEN LSH P2,-^D27 ;SHIFT DOWN TO SUBS CODE SETZM TYPCNT ;ASSUME NOT INDIRECT CAIN P2,100 ;IS IT INDIRECT? JRST TYPE02 ;YES, SPECIAL CASE MOVEI P3,TYPBLK+1 ;NO, ARG IS IN SAVED T1 THEN JRST TYPE03 ;ALL SET FOR SUBS TYPE02: MOVE P1,TYPBLK+1 ;ARG BLOCK IS POINTED BY SAVED T1 THEN HLRZM P1,TYPCNT ;COUNT OF ARGS NON-ZERO (FLAGS INDIRECT HRRZ P1,P1 ;CREAM IN ARG TO GTSBWD PUSHJ P,GTSBWD ;SET UP FIRST ARGUMENT TYPE03: PUSHJ P,TYPTXT ;TYPE TEXT WITH SUBSTITUTION MOVE P2,TYPAR1 ;REGET BASIC CODES LSH P2,^D14 ;OVER TO TRAILER CODE SETZM P1 ;CLEAR DESTINATION LSHC P1,2 ;SHIFT IN TRAILER CODE JUMPN P1,TYPE04 ;IF NON-ZERO NO TRAILER MOVEI T1,"]" ;ASSUME NEED CLOSE FOR "INFO" SKIPE INFFLG ;RIGHT? PUSHJ P,.TCHAR ;RIGHT! PUSHJ P,.TCRLF ;AND FINSH WITH CRLF TYPE04: SETZM P1 ;CLEAR DESTINATION AGAIN LSHC P1,2 ;GET RETURN CODE SKIPE P1 ;NON-ZERO? EXIT ;YES, DISASTER EXIT MOVE 16,[TYPBLK,,0] ;SET UP TO BLT 16,16 ;RESTORE AC'S POPJ P, ;AND BACK TO CALLER ;TABLE OF LEADIN CHARACTERS ;REFERENCE WITH MSGCHR-1 MSGCHR: "?" ;1=FATAL "%" ;2=WARNING "[" ;3=INFO " " ;4=TAB (BUT NO VERBO MSG) ;SUBROUTINES FOR TYPER ;SUBROUTINE TO PICK UP SUBS CODE AND ADDRESS ;CAUTION, CALL+2 IS SPECIAL FORMAT, DONT USE HERE AS SCHR IS IN INDEX ;CALLED WITH ADDRESS OF CODE IN P1 ;RETURNS CODE IN P2, ADDRESS (E) IN P3, INCREMENTS P1 GTSBWD: PUSH P,P1 ;SAVE P1 IN CASE INDIRECT ADDRESS MOVE P2,(P1) ;GET SUBS WORD LSH P2,-^D27 ;SHIFT DOWN TO OP CODE ONLY GTSB01: MOVE P3,(P1) ;GET ADDRESS TLZ P3,777710 ;LESS AC AND OP CODE TLNN P3,17 ;IS THERE AN INDEX? JRST GTSB02 ;NO, PRESS ON HLRZ T1,P3 ;YES, GET IT TRZ T1,20 ;BE SURE INDIRECT IS OFF HRRZ T1,TYPBLK(T1) ;GET OLD AC CONTENTS (RH) ADDI P3,(T1) ;AND ADD INDEX GTSB02: TLZN P3,20 ;INDIRECT? JRST GTSB03 ;NO, DONE MOVEI P1,(P3) ;YES, START AGAIN JRST GTSB01 ;.. GTSB03: CAIGE P3,P ;ARG IN AC'S? ADDI P3,TYPBLK ;THEN REALLY IN SAVE AREA POP P,P1 ;RESTORE P1 SOSLE TYPCNT ;DECREMENT INDIRECT ARG COUNT AOJ P1, ;IF ANY LEFT STEP TO NEXT WORD POPJ P, ;AND RETURN ;SUBROUTINE TO TYPE ASCIZ TEXT STRING CALLING FOR SUBSTITUTION ;ROUTINE (TYPE IN P2, ADDRESS OF VALUE IN P3) WHENVER THE SUBS CHR ;(IN P4) IS SEEN IN THE TEXT TYPTXT: ILDB T1,TYPADD ;GET A BYTE SKIPN T1 ;NULL? POPJ P, ;YES, DONE CAIN T1,(P4) ;IS IT THE SUBSTITUTION CHR? JRST TYPT01 ;YES, TYPE SUBSTITUTION INSTEAD PUSHJ P,.TCHAR ;NO, TYPE THE CHR JRST TYPTXT ;AND BACK FOR NEXT TYPT01: SKIPLE P2 ;ARG IS NON-ZERO AND CAILE P2,TDSPLN ;LESS THAN MAX? JRST TYPT03 ;NO, IGNORE SUBSTITUTION THEN MOVE T1,(P3) ;YES, GET ARGUMENT AND PUSHJ P,@TYPDSP-1(P2) ;CALL ROUTINE TYPT02: SKIPLE TYPCNT ;ARE WE INDIRECT? PUSHJ P,GTSBWD ;YES, SET UP NEXT POINTER JRST TYPTXT ;THEN NEXT CHR TYPT03: PUSHJ P,.TCHAR ;SEND THE + AND JRST TYPT02 ;CHECK FOR INDIRECT TO INC ARG ;DISPATCH TABLE TO SUBSTITUTION TYPER ROUTINES TYPDSP: .TOCTW ;(1)OCTAL TYPER .TDECW ;(2)DECIMAL TYPER .TSIXN ;(3)SIXBIT TYPER .TSTRG ;(4)TYPE ASCIZ STRING (ADDRESS IN P3) TYPSIL ;(5)TYPE SIXBIT (LEFT HALF ONLY) .TPPNW ;(6)TYPE PPN FORMAT TDSPLN==.-TYPDSP ;LENGTH OF DISPATCH TABLE ;SPECIAL ROUTINES CALLED ABOVE TYPSIL: TRZ T1,-1 ;CLOBBER RIGHT HALF PJRST .TSIXN ;AND TYPE WHATS LEFT ;DEFINE TYPEOUT ROUTINES ;EXTERN TYPEOUT ROUTINES IN SCAN EXTERN .TCRLF,.TPPNW,.TRBRK,.TSIXN,.TXWDW,.TDECW,.TOCTW,.TRDXW EXTERN .TSTRG, .TSPAC,.TTABC,.TCOMA,.TCOLN,.TASTR,.TCHAR ;HERE TO GIVE UP (CALLED FROM DIE) ;RELOC ADDRESS AND TYPE MESSAGE ;CALL PUSHJ P,BUG ; NEVER RETURN BUG: MOVE T1,(P) ;GET ADDRESS+1 OF FAILURE MOVEI T1,-1(T1) ;CREAM APR FLAGS AND ADJUST ADDRESS MOVEI T2,BEGINH ;ASSUME HIGH SEG FAILURE CAIG T1,400000 ;HI SEG? MOVEI T2,BEGINL ;NO, LOW SEG RELOCATION THEN SUBI T1,(T2) ;SUBTRACT CORRECT RELOC TYPE$ (F,PLE,$O,,,,END) SUBTTL STORAGE ;STORAGE ;IN LOW SEGMENT $LOW PDL: BLOCK PDLEN SAVFF: Z ;HOLD INITIAL .JBFF ALOTCK: Z ;FLAG FOR MULTIPLE ALLOUT CALLS LKWP1: INSPEC ;HOLD FIRST WORD OF FIRST SCANNER FILE SPEC LKWP2: INSPEC ;HOLDS FIRST WORD OF LAST SCANNER FILE SPEC LKWP3: Z ;HOLDS POINTER TO FILE SPEC SPCLST: BLOCK SPCCNT ;HOLDS INPUT SPEC POINTERS INSPCT: Z ;COUNT INPUT SPECS SEEN DNSPCT: Z ;COUNT INPUT SPECS DONE ILIST: Z ;INPUT DUMP MODE LIST Z INPCLS: Z ;INPUT CLUSTER SIZE OUTCLS: Z ;OUTPUT CLUSTER SIZE LS.ERR: -1 ;[15]VALUE OF /OKERR FOR SCAN LS.INF: -1 ;[15]VALUE OF /INFORM FOR SCAN LS.MOD: -1 ;[27]VALUE OF /MODE FROM SCAN LF.ERR: -1 ;[15]/OKERR WE PRESERVE OVER CALLS LF.INF: -1 ;[15]/INFORM WE PRESERVE OVER CALLS %LKWLD: LKWP1,,LKWP2 ;WORD FOR INSPEC PTR, FOR LAST USED PTR %OPENI,,%LOKUP ;ADDRESS OF OPEN,, LOOKUP INLEN,,EXTLEN WLDCHN,,LKWP3 ;CHANNEL FOR WILD FOR DATA CPOPJ ;ROUTINE TO CALL AT END OF DIRECTORY ;THESE ARE KLUGES NEEDED TO MAKE .SCWLD UNDERSTAND US PISP: INSPEC POSP: OUTSPE ;HOLD THE DEVCHR'S RETURNED TO US INPDVC: Z OUTDVC: Z ;COUNT XFERS IN MOVLOP XFERS: Z ;[15]FOR ERROR MESSAGES WRDCLS: Z ;[32]SIZE OF CLUSTER IN WORDS BLKCLS: Z ;[15]SIZE OF CLUSTER IN BLOCKS TO CONVERT XFERS ;ARG LIST FOR CONVERTING SCAN BLOCKS %SCWLD: PISP,,POSP %OPENI,,%OPENO %LOKUP,,%ENTER %EXT,,EXTLEN %IPATH: ICH ;[16]PATH FOR ICH IN CHKIDN BLOCK 7 %OPATH: OCH ;[16]PATH FOR OCH IN CHKIDN BLOCK 7 %OPENO: BLOCK 3 %ENTER: BLOCK EXTLEN+1 ;[12]EXTENDED ENTER BLOCK %EXT: 0,,-1 ;NO DEFAULT EXTENSION %OPENI: BLOCK 3 %LOKUP: BLOCK EXTLEN+1 ;[12]ENTENDED LOOKUP BLOCK CCLFLG: -1 ;[17][26]-1 OR LESS IF NOT CCL, Z IFF CCL RSCLST: IOWD 3,COMTAB ;[17,27]IOWD TO COMMAND LIST COMTAB: SIXBIT/HOLD/ ;[17]COMMANDS WE RECOGNIZE SIXBIT/MOVE/ ;.. SIXBIT/DUPLIC/ ;[27].. %ISCAN: Z ;[17]SLOT FOR RSCLST OR Z(IF NOT CCL) SIXBIT/FST/ ;[17]OUR NAME IN CCL FILES BLOCK 3 ;[17]NOTHING ELSE OF INTREST %TSCAN: IOWD FASTL,FASTN ;[15]USER SWITCTH TABLE XWD FASTD,FASTM ;[15].. XWD Z,FASTP ;[15].. -1 ;INDICATES USE JOB NAME FOR HLP:JOB.HLP ON /H XWD CLRFLG,Z ;[11]ROUTINE TO CLEAR ANSWERS (ALL,,FILE) XWD ALLIN,ALLOUT ;SUBS TO ALLOCATE INPUT AND OUTPUT BLOCK 3 SCWP1: INSPEC ;POINTER WORD TO INSPEC SCWP2: OUTSPE ;POINTER TO OUTSPE INSPEC: BLOCK INLEN ; OUTBLK: BLOCK OUTLEN ;BLOCK FOR ACTUAL SPEC OUTSPE: BLOCK OUTLEN ;[14]BLOCK FOR POSSIBLY HACKED VERSION %DVCHR: BLOCK DEVLEN ;DSKCHR ARG BLOCK END START ;[26]