File DUMP.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/OS/8 DUMP - A SYSTEM UTILITY

/THIS UTILITY IS USED TO DUMP MULTIPLE FILES INTO A SINGLE
/FILE FOR ARCHIVAL OR BACKUP PURPOSES.  THE DUMPED FILES
/MAY BE RETRIEVED WITH THE "LOAD" UTILITY IN A FLEXIBLE MANNER.

/LOADING INFORMATION..

/	.LOAD DUMP(9)
/	.SA SYS DUMP

/COMMAND DECODER:
/THE COMMAND DECODER IS USED IN SPECIAL MODE TO SPECIFY
/THE FILES TO BE DUMPED.  THUS THE NORMAL RULES APPLY AS TO
/NUMBER OF FILE SPECIFICATIONS.
/OUTPUT FILE:	FILES ARE DUMPED INTO HERE.
/INPUT FILES:	THE FILES TO BE DUMPED.  IF ONLY A DEVICE
/		IS SPECIFIED THEN *.* IS ASSUMED.
/	NOTE:	ALL INPUT FILES MUST BE ON THE SAME DEVICE!!!!

/	/V	OPTION=INVERT WILDCARDS


/	W I L D   C A R D   L O O K U P

/THE ALGORITHM USED FOR MATCHING NAMES IS AS FOLLOWS.
/ 1. THE ENTIRE DIRECTORY IS READ INTO CORE 12000-14777.
/ 2. A MATCH/NO-MATCH TABLE IS CREATED WHICH HAS A POINTER TO
/    EACH FILENAME.  INITIALLY ALL ARE NO-MATCHES
/	TABLE FORMAT:
/		1 POINTER PER FILENAME
/		POINTERS ARE RELATIVE (I.E. ADDRESS-2000)
/		A NO-MATCH POINTER HAS BIT ZERO = 0
/		A MATCH POINTER HAS BIT ZERO = 1
/ 3. FILE SPECIFICATIONS ARE TURNED INTO A NAME MASK AND
/    A WILDNM FOR MATCHING.  THE TRIAL FILENAME IS MASKED
/    WITH THE MASK NAME AND COMPARED TO THE WILDNM.
/    IF THEY MATCH THEN THE FILE IS SPECIFIED.
/ 4. A FILE HEADER IS BUILT FOR THE DUMP FILE, WITH THE FORMAT:
/	1	7777	/FOR POSITIONING PAPER TAPES
/	2	# BLOCKS IN HEADER
/	3	-# FILES IN DUMP
/       4	FUTURE EXPANSION
/
/    5-10	NAME FIRST DUMPED FILE
/      11	DATE FIRST DUMPED FILE
/      12	SIZE IN BLOCKS FIRST DUMPED FILE

/   13-20	SECOND FILE
/   21-26	THIRD FILE
/   .....	ETC.

/ 5. AT THE SAME TIME AS ABOVE A TABLE OF FILE-TRANSFER INFO
/    IS BUILD CONTAINING STARTING BLOCK AND SIZE OF EACH FILE
/    TO BE TRANSFERED.  IN THIS WAY THE IN-CORE DIRECTORY MAY
/    BE DESTROYED AS THE TABLES ARE BUILT.  HENCE THE HEADER IS
/    STORED OVER TOP OF THE IN-CORE DIRECTORY.
/    THE TRANSFER TABLE IS STORED IN FIELD 0 AT "TRNTBL"

/ 6. A TENATIVE OUTPUT FILE IS CREATED.
/ 7. THE HEADER IS TRANSFERRED.
/ 8. AREAS DESIGNATED IN "TRNTBL" ARE WRITTEN INTO THE DUMP FILE
/ 9. THE OUTPUT FILE IS CLOSED.

NOMAT=2000+3000 /ADDRESS OF MATCH NO-MATCH TABLE MPARAM=7643 /CD OPTION TABLE *10 XRT, 0 /GENERAL PURPOSE XR. XRT2, 0 WILDXR, 7605-1 /POINTS INTO COMMAND DECODER TABLE STARXR, 0 /USED IN MKWILD TBLXR, 0 /POINTS TO MATCH TABLE *20 TEMP, 0 /GENERAL PURPOSE TEMPORARIES TEMP1, 0 TEMP2, 0 TEMP3, 0 CNTR, 0 /GENERAL PURPOSE COUNTERS CNTR1, 0 CNTR2, 0 INDEVN, 0 /INPUT DEVICE NUMBER INHAND, 0 /INPUT DEVICE HANDLER ENTRY POINT OUDEVN, 0 /OUT DEVICE NUMBER OUHAND, 0 /OUTPUT DEVICE HANDLER ENTRY POINT ENTRIE, 0 /ACCUMULATES # FILES IN DUMP TSIZE, 0 /TOTAL SIZE OF FILE /THE FOLLOWING ARE FOR WILD CARD LOOKUPS. /THE TRIAL FILENAME IS MASKED WITH THE MASK WORDS AND /THEN COMPARED TO THE WILDNAME FOR A MATCH /THE MASKS GET 00'S FOR "?" OR "*" ELSE 77'S /THE WILDNAME GETS 00'S FOR WILD CARDS ELSE THE 6-BIT NAME. WILDN1, 0 /AND MATCH NAME MASK1, 0 /CONTAINS MASK FOR FILENAME WILDN2, 0 MASK2, 0 WILDN3, 0 MASK3, 0 WILDEX, 0 /AND FOR THE EXTENSION MASKEX, 0 WDATE, 0 /SOMEDAY ALLOW DATE MATCH MDATE, 0 /AND MASK FOR DATE USR, 200 /ENTRY TO USR /IT'S IN CORE USRSIZ, 0 /USED FOR OUPUT FILE TEN ENTER /POINTERS AND STUFF FOR "NXTFIL" SEGPNT, 0 /POINTER INTO SEGMENT SEGCNT, 0 /POINTS TO NEXT SEGMENT IF ANY SEGINC, 0 /NON-ZERO IF ALL SEGMENTS IN CORE EMPTY, 0 /PRECEEDING EMPTY-1 FILST, 0 /BLOCK START OF NEXT FILE FILPNT, 0 /POINTER TO FILENAME NEXT FILE FILLEN, 0 /-LENGTH NEXT FILE PAGE
DUMP, SKP CLA /RUN COMES HERE JMP NODECODE /CHAIN ENTRY /LOCK USR IN CORE LATER CIF 10 /GO DECODE JMS I USR 5 /DECODE 5200 /SPECIAL MODE NODECODE, /COME HERE DIRECTLY ON CHAIN CDF 10 TAD I (7605 /GET INDEV TAD I (7600 /AND OUTDEV SNA CLA /SKIP IF BOTH INPUT AND OUTPUT SPECIFIED JMP DUMP /NOPE:RE-DECODE JMS I (CHKCD /GO CHECK INDEVICES FOR SAMENESS. JMP I (ERROR6 /INDEV MUST BE SAME FOR INPUT FILES JMS I (SETTAB /READ INDEV DIRECTORY AND SET /UP NO-MATCH TABLE TAD (7605-1 /SET INPUT FILE-POINTER DCA WILDXR /SET WILD POINTER THERE LOOK1, JMS I (MKWILD /MAKE A WILD SPECIFICATION JMP GOTTAB /MATCH TABLE COMPLETED TAD (NOMAT-1 /SET POINTER TO MATCH/NO-MATCH TABLE DCA TBLXR /FOR WILD-CARD COMPARE LOOK2, CLA CLL CDF 10 /TO NOMATABLE FIELD TAD I TBLXR /GET A POINTER CDF 0 /BACK TO THIS FIELD SNA /ZERO'S END LIST JMP LOOK1 /DO NEXT SPECIFICATION SPA /SKIP IF NOT ALREADY SPECIFIED JMP LOOK2 /CHECK NEXT TAD (2000-1 /MAKE ABSOLUTE POINTER-1 FOR MATCH JMS I (MATCH /SEE IF IT MATCHES JMP LOOK2 /NOPE.... TAD TBLXR /FOR FLAGGING THIS FILE DCA TEMP CDF 10 /TO THE TABLE FIELD CLA STL RAR /SET BIT 0 TAD I TEMP /GET THE POINTER DCA I TEMP /AND PUT BACK WITH MATCH FLAGGED JMP LOOK2 /FIELD DOESN'T MATTER /AT THIS POINT WE HAVE THE TABLE BUILT WITH ALL /WILD SPECIFICATIONS MATCHING FLAGGED BY BIT 0 /WE MUST NEXT BUILD THE FILE HEADER AND TRANSFER TABLE GOTTAB, JMS I (INVERT /CHECK FOR WILDCARD INVERSION JMS I (TBLSET /SET UP THE TABLES DCA I STARXR /END THE TRNTBL LIST TAD WILDXR /AND ZERO THE REST OF THE NAME LIST AND (377 /HOW FAR INTO PAGE TAD (-400 /CALC HOWMUCH LEFT DCA CNTR /SET CLEAR COUNTER CDF 10 DCA I WILDXR /AND THE NAME LIST ISZ CNTR JMP .-2 /CLEAR IT OUT STA DCA I (2000 /SET FLAG FOR PAPER TAPE POSITIONING TAD ENTRIES /PICK UP # FILES CIA /NEGATE IT DCA ENTRIES /AND SAVE TAD ENTRIES /NOW PUT IN HEADER DCA I (2002 /IN APPROPRIATE PLACE TAD WILDXR /NOW CALC BLOCKS OF HEADER AND (7400 /BLOCK PART TAD (-2000 /RELATIVE SIZE CLL RTL;RTL;RAL /BLOCKS INTO LOW ORDER AC DCA I (2001 /SAVE IN HEADER TAD (7600-1 DCA XRT /NOW TO COPY FILENAME DOWN TAD I XRT DCA OUDEVN /GET OUT DEV NUMBER TAD I XRT /AND COPY OUT NAME DCA WILDN1 /STARTING AT WILDN1 TAD I XRT DCA MASK1 TAD I XRT DCA WILDN2 TAD I XRT DCA MASK2 /THAT'S IT TAD I (2001 /GET HEADER SIZE AGAIN CLL RTR;RTR;RTR /SHIFT FOR HANDLER WRITE TAD (4011 /FINISH FUNCTION WORD CDF 0 DCA I (COPHD /STASH CDF 10 TAD I (2001 /GET HEADER SIZE BACK CDF 0 /DONE WITH TABLES CIA /MAKE NEG TAD TSIZE /AND ADD INTO TOTAL SIZE CIA /MAKE POSITIVE SIZE DCA TSIZE /FOR USR CALL TAD TSIZE /NOW TO FIGURE OUT IF NEED AND (7400 /INDEFINETE ENTER SZA CLA /SKIP IF CAN DO DEFINATE ENTER JMP .+4 /NOPE - SO CLEAR TSIZE TAD TSIZE CLL RTL;RTL /SHIFT FOR ENTER TAD OUDEVN /STICK IN OUT DEVICE NUMBER FOR USR DCA USRSIZ /AND SAVE JMS I (XFER /WRITE IT ALL KUT JMP I .+1 /DONE 7600 PAGE
/CHECK CD FOR VALIDITY - ALL INPUT FILES MUST BE FROM SAME /FILE STRUCTURED DEVICE!!!! / JMS CHKCD / ERR RETURN / NORM RETURN CHKCD, 0 CDF 10 TAD I (7605 /GET FIRST DEVICE NUMBER DCA INDEVN /SAVE IT TAD INDEVN /GET BACK TAD (7757 /AND CHECK FOR FILE STRUCTURED DCA TEMP TAD I TEMP /ALL INPUT FROM FILE STRUCTURED DEVICE SMA CLA /SKIP IF FILE STRUCTURED JMP I CHKCD /NO:ERROR TAD INDEVN /GET INDEVICE NUMBER AGAIN CDF 0 /IN CASE ERROR SNA /MUST BE ONE JMP I CHKCD /TAKE ERROR RETURN CIA /NEGATE DCA TEMP /SAVE FOR COMPARE CDF 10 TAD I (7612 /CHECK #2 JMS CHKCDS /CHECK IT TAD I (7617 /AND #3 JMS CHKCDS TAD I (7624 /AND #4 JMS CHKCDS TAD I (7625 /AND #5 JMS CHKCDS CHKCDE, CDF 0 /ALL O.K. ISZ CHKCD /TAKE NORMAL RETURN JMP I CHKCD /AND RETURN CHKCDS, 0 SNA /DON'T CHECK IF NULL JMP CHKCDE /EVERYTHING GROOVY TAD TEMP /COMPARE FOR THE SAME SNA /SKIP IF A BAD ONE JMP I CHKCDS /IS O.K. CDF 0 /TAKE ERROR RETURN JMP I CHKCD /INITIALIZATION FOR "NXTFIL" INITLO, 0 STA /INDICATE DONE WITH SEGMENT DCA SEGCNT ISZ SEGINC /INDICATE ALL SEGMENTS IN CORE TAD (2000-400 /SET POINTER TO FAKE LAST SEGMENT DCA SEGPNT DCA I (SEGSEG /CLEAR END OF SEGMENTS JMP I INITLOK /SUBROUTINE TO CHECK FOR NAME MATCH. /ENTER WITH POINTER TO NAME-1 CANDIDATE (IN FIELD 1) IN AC. /THE WILD NAME MASK AND MATCH MUST BE IN PAGE ZERO "MASKN" /AND "WILDNM". RETURN INDICATES MATCH/NO-MATCH CONDITION. /USES CNTR,TEMP,XRT,XRT2. /CALL: TAD PNTR /TO FIELD 1 NAME-1 / JMS MATCH / NOMATCH RETURN / MATCH RETURN MATCH, 0 DCA XRT /SAVE NAME POINTER TAD (WILDN1-1 /AND SET WILD POINTER DCA XRT2 TAD (-5 /MATCH 4 NAMES+DATE DCA CNTR MATCHL, TAD I XRT2 /GET WILDNX CIA /FOR MATCH CHECK DCA TEMP TAD I XRT2 /GET MASKNX CDF 10 /TO NAME FIELD AND I XRT /MASK NAME CDF 0 TAD TEMP /SUBTR FROM WILDNX SZA CLA /SKIP IF MATCHES JMP I MATCH /NOPE... EXIT ISZ CNTR /DONE?? JMP MATCHL /NO: CHECK NEXT ISZ MATCH /GOT ONE: TAKE SECOND RETURN JMP I MATCH
/SUBROUTINE TO SET UP HEADER AND TRNTBL TBLSET, 0 JMS I (INITLO /INITIALIZE NXTFIL DCA ENTRIES /AND CLEAR # FILES IN DUMP DCA TSIZE /AND SUM OF SIZES TAD (NOMAT-1 /INIT XR TO MATCH TABLE DCA TBLXR TAD (2005-1 /INIT XR TO HEADER FILENAMES DCA WILDXR /A GOOD TEMP XR TAD (TRNTBL-1 /AND TRANSFER TABLE DCA STARXR TBLOP1, CLA CDF 10 /FIND A DESIRED FILE TAD I TBLXR CDF 0 SNA /ZEROS END LIST JMP I TBLSET /DONE SMA /NEGATIVES ARE MATCH JMP TBLOP1 /NOT A DESIRED ONE TAD (4000+2000 /MAKE ABSOLUTE DCA TEMP /SAVE POINTER TBLOP2, JMS I (NXTFILE /LOOKUP NEXT FILE HLT /CAN'T HAPPEN TAD FILPNT /GET POINTER TO NAME CIA TAD TEMP /SEE IF IT IS THE ONE WE ARE LOOKING FOR SZA CLA /SKIP IF IT IS JMP TBLOP2 /NOPE:MOVE ON TO NEXT TAD FILST /SAVE START IN TRNTBL DCA I STARXR TAD FILLEN /AND LENGTH DCA I STARXR TAD FILLEN /AND UPDATE TOTAL SIZE TAD TSIZE DCA TSIZE STA TAD FILPNT DCA XRT /POINTER TO FILENAME TAD (-5 /4 OF NAME AND DATE DCA CNTR CDF 10 /THEN UPDATE HEADER IN FIELD 1 TAD I XRT /TRANSFER NAME AND DATE DCA I WILDXR ISZ CNTR JMP .-3 TAD FILLEN DCA I WILDXR /AND SAVE LENGTH ISZ ENTRIES /COUNT THE FILE JMP TBLOP1 /DO NEXT ONE PAGE
/SUBROUTINE TO GET NEXT FILE ENTRY FROM INPUT DIRECTORY /TO INITIALIZE CALL INITLOK: ALSO IF "SEGINC"=0 THEN /WILL GET NEXT SEGMENT DEVICE - IF NOT WILL USE ONE IN CORE. /RETURNS THE FOLLOWING PAGE ZEROS: / EMPTY = PRECEEDING EMPTY-1 / FILST = BLK START OF NEXT FILE / FILPNT = POINTER TO FILENAME NEXT FILE / FILLEN = -LENGTH NEXT FILE /CALL: JMS I (NXTFIL / RET1 /DONE WITH FILES / RET2 /PAGE ZERO'S SET NXTFIL, 0 STA /INIT FOR NO EMPTY DCA EMPTY /SET IT UP ISZ SEGCNT /SKIP IF DONE THIS SEGMENT JMP NXTFL1 /NO:GET NEXT ENTRY TAD SEGINC /IS NEXT SEG IN CORE?? SZA CLA /SKIP IF NOT JMP NXTFL3 /IT IS:JUST UPDATE POINTERS HLT /IMPLEMENT LATER NXTFL3, TAD SEGPNT /GET POINTER THIS SEGMENT AND (7400 /MASK CURRENT BLOCK TAD (400 /POINT TO NEXT SEGMENT DCA SEGPNT /AND UPDATE ISZ SEGSEG /CHECK DONE WITH SEGMENTS FLAG SKP JMP I NXTFIL /NO MORE FILES CDF 10 /THAT'S WHERE THE DIRECTORY IS TAD I SEGPNT /GET -# ENTRIES DCA SEGCNT /SET ENTRY COUNTER ISZ SEGPNT /POINT TO WHERE FILES START TAD I SEGPNT /PICK IT UP DCA SEGST /INIT START OF FILES ISZ SEGPNT /POINT TO LINK WORD TAD I SEGPNT /GET LINK TO NEXT SEGMENT CMA /FOR END CHECK DCA SEGSEG ISZ SEGPNT /TO TENATIVE POINTER ISZ SEGPNT /TO #WASTE WORDS TAD I SEGPNT /GET -WASTE WORDS CIA /MAKE POSITIVE DCA FILWAST /SET WASTE CONSTANT ISZ SEGPNT /POINT TO START OF FILE NAMES NXTFL1, CDF 10 /THAT'S WHERE DIRECTORY IS TAD I SEGPNT /PICK UP NM1 SZA CLA /SKIP IF AN EMPTY JMP NXTFL2 /NO:IS A FILE ISZ SEGPNT /AN EMPTY:POINT TO -LENGTH TAD I SEGPNT /PICK IT UP TAD EMPTY /AND ADD TO EMPTY DCA EMPTY /TO RETURN EMPTY-1(-EMPTY-1) TAD I SEGPNT /NOW UPDATE START OF NEXT FILE CIA /MAKE POSITIVE TAD SEGST /UPDATE IT DCA SEGST /BY ADDING EMPTY BLOCKS CDF 0 /BACK TO THIS FIELD ISZ SEGPNT /POINT TO NEXT ENTRY JMP NXTFIL+3 /AND KEEP LOOKING NXTFL2, TAD SEGPNT /GOT A FILE:SO FIX PAGE ZEROS DCA FILPNT /STASH POINTER TO ENTRY TAD SEGPNT /NOW UPDATE SEGPNT TAD (4 /TO FIRST WASTE TAD FILWAS /TO -LENGTH DCA SEGPNT /NOW POINTS TO -LENGTH TAD I SEGPNT /GET -LENGTH CDF 0 /BACK TO THIS FIELD DCA FILLEN /STASH FILE LENGTH TAD SEGST /AND SET START OF FILE DCA FILST /FOR CALLERS INFORMTION TAD FILLEN /NOW UPDATE SEGST CIA /FOR NEXT TIME BY ADDING TAD SEGST /LENGTH OF THIS FILE DCA SEGST /UPDATED... ISZ SEGPNT /POINT TO NEXT FILE TAD FILLEN /UNLESS IT IS A TENATIVE ONE SNA CLA /SKIP IF NOT TENATIVE JMP NXTFIL+3 /IS TENATIVE SO GET NEXT ISZ NXTFIL /TAKE NORMAL RETURN JMP I NXTFIL FILWAS, 0 /#WASTE WORDS SEGST, 0 /BLK NUMBER OF CURRENT SEGSEG, 0 /-1 WHEN ON LAST SEGMENT
/THIS SUBROUTINE READS THE INDEVICE DIRECTORY AND BUILDS A /TABLE OF POINTERS TO EACH FILE. THIS IS THE "NO-MATCH" TABLE /FROM WHICH THE WILD CARD WORK WILL BE DONE. SETTAB, 0 CLA CLL /FOR BAD GUYS... CDF 0 /ALSO FOR BAD GUYS TAD (7201 /RESTORE WHERE TO LOAD DCA .+5 TAD INDEVN /GET THE INPUT DEVICE NUMBER CIF 10 /AND CALL THE USR JMS I USR /TO LOAD THE HANDLER 1 /FETCH 7201 /ALLOW 2-PAGE HANDLERS HLT /***CAN'T HAPPEN*** TAD .-2 /GET HANDLER ADDRESS DCA INHAND /SET ENTRY POINT JMS I INHAND /NOW CALL IT 1410 /TO READ THE DIRECTORY 2000 /ABOVE THE USR 1 /BLOCKS 1-6 JMP I (ERROR1 /HANDLER ERROR JMS CHKDIR /CHECK DIRECTORY FOR VALIDITY JMS I (INITLOK /INIT POINTERS FOR "NXTFIL" TAD (NOMAT-1 /SET POINTER TO NO-MATCH TABLE DCA XRT /USE GEN PURPOSE XR SETTA1, JMS NXTFIL /GET AN ENTRY JMP SETTA2 /DONE.... TAD FILPNT /INTO NO-MATCH TABLE TAD (-2000 /MAKE THEM RELATIVE CDF 10 /NOW TO PUT FILENAME POINTER DCA I XRT CDF 0 /BACK TO THIS FIELD JMP SETTA1 SETTA2, CDF 10 /NOW CLEAR LAST DCA I XRT /TABLE ENTRY FOR END OF LIST CDF 0 JMP I SETTAB /DIRECTORY CHECKER /CATCHES MOST ERRORS BY REQUIRING # FILE ENTRIES TO /BE LESS THAN 200(8) (SAME AS "PIP"'S CHECK CHKDIR, 0 CDF 10 TAD I (2000 /-# ENTRIES 1ST SEGMENT CDF 0 SMA /MUST BE NEGATIVE JMP .+3 TAD (200 /MUST BE LESS THAN THIS MANY SPA CLA JMP I (ERROR8 /A BAD DIRECTORY JMP I CHKDIR PAGE
/THIS SUBROUTINE TURNS THE NEXT CD ENTRY INTO A SET OF /MASKS AND WILDNAMES. THE NEXT ENTRY IS POINTED TO BY /WILDXR. /CALL: JMS MKWILD / RET1 /NO MORE CD ENTRIES / RET2 /MASKS AND WILDNAMES SET MKWILD, 0 CDF 10 /FIRST CHECK FOR AN ENTRY TAD I WILDXR /GET THE DEVICE NUMBER CDF 0 /IN CASE ERROR RETURN SNA CLA /SKIP IF AN ENTRY JMP I MKWILD /NO MORE RETURN CDF 10 /NOW COPY NAME INTO WILDN1-WILDEX TAD I WILDXR SNA TAD (5200 DCA WILDN1 TAD I WILDXR DCA WILDN2 TAD I WILDXR DCA WILDN3 TAD I WILDXR SNA TAD (5200 DCA WILDEX CDF 0 /NO MORE NEED FOR FIELD 1 TAD WILDN1 /CHECK NAME FOR "*" TAD (-5200 SZA CLA /SKIP IF NAME FIELD="*" JMP STAREX /NO:CHECK EXTENTION FIELD STA /NAME IS "*" SO TURN FIELD INTO "?"'S DCA WILDN1 STA DCA WILDN2 STA DCA WILDN3 STAREX, TAD WILDEX /CHECK EXTENSION FIELD FOR "*" TAD (-5200 SZA CLA /SKIP IF A "*" JMP QUESTM /GO CHECK FOR "?" STA DCA WILDEX /TURN EXTENSION FIELD INTO "??". QUESTM, TAD (WILDN1-1 /SET AUTOINDEX FOR WILD STUFF DCA XRT TAD (-4 /4 NAME WORDS DCA CNTR TAD I XRT /GET A NAME JMS CHKQUES /CONVERT STA TAD XRT DCA XRT /BACK UP XR TAD TEMP2 /GET CONVERTED NAME DCA I XRT /STASH TAD TEMP1 /GET MASK DCA I XRT ISZ CNTR /DONE?? JMP QUESTM+4 /NOT YET ISZ MKWILD /TAKE SECOND RETURN JMP I MKWILD /DONE... /CHECK PACKED 6-BIT FOR 77 CODE - RETURN MASK IN TEMP1 /AND NEW WILDNAME WORD IN TEMP2 CHKQUE, 0 DCA TEMP TAD TEMP RTR;RTR;RTR /CHAR 1 OVER JMS CHKSUB /CONVERT TO MASK ETC JMP I (ERROR3 /"*" FOUND CLL RTL;RTL;RTL /BACK OVER DCA TEMP1 /SAVE 6-BIT MASK TAD TEMP3 /GET 6-BIT CHAR CLL RTL;RTL;RTL /FOR WILDNAME DCA TEMP2 TAD TEMP JMS CHKSUB /CONVERT THAT ALSO JMP I (ERROR3 /"*" FOUND TAD TEMP1 DCA TEMP1 /FULL WORD OF MASK TAD TEMP3 TAD TEMP2 DCA TEMP2 /FULL WORD OF WILDNAME JMP I CHKQUE /AND RETURN /CHECK A CHARACTER FOR "*" AND PRODUCE MASK CHAR AND /CHAR FOR WILDNM. RETURN WITH MASK CHAR IN AC AND WILDNM /CHAR IN TEMP3. /CALL: JMS CHKSUB / RET1 /"*" FOUND / RET2 /NORMAL CHKSUB, 0 AND (77 /MASK 6-BIT CHAR SNA JMP NULCHR /TREAT NULLS SPECIAL TAD (-52 /CHECK FOR "*" SNA JMP I CHKSUB /FIRST RETURN ISZ CHKSUB TAD (-77+52 SZA TAD (77 /RESTORE CHAR DCA TEMP3 /SAVE IN TEMP3 TAD TEMP3 /GET AGAIN SZA CLA /IF WAS WILD MASK=0 TAD (77 /IF NOT MASK=77 JMP I CHKSUB /RETURN WITH MASK IN AC NULCHR, DCA TEMP3 /CLEAR CHAR ISZ CHKSUB JMP .-4 /AND SET MASK TO 77 /CHECK FOR /V INVERSION OPTION & INVERT IF SET INVERT, 0 CDF 10 /TO CD TABLE TAD I (MPARAM+1 /GET OPTION TABLE CDF 0 AND (4 /MASK OUT THE /V OPTION SNA CLA /SKIP IF SET JMP I INVERT /NO INVERSION REQUESTED TAD (NOMAT /SET TOP OF TABLE DCA TEMP /USE TEMP FOR POINTER CDF 10 /TO NOMAT FIELD INVRTL, TAD I TEMP /GET A POINTER SNA /ZERO'S END LIST JMP INVERT+3 /THIS WAY FIELD GET'S RESET TAD (4000 /COMPLEMENT BIT 0 DCA I TEMP /AND PUT BACK ISZ TEMP /NEXT POINTER JMP INVRTL /KEEP GOING PAGE
/IMAGE TRANSFER ROUTINE - INPUT IS USING HANDLER AT INHAND /OUTPUT USES HANDLER AT OUHAND. BUFFER IS ALL OF FIELD 1. /CALL: JMS I (IMAGE / STRT BLK # /INDEVICE / STRT BLK # /OUTDEV / -#BLOCKS IMAGE, 0 TAD I IMAGE /PICK UP START OF INPUT DCA INBLOK /SAVE FOR HANDLER CALL ISZ IMAGE /POINT TO OUTBLOCK TAD I IMAGE DCA OUBLOK /SAVE START OF OUTPUT ISZ IMAGE /POINT TO SIZE TAD I IMAGE /GET IT DCA IMSIZE /SAVE FOR CALC ISZ IMAGE /POINT TO RETURN TAD (3610 /BIG BLOCK FUNCTION WORD DCA INBLOK-2 /STICK IN HANDLER CALL IMAGL1, TAD IMSIZE /CHECK IF ROOM FOR BIG TRANSFER CLL /IN CASE BIG FILE TAD (17 /IN EVEN BLOCKS SZL /SKIP IF CAN DO IT JMP IMAGL2 /NO:DO FINAL TRANSFER DCA IMSIZE /SAVE HOW MUCH LEFT JMS COPY /COPY IT JMP IMAGL1 /AND DO MORE IMAGL2, CLA CLL /GARBAGE IN AC TAD IMSIZE /DO FINAL READ/WRITE CIA /MAKE POSITIVE SNA /SKIP IF ANY LEFT JMP I IMAGE /CAME OUT EVEN-WE ARE DONE CLL RTR;RTR;RTR /MAKE FUNCTION WORD BLOCKS TAD (10 /PUT IN FIELD DCA INBLOK-2 /SAVE IN HANDLER CALL JMS COPY /AND COPY THAT PART JMP I IMAGE /DONE IMSIZE, 0
/SUBROUTINE TO COPY BLOCKS COPY, 0 CLA STL RAR /SET WRITE BIT TAD INBLOK-2 /GET IN FUNCTION DCA OUBLOK-2 /TO MAKE OUT FUNCTION WORD JMS I INHAND /READ THE INPUT 0 /IN FUNCTION WORD 0 /USE ALL OF FIELD 1 INBLOK, 0 /IN BLOCK NUMBER JMP I (ERROR1 /HANDLER ERROR JMS I OUHAND /AND DO THE OUTPUT 0 /OUT FUNCTION WORD 0 /ALL OF FIELD 1 OUBLOK, 0 /THE BLOCK NUMBER JMP I (ERROR1 /HANDLER ERROR TAD INBLOK /UPDATE BLOCK NUMBER BY 17 BLOCKS TAD (17 DCA INBLOK TAD OUBLOK /AND OUTBLOCK BY 17 TAD (17 DCA OUBLOK JMP I COPY
/SUBROUTINE TO SET UP THE OUTPUT FILE /AND CHECK THE NAME FOR NO WILDCARDS. GOUTFL, 0 TAD (-4 DCA CNTR TAD (WILDN1-1 DCA XRT TAD WILDN1 /FIRST MAKE SURE HE GAVE A NAME SNA CLA JMP NONFL1 /CHECK FOR NON-FILE STRUCTURED TAD I XRT JMS I (CHKQUE /CHECK FOR "?"'S ISZ TEMP1 /MASK SHOULD BE -1 JMP I (ERROR7 /"?" IN OUTPUT NAME ERROR ISZ CNTR JMP .-5 /DO ALL OF THEM GOUTF1, TAD (6601 /RESTORE HANDLER LOAD AREA DCA .+5 TAD OUDEVN /GET OUT DEVICE NUMBER CIF 10 /GET THE OUT HANDLER JMS I USR /INTO CORE 1 6601 /AT 6600-7177 HLT /CAN'T HAPPEN TAD .-2 /GET HANDLER ENTRY POINT DCA OUHAND /AND STASH IN PAGE 0 TAD USRSIZ /GET SIZE SPEC IF ANY CIF 10 JMS I USR /CALL THE USR AGAIN 3 /TO ENTER OUTPUT OUSTRT, WILDN1 /NAME POINTER OUSIZE, 0 /GETS SIZE AVAILABLE JMP NOROOM /NOT ENOUGH ROOM TAD OUSIZE /PICK UP SIZE AVAILABLE SNA /CHECK FOR NON-FILE STRUCTURED JMP NONFL2 /SHOULD BE NON-FILE STRUCTURED STL /FOR CHECK TAD TSIZE /SEE IF WILL FIT SNL SZA CLA /SKIP IF WILL FIT NOROOM, JMP I (ERROR4 /NOT ENOUGH ROOM FOR OUTPUT JMP I GOUTFL /AND RETURN NONFL1, JMS NONFLS JMP GOUTF1 NONFL2, JMS NONFLS DCA OUSTRT DCA OUSIZE JMP I GOUTFL /SUBROUTINE TO GENERATE ERROR IF DEVICE FILE STRUCTURED /TAKE NORMAL RETURN OTHERWISE. NONFLS, 0 TAD OUDEVN /GET OUT DEVICE NUMBER TAD (7757 /INDEX INTO TABLE DCA CNTR CDF 10 /CHECK DCB TABLE TAD I CNTR CDF 0 SPA CLA /SKIP IF NON-FILE STRUCURED JMP I (ERROR5 /NO-NAME GIVEN FOR FILE STRUCTURED DEV. JMP I NONFLS PAGE
/ROUTINE TO DO THE ACTUAL TRANSFER XFER, 0 JMS I (GOUTFL /SET UP THE OUTPUT FILE TAD I (OUSTRT /GET START OF OUTPUT DCA COPHD+2 /FOR IMAGE CALL JMS I OUHAND /WRITE THE HEADER COPHD, 0 2000 /WHERE HEADER IS 0 /BLOCK NUMBER OF OUTPUT JMP I (ERROR1 /HANDLER ERROR TAD .-2 /GET BLOCK NUMBER CDF 10 TAD I (2001 /CALC BLOCK WHERE FILES START CDF 0 DCA IMCALL+2 /FOR IMAGE CALL TAD (TRNTBL-1 /CONSTRUCT POINTER TO TABLE DCA XRT IMCALP, TAD I XRT /GET INFILE START DCA IMCALL+1 TAD I XRT /GET -#BLOCKS DCA IMCALL+3 IMCALL, JMS I (IMAGE 0;0;0 /PARAMETERS FOR IMAGE TAD IMCALL+3 CIA TAD IMCALL+2 /UPDATE WHERE NEXT GOES DCA IMCALL+2 ISZ ENTRIES JMP IMCALP /DO NEXT ONE TAD TSIZE /GET SIZE OF FILE DCA CLOSE /FOR USR CLOSE TAD OUDEVN CIF 10 JMS I (7700 /ALWAYS REFRESH MONITOR HERE 4 WILDN1 CLOSE, 0 /GETS SIZE JMP I (ERROR2 /CAN'T CLOSE FILE JMP I XFER
/ERROR MESSAGES AND PRINTING ROUTINES ERROR1, JMS ERROR ERR1M ERROR2, JMS ERROR ERR2M ERROR3, JMS ERROR ERR3M ERROR4, JMS ERROR ERR4M ERROR5, JMS ERROR ERR5M ERROR6, JMS ERROR ERR6M ERROR7, JMS ERROR ERR7M ERROR8, JMS ERROR ERR8M ERROR, 0 CLA CLL CDF 0 /JUST IN CASE TAD I ERROR JMS PRINT JMS CRLF JMP I (DUMP /PRINT CR/LF CRLF, 0 TAD (215 JMS PCH TAD (212 JMS PCH JMP I CRLF /ROUTINE TO PRINT PACKED ASCII PRINT, 0 DCA TEMP TAD I TEMP CLL RTR;RTR;RTR JMS PRNT6 /OUTPUT IT TAD I TEMP JMS PRNT6 ISZ TEMP JMP PRINT+2 PRNT6, 0 AND (77 /MASK CHAR SNA JMP I PRINT /0'S END LIST TAD (-40 SPA TAD (100 TAD (240 JMS PCH JMP I PRNT6 PCH, 0 6046 /PUNCH IT CLA CLL 6041 /SKIP WHEN DONE SKP JMP I PCH /DONE 6031 /TTY FLAG UP? JMP .-4 /NOPE 6034 /READ IT TAD ("O-100 /CHK ^O SNA /SKIP IF NOT JMP I PRINT /IGNORE THE REST TAD ("C-"O /NOW ^C SZA CLA JMP PCH+2 JMP I .+1 7600 PAGE
ERR1M, TEXT \?HANDLER I/O ERROR.\ ERR2M, TEXT \?UNABLE TO CLOSE OUTPUT FILE.\ ERR3M, TEXT \?BAD FILENAME SYNTAX.\ ERR4M, TEXT \?NOT ENOUGH ROOM FOR DUMP FILE.\ ERR5M, TEXT \?NO NAME GIVEN FOR OUTPUT FILE.\ ERR6M, TEXT \?INFILES MUST BE FROM SAME DEVICE.\ ERR7M, TEXT \?WILDCARDS NOT ALLOWED IN OUTPUT FILENAME.\ ERR8M, TEXT \?BAD DIRECTORY ON INPUT DEVICE\ PAGE
TRNTBL=. 1M, TEXT \?HANDLER I/O ERROR.\ ERR2M, TEXT \?UNABLE TO CLOSE OUTPUT FILE.\ ERR3M, TEXT



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search