TITLE NIP NFT Network Interchange Program module SUBTTL Robert Houk/RDH SEARCH JOBDAT, MACTEN, UUOSYM ;STANDARD DEFINITIONS SEARCH NFTDEF ;NFT-WIDE DEFINITIONS SEARCH SWIL ;SWIL PACKAGE DEFINITIONS SALL ;PRETTY LISTINGS .DIREC FLBLST ;PRETTIER LISTINGS TWOSEG 400000 ;NICE PURE CODE COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988. ALL RIGHTS RESERVED. \;END COPYRIGHT MACRO COMMENT \ NIP -- NFT "Network Interchange Program" module COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1984,1986,1988. ALL RIGHTS RESERVED. THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSION OF THE ABOVE NOTICE. THIS SOFTWARE OR ANY OTHER COPIES THEROF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THIS SOFTWARE IS HEREBY TRANSFERRED. THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. \ SUBTTL Revision history ;INITIAL VERSION CREATED FROM NIK 25-MAR-80 ;7 RDH 31-Mar-84 ; Fix RT11 file DELETE (set IM.SMD so not send RFM to remote). ;13 RDH 30-Apr-85 ; Version 2. Add "SET DEFAULT" and "SET NAME" commands. ;14 RDH 12-May-85 ; Problem with copying ASCII file which ended in - COACS9 ; trashed the error code in M0 prior to dispatch to COASE. ; ;15 LEO 15-Aug-85 ; Do copyrights ; ;16 RDH 30-Oct-85 ; Fix [15] ; ;17 RDH 4-Jan-86 SPR 10-35424 ; Can't send LSNs over network link. ; ;20 RDH 23-Jan-86 ; Extra null byte in record-oriented byte copy. ; ;22 KDO 20-Mar-87 ; Add ULTRIX support. ; ;23 KDO 3-Apr-89 ; Suppress appending extension ".*" for quoted input file specs. SUBTTL External linkages ;TO NFT EXECUTIVE EXTERN ERRMSG ;ERROR MESSAGE PROCESSOR ;TO NFT/SCAN INTERFACE EXTERN CLRFIL, CLRALL ;CLEAR FOR NEW SPECS EXTERN CLRSTK, MEMSTK, APLSTK ;STICKY DEFAULT PROCESSORS EXTERN INX, OUX ;ALLOCATE FSB'S ;TO SWITCH DATA BASE EXTERN S.BAUD ;/BAUD EXTERN S.MOAN ;/MOAN EXTERN S.DIAL ;/DIAL EXTERN S.OKER ;/OKERROR EXTERN S.PASS ;/PASSWORD EXTERN S.TOTA ;/TOTALS EXTERN S.USER ;/USERID ;*** EXTERN S.UACC ;/UACCOUNT ;*** EXTERN S.UPAS ;/UPASSWORD EXTERN S.XUO0, S.XUO1, S.XUO2, S.XUO3, S.XUO4, S.XUO5, S.XUO6, S.XUO7 SUBTTL Program parameters ND $SZRSZ,^D256 ;DEFAULT RECORD SIZE SUBTTL Command base table definition DEFINE CMNDS,< CM COPY,COP, CM DDELET,DDEL, CM DDIREC,DDIR, CM DRENAM,DREN, CM DSUBMI,DSBM, ;CM DEFAUL,DEF, CM DELETE,DEL, CM DIRECT,DIR, ;CM MOVE,MOV, CM NETWOR,NET, CM PRINT,PRI, CM RENAME,REN, CM RESET,RES, ;CM REVIEW,REV, CM SET,SET, CM SUBMIT,SBM, CM TYPE,TYP, IFN FT$FAL,< CM FAL,FAL##, > IFN FT$TSC,< CM TLINK,TLINK##, CM TSC,TSC##, > IFN FT$CCM,< CM NCOPY,COP,<"CCL" monitor command, same as COPY> CM NDELET,DEL,<"CCL" monitor command, same as DELETE> CM NDIREC,DIR,<"CCL" monitor command, same as DIRECT> ;CM NMOVE,MOV,<"CCL" monitor command, same as MOVE> CM NRENAM,REN,<"CCL" monitor command, same as RENAME> ;CM NREVIE,REV,<"CCL" monitor command, same as REVIEW> CM NTYPE,TYP,<"CCL" monitor command, same as TYPE> > > ;END OF COMMANDS MACRO ;NOW BUILD THE NIP COMMAND BASE TABLE DOCMND(NIP) ;NOW MAKE NIP STUFF AVAILABLE TO NFT FOR START-UP (.ISCAN) PURPOSES INTERN NIPBAS, NIPLEN, NIPNAM SUBTTL Local keyword lists ;MUST MATCH TT$XXX DEFINITIONS IN ND UNIVERSAL MODULE KEYS (TOT,) SUBTTL NIP command NIP:: PUSHJ P,NIP00 ;DO NIP-STARTUP STUFF JFCL ;DUH? PUSHJ P,.CLEOL## ;EAT REST OF LINE'S JUNK JRST .POPJ1## ;WE ARE NOW A NIP! ;NIP STARTUP STUFF NIP00:: MOVEI T1,NIPBAS ;SELECT NIP COMMAND BASE MOVEM T1,CMDBAS## ;AS THE COMMAND BASE ;Now check for a /INITFILE spec and set it up if requested ; PUSHJ P,CLRFIL ;CLEAR OUT "FILE ANSWERS" ; SETZM NIPFSB+.FXFLD ;IN PARTICULAR, CLEAR OUT /INITFILE ; MOVE T1,[NIPOL,,NIPOS] ;.OSCAN BLOCK ; PUSHJ P,.OSCAN## ;CHECK OUT SWITCH.INI ; SKIPN NIPFSB+.FXFLD ;WAS THERE A /INITFILE? ; JRST .POPJ1## ;NO, NIP INITIALIZED ;/INITFILE was specified, convince SWISCN to take indirect file JRST .POPJ1## ;ALL FOR HERE SUBTTL NIP command - switch definitions ;"NIP" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SP USERID,>,S.USER>,.SWUID##,, > ;DOSCAN(NIPSW) SUBTTL COPY command ;COPY COMMAND ; ; COPY = TTLCOP==TT$BIT!TT$BYT!TT$WRD!TT$BLK!TT$FIL!TT$BAU!TT$ERR TTMCOP==TT$WRD!TT$BLK!TT$FIL!TT$ERR COP: SETZM DDCMDF## ;NORMAL COMMAND STUFF JUMPLE CH,ERRNIF## ;EOL HERE IS JUNK PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,COPC ;READ IN THE REST OF THE COMMAND JRST COP70 ;COMMAND ERROR PUSHJ P,COPD ;HANDLE ANY DEFAULTING JRST COP70 ;ERROR PUSHJ P,COPL ;DO THE FILE TRANSFER(S) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) MOVE T1,[TTLCOP,,TTMCOP] ;/TOTALS CONTROL SKIPLE S.BAUD ;WANT BAUD RATE TOO? TXO T1,TT$BAU ;YES PUSHJ P,.TOTAL## ;ISSUE TOTALS SUMMARY JFCL ;DUH?? ;NOW CLEAN UP ANY RANDOM I/O LEFT OVER ; ;INPUT IS RELEASED FIRST IN ORDER TO DE-ALLOCATE MANAGED MEMORY ;IN OPPOSITE ORDER OF ALLOCATION . . . COP50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? MOVEI T1,CDBLO## ;OUTPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS COP60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST COP77 ;??? ;ALL DONE WITH COPY COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;COPY ERROR COP70: PUSHJ P,FRESB## ;MAKE SURE FILE SPEC BLOCKS FREED UP JFCL ;??? COP77: POPJ P, ;PROPAGATE ERROR SUBTTL COPY command - parsing ;HERE TO READ THE COPY FILE SPECIFICATIONS COPC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[COPTL,,COPTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[COPOL,,COPOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW JRST .POPJ1## ;RETURN HAPPILY SUBTTL COPY command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS COPD: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST ERRNIF## ;NO INPUT FILE SPECIFIED ;HANDLE INPUT DEFAULTING COPD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;GOT A FILE NAME? JRST COPD17 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNAM(P1) ;SUPPLY DEFAULT FILE NAME XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNAM(P1) ;SUPPLY DEFAULT FILE NAME MOVX T3,FX.WNM ;THE WILDCARDS-IN-NAME FLAG IORM T3,.FXFLD(P1) ;SET IN FIELDS FLAGS COPD17: MOVX T1,FX.UQN ; TDNN T1,.FXFLD(P1) ;USER-SPECIFIED QUOTED FILE NAME? SKIPE .FXEXT(P1) ;GOT AN EXTENSION? JRST COPD18 ;YES MOVSI T1,'* ' ;FULL WILD NAME HLLZM T1,.FXEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION MOVX T3,FX.WEX ;THE WILDCARDS-IN-EXTENSION FLAG IORM T3,.FXFLD(P1) ;SET THAT TOO COPD18: MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT ; CONSIDER "26_NUL:=ACCT.SYS[1,4]" IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? IORM T1,.FXMOD(P1) ;NO, SET IMPLICIT /STRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST COPD10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT DEFAULTING COPD50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST COPD52 ;USER TYPED ONE IN, GO FILL IT OUT ;NO OUTPUT FILE SPECIFIED, DEFAULT TO DSK:[]*.* PUSHJ P,CLRFIL## ;CLEAR OUT FILE SPECIFICATION PUSHJ P,OUX## ;ALLOCATE A FILE SPEC BLOCK MOVE P1,T1 ;WANT ADDRESS IN P1 ON G.P.S MOVSI T1,'DSK' ;DEFAULT OUTPUT DEVICE SETO T2, ;NON-WILD MASK DMOVEM T1,.FXDEV(P1) ;SET DEFAULT DEVICE XMOVEI T1,[ASCIZ\DSK\] ;DEFAULT OUTPUT DEVICE MOVEM T1,.FSDEV(P1) ;SUPPLY DEFAULT OUTPUT DEVICE ;FLESH OUT THE OUTPUT FILE SPEC COPD52: MOVE T1,P1 ;POSITION ADDRESS OF FILE SPEC BLOCK PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;OUTPUT FILE NAME GIVEN? JRST COPD57 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNAM(P1) ;SET DEFAULT FILE NAME XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNAM(P1) ;SUPPLY DEFAULT FILE NAME MOVX T3,FX.WNM ;THE WILDCARDS-IN-NAME FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO COPD57: MOVX T1,FX.UQN ; TDNN T1,.FXFLD(P1) ;USER-SPECIFIED QUOTED FILE NAME? SKIPE .FXEXT(P1) ;OUTPUT EXTENSION GIVEN? JRST COPD58 ;YES MOVSI T1,'* ' ;FULL WILD NAME HLLZM T1,.FXEXT(P1) ;NO, DEFAULT TO FULL WILD XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION MOVX T3,FX.WEX ;THE WILDCARDS-IN-EXTENSION FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO COPD58: MOVX T1,FX.PRT ;THE /OKPROT BIT TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, FORCE /ERPROT FOR OUTPUT FILE TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? IORM T1,.FXMOM(P1) ;AND MAKE IT STICKY MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL COPY command - main file transfer loop ;LOOP FINDING AND TRANSFERRING THE FILE(S) COPL: XMOVEI CI,CDBLI## ;INPUT CDB XMOVEI CO,CDBLO## ;OUTPUT CDB MOVE T1,CI ;ADDRESS OF INPUT I/O CDB MOVEI T2,COPIV ;ADDRESS OF CDB INITIALIZATION VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T INITIALIZE INPUT CDB MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC MOVEM T3,.IOFSL(T1) ;SET LAST INPUT FILE SPEC MOVE T1,CO ;ADDRESS OF OUTPUT I/O CDB MOVEI T2,COPOV ;ADDRESS OF CDB INITIALIZATION VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDO## ;CAN'T INITIALIZE OUTPUT CDB MOVE T3,SOFIR## ;FIRST (AND ONLY) OUTPUT SPEC MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVEM T3,.IOFSL(T1) ;ALSO THE LAST ADDRESS COPL10: MOVE T3,COPIVC ;PROTOTYPE INPUT I/O CONTROL FLAGS MOVE T1,.IOFSB(CO) ;GET OUTPUT FILE SPEC BLOCK ADDRESS DMOVE T1,.FXUSW(T1) ;GET OUTPUT FILE SWITCHES (/[NO]LSN) TXNE T1,US$LSN ;OUTPUT SELECT LSN? TXO T3,IC.LSN ;YES, PRESERVE INCOMING LSN'S THEN MOVE T1,.IOFSB(CI) ;GET INPUT FILE SPEC BLOCK ADDRESS DMOVE T1,.FXUSW(T1) ;GET INPUT FILE SWITCHES (/[NO]LSN) TXNE T1,US$LSN ;WAS /LSN? TXO T3,IC.LSN ;YES, PRESERVE INPUT LSN'S TXNE T2,US$LSN ;DID INPUT SPECIFY SOME FLAVOR OF /[NO]LSN? TXNE T1,US$LSN ;YES, WAS IT /NOLSN? CAIA ;NOT TO WORRY TXZ T3,IC.LSN ;/NOLSN, SUPPRESS INPUT LSNS MOVEM T3,.IOIOC(CI) ;RE/SET I/O CONTROL FOR NEW INPUT FILE PUSHJ P,.NXTFI## ;GET NEXT INPUT FILE JRST COPLIE ;GO CHECK OUT FAILURE PUSHJ P,CIOX ;SET OUTPUT FILE ATTRIBUTES FROM INPUT FILE JFCL ;DUH? PUSHJ P,.NXTFO## ;SET NEXT OUTPUT FILE JRST COPLOE ;BUMMER MOVE T1,CDBLI+.IOCCF ;GET INPUT CHANNEL CONTROL FLAGS IOR T1,CDBLO+.IOCCF ;MERGE IN OUTPUT CHANNEL CONTROL FLAGS SKIPGE S.BAUD ;UNLESS USER EXPLICITLY SPECIFIED /[NO]BAUD TXNN T1,IO.NET ;DEFAULT /BAUD IF A NETWORK CHANNEL CAIA ;NO DEFAULT HRRZM P,S.BAUD ;DEFAULT /BAUD FOR NETWORK FILE TRANSFER MSTIME T1, ;GET TIME OF DAY MOVEM T1,TIME## ;AND REMEMBER IT FOR LATER MOVE P4,CDBLO##+.IOBSZ ;GET OUTPUT BYTE SIZE ; (ALL "TOTAL"S ARE BASED ON OUTPUT FILE) MOVEM P4,TOTBSZ ;SAVE FOR LATER TOTALS CALCULATION SETZ P4, ;TOTAL BYTES TRANSFERRED SO FAR ;LOOP COPYING FILE DATA COPL50: PUSHJ P,COPY ;LET THE COPY PROCESSOR RIP JRST COPL10 ;ABORTED, TRY FOR ANOTHER FILE ;INPUT FILE FINISHED, ACCUMULATE TOTALS COPL80: MSTIME T1, ;GET NEW TIME OF DAY SUB T1,TIME## ;GET INCREMENTAL TIME OF DAY CAIGE T1,0 ;WRAP AROUND? ADDX T1,^D24*^D60*^D60*^D1000 ;WRAPPED PAST MIDNIGHT CAIG T1,0 ;IF CAME BACK THE SAME TICK MOVEI T1,1 ;DON'T DIVIDE BY ZERO ADDM T1,MSECS## ;COUNT UP TIME ;NOW ACCOUNT FOR THE ACTUAL AMOUNT OF DATA TRANSFERRED MOVE T2,TOTBSZ ;T2:=BITS PER LOGICAL DATA BYTE JFCL 17,.+1 ;CLEAR OUT ARITHMETIC FLAGS IMUL T2,P4 ;T2:=TOTAL DATA BITS EFFECTIVELY TRANSFERRED ADDM T2,BITS## ;ACCUMULATE TOTAL BITS FOR BAUD SUMMARY JOV [PUSHJ P,TOTGBT ;SINGLE PRECISION OVERFLOW JRST .+1] ;HO HUM ADDM P4,BYTES## ;ACCUMULATE TOTAL BYTES MOVEI T2,^D36 ;BITS PER -10 WORD IDIV T2,TOTBSZ ;T2:=NUMBER OF DATA BYTES PER -10 WORD MOVE T1,P4 ;GET TOTAL BYTES TRANSFERRED IDIV T1,T2 ;T2:=TOTAL -10 WORDS XFERRED CAIE T2,0 ;GOT ANYTHING LEFTOVER? ADDI T1,1 ;ROUND UP WORD COUNT ADDM T1,WORDS## ;ACCUMULATE TOTALS ADDI T1,177 ;ROUND UP LSH T1,-7 ;AND CHOP DOWN TO BLOCKS ADDM T1,BLOCKS## ;COUNT UP BLOCKS AOS FILES## ;COUNT UP FILES JRST COPL10 ;BACK FOR MORE FILES ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) COPLIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST .POPJ1## ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST COPL10 ;CONTINUE ON ERROR ;FILE CREATE ERROR (.NXTFO/.IOPOU) COPLOE: CAIN M0,$EFRJU ;REJECTED BY USER? JRST [PUSHJ P,NERFAB ;ABORT I/O JRST COPL10] ;SKIP INTO NEXT FILE AOS ERRORS## ;COUNT UP FILE ERROR MOVEI T1,CDBLO## ;*** ADDRESS OF OUTPUT CDB PUSHJ P,.ERPOU## ;TYPE FILE CREATE ERROR MESSAGE PUSHJ P,NERFAB ;ABORT THE FILE PUSHJ P,ONERCK## ;WANT TO ABORT ON ERROR? POPJ P, ;ABORT ON ERROR JRST COPL10 ;CONTINUE ON ERROR ;HERE ON INFINITE BITS (SINGLE PRECISION /TOTALS OVERFLOW) TOTGBT: SKIPE S.TOTA ;GOING TO GIVE A TOTALS SUMARY? WARN GBT, HRLOI T2,377777 ;POSITIVE INFINITY MOVEM T2,BITS## ;PEG THE BITS COUNTER SETZ T2, ;CLEAR POPJ P, ;AND RETURN SUBTTL COPY command - switch definitions ;"COPY" SWITCHS DEFINE SWTCHS,< SN ARROW,, SN BAUD,S.BAUD,FS.NFS ;SN CHOP,, SN CONCATENATE,, SP CRLF,S.XUO0,.SWDEC##,,FS.VRQ SN CSN,, SP CSNCOLUMN,S.XUO2,.SWDEC##,CSC,FS.VRQ SP CSNINCREMENT,S.XUO3,.SWDEC##,CSI,FS.VRQ SP CSNWIDTH,S.XUO4,.SWDEC##,CSW,FS.VRQ SP DIAL,,S.DIAL>,.SWPNM##,, SN EBCDIC,, SL FLAG,,FLG,FLGLOW ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN LSN,, SN LSNCONTINUOUS,, SP LSNINCREMENT,S.XUO6,.SWDEC##,LSI, SN MOAN,S.MOAN,FS.NFS SN NONULLS,, SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SN SPACES,, SN TABS,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SN TRUNCATE,, SP USERID,>,S.USER>,.SWUID##,, ;*** SP UACCOUNT,,S.UACC>,.SWUAC##,, ;*** SP UPASSWORD,,S.UPAS>,.SWUPA##,, SP WRAP,S.XUO7,.SWDEC##,,FS.VRQ > ;FLAGS STORED IN THE .FXUSW WORD US$ARR==1B0 ;/[NO]ARROW US$CHO==1B1 ;/[NO]CHOP US$CSN==1B2 ;/[NO]CSN US$EBC==1B3 ;/[NO]EBCDIC US$EBI==1B4 ;INTERNAL FLAG USAGE ONLY, NOT A SWITCH US$LSN==1B5 ;/[NO]LSN US$NUL==1B6 ;/[NO]NONULLS US$SPA==1B7 ;/[NO]SPACES US$TAB==1B8 ;/[NO]TABS US$TRU==1B9 ;/[NO]TRUNCATE US$FLG==7B12 ;/FLAG:(LOWER, UPPER) US$FLU==1B11 ;/FLAG:UPPER US$FLL==1B12 ;/FLAG:LOWER US$CON==1B13 ;/CONCATENATE US$LSC==1B14 ;/[NO]LSNCONTINUOUS ;THE CHARACTER TRANSLATION MASKS US$XLI==US$EBI ;INPUT TRANSLATION NEEDED US$XLO==US$EBC ;OUTPUT TRANSLATION NEEDED ;CHARACTER PROCESSING OF ANY TYPE MASK US$CHP==US$ARR!US$CHO!US$CSN!US$EBC!US$EBI!US$LSN!US$NUL US$CHP==US$CHP!US$SPA!US$TAB!US$TRU!US$FLG ;VALUES STORED IN $FXUO? (ORDERING MUST MATCH S.XUO? USAGE IN SWTCHS MACRO) $FXCRL==$FXUO0 ;/CRLF ;$FXCSN==$FXUO1 ;/CSN $FXCSC==$FXUO2 ;/CSNCOLUMN $FXCSI==$FXUO3 ;/CSNINCREMENT $FXCSW==$FXUO4 ;/CSNWIDTH ;$FXLSN==$FXUO5 ;/LSN $FXLSI==$FXUO6 ;/LSNINCREMENT $FXWRA==$FXUO7 ;/WRAP $FXBCH==$FXUO0 ;BEGINING OF CHARACTER PROCESSING SWITCHES $FXECH==$FXUO7+1 ;END (+1) OF CHARACTER PROCESSING SWITCHES ;SWITCH MAXIMA AND DEFAULTS DM CSC,^D500,^D72,^D72 ;/CSNCOLUMN DM CSI,^D10000,^D1,^D1 ;/CSNINCREMENT DM CSW,^D16,^D08,^D08 ;/CSNWIDTH DM LSI,^D10000,^D10,^D10 ;/LSN ;SWITCH KEYWORDS KEYS (FLG,) DOSCAN(COPSW) SUBTTL COPY command - SCAN argument blocks ;"COPY" TSCAN PARAMETER BLOCK COPTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD COPSWL,COPSWN ;IOWD POINTER FOR SWITCH NAMES XWD COPSWD,COPSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,COPSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN COPTL==.-COPTS ;"COPY" OSCAN BLOCK COPOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD COPSWL,COPSWN ;IOWD POINTER FOR SWITCH NAMES XWD COPSWD,COPSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,COPSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD COPOSL,COPOSN ;OPTIONS NAME(S) COPOL==.-COPOS COPOSN: SIXBIT \COPY\ SIXBIT \NIP\ SIXBIT \NFT\ COPOSL==.-COPOSN SUBTTL COPY command - I/O CDB initialization vectors ;"COPY" CDB INITIALIZATION VECTORS. ; ;NOTE THAT THE INPUT SIDE DEFERS BUFFER ALLOCATION UNTIL AFTER THE ;OUTPUT SIDE HAS BEEN OPENED AND OUTPUT BUFFERS ALLOCATED. THIS IS ;SO THAT VARIOUS INPUT DEVICES CAN ALLOCATE AND DEALLOCATE BUFFERS ;AND NOT "GROW" MEMORY NEEDLESSLY. ;"COPY" INPUT CDB INITIALIZATION VECTOR COPIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING COPIVC: 0 ;I/O CONTROL 0 ;I/O ERROR CONTROL IM.SMD!IM.SBO!IM.DQI ;I/O MODE 0 ;(RESERVED) ;"COPY" OUTPUT CDB INITIALIZATION VECTOR COPOV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING COPOVC: 0 ;I/O CONTROL 0 ;I/O ERROR CONTROL 0 ;I/O MODE 0 ;(RESERVED) SUBTTL DEFAULT command DEF: ERROR DFY, SUBTTL DELETE command ;DELETE COMMAND ; ; DELETE ; DDELET TTLDDE==TT$BLK!TT$FIL!TT$ERR TTLDEL==TT$BLK!TT$FIL!TT$ERR TTMDEL==TT$BLK!TT$FIL!TT$ERR DDEL: TDZA T1,T1 ;"DAP" ENTRY DEL: SETO T1, ;NORMAL ENTRY SETCAM T1,DDCMDF## ;SET COMMAND MODE JUMPLE CH,ERRNIF## ;EOL HERE IS JUNK PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,DELC ;READ IN THE REST OF THE COMMAND JRST DEL70 ;COMMAND ERROR PUSHJ P,DELD ;HANDLE ANY DEFAULTING JRST DEL70 ;ERROR PUSHJ P,DELL ;DO THE FILE DELETE(S) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) SKIPE DDCMDF## ;RESTRICTED TO DAP MODE? SKIPA T1,[TTLDDE,,TTMDEL] ;YES MOVE T1,[TTLDEL,,TTMDEL] ;GET TOTALS CONTROL PUSHJ P,.TOTAL## ;AND ISSUE TOTALS SUMMARY JFCL ;ERROR (?) ;DO ANY FINAL CLEANUP NEEDED DEL50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS DEL60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST DEL77 ;??? ;ALL DONE WITH "DELETE" COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;DELETE COMMAND-LEVEL ERROR DEL70: PUSHJ P,FRESB## ;FREE UP ANY FILE SPEC BLOCKS LEFT LYING AROUND JFCL ;??? DEL77: POPJ P, ;PROPAGATE ERROR SUBTTL DELETE command - parsing ;HERE TO READ THE DELETE FILE SPECIFICATIONS DELC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[DELTL,,DELTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[DELOL,,DELOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW SKIPN DDCMDF## ;DAPPING? JRST .POPJ1## ;RETURN HAPPILY ;MAKE SURE COMMAND WILL FIT DAP CONSTRAINTS PUSHJ P,DDCVFY ;CALL DAP COMMAND VERIFIER POPJ P, ;USER LOSES JRST .POPJ1## ;RETURN HAPPILY SUBTTL DELETE command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS DELD: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST ERRNIF## ;NONE??? ;HANDLE INPUT DEFAULTING DELD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPN .FXNAM(P1) ;USER TYPE AN EXPLICIT FILE NAME? ERROR FRD, SKIPN .FXEXT(P1) ;USER TYPE AN EXPLICIT EXTENSION? HLLOS .FXEXT(P1) ;NO, DELETE SHOULD NOT DEFAULT TO "*" MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? IORM T1,.FXMOD(P1) ;NO, SET IMPLICIT /STRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL MOVX T1,FX.QNY ;THE [N/Y] BIT TDNN T1,.FXCTM(P1) ;DID USER REQUEST IT? IORM T1,.FXCTL(P1) ;NO, SO DEFAULT TO [N/Y] ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST DELD10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT DELD50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST ERROFI## ;ILLEGAL OUTPUT FILE ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL DELETE command - main file deletion loop ;LOOP FINDING AND DELETING THE FILE(S) DELL: MOVEI T1,CDBLI## ;ADDRESS OF INPUT I/O CDB MOVEI T2,DELIV ;ADDRESS OF CDB INITIALIZATION VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T INITIALIZE INPUT CDB MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC MOVEM T3,.IOFSL(T1) ;SET LAST INPUT FILE SPEC SKIPE DDCMDF## ;DAP-MODE? JRST DELLD ;YES DELL10: PUSHJ P,.NXTFI## ;GET NEXT INPUT FILE JRST DELLIE ;GO CHECK OUT FAILURE MOVE P4,CDBLI+.IOLNW ;INPUT FILE WORD COUNT ;NOW DELETE THE FILE AS REQUESTED MOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB PUSHJ P,.IOFDL## ;DELETE THE FILE AS APPROPRIATE JRST DELLFE ;GO CHECK OUT FAILURE DELL80: ADDM P4,WORDS## ;COUNT UP THE WORDS TRANSFERRED ADDI P4,177 ;ROUND UP LSH P4,-7 ;AND CHOP DOWN TO BLOCKS ADDM P4,BLOCKS## ;COUNT UP BLOCKS AOS FILES## ;COUNT UP FILES JRST DELL10 ;GO BACK FOR NEXT FILE ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) DELLIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST .POPJ1## ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST DELL10 ;CONTINUE ON ERROR ;FILE DELETE ERROR (.IOFDL) DELLFE: CAIN M0,$EFRJU ;REJECTED BY USER? JRST [PUSHJ P,NERFAI ;ABORT I/O JRST DELL10] ;SKIP INTO NEXT FILE AOS ERRORS## ;COUNT UP ERRORS MOVEI T1,CDBLI## ;*** ADDRESS OF INPUT CDB PUSHJ P,.ERFDL## ;TYPE FILE DELETE ERROR MESSAGE PUSHJ P,NERFAI ;ABORT THE FILE PUSHJ P,ONERCK## ;WANT TO ABORT ON ERROR? POPJ P, ;ABORT ON ERROR JRST DELL10 ;CONTINUE ON ERROR ;HERE FOR DAP-MODE DELETE DELLD: XMOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB XMOVEI T2,DELLDP ;ADDRESS OF FILE "PROCESSOR" XMOVEI T3,DELLDE ;ADDRESS OF ERROR PROCESSOR PUSHJ P,.IODDE## ;DO A DAP-MODE DELETE OPERATION JRST DDCERM ;DAP-MODE COMMAND FAILURE JRST .POPJ1## ;SUCCESSFUL DELLDP: MOVE T1,CDBLI+.IOLNW ;GET FILE LENGTH IN -10 WORDS ADDI T1,177 ;ROUND UP AND LSH T1,-7 ;TRUNCATE TO BLOCK SIZE ADDM T1,BLOCKS## ;ACCUMULATE BLOCKS DEALLOCATED AOS FILES## ;COUNT THE FILES AS THEY GO BY JRST .POPJ1## ;THAT'S ALL DELLDE: AOS ERRORS## ;COUNT THE ERRORS AS THEY ACCUMULATE PJRST ONERCK## ;MAYBE PROCEED, MAYBE ABORT SUBTTL DELETE command - switch definitions ;"DELETE" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SP USERID,>,S.USER>,.SWUID##,, > DOSCAN(DELSW) SUBTTL DELETE command - SCAN argument blocks ;"DELETE" TSCAN PARAMETER BLOCK DELTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD DELSWL,DELSWN ;IOWD POINTER FOR SWITCH NAMES XWD DELSWD,DELSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,DELSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN DELTL==.-DELTS ;"DELETE" OSCAN BLOCK DELOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD DELSWL,DELSWN ;IOWD POINTER FOR SWITCH NAMES XWD DELSWD,DELSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,DELSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD DELOSL,DELOSN ;OPTIONS NAME(S) DELOL==.-DELOS DELOSN: SIXBIT \DELETE\ SIXBIT \NIP\ SIXBIT \NFT\ DELOSL==.-DELOSN SUBTTL DELETE command - I/O CDB initialization vector ;"DELETE" INPUT CDB INITIALIZATION VECTOR DELIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING 0 ;I/O CONTROL 0 ;I/O ERROR CONTROL IM.SBO!IM.SMD ;I/O MODE ;[7] 0 ;(RESERVED) SUBTTL DIRECTORY command ;DIRECTORY COMMAND ; ; DIRECT = ; DDIREC = TTLDDI==TT$FIL!TT$ERR TTLDIR==TT$WRD!TT$BLK!TT$FIL!TT$ERR TTMDIR==TT$FIL!TT$ERR DDIR: TDZA T1,T1 ;FLAG DAP MODE ENTRY DIR: SETO T1, ;FLAG NORMAL ENTRY SETCAM T1,DDCMDF## ;SET DAP FLAG PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,DIRC ;READ IN THE REST OF THE COMMAND JRST DIR70 ;COMMAND ERROR PUSHJ P,DIRD ;HANDLE ANY DEFAULTING JRST DIR70 ;ERROR PUSHJ P,DIRL ;LIST THE FILE(S) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) SKIPE DDCMDF## ;RESTRICTED TO DAP-MODE? SKIPA T1,[TTLDDI,,TTMDIR] ;GET THE TOTALS CONTROL MOVE T1,[TTLDIR,,TTMDIR] ;GET THE TOTALS CONTROL PUSHJ P,.TOTAL## ;AND ISSUE TOTALS IF NEEDED JFCL ;ERROR (?) ;NOW CLEAN UP ANY RANDOM I/O LEFT OVER ; ;INPUT IS RELEASED FIRST IN ORDER TO DE-ALLOCATE MANAGED MEMORY ;IN OPPOSITE ORDER OF ALLOCATION . . . DIR50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? SKIPN SOFIR## ;GOT AN OUTPUT SPEC? JRST DIR60 ;NO, JUST DID OUTCHRS, NO CDB PRESENT MOVEI T1,CDBLO## ;OUTPUT CHANNEL CDB PUSHJ P,.IOCLO## ;CLOSE OFF THE LISTING FILE ERROR ECD, PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS DIR60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST DIR77 ;??? ;ALL DONE WITH DIRECT COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;DIRECT ERROR DIR70: PUSHJ P,FRESB## ;MAKE SURE FILE SPEC BLOCKS FREED UP JFCL ;??? DIR77: POPJ P, ;PROPAGATE ERROR SUBTTL DIRECTORY command - parsing ;HERE TO READ THE DIRECT FILE SPECIFICATIONS DIRC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[DIRTL,,DIRTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[DIROL,,DIROS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW SKIPN DDCMDF## ;DAPPING? JRST .POPJ1## ;RETURN HAPPILY ;MAKE SURE DAP WON'T BE OFFENDED PUSHJ P,DDCVFY ;VERIFY DAPPABLE COMMAND POPJ P, ;NOPE JRST .POPJ1## ;RETURN HAPPILY SUBTTL DIRECTORY command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS DIRD: MOVEI T1,1 ;DEFAULT VALUE FOR /OKERROR SKIPGE S.OKER## ;USER SUPPLY /[NO]OKERROR? MOVEM T1,S.OKER## ;NO, DIRECT DEFAULTS TO /OKERRROR SKIPE P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST DIRD10 ;FLESH OUT THE INPUT SPEC AS NEEDED ;HERE WHEN NO INPUT SPECIFIED, DEFAULT TO DSK:[-]*.* PUSHJ P,CLRFIL## ;CLEAR OUT THE FILE AREA PUSHJ P,INX## ;AND ALLOCATE AN INPUT FILE MOVE P1,SIFIR ;NOW GET FIRST INPUT FILE SPEC BLOCK MOVSI T1,'DSK' ;DEFAULT DEVICE IS DISK SETO T2, ;FULL NON-WILD MASK DMOVEM T1,.FXDEV(P1) ;SET DEVICE FIELD SPECIFICATION XMOVEI T1,[ASCIZ\DSK\] ;DEFAULT DEVICE IS DISK MOVEM T1,.FSDEV(P1) ;SET DEVICE FIELD SPECIFICATION ;HANDLE INPUT DEFAULTING DIRD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;GOT A FILE NAME? JRST DIRD17 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNAM(P1) ;SUPPLY DEFAULT FILE NAME XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNAM(P1) ;SUPPLY DEFAULT FILE NAME MOVX T3,FX.WNM ;THE WILDCARDS-IN-NAME FLAG IORM T3,.FXFLD(P1) ;SET IN FIELDS FLAGS DIRD17: MOVX T1,FX.UQN ; TDNN T1,.FXFLD(P1) ;USER-SPECIFIED QUOTED FILE NAME? SKIPE .FXEXT(P1) ;GOT AN EXTENSION? JRST DIRD18 ;YES MOVSI T1,'* ' ;FULL WILD NAME HLLZM T1,.FXEXT(P1) ;SUPPLY A DEFAULT XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION MOVX T3,FX.WEX ;THE WILDCARDS-IN-EXTENSION FLAG IORM T3,.FXFLD(P1) ;SET THAT TOO DIRD18: MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? IORM T1,.FXMOD(P1) ;NO, SET IMPLICIT /STRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRN ;/QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T1,.FXCTM(P1) ;NO, MAKE SURE NOONE ELSE UNDEFAULTS US ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST DIRD10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT DEFAULTING DIRD50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST DIRD52 ;USER TYPED ONE IN, GO FILL IT OUT JRST .POPJ1## ;*** JUST DO OUTCHRS! ;NO OUTPUT FILE SPECIFIED, DEFAULT TO TTY: PUSHJ P,CLRFIL## ;CLEAR OUT FILE SPECIFICATION PUSHJ P,OUX## ;ALLOCATE A FILE SPEC BLOCK MOVE P1,T1 ;WANT ADDRESS IN P1 ON G.P.S MOVSI T1,'TTY' ;DEFAULT OUTPUT DEVICE SETO T2, ;NON-WILD MASK DMOVEM T1,.FXDEV(P1) ;SET DEFAULT DEVICE XMOVEI T1,[ASCIZ\TTY\] ;DEFAULT OUTPUT DEVICE MOVEM T1,.FSDEV(P1) ;SET DEFAULT DEVICE ;FLESH OUT THE OUTPUT FILE SPEC DIRD52: MOVE T1,P1 ;POSITION ADDRESS OF FILE SPEC BLOCK PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;OUTPUT FILE NAME GIVEN? JRST DIRD57 ;YES MOVE T1,['FILES '] ;DEFAULT LISTING FILE NAME SETO T2, ;NON-WILD MASK DMOVEM T1,.FXNAM(P1) ;SET OUTPUT LIST FILE DIRD57: SKIPE .FXEXT(P1) ;OUTPUT EXTENSION GIVEN? JRST DIRD58 ;YES MOVSI T1,'DIR' ;DEFAULT LISTING EXTENSION HLLOM T1,.FXEXT(P1) ;SET LISTING FILE XMOVEI T1,[ASCIZ\DIR\] ;DEFAULT LISTING EXTENSION MOVEM T1,.FSEXT(P1) ;SET LISTING FILE DIRD58: MOVX T1,FX.PRT ;THE /OKPROT BIT TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, FORCE /ERPROT FOR OUTPUT FILE TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? IORM T1,.FXMOM(P1) ;AND MAKE IT STICKY MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRN ;/QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T1,.FXCTM(P1) ;ENSURE NOONE UNDEFAULTS US MOVEI T1,1 ;/SCERROR:NEVER DPB T1,[POINTR .FXCTL(P1),FX.SCE] ;KROCK ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL DIRECTORY command - main file listing loop ;LOOP FINDING AND REPORTING THE FILE(S) DIRL: MOVEI T1,CDBLI## ;ADDRESS OF INPUT I/O CDB MOVEI T2,DIRIV ;ADDRESS OF CDB INIT VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC BLOCK ADDRESS MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC BLOCK ADDRESS MOVEM T3,.IOFSL(T1) ;SET LAST ADDRESS IN CDB SKIPN SOFIR## ;GOT A LISTING FILE? JRST DIRL09 ;NO MOVEI T1,CDBLO## ;ADDRESS OF LISTING I/O CDB MOVEI T2,DIROV ;ADDRESS OF CDB INIT VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDO## ;CAN'T? MOVE T3,SOFIR## ;ADDRESS OF FIRST OUTPUT FILE SPEC BLOCK MOVEM T3,.IOFSB(T1) ;SET IN CDB MOVEM T3,.IOFSL(T1) ;ALSO LAST ADDRESS MOVEI T2,CDBLI## ;KROCK ADDRESS OF SOMETHING PUSHJ P,.IOPOU## ;OPEN OUTPUT LISTING FILE ERROR EOD, DIRL09: XMOVEI T1,DIRLTC ;ASSUME NO OUTPUT FILE SKIPE SOFIR## ;DID WE GUESS RIGHT? XMOVEI T1,DIRLTO ;NO, ADDRESS OF OUR "TYPER" PUSHJ P,.XTYPO## ;REDIRECT TYPEOUT TO LISTING FILE SKIPE DDCMDF## ;DAP MODE? JRST DIRLD ;YEAH ;LOOP FINDING EACH FILE DIRL10: PUSHJ P,.NXTFI## ;ASK FOR AN INPUT FILE JRST DIRLIE ;SEE IF DONE ;LIST THE FILE PUSHJ P,DIRLP ;PROCESS THIS FILE JFCL ;HUH? ;NOW CLOSE OFF THIS FILE MOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB PUSHJ P,.IOCLO## ;CLOSE OFF THE FILE JFCL ;HUH? JRST DIRL10 ;BACK FOR MORE FILES ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) DIRLIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST .POPJ1## ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST DIRL10 ;CONTINUE ON ERROR ;HERE FOR DAP MODE DIRECTORY DIRLD: MOVEI T1,CDBLI## ;INPUT CDB ADDRESS XMOVEI T2,DIRLP ;LIST-THE-FILE PROCESSOR XMOVEI T3,DIRLDE ;ERROR PROCESSOR PUSHJ P,.IODDI## ;DO A DAP-MODE DIRECTORY LIST JRST DDCERM ;DAP-MODE COMMAND FAILURE JRST .POPJ1## ;SUCCESSFUL DIRLDE: AOS ERRORS## ;NOTE AN ERROR OCCURRED PJRST ONERCK## ;MAYBE CONTINUE, MAYBE ABORT ;THE LIST-THE-FILE PROCESSOR DIRLP: MOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB PUSHJ P,.TOCFN## ;TYPE OUT FILE SPECIFICATION STRING JFCL ;CAN'T FAIL PUSHJ P,.TCRLF## ;CAP OFF LISTING ;AND ACCUMULATE TOTALS FOR ANYONE WHO CARES MOVE T1,CDBLI+.IOLNW ;LENGTH OF FILE ADDM T1,WORDS## ;ACCUMULATE WORDS ADDI T1,177 ;ROUND UP AND LSH T1,-7 ;TRUNCATE TO BLOCKS ADDM T1,BLOCKS## ;ACCUMULATE BLOCKS AOS FILES## ;ACCUMULATE FILES JRST .POPJ1## ;SUCCESSFUL RETURN ;HELPER TO "TYPE" CHARACTERS DIRLTC: OUTCHR T1 ;THE SIMPLE CASE POPJ P, ;ALL DONE DIRLTO: PUSH P,T2 ;SAVE T2 MOVE T2,T1 ;PUT CHARACTER IN T2 MOVEI T1,CDBLO## ;AND THE CDB ADDRESS IN T1 PUSHJ P,@.IOOSR(T1) ;OUTPUT CHARACTER JFCL ;*** GOTTA DO SOMETHING ABOUT THIS MOVE T1,T2 ;RESTORE CHARACTER POP P,T2 ;RESTORE T2 POPJ P, ;RETURN SUBTTL DIRECTORY command - switch definitions ;"DIRECT" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SP USERID,>,S.USER>,.SWUID##,, > DOSCAN(DIRSW) SUBTTL DIRECTORY command - SCAN argument blocks ;"DIRECT" TSCAN PARAMETER BLOCK DIRTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD DIRSWL,DIRSWN ;IOWD POINTER FOR SWITCH NAMES XWD DIRSWD,DIRSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,DIRSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN DIRTL==.-DIRTS ;"DIRECT" OSCAN BLOCK DIROS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD DIRSWL,DIRSWN ;IOWD POINTER FOR SWITCH NAMES XWD DIRSWD,DIRSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,DIRSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD DIROSL,DIROSN ;OPTIONS NAME(S) DIROL==.-DIROS DIROSN: SIXBIT \NDIREC\ SIXBIT \NIP\ SIXBIT \NFT\ DIROSL==.-DIROSN SUBTTL DIRECTORY command - I/O CDB initialization vectors ;"DIRECT" CDB INITIALIZATION VECTORS. ; ;NOTE THAT THE INPUT SIDE DEFERS BUFFER ALLOCATION UNTIL AFTER THE ;OUTPUT SIDE HAS BEEN OPENED AND OUTPUT BUFFERS ALLOCATED. THIS IS ;SO THAT VARIOUS INPUT DEVICES CAN ALLOCATE AND DEALLOCATE BUFFERS ;AND NOT "GROW" MEMORY NEEDLESSLY. ;"DIRECT" INPUT CDB INITIALIZATION VECTOR DIRIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING 0 ;I/O CONTROL 0 ;I/O ERROR CONTROL IM.SMD!IM.SBO ;I/O MODE 0 ;(RESERVED) ;"DIRECT" OUTPUT CDB INITIALIZATION VECTOR DIROV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING .ICASC ;I/O CONTROL (ASCII MODE) 0 ;I/O ERROR CONTROL 0 ;I/O MODE 0 ;(RESERVED) SUBTTL MOVE command MOV: ERROR MVY, SUBTTL NETWORK command ;NETWORK COMMAND ; ; NETWORK ; ;The NETWORK command is used to list network/DAP-related information ;about the specified network nodes. NET: PUSHJ P,NETC ;READ IN THE NODE LIST JRST NET70 ;DIED? CLEAN UP PUSHJ P,NETD ;HANDLE ANY DEFAULTING JRST NET70 ;NOT SUPPOSED TO HAPPEN! PUSHJ P,NETL ;LIST THE NETWORK NODES JFCL ;HO HUM NET50: SKIPN SOFIR## ;GOT A REAL LISTING FILE? JRST NET60 ;NO MOVEI T1,CDBLO## ;ADDRESS OF OUTPUT/LISTING CDB PUSHJ P,.IOCLO## ;CLOSE OFF LISTING FILE ERROR ECN,,,,NET57 NET57: MOVEI T1,CDBLO## ;ADDRESS OF OUTPUT CDB PUSHJ P,.IORLS## ;CLEAN UP THE CDB JFCL ;DEALLOCATE SCAN BLOCKS NET60: PUSHJ P,FRESB## ;FREE UP AN FILE SPEC BLOCKS JRST NET77 ;FAILED??? JRST .POPJ1## ;SUCCESSFUL COMPLETION OF NETWORK COMMAND ;HERE ON ERROR NET70: PUSHJ P,FRESB## ;PITCH ANY ACCUMULATED FILE SPEC BLOCKS JFCL ;HO HUM NET77: POPJ P, ;TAKE ERROR RETURN SUBTTL NETWORK command - parsing ;HERE TO READ THE NODE LIST NETC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[NETTL,,NETTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[NETOL,,NETOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI JRST .POPJ1## ;RETURN HAPPILY SUBTTL NETWORK command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS NETD: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC ERROR NNN, ;HANDLE INPUT DEFAULTING NETD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNOD(P1) ;GOT AN EXPLICIT NODE? JRST NETD20 ;YES, NO FAKERY SKIPE .FXNAM(P1) ;NO, CAN WE FAKE ONE FROM A FILE NAME? JRST NETD12 ;YES SKIPE .FXDEV(P1) ;NO NODE, NO NAME, GIVE A DEVICE? JRST NETD20 ;YES, TRY IT AND SEE WHAT HAPPENS ERROR NNS, NETD12: DMOVE T1,.FXNAM(P1) ;GET NAME SPEC DMOVEM T1,.FXNOD(P1) ;AND SET AS NODE SPEC SETZM .FXNAM(P1) ;CLEAR OUT NAME SPEC SETZM .FXNAM+1(P1) ;AND THE MASK TOO MOVE T1,.FSNAM(P1) ;GET NAME STRING MOVEM T1,.FSNOD(P1) ;AND SET AS NODE STRING SETZM .FSNAM(P1) ;CLEAR OUT NAME STRING MOVE T1,.FXFLD(P1) ;GET FIELDS FLAGS TXZ T1,FX.UNM!FX.SNM;CLEAR NAME-TYPED FLAGS TXNE T1,FX.WNM ;WAS NAME WILD? TXO T1,FX.WND ;YES, THEN NODE IS WILD TXO T1,FX.UND ;THE "USER" TYPED A NODE (NO, REALLY, HE DID!) MOVEM T1,.FXFLD(P1) ;SET FIELDS FLAGS NETD20: MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRN ;/QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T1,.FXCTM(P1) ;NO, MAKE SURE NOONE ELSE UNDEFAULTS US ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST NETD10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT DEFAULTING NETD50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST NETD52 ;USER TYPED ONE IN, GO FILL IT OUT JRST .POPJ1## ;*** JUST DO OUTCHRS! ;FLESH OUT THE OUTPUT FILE SPEC NETD52: MOVE T1,P1 ;POSITION ADDRESS OF FILE SPEC BLOCK PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;OUTPUT FILE NAME GIVEN? JRST NETD57 ;YES MOVE T1,['NODES '] ;DEFAULT LISTING FILE NAME SETO T2, ;NON-WILD MASK DMOVEM T1,.FXNAM(P1) ;SET OUTPUT LIST FILE NETD57: SKIPE .FXEXT(P1) ;OUTPUT EXTENSION GIVEN? JRST NETD58 ;YES MOVSI T1,'NET' ;DEFAULT LISTING EXTENSION HLLOM T1,.FXEXT(P1) ;SET LISTING FILE XMOVEI T1,[ASCIZ\NET\] ;DEFAULT LISTING EXTENSION MOVEM T1,.FSEXT(P1) ;SET LISTING FILE NETD58: MOVX T1,FX.PRT ;THE /OKPROT BIT TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, FORCE /ERPROT FOR OUTPUT FILE TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? IORM T1,.FXMOM(P1) ;AND MAKE IT STICKY MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRN ;/QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T1,.FXCTM(P1) ;ENSURE NOONE UNDEFAULTS US MOVEI T1,1 ;/SCERROR:NEVER DPB T1,[POINTR .FXCTL(P1),FX.SCE] ;KROCK ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL NETWORK command - main file listing loop ;LOOP FINDING AND REPORTING THE NODE(S) NETL: MOVEI T1,CDBLI## ;ADDRESS OF INPUT I/O CDB MOVEI T2,NETIV ;ADDRESS OF CDB INIT VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC BLOCK ADDRESS MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC BLOCK ADDRESS MOVEM T3,.IOFSL(T1) ;SET LAST ADDRESS IN CDB SKIPN SOFIR## ;GOT A LISTING FILE? JRST NETL09 ;NO MOVEI T1,CDBLO## ;ADDRESS OF LISTING I/O CDB MOVEI T2,NETOV ;ADDRESS OF CDB INIT VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDO## ;CAN'T? MOVE T3,SOFIR## ;ADDRESS OF FIRST OUTPUT FILE SPEC BLOCK MOVEM T3,.IOFSB(T1) ;SET IN CDB MOVEM T3,.IOFSL(T1) ;ALSO LAST ADDRESS MOVEI T2,CDBLI## ;KROCK ADDRESS OF SOMETHING PUSHJ P,.IOPOU## ;OPEN OUTPUT LISTING FILE ERROR EON, NETL09: XMOVEI T1,DIRLTC ;ASSUME NO OUTPUT FILE SKIPE SOFIR## ;DID WE GUESS RIGHT? XMOVEI T1,DIRLTO ;NO, ADDRESS OF OUR "TYPER" PUSHJ P,.XTYPO## ;REDIRECT TYPEOUT TO LISTING FILE SETZM NETNOD ;NO NODES SEEN YET ;LOOP FINDING EACH NODE NETL10: MOVEI IO,CDBLI## ;RUN IN I/O CONTEXT PUSHJ P,IOPND0## ;OPEN ONLY A NETWORK/DAP LINK (NO FILE LOOKUP) JRST NETLIE ;SEE IF DONE ;GO TYPE OUT INFO FOR THIS NODE MOVE T2,.ION6M(IO) ;GET NODE OPENED CAMN T2,NETNOD ;SAME AS LAST TIME HERE? JRST NETL10 ;YEAH, PUNT IT MOVEM T2,NETNOD ;NEW NODE, REMEMBER IT PUSHJ P,NETLP ;DO LOTS OF TYPING JFCL ;HUH? NAH, DIDN'T HAPPEN . . . AOS .CTFLF## ;TELL .LKWLD TO MIND ITS OWN BUSINESS JRST NETL10 ;GO GET ANOTHER NODE ;HERE ON END, CLEAN UP THE CDB NETL30: PUSHJ P,NTZAP0## ;BLAST AWAY THE NETWORK LINK JFCL ;IGNORE NON-EXISTENT ERRORS PUSHJ P,.TCRLF## ;BLANK LINE FOR NEATNESS JRST .POPJ1## ;SUCCESSFUL COMPLETION OF COMMAND ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) NETLIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST NETL30 ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST NETL10 ;CONTINUE ON ERROR ;THE LIST-THE-NODE PROCESSOR NETLP: PUSHJ P,.TCRLF## ;START WITH AN INTERVENING BLANK LINE MOVEI T1,[ASCIZ\Node \] ;TEXT PUSHJ P,.TSTRG## ;TYPE IT MOVE T1,.ION6M(IO) ;NODE NAME PUSHJ P,.TSIXN## ;TYPE IT MOVE T2,.IOCCF(IO) ;CHANNEL CONTROL FLAGS MOVEI T1,[ASCIZ\ (Unknown)\] ;NETWORK TYPE TXNE T2,IO.ANF ;ANF-10 NODE? MOVEI T1,[ASCIZ\ (ANF-10)\] ;YES TXNE T2,IO.DCN ;DECNET NODE? MOVEI T1,[ASCIZ\ (DECnet)\] ;YES PUSHJ P,.TSTRG## ;TYPE IT OUT MOVEI T1,[ASCIZ\ running \] ;TEXT TO IDENTIFY PUSHJ P,.TSTRG## ;THE OPERATING SYSTEM MOVD1 T1,OST ;GET REMOTE OPERATING SYSTEM TYPE CAILE T1,$DVOMX ;WITHIN LIMITS? SETZ T1, ;UNKNOWN (NEW) OPERATING SYSTEM TYPE MOVE T1,NETOST(T1) ;GET ADDRESS OF TEXT STRING PUSHJ P,.TSTRG## ;IDENTIFY REMOTE OPERATING SYSTEM MOVD1 T1,FST ;GET REMOTE FILE SYSTEM CAIE T1,$DVFT1 ;IF TOPS-10 CAIN T1,$DVFT2 ;OR TOPS-20 JRST NETLP2 ;THEN SKIP FILE SYSTEM JUNK CAIN T1,$DVOS8 ;IF OS-8 JRST NETLP2 ;THEN SKIP FILE SYSTEM JUNK MOVEI T1,[ASCIZ\ with \] ;PREFIX TEXT PUSHJ P,.TSTRG## ;FOR THE FILE SYSTEM MOVD1 T1,FST ;RETRIEVE FST AGAIN CAILE T1,$DVFMX ;WITHIN KNOWN BOUNDS? SETZ T1, ;NO, UNKNOWN FILE SYSTEM TYPE MOVE T1,NETFST(T1) ;GET TEXT STRING TO PUSHJ P,.TSTRG## ;IDENTIFY THE REMOTE FILE SYSTEM NETLP2: PUSHJ P,.TCRLF## ;START UP A NEW LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVEI T1,[ASCIZ\ DAP version \] ;MORE PREFIX TEXT PUSHJ P,.TSTRG## ;TO USE UP SCREEN SPACE MOVD1 T1,DVR ;MAJOR VERSION PUSHJ P,.TDECW## ;TYPE OUT AS DECIMAL PUSHJ P,.TDOT## ;SEPARATE FROM MINOR VERSION MOVD1 T1,DVE ;WHICH IS SAVED HERE PUSHJ P,.TDECW## ;TYPE OUT MINOR ("ECO") LEVEL PUSHJ P,.TDOT## ;SEPARATE FROM MINOR MINOR VERSION MOVD1 T1,DVU ;WHICH IS YET A DIFFERENT FIELD PUSHJ P,.TDECW## ;TYPE OUT "USER" (CUSTOMER) VERSION PUSHJ P,.TDOT## ;SEPARATE WITH ANOTHER DOT MOVD1 T1,DVS ;DAP "SOFTWARE" VERSION PUSHJ P,.TDECW## ;TYPE THAT OUT TOO PUSHJ P,.TDOT## ;THIS IS GETTING KINDA TEDIOUS . . . MOVD1 T1,DVT ;DAP "USER SOFTWARE" VERSION PUSHJ P,.TDECW## ;TYPE THAT OUT MOVEI T1,[ASCIZ\; Maximum message size is \] PUSHJ P,.TSTRG## ;MORE NOISE MOVD1 T1,MSZ ;DAP MESSAGE MAXIMA JUMPE T1,[MOVEI T1,[ASCIZ\unlimited\] PUSHJ P,.TSTRG## ;TELL HIM JRST NETLP3] ;CAP IF OFF PUSHJ P,.TDECW## ;LIST DECIMAL BYTES MOVEI T1,[ASCIZ\ bytes\] PUSHJ P,.TSTRG## ;CAP OFF MESSAGE SIZE NETLP3: PUSHJ P,.TCRLF## ;CAP OFF LINE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;NOW LIST THE CONFIGURATION CAPABILITIES DEFINE NETXN(FLG,TXT),< TFNE P1,FLG PUSHJ P,[MOVEI T1,[ASCIZ\ TXT \] PJRST .TSTRG##] > ;END DEFINE NETXN NETLP5: MOVD P1,CNF ;GENERIC REMOTE CONFIGURATION FLAGS MOVEI T1,[ASCIZ\ Supports file READ/WRITE access Supports file DELETE access \] ;BY DEFINITION PUSHJ P,.TSTRG## ;START OFF WITH THE OBVIOUS ;MAJOR FUNCTIONALITY NETXN APN,Supports file APPEND access NETXN CMF,Supports file SUBMIT/EXECUTE access NETXN REN,Supports file RENAME access NETXN DIR,Supports file DIRECTORY-list access ;SEMI-MAJOR FUNCTIONALITY NETXN SPO,Supports PRINT-on-CLOSE via FOP NETXN CMS,Supports SUBMIT-on-CLOSE via FOP NETXN FDE,Supports DELETE-on-CLOSE via FOP NETXN <>,Supports RENAME-on-CLOSE via ACCOMP(CHANGE) ;SEMI-MINOR FUNCTIONS NETXN CRA,Supports changing main attributes on RENAME access NETXN CFA,Supports changing main attributes on RENAME-on-CLOSE NETXN CRD,Supports changing date/time on RENAME access NETXN CFD,Supports changing date/time on RENAME-on-CLOSE NETXN CRP,Supports changing protection on RENAME access NETXN CFP,Supports changing protection on RENAME-on-CLOSE NETXN CFN,Supports changing name on RENAME-on-CLOSE ;MINOR FUNCTIONS NETXN FPA,Supports file pre-allocation NETXN FCK,Supports file data checksumming NETXN FTR,Supports file transfer recovery NETXN WLD,Supports file wildcarding NETXN CGN,Supports GO/NOGO file selection ;FILE ORGANIZATIONS NETXN SFO,Supports sequential file organization NETXN RFO,Supports relative file organization NETXN DFO,Supports direct file organization NETXN MFO,Supports multi-keyed indexed file organization ;RANDOM ACCESS STUFF NETXN SFT,Supports sequential file transfer NETXN SRA,Supports sequential record transfer NETXN RAR,Supports random-access by relative record number NETXN RAB,Supports random-access by virtual block number NETXN RAK,Supports random-access by key NETXN RAH,Supports random-access by hash value NETXN RAA,Supports random-access by record file address ;ERRATA NETXN NAM,Supports name message NETXN PEA,Supports protection attributes message NETXN TEA,Supports date/time attributes message NETXN AEA,Supports allocation attributes message NETXN KEA,Supports key definition attributes message NETXN SEA,Supports summary attributes message NETXN LEA,Supports access control list message NETXN FXC,Supports extending files with CONTROL(EXTEND) NETXN SWA,Supports switching of record access mode NETXN CCP,Supports data compression NETXN MDS,Supports multiple data streams NETXN DFC,Supports return of attributes via CONTROL(DISPLAY) NETXN DFS,Supports default file specification NETXN WST,Supports warning status message NETXN MAR,Supports return of modified attributes on file create NETXN N3D,Supports control of 3-part name messages via DISPLAY NETXN BLC,Supports BLKCNT field in CONTROL message NETXN OVO,Supports octal file version only ;ERRATA II NETXN C25,Supports long (.GT. 255 bytes) messages NETXN BLR,Supports blocking of messages up to response NETXN BLU,Supports unlimited blocking of messages NETXN DSG,Supports message segmentation NETXN BTC,Supports BITCNT field of data message NETLP9: JRST .POPJ1## ;THAT'S ALL FOR NOW ;THE OPERATING SYSTEM AND FILE SYSTEM TEXT TABLES DEFINE X(TXT),<[ASCIZ\TXT\]> NETOST: X Unknown X RT-11 X RSTS/E X RSX-11S X RSX-11M X RSX-11D X IAS X VAX/VMS X TOPS-20 X TOPS-10 X RTS-8 X OS-8 X RSX-11M+ X COPOS/11 X P/OS X VAX/ELAN X CP/M X MS-DOS X ULTRIX-32 X ULTRIX-11 IFN <$DVOMX-<.-NETOST>+1>,> NETFST: X Unknown X RMS-11 X RMS-20 X RMS-32 X FCS-11 X RT-11 X No file system X TOPS-20 X TOPS-10 X OS-8 X RMS-32S X CP/M X MS-DOS X ULTRIX-32 X ULTRIX-11 IFN <$DVFMX-<.-NETFST>+1>,> SUBTTL NETWORK command - switch definitions ;"NETWORK" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP USERID,>,S.USER>,.SWUID##,, > DOSCAN(NETSW) SUBTTL NETWORK command - SCAN argument blocks ;"NETWORK" TSCAN PARAMETER BLOCK NETTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD NETSWL,NETSWN ;IOWD POINTER FOR SWITCH NAMES XWD NETSWD,NETSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,NETSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN NETTL==.-NETTS ;"NETWORK" OSCAN BLOCK NETOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD NETSWL,NETSWN ;IOWD POINTER FOR SWITCH NAMES XWD NETSWD,NETSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,NETSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD NETOSL,NETOSN ;OPTIONS NAME(S) NETOL==.-NETOS NETOSN: SIXBIT \NIP\ SIXBIT \NFT\ NETOSL==.-NETOSN SUBTTL NETWORK command - I/O CDB initialization vectors ;"NETWORK" CDB INITIALIZATION VECTORS. ; ;NOTE THAT THE INPUT SIDE DEFERS BUFFER ALLOCATION UNTIL AFTER THE ;OUTPUT SIDE HAS BEEN OPENED AND OUTPUT BUFFERS ALLOCATED. THIS IS ;SO THAT VARIOUS INPUT DEVICES CAN ALLOCATE AND DEALLOCATE BUFFERS ;AND NOT "GROW" MEMORY NEEDLESSLY. ;"NETWORK" INPUT CDB INITIALIZATION VECTOR NETIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING 0 ;I/O CONTROL 0 ;I/O ERROR CONTROL IM.SMD!IM.SBO ;I/O MODE 0 ;(RESERVED) ;"NETWORK" OUTPUT CDB INITIALIZATION VECTOR NETOV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING .ICASC ;I/O CONTROL (ASCII MODE) 0 ;I/O ERROR CONTROL 0 ;I/O MODE 0 ;(RESERVED) SUBTTL PRINT command ;PRINT COMMAND ; ; PRINT ; ;The print command is used to "print" the specified files on the ;system lineprinter. It does not actually copy the file, rather it ;"queues" or "spools" the file with the system's line printer spooling ;mechanism. TTLPRI==TT$FIL!TT$ERR TTMPRI==TT$BLK!TT$FIL!TT$ERR PRI: JUMPLE CH,ERRNIF## ;EOL HERE IS JUNK PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,PRIC ;READ IN THE REST OF THE COMMAND JRST PRI70 ;COMMAND ERROR PUSHJ P,PRID ;HANDLE ANY DEFAULTING JRST PRI70 ;ERROR PUSHJ P,PRIL ;DO THE FILE SUBMISSION(S) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) MOVE T1,[TTLPRI,,TTMPRI] ;GET TOTALS CONTROL PUSHJ P,.TOTAL## ;AND ISSUE TOTALS SUMMARY JFCL ;ERROR (?) ;DO ANY FINAL CLEANUP NEEDED PRI50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS PRI60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST PRI77 ;??? ;ALL DONE WITH "PRINT" COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;PRINT COMMAND-LEVEL ERROR PRI70: PUSHJ P,FRESB## ;FREE UP ANY FILE SPEC BLOCKS LEFT LYING AROUND JFCL ;??? PRI77: POPJ P, ;PROPAGATE ERROR SUBTTL PRINT command - parsing ;HERE TO READ THE PRINT FILE SPECIFICATIONS PRIC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[PRITL,,PRITS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[PRIOL,,PRIOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW JRST .POPJ1## ;RETURN HAPPILY SUBTTL PRINT command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS PRID: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST ERRNIF## ;NONE??? ;HANDLE INPUT DEFAULTING PRID10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPN .FXNAM(P1) ;USER TYPE AN EXPLICIT FILE NAME? ERROR FRP, PRID18: MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? ANDCAM T1,.FXMOD(P1) ;NO, SET IMPLICIT /NOSTRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL ; MOVX T1,FX.QNY ;THE [N/Y] BIT ; TDNN T1,.FXCTM(P1) ;DID USER REQUEST IT? ; IORM T1,.FXCTL(P1) ;NO, SO DEFAULT TO [N/Y] ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST PRID10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT (CURRENTLY ILLEGAL, MAYBE USED IN FUTURE A LA QUEUE) PRID50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST ERROFI## ;ILLEGAL OUTPUT FILE ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL PRINT command - main file submission loop ;LOOP FINDING AND PRINTING THE FILE(S) PRIL: MOVEI T1,CDBLI## ;ADDRESS OF INPUT I/O CDB MOVEI T2,PRIIV ;ADDRESS OF CDB INITIALIZATION VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T INITIALIZE INPUT CDB MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC MOVEM T3,.IOFSL(T1) ;SET LAST INPUT FILE SPEC PRIL10: PUSHJ P,.NXTFI## ;GET NEXT INPUT FILE JRST PRILIE ;GO CHECK OUT FAILURE MOVE P4,CDBLI+.IOLNW ;INPUT FILE WORD COUNT ;NOW PRINT THE FILE AS REQUESTED MOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB PUSHJ P,.IOFPR## ;PRINT THE FILE AS APPROPRIATE JRST PRILFE ;GO CHECK OUT FAILURE PRIL80: ADDM P4,WORDS## ;COUNT UP THE WORDS ADDI P4,177 ;ROUND UP LSH P4,-7 ;AND CHOP DOWN TO BLOCKS ADDM P4,BLOCKS## ;COUNT UP BLOCKS AOS FILES## ;COUNT UP FILES JRST PRIL10 ;GO BACK FOR NEXT FILE ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) PRILIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST .POPJ1## ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST PRIL10 ;CONTINUE ON ERROR ;FILE PRINT ERROR (.IOFPR) PRILFE: CAIN M0,$EFRJU ;REJECTED BY USER? JRST [PUSHJ P,NERFAI ;ABORT I/O JRST PRIL10] ;SKIP INTO NEXT FILE AOS ERRORS## ;COUNT UP ERRORS MOVEI T1,CDBLI## ;*** ADDRESS OF INPUT CDB PUSHJ P,.ERFPR## ;TYPE FILE PRINT ERROR MESSAGE PUSHJ P,NERFAI ;ABORT THE FILE PUSHJ P,ONERCK## ;WANT TO ABORT ON ERROR? POPJ P, ;ABORT ON ERROR JRST PRIL10 ;CONTINUE ON ERROR SUBTTL PRINT command - switch definitions ;"PRINT" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SP USERID,>,S.USER>,.SWUID##,, > DOSCAN(PRISW) SUBTTL PRINT command - SCAN argument blocks ;"PRINT" TSCAN PARAMETER BLOCK PRITS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD PRISWL,PRISWN ;IOWD POINTER FOR SWITCH NAMES XWD PRISWD,PRISWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,PRISWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN PRITL==.-PRITS ;"PRINT" OSCAN BLOCK PRIOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD PRISWL,PRISWN ;IOWD POINTER FOR SWITCH NAMES XWD PRISWD,PRISWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,PRISWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD PRIOSL,PRIOSN ;OPTIONS NAME(S) PRIOL==.-PRIOS PRIOSN: SIXBIT \NPRINT\ SIXBIT \NIP\ SIXBIT \NFT\ PRIOSL==.-PRIOSN SUBTTL PRINT command - I/O CDB initialization vector(s) ;"PRINT" INPUT CDB INITIALIZATION VECTOR PRIIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING .ICASC ;I/O CONTROL (ASCII MODE) 0 ;I/O ERROR CONTROL IM.SBO ;I/O MODE 0 ;(RESERVED) SUBTTL RENAME command ;RENAME COMMAND ; ; RENAME = ; DRENAM = TTLDRE==TT$FIL!TT$ERR TTLREN==TT$FIL!TT$ERR TTMREN==TT$FIL!TT$ERR DREN: TDZA T1,T1 ;"DAP" MODE ENTRY REN: SETO T1, ;NORMAL MODE ENTRY SETCAM T1,DDCMDF## ;SET MODE FLAG JUMPLE CH,ERRNIF## ;EOL HERE IS JUNK PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,RENC ;READ IN THE REST OF THE COMMAND JRST REN70 ;COMMAND ERROR PUSHJ P,REND ;HANDLE ANY DEFAULTING JRST REN70 ;ERROR PUSHJ P,RENL ;DO THE FILE TRANSFER(S) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) SKIPE DDCMDF## ;DAP-MODE? SKIPA T1,[TTLDRE,,TTMREN] ;YES MOVE T1,[TTLREN,,TTMREN] ;GET TOTALS CONTROL PUSHJ P,.TOTAL## ;ISSUE APPROPRIATE TOTALS JFCL ;ERROR (?) ;DO ANY FINAL CLEANUP NEEDED REN50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS REN60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST REN77 ;??? ;ALL DONE WITH "RENAME" COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;RENAME COMMAND ERRORS REN70: PUSHJ P,FRESB## ;RETURN ANY FILE SPEC BLOCKS JFCL ;??? REN77: POPJ P, ;RETURN ERROR SUBTTL RENAME command - parsing ;HERE TO READ THE RENAME FILE SPECIFICATIONS RENC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[RENTL,,RENTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[RENOL,,RENOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW SKIPN DDCMDF## ;DAPPING? JRST .POPJ1## ;RETURN HAPPILY ;MAKE SURE COMMAND WILL FIT DAP PUSHJ P,DDCVFY ;CHECK DAP CONSTRAINTS POPJ P, ;USER LOSES JRST .POPJ1## ;RETURN HAPPILY SUBTTL RENAME command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS REND: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST ERRNIF## ;NONE??? ;HANDLE INPUT DEFAULTING REND10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPN .FXNAM(P1) ;GOT AN EXPLICIT FILE NAME? ERROR FRR, SKIPN .FXEXT(P1) ;GOT AN EXPLICIT FILE TYPE? HLLOS .FXEXT(P1) ;NO, THEN SET BLANK EXTENSION MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? IORM T1,.FXMOD(P1) ;NO, SET IMPLICIT /STRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST REND10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT DEFAULTING REND50: SKIPN P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST ERRNOF## ;NONE??? MOVE T1,P1 ;POSITION ADDRESS OF FILE SPEC BLOCK PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING REPEAT 0,< ;HO HUM SKIPE .FXNOD(P1) ;RESULTANT OUTPUT NODE GIVEN? JRST REND52 ;NO MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNOD(P1) ;NO, SUPPLY DEFAULT (TO KEEP SAME INPUT NODE) XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNOD(P1) ;SUPPLY DEFAULT NODE (TO KEEP SAME INPUT NODE) MOVX T3,FX.WND ;THE WILDCARDS-IN-NODE FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO REND52: SKIPE .FXDEV(P1) ;RESULTANT DEVICE GIVEN? JRST REND53 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXDEV(P1) ;SUPPLY DEFAULT (TO KEEP SAME INPUT DEVICE) XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSDEV(P1) ;SUPPLY DEFAULT DEVICE MOVX T3,FX.WDV ;THE WILDCARDS-IN-DEVICE FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO REND53: SKIPE .FXDIR(P1) ;EXPLICIT OUTPUT DIRECTORY GIVEN? JRST REND56 ;YES MOVSI T3,-.FXLND ;LENGTH OF FILE SPEC DIRECTORY BLOCK HRRI T3,.FXDIR(P1) ;ADDRESS OF FILE SPEC DIRECTORY BLOCK MOVE T1,[377777,,377777] ;[*,*] REND55: DMOVEM T1,(T3) ;STASH IN FILE SPEC BLOCK MOVSI T1,'* ' ;DEFAULT FULL WILD NAME ADDI T3,1 ;NEXT FILE SPEC DIRECTORY NAME ENTRY AOBJN T3,REND55 ;LOOP FOR ENTIRE PATH BLOCK XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSDIR(P1) ;SUPPLY DEFAULT DIRECTORY MOVX T3,FX.WDR ;THE WILDCARDS-IN-DIRECTORY FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO REND56: SKIPE .FXNAM(P1) ;OUTPUT FILE NAME GIVEN? JRST REND57 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNAM(P1) ;SUPPLY DEFAULT FILE NAME XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNAM(P1) ;SUPPLY DEFAULT FILE NAME MOVX T3,FX.WNM ;THE WILDCARDS-IN-NAME FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO REND57: SKIPE .FXEXT(P1) ;OUTPUT EXTENSION GIVEN? JRST REND58 ;YES MOVSI T1,'* ' ;FULL WILD NAME HLLZM T1,.FXEXT(P1) ;NO, DEFAULT TO FULL WILD XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION MOVX T3,FX.WEX ;THE WILDCARDS-IN-EXTENSION FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO > ;END REPEAT 0 REND58: MOVX T1,FX.PRT ;THE /OKPROT BIT TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, FORCE /ERPROT FOR OUTPUT FILE TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? IORM T1,.FXMOM(P1) ;NO, MAKE IT STICKY MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL RENAME command - main file renaming loop ;LOOP FINDING AND RENAME'ING THE FILE(S) RENL: MOVEI T1,CDBLI## ;ADDRESS OF INPUT I/O CDB MOVEI T2,RENIV ;ADDRESS OF CDB INITIALIZATION VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T INITIALIZE INPUT CDB MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC MOVEM T3,.IOFSL(T1) ;SET LAST INPUT FILE SPEC MOVE T3,SOFIR## ;FIRST OUTPUT FILE SPEC BLOCK MOVEM T3,.IOFS3(T1) ;SET FIRST OUTPUT FILE SPEC SKIPE DDCMDF## ;DAP MODE? JRST RENLD ;YES RENL10: PUSHJ P,.NXTFI## ;GET NEXT INPUT FILE JRST RENLIE ;GO CHECK OUT FAILURE ;NOW RENAME THE FILE AS REQUESTED MOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB PUSHJ P,.IOFRN## ;RENAME THE FILE AS APPROPRIATE JRST RENLFE ;GO CHECK OUT FAILURE RENL80: AOS FILES## ;COUNT UP FILES JRST RENL10 ;GO BACK FOR NEXT FILE ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) RENLIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST .POPJ1## ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST RENL10 ;CONTINUE ON ERROR ;FILE RENAME ERROR (.IOFRN) RENLFE: CAIN M0,$EFRJU ;REJECTED BY USER? JRST [PUSHJ P,NERFAI ;ABORT I/O JRST RENL10] ;SKIP INTO NEXT FILE AOS ERRORS## ;COUNT UP ERRORS MOVEI T1,CDBLI## ;*** ADDRESS OF INPUT CDB PUSHJ P,.ERFRN## ;TYPE FILE RENAME ERROR MESSAGE PUSHJ P,NERFAI ;ABORT THE FILE PUSHJ P,ONERCK## ;WANT TO ABORT ON ERROR? POPJ P, ;ABORT ON ERROR JRST RENL10 ;CONTINUE ON ERROR ;HERE FOR DAP-MODE RENAME RENLD: XMOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB XMOVEI T2,RENLDP ;ADDRESS OF FILE "PROCESSOR" XMOVEI T3,RENLDE ;ADDRESS OF ERROR PROCESSOR PUSHJ P,.IODRN## ;DO A DAP-MODE RENAME OPERATION JRST DDCERM ;DAP-MODE COMMAND FAILURE JRST .POPJ1## ;SUCCESSFUL RENLDP: AOS FILES## ;COUNT THE FILES AS THEY GO BY JRST .POPJ1## ;THAT'S ALL RENLDE: AOS ERRORS## ;COUNT THE ERRORS AS THEY ACCUMULATE PJRST ONERCK## ;MAYBE PROCEED, MAYBE ABORT SUBTTL RENAME command - switch definitions ;"RENAME" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SP USERID,>,S.USER>,.SWUID##,, > DOSCAN(RENSW) SUBTTL RENAME command - SCAN argument blocks ;"RENAME" TSCAN PARAMETER BLOCK RENTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD RENSWL,RENSWN ;IOWD POINTER FOR SWITCH NAMES XWD RENSWD,RENSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,RENSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN RENTL==.-RENTS ;"RENAME" OSCAN BLOCK RENOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD RENSWL,RENSWN ;IOWD POINTER FOR SWITCH NAMES XWD RENSWD,RENSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,RENSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD RENOSL,RENOSN ;OPTIONS NAME(S) RENOL==.-RENOS RENOSN: SIXBIT \RENAME\ SIXBIT \NIP\ SIXBIT \NFT\ RENOSL==.-RENOSN SUBTTL RENAME command - I/O CDB initialization vector(s) ;"RENAME" INPUT CDB INITIALIZATION VECTOR RENIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING 0 ;I/O CONTROL 0 ;I/O ERROR CONTROL IM.SBO!IM.DQI ;I/O MODE 0 ;(RESERVED) SUBTTL RESET command ;RESET COMMAND ; ; RESET RES: PUSHJ P,RSEDF ;RESET SET DEFAULTS JFCL ;FAILED??? JRST .POPJ1## ;SUCCESSFUL RETURN SUBTTL REVIEW command REV: ERROR RVY, SUBTTL SET command ;SET COMMAND ; ; SET ; ; SET DEFAULT [ =] SET: JUMPLE CH,SETER0 ;IF THEN JUNK SET COMMAND ;FOR NOW (SINCE COMMANDS DON'T NEST), JUST FAKE IT OUT PUSHJ P,.SIXSC## ;READ SET COMMAND MOVE T1,[IOWD SETCML,SETCMT] ;LIST OF LEGAL SET COMMANDS SKIPN T2,NM ;GET USER'S SET COMMAND JRST SETER0 ;NULL SET COMMAND ILLEGAL PUSHJ P,.LKNAM## ;IDENTIFY SET COMMAND JRST SETER1 ;UNKNOWN/ILLEGAL SET COMMAND SUBI T1,SETCMT ;GET INDEX OF SET COMMAND PUSHJ P,@SETCMX(T1) ;DISPATCH ON SPECIFIC SET COMMAND PUSHJ P,.CLEOL## ;FAILED? CLEAR REST OF LINE (IF ANY) JUMPLE CH,.POPJ1## ;HAPPINESS = WARN GSC, PUSHJ P,.CLEOL## ;DIGEST AND EXCRETE THE GARBAGE JRST .POPJ1## ;TAKE SUCCESSFUL RETURN ;The SET commands SETCMT: 'DEFAUL' ;SET DEFAULT 'NAME ' ;SET NAME SETCML==.-SETCMT ;LENGTH OF SET COMMAND TABLE ;And the SET command processors SETCMX: IFIW SEDF ;SET DEFAULT PROCESSOR IFIW SENM ;SET NAME PROCESSOR ;SET COMMAND ERRORS SETER0: ERROR SE0, SETER1: CAIL T1,0 ;UNKNOWN OR AMBIGUOUS COMMAND? ERROR SE1,,SETE01 ERROR SE2,,SETE01 SETE01: MOVE T1,NM ;COPY OF BUM COMMAND PUSHJ P,.TSIXN## ;TYPE IT OUT FOR USER PUSHJ P,.TDQTE## ;ENCLOSING QUOTE CHARACTER PJRST .TCRLF## ;CAP OFF ERROR MESSAGE WITH SETER3: ERROR SE3, SETER4: ERROR SE4, SUBTTL SET DEFAULT command ;SET DEFAULT command ;SET NAME command ; ; SET DEFAULT [ =] ; SET DEFAULT = ; ;The defaults are stored as a linked list of "=" file specs. If ;the was not supplied, then the default is the global or ;"master" default. ; ;The names are stored in the same linked-list, only sans . $DFNXT==0 ;POINTER TO NEXT LINK IN THE CHAIN $DFNAM==1 ;NAME (SIXBIT) $DFAFS==2 ;ADDRESS OF $DFDFS==3 ;ADDRESS OF $DFLEN==4 ;SIZE OF CHAIN LINK SEDF: TDZA P1,P1 ;FLAG 'DEFAULT' SENM: SETO P1, ;FLAG 'NAME' PUSHJ P,SEDF00 ;GO DO IT! JRST [MOVE T1,CMDFF## ;OOPS, SOMETHING FALL DOWN GO BOOM! MOVEM T1,.JBFF ;BACK OUT OF WHATEVER HAPPENED POPJ P,] ;PROPAGATE ERROR RETURN JRST .POPJ1## ;SUCCESS ;Here to RESET the SET DEFAULTs and NAMEs RSEDF: SETZM SDFFIR ;CLEAR START SETZM SDFLAS ; AND END OF DEFAULTS CHAIN SETZM SDFMAS ;CLEAR "MASTER" SPEC POINTER MOVE T1,ORGFF## ;GET THE REAL .JBFF MOVEM T1,.JBFF ;TELL THE WORLD MOVEM T1,CMDFF## ;TELL THE GALAXY MOVEM T1,SAVFF## ;TELL THE WHOLE UNIVERSE JRST .POPJ1## ;SUCCESSFUL RETURN ;Here to do the actual work of the SET DEFAULT command SEDF00: JUMPLE CH,SETER0 ;CAN'T END THE LINE YET! CAIE CH," " ;MUST BE A BLANK HERE JRST SETER3 ;SET COMMAND SYNTAX ERROR ;First get a[nother] list pointer cell (for lack of a better name) MOVEI T1,$DFLEN ;SIZE OF A LINK PUSHJ P,.MMGWD## ;ASK MEMORY MANAGER JRST SETER4 ;NO FREE CORE, CAN'T DO COMMAND MOVE P2,T2 ;HANG ONTO THIS LINK FOR AWHILE SETZM $DFNAM(P2) ;CLEAR THE NAME SPEC SETZM $DFAFS(P2) ;AND THE POINTER ;Get the first 'file spec' SEDF10: PUSHJ P,SEDFS ;PARSE THE FIRST DEFAULT (FILE SPEC) POPJ P, ;ERROR (PROBABLY SYNTAX), ABORT JUMPG CH,SEDF20 ;IF MORE COMMING, THEN TWO SPECS JUMPE P1,SEDF12 ;IF SET DEFAULT THEN THIS IS MASTER ERROR MNS, SEDF12: SKIPE SDFMAS ;ALREADY SEEN A "MASTER" DEFAULT? ERROR DMI, MOVEM P2,SDFMAS ;THIS WILL BE THE MASTER DEFAULT JRST SEDF29 ;AND PUT THIS LINK INTO THE CHAIN ;Here for ! = construction SEDF20: JUMPE P1,SEDF23 ;PROCESS TWO SPECS IF SET DEFAULT SKIPN T3,.FXDEV(T2) ;GET DEVICE NAME SKIPE T3,.FXNAM(T2) ;NONE, TRY FOR SIMPLE NAME CAIA ;SET THE NAME ERROR MNM, MOVEM T3,$DFNAM(P2) ;SAVE THE NAME PUSHJ P,.MMFWD## ;RELINQUISH THE NAME FSB JFCL ;DUH? CAIN CH,"=" ;MUST BE SEPARATING "=" JRST SEDF24 ;SLURP UP THE ERROR MEN, SEDF24: PUSHJ P,SEDFS ;NOW PARSE THE POPJ P, ;ERROR, ABORT SEDF29: MOVEM T2,$DFDFS(P2) ;SAVE ADDRESS OF ;Insert this default into the chain of defaults SEDF40: SKIPN SDFFIR ;IS THIS THE FIRST DEFAULT? MOVEM P2,SDFFIR ;YES, SO ACTS AS START OF CHAIN SKIPE SDFLAS ;IF THERE IS ALREADY AN END TO THE CHAIN, MOVEM P2,@SDFLAS ;LINK OLD LAST TO NEW LAST MOVEM P2,SDFLAS ;SET THE NEW END OF THE CHAIN ;Make the .JBFF allocations permanent MOVE T1,.JBFF ;CURRENT .JBFF VALUE MOVEM T1,CMDFF## ;FAKE OUT THE COMMAND-LEVEL COPY MOVEM T1,SAVFF## ;AND THE TOP-LEVEL COPY AS WELL JRST .POPJ1## ;SUCCESSFUL COMPLETION OF THIS COMMAND ;SEDFS - Parse a file spec for the SET DEFAULT command ;Call is: ; ; PUSHJ P,SEDFS ; error return ; normal return ; ;On error return an error message has been issued. ; ;On successful return, the address of the resultant file spec block ;is in T2. ; ;Uses T1, T2, T3, T4. SEDFS: PUSHJ P,.CLRFL## ;CLEAR THE SCANNER PUSHJ P,.CLSNS## ;AND THE STICKY DEFAULTS TOO! PUSHJ P,.FILSP## ;PARSE ONE FILE SPEC PJRST (T1) ;*** RETURNED ADDRESS, NOT CODE ;*** NOTE THAT THIS WILL ERROR-RETURN VIA ;*** NFTER ROUTINE IN NFT MODULE! BLETCH! PUSHJ P,.TINBC## ;GET TO NON-BLANK TERMINATOR CAIN CH,"=" ;AN "=" IS AN OK TERMINATOR JRST SEDFS3 ;SLURP UP THIS SPEC AND RETURN IT JUMPLE CH,SEDFS3 ; IS VALID TERMINATOR CAIGE CH,.CHGWD ;'GUIDE-WORD' META-CHARACTER? ERROR SDC,,.+2,CH ERROR SDG,,.+1,CH PUSHJ P,.TFCHR## ;TYPE OFFENDING CHARACTER PJRST .TDQTE## ;CAP OFF WITH ENCLOSING QUOTES SEDFS3: PUSHJ P,INX## ;ALLOCATE AND SETUP ONE FILE SPEC BLOCK SETZM SIFIR## ;WE DON'T REALLY USE SIFIR SETZM SILAS## ;NOR SILAS, SO BLOW THEM AWAY PUSHJ P,.GTSPC## ;COPY SPEC FROM SCAN'S DATA BASE EXCH T1,T2 ;NATURALLY, WE WANT THE ADDRESS IN T2! JRST .POPJ1## ;RETURN WITH FILE SPEC BLOCK ;DOSDF - Here to apply file-spec-defaults, from both SET DEFAULT and SWITCH.INI DOSDF: PUSHJ P,.SAVE4## ;PROTECT THE PEAS PUSHJ P,TSAV14## ;AND THE TEAS TOO PUSHJ P,DNSDF ;LOOK FOR A 'NAME' MATCH JRST DOSDF3 ;NOPE, JUST TRY DEFAULTS PUSHJ P,DASDF ;DEFAULT-FILL THE USER'S SPEC JFCL ;FAILED??? DOSDF3: MOVE T1,-T1(P) ;RESTORE ADDRESS OF USER FSB PUSHJ P,DMSDF ;GET A MATCHING SPEC FROM SET DEFAULT JRST DOSDF8 ;NONE, JUST TRY FOR SWITCH.INI PUSHJ P,DASDF ;APPLY THE DEFAULTS JFCL ;FAILED??? DOSDF8: MOVE T1,-T1(P) ;RESTORE ADDRESS OF USER FSB MOVEI T2,.FXMAX ;LENGTH OF A FILE SPEC BLOCK PJRST DOOSDF## ;APPLY SWITCH.INI DEFAULTS ;Loop through the DEFAULTs looking for a that matches ;the current user-typed file spec. DNSDF: SKIPE .FXDEV(T1) ; MATCH ONLY ON DEVICE: SKIPE .FXNOD(T1) ;SANS ANY NODE-NAME POPJ P, ;NO MATCH FOR THIS SPEC SKIPN T3,SDFFIR ;BASE ADDRESS OF DEFAULTS CHAIN POPJ P, ;NONE, NO MATCH HERE THEN DNSDF1: CAME T3,SDFMAS ;SKIP THE MASTER SPEC ON 'NAME' SEARCH SKIPN T2,$DFNAM(T3) ;GET , IF ANY JRST DNSDF8 ;NONE, SKIP THIS ONE DMOVE P1,.FXDEV(T1) ;GET USER'S DEVICE SPEC CAMN T2,P1 ;DOES THIS MATCH USER'S DEVICE? AOJE P2,DNSDF9 ;YES (BUT ONLY IF NOT-WILDCARDED!) DNSDF8: SKIPE T3,$DFNXT(T3) ;ADVANCE TO NEXT ENTRY IN THE CHAIN JRST DNSDF1 ;AND SEE IF IT MATCHES POPJ P, ;NO MATCH, NO MASTER, DO DEFAULTS HERE DNSDF9: MOVE T2,$DFDFS(T3) ;ADDRESS OF SETZM .FXDEV(T1) ;BLAST THE DEVICE NAME SETZM .FXDEM(T1) ; AND THE DEVICE MASK SETZM .FSDEV(T1) ; AND THE DEVICE STRING MOVX T4,FX.UDV!FX.WDV!FX.SDV ;CLEAR ALL VESTIGES OF THE ANDCAM T4,.FXFLD(T1) ;DEVICE'S HAVING EVER EXISTED JRST .POPJ1## ;RETURN POINTING TO DEFAULT SPEC ;Loop through the DEFAULTs looking for an that matches ;the current user-typed file spec, or a "master" default spec. DMSDF: SKIPN T3,SDFFIR ;BASE ADDRESS OF DEFAULTS CHAIN POPJ P, ;NONE, NO MATCH HERE THEN DMSDF1: CAME T3,SDFMAS ;SAVE THE MASTER SPEC TILL LAST SKIPN T2,$DFAFS(T3) ;GET , IF ANY JRST DMSDF8 ;NONE, SKIP THIS ONE MOVE P4,.FXFLD(T2) ;GET FIELDS-MASK OF TXNN P4,FX.UND!FX.UDV!FX.UDR!FX.UNM!FX.UEX ;GOT ANYTHING WORTHWHILE? JRST DMSDF8 ;NO, SKIP OVER THIS SPEC TXNN P4,FX.UND ;GOT A NODE-SPEC TO MATCH? JRST DMSDF2 ;NO, SKIP NODE FIELD MOVE P1,.FXNOD(T1) ;USER'S NODE SPEC XOR P1,.FXNOD(T2) ;CONTRAST WITH AND P1,.FXNOM(T2) ;MASK OUT WILDCARD FIELDS JUMPN P1,DMSDF8 ;IF NOT A MATCH, ADVANCE TO NEXT CANDIDATE DMSDF2: TXNN P4,FX.UDV ;GOT A DEVICE-SPEC TO MATCH? JRST DMSDF3 ;NO, SKIP DEVICE FIELD MOVE P1,.FXDEV(T1) ;USER'S DEVICE SPEC XOR P1,.FXDEV(T2) ;CONTRAST WITH AND P1,.FXDEM(T2) ;MASK OUT WILDCARD FIELDS JUMPN P1,DMSDF8 ;IF NOT A MATCH, ADVANCE TO NEXT CANDIDATE DMSDF3: TXNN P4,FX.UDR ;GOT A DIRECTORY-SPEC TO MATCH? JRST DMSDF6 ;NO, SKIP DIRECTORY FIELD HRRZI P2,.FXDIR(T1) ;ADDRESS OF USER'S DIRECTORY MOVSI P3,-.FXLND ;COUNT OF DIRECTORY BI-WORDS HRRI P3,.FXDIR(T2) ;ADDRESS OF DIRECTORY DMSDF4: MOVE P1,0(P2) ;USER'S DIRECTORY SPEC XOR P1,0(P3) ;CONTRAST WITH AND P1,1(P3) ;MASK OUT WILDCARD FIELDS JUMPN P1,DMSDF8 ;IF NOT A MATCH, ADVANCE TO NEXT CANDIDATE AOBJP P3,DMSDF6 ;IF LOOKED AT WHOLE DIRECTORY THEN MATCHES ADDI P2,2 ;ADVANCE USER'S SPEC TO NEXT BI-WORD SKIPE 1(P3) ;GOT MORE TO LOOK AT? AOJA P3,DMSDF4 ;YES, CHECK NEXT SUB-DIRECTORY LEVEL SKIPE 0(P2) ;NO, IF USER SPEC STILL GOING JRST DMSDF8 ;THEN SPEC DOESN'T MATCH ;Continued on next page ;Continued from previous page DMSDF6: TXNN P4,FX.UNM ;GOT A NAME-SPEC TO MATCH? JRST DMSDF7 ;NO, SKIP NAME FIELD MOVE P1,.FXNAM(T1) ;USER'S NAME SPEC XOR P1,.FXNAM(T2) ;CONTRAST WITH AND P1,.FXNMM(T2) ;MASK OUT WILDCARD FIELDS JUMPN P1,DMSDF8 ;IF NOT A MATCH, ADVANCE TO NEXT CANDIDATE DMSDF7: TXNN P4,FX.UEX ;GOT A EXTENSION/TYPE-SPEC TO MATCH? JRST DMSDF9 ;NO, THEN THIS SPEC WINS! HLLZ P1,.FXEXT(T1) ;USER'S EXTENSION SPEC XOR P1,.FXEXT(T2) ;CONTRAST WITH HRLZ P2,.FXEXT(T2) ; WILDCARD MASK AND P1,P2 ;MASK OUT WILDCARD FIELDS JUMPN P1,DMSDF8 ;IF NOT A MATCH, ADVANCE TO NEXT CANDIDATE JRST DMSDF9 ;THIS MATCHES, USE IT DMSDF8: SKIPE T3,$DFNXT(T3) ;ADVANCE TO NEXT ENTRY IN THE CHAIN JRST DMSDF1 ;AND SEE IF IT MATCHES SKIPN T3,SDFMAS ;NO MATCHES, GOT A "MASTER" DEFAULT? POPJ P, ;NO MATCH, NO MASTER, NO DEFAULTS HERE DMSDF9: MOVE T2,$DFDFS(T3) ;ADDRESS OF JRST .POPJ1## ;RETURN POINTING TO DEFAULT SPEC ;Apply the SET DEFAULTs to this user-typed file spec. ; ;T1/User-FSB ;T2/Defl-FSB DASDF: DMOVE P3,T1 ;P3:=USER SPEC, P4:=DEFAULT SPEC MOVE P1,.FXFLD(P3) ;FIELDS SEEN SO FAR MOVE P2,.FXFLD(P4) ;FIELDS PRESENT IN DEFAULT AREA DASDF1: SKIPN .FXNOD(P3) ;GOT A NODE SPECIFICATION? TXNN P2,FX.UND ;NO, DEFAULT NODE? JRST DASDF3 ;NO DEFAULT NODE NAME DMOVE T3,.FXNOD(P4) ;APPLY NODE--PICK UP DEFAULT DMOVEM T3,.FXNOD(P3) ;SUPPLY HIS DEFAULT NODE MOVE T1,.FSNOD(P4) ;ADDRESS OF DEFAULT NODE STRING MOVEM T1,.FSNOD(P3) ;SET APPLIED DEFAULT NODE STRING TXO P1,FX.UND ;NOTE A "DEFAULT" NODE NAME TXNE P2,FX.WND ;NODE WILDCARDS? TXO P1,FX.WND ;YES, NOTE THOSE TOO DASDF2: SKIPN .FXDEV(P3) ;GOT A DEVICE SPECIFICATION? TXNN P2,FX.UDV ;NO, DEFAULT DEVICE? JRST DASDF3 ;NO DEFAULT DEVICE NAME DMOVE T3,.FXDEV(P4) ;APPLY DEVICE--PICK UP DEFAULT DMOVEM T3,.FXDEV(P3) ;SUPPLY HIS DEFAULT DEVICE MOVE T1,.FSDEV(P4) ;ADDRESS OF DEFAULT DEVICE STRING MOVEM T1,.FSDEV(P3) ;SET APPLIED DEFAULT DEVICE STRING TXO P1,FX.UDV ;NOTE A "DEFAULT" DEVICE NAME TXNE P2,FX.WDV ;DEVICE WILDCARDS? TXO P1,FX.WDV ;YES, NOTE THOSE TOO DASDF3: SKIPN .FXDIR(P3) ;GOT A DIRECTORY SPECIFICATION? TXNN P2,FX.UDR ;NO, DEFAULT DIRECTORY? JRST DASDF4 ;NO DEFAULT DIRECTORY MOVSI T4,.FXDIR(P4) ;ADDRESS OF DEFAULT DIRECTORY SPEC HRRI T4,.FXDIR(P3) ;ADDRESS OF USER-SPEC DIRECTORY FIELD BLT T4,.FXDIR+<2*.FXLND>-1(P3) ;COPY DEFAULT MOVE T1,.FSDIR(P4) ;ADDRESS OF DEFAULT DIRECTORY STRING MOVEM T1,.FSDIR(P3) ;SET APPLIED DEFAULT DIRECTORY STRING TXO P1,FX.UDR ;NOTE "DEFAULT" DIRECTORY TXNE P2,FX.WDR ;WILD DIRECTORY? TXO P1,FX.WDR ;YES, NOTE THOSE TOO ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DASDF4: SKIPN .FXNAM(P3) ;GOT A FILE NAME SPECIFICATION? TXNN P2,FX.UNM ;NO, DEFAULT FILE NAME? JRST DASDF5 ;NO DEFAULT FILE NAME DMOVE T3,.FXNAM(P4) ;GET NAME DMOVEM T3,.FXNAM(P3) ; APPLY DEFAULT NAME MOVE T1,.FSNAM(P4) ;ADDRESS OF DEFAULT NAME STRING MOVEM T1,.FSNAM(P3) ;SET APPLIED DEFAULT NAME STRING TXO P1,FX.UNM ;NOTE "DEFAULT" NAME TXNE P2,FX.WNM ;NAME WILDCARDS? TXO P1,FX.WNM ;YES, NOTE THOSE TOO DASDF5: SKIPN .FXEXT(P3) ;GOT A FILE TYPE SPECIFICATION? TXNN P2,FX.UEX ;NO, DEFAULT EXTENSION? JRST DASDF6 ;NO DEFAULT EXTENSION MOVE T3,.FXEXT(P4) ;APPLY EXTENSION MOVEM T3,.FXEXT(P3) ; .. MOVE T1,.FSEXT(P4) ;ADDRESS OF DEFAULT EXTENSION STRING MOVEM T1,.FSEXT(P3) ;SET APPLIED DEFAULT EXTENSION STRING TXO P1,FX.UEX ;NOTE "DEFAULT" EXTENSION TXNE P2,FX.WEX ;EXTENSION WILDCARDS? TXO P1,FX.WEX ;YES, NOTE THOSE TOO DASDF6: SKIPN .FXGEN(P3) ;GOT A FILE GENERATION SPECIFICATION? TXNN P2,FX.UGN ;NO, DEFAULT GENERATION? JRST DASDF7 ;NO DEFAULT GENERATION MOVE T3,.FXGEN(P4) ;APPLY GENERATION MOVEM T3,.FXGEN(P3) ; .. MOVE T1,.FSGEN(P4) ;ADDRESS OF DEFAULT GENERATION STRING MOVEM T1,.FSGEN(P3) ;SET APPLIED DEFAULT GENERATION STRING TXO P1,FX.UGN ;NOTE "DEFAULT" GENERATION TXNE P2,FX.WGN ;GENERATION WILDCARDS? TXO P1,FX.WGN ;YES, NOTE THOSE TOO ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE DASDF7: MOVEM P1,.FXFLD(P3) ;STASH AWAY FIELD FLAGS DMOVE T3,.FXCTL(P4) ;APPLY ALL CONTROL MODES ANDCM T3,.FXCTM(P3) ;LESS THOSE EXPLICITLY TYPED IORM T3,.FXCTL(P3) ; . . . IORM T4,.FXCTM(P3) ; . . . DMOVE T3,.FXMOD(P4) ;APPLY ALL FILE SWITCHES ANDCM T3,.FXMOM(P3) ;MASK HERE USED TO INDICATE WHICH WERE TYPED IORM T3,.FXMOD(P3) ; .. IORM T4,.FXMOM(P3) ; .. MOVSI T3,.FXBOM-.FXEOM;LENGTH OF SWITCHES HRRI T3,(P3) ;ADDRESS OF USER SPEC MOVEI T4,(P4) ;ADDRESS OF DEFAULT SPEC DASDF8: MOVE T2,.FXBOM(T3) ;GET CURRENT VALUE CAMN T2,[-1] ;SEE IF SET MOVE T2,.FXBOM(T4) ;NO--GET THIS DEFAULT SWITCH MOVEM T2,.FXBOM(T3) ;STORE RESULT ADDI T4,1 ;ADVANCE DEFAULT POINTER AOBJN T3,DASDF8 ;LOOP OVER ALL SWITCHES ;Continued on next page ;Continued from previous page ;Now do our own stuff DASDG: SKIPN .FXUID(P3) ;IF USER TYPED A USERID FIELD, SKIPN .FXUID(P4) ;OR WE DON'T HAVE A DEFAULT ONE JRST DASDG3 ;THEN DON'T DEFAULT THE USERID FIELD MOVSI T3,.FXUID(P4) ;ADDRESS OF DEFAULT USERID FIELD HRRI T3,.FXUID(P3) ;ADDRESS OF WANTING USERID FIELD BLT T3,.FXUID+$ASCMX-1(P3) ;DEFAULT THE USERID FIELD DASDG1: SKIPN .FXUAC(P3) ;IF USER SUPPLIED AN ACCOUNT FIELD SKIPN .FXUAC(P4) ;OR WE DON'T HAVE A DEFAULT ONE JRST DASDG2 ;THEN DON'T DEFAULT THE ACCOUNT FIELD MOVSI T3,.FXUAC(P4) ;ADDRESS OF DEFAULT ACCOUNT FIELD HRRI T3,.FXUAC(P3) ;ADDRESS OF WANTING ACCOUNT FIELD BLT T3,.FXUAC+$ASCMX-1(P3) ;DEFAULT THE ACCOUNT FIELD DASDG2: SKIPN .FXUPW(P3) ;IF USER TYPED A PASSWORD FIELD, SKIPN .FXUPW(P4) ;OR WE DON'T HAVE A DEFAULT ONE JRST DASDG3 ;THEN DON'T DEFAULT THE PASSWORD FIELD MOVSI T3,.FXUPW(P4) ;ADDRESS OF DEFAULT PASSWORD FIELD HRRI T3,.FXUPW(P3) ;ADDRESS OF WANTING PASSWORD FIELD BLT T3,.FXUPW+$ASCMX-1(P3) ;DEFAULT THE PASSWORD FIELD DASDG3: JRST .POPJ1## ;SUCCESSFUL RETURN SUBTTL SUBMIT command ;SUBMIT COMMAND ; ; SUBMIT ; DSUBMI ; ;Note: DAP refers to this function as "execute", and defines "submit" to ; be a copy operation with execute on close. For the purposes of ; user interface on TOPS-10, the terminology is "submit", even ; though the code in the I/O library will use "execute". TTLDSU==TT$FIL!TT$ERR TTLSUL==TT$FIL!TT$ERR TTMSUL==TT$BLK!TT$FIL!TT$ERR DSBM: TDZA T1,T1 ;"DAP" ENTRY SBM: SETO T1, ;NORMAL ENTRY SETCAM T1,DDCMDF## ;SET COMMAND MODE JUMPLE CH,ERRNIF## ;EOL HERE IS JUNK PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,SBMC ;READ IN THE REST OF THE COMMAND JRST SBM70 ;COMMAND ERROR PUSHJ P,SBMD ;HANDLE ANY DEFAULTING JRST SBM70 ;ERROR PUSHJ P,SBML ;DO THE FILE SUBMISSION(S) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) SKIPE DDCMDF## ;RESTRICTED TO DAP MODE? SKIPA T1,[TTLDSU,,TTMSUL] ;YES MOVE T1,[TTLSUL,,TTMSUL] ;GET TOTALS CONTROL PUSHJ P,.TOTAL## ;AND ISSUE TOTALS SUMMARY JFCL ;ERROR (?) ;DO ANY FINAL CLEANUP NEEDED SBM50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS SBM60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST SBM77 ;??? ;ALL DONE WITH "SUBMIT" COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;SUBMIT COMMAND-LEVEL ERROR SBM70: PUSHJ P,FRESB## ;FREE UP ANY FILE SPEC BLOCKS LEFT LYING AROUND JFCL ;??? SBM77: POPJ P, ;PROPAGATE ERROR SUBTTL SUBMIT command - parsing ;HERE TO READ THE SUBMIT FILE SPECIFICATIONS SBMC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[SBMTL,,SBMTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[SBMOL,,SBMOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW SKIPN DDCMDF## ;DAPPING? JRST .POPJ1## ;RETURN HAPPILY ;MAKE SURE COMMAND WILL FIT DAP CONSTRAINTS PUSHJ P,DDCVFY ;CALL DAP COMMAND VERIFIER POPJ P, ;USER LOSES JRST .POPJ1## ;RETURN HAPPILY SUBTTL SUBMIT command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS SBMD: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST ERRNIF## ;NONE??? ;HANDLE INPUT DEFAULTING SBMD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPN .FXNAM(P1) ;USER TYPE AN EXPLICIT FILE NAME? ERROR FRS, SKIPE .FXEXT(P1) ;USER TYPE AN EXPLICIT EXTENSION? JRST SBMD18 ;YES MOVSI T1,'CTL' ;DEFAULT SUBMIT FILE TYPE HLLOM T1,.FXEXT(P1) ;NO, SUBMIT DEFAULTS TO .CTL XMOVEI T1,[ASCIZ\CTL\] ;DEFAULT SUBMIT FILE TYPE MOVEM T1,.FSEXT(P1) ;SUBMIT DEFAULTS TO .CTL SBMD18: MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? ANDCAM T1,.FXMOD(P1) ;NO, SET IMPLICIT /NOSTRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRT ;/QUERY:TELL TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:TELL ; MOVX T1,FX.QNY ;THE [N/Y] BIT ; TDNN T1,.FXCTM(P1) ;DID USER REQUEST IT? ; IORM T1,.FXCTL(P1) ;NO, SO DEFAULT TO [N/Y] ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST SBMD10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT SBMD50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST ERROFI## ;ILLEGAL OUTPUT FILE ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL SUBMIT command - main file submission loop ;LOOP FINDING AND SUBMITTING THE FILE(S) SBML: MOVEI T1,CDBLI## ;ADDRESS OF INPUT I/O CDB MOVEI T2,SBMIV ;ADDRESS OF CDB INITIALIZATION VECTOR PUSHJ P,.IOINI## ;INITIALIZE THE CDB JRST ERRCDI## ;CAN'T INITIALIZE INPUT CDB MOVE T3,SIFIR## ;FIRST INPUT FILE SPEC MOVEM T3,.IOFSB(T1) ;SET FIRST ADDRESS IN CDB MOVE T3,SILAS## ;LAST INPUT FILE SPEC MOVEM T3,.IOFSL(T1) ;SET LAST INPUT FILE SPEC SKIPE DDCMDF## ;DAP-MODE? JRST SBMLD ;YES SBML10: PUSHJ P,.NXTFI## ;GET NEXT INPUT FILE JRST SBMLIE ;GO CHECK OUT FAILURE MOVE P4,CDBLI+.IOLNW ;INPUT FILE WORD COUNT ;NOW SUBMIT THE FILE AS REQUESTED MOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB PUSHJ P,.IOFSU## ;SUBMIT THE FILE AS APPROPRIATE JRST SBMLFE ;GO CHECK OUT FAILURE SBML80: ADDM P4,WORDS## ;COUNT UP THE WORDS ADDI P4,177 ;ROUND UP LSH P4,-7 ;AND CHOP DOWN TO BLOCKS ADDM P4,BLOCKS## ;COUNT UP BLOCKS AOS FILES## ;COUNT UP FILES JRST SBML10 ;GO BACK FOR NEXT FILE ;INPUT FILE ACCESS ERROR (.NXTFI/.IOPIN) SBMLIE: CAIN M0,$EFIXN ;INPUT EXHAUSTED? JRST .POPJ1## ;YES, SUCCESSFUL COMPLETION OF COMMAND PUSHJ P,NERFAE ;HANDLE FILE OPEN ERROR POPJ P, ;ABORT ON ERROR JRST SBML10 ;CONTINUE ON ERROR ;FILE SUBMIT ERROR (.IOFSU) SBMLFE: CAIN M0,$EFRJU ;REJECTED BY USER? JRST [PUSHJ P,NERFAI ;ABORT I/O JRST SBML10] ;SKIP INTO NEXT FILE AOS ERRORS## ;COUNT UP ERRORS MOVEI T1,CDBLI## ;*** ADDRESS OF INPUT CDB PUSHJ P,.ERFSU## ;TYPE FILE SUBMIT ERROR MESSAGE PUSHJ P,NERFAI ;ABORT THE FILE PUSHJ P,ONERCK## ;WANT TO ABORT ON ERROR? POPJ P, ;ABORT ON ERROR JRST SBML10 ;CONTINUE ON ERROR ;HERE FOR DAP-MODE SUBMIT SBMLD: XMOVEI T1,CDBLI## ;ADDRESS OF INPUT CDB XMOVEI T2,SBMLDP ;ADDRESS OF FILE "PROCESSOR" XMOVEI T3,SBMLDE ;ADDRESS OF ERROR PROCESSOR PUSHJ P,.IODEX## ;DO A DAP-MODE SUBMIT OPERATION JRST DDCERM ;DAP-MODE COMMAND FAILURE JRST .POPJ1## ;SUCCESSFUL SBMLDP: MOVE T1,CDBLI+.IOLNW ;GET FILE LENGTH IN -10 WORDS ADDI T1,177 ;ROUND UP AND LSH T1,-7 ;TRUNCATE TO BLOCK SIZE ADDM T1,BLOCKS## ;ACCUMULATE BLOCKS AOS FILES## ;COUNT THE FILES AS THEY GO BY JRST .POPJ1## ;THAT'S ALL SBMLDE: AOS ERRORS## ;COUNT THE ERRORS AS THEY ACCUMULATE PJRST ONERCK## ;MAYBE PROCEED, MAYBE ABORT SUBTTL SUBMIT command - switch definitions ;"SUBMIT" SWITCHS DEFINE SWTCHS,< ;SP INITFILE,NIPFSB,.SWFIL##,,FS.NFS!FS.VRQ SN MOAN,S.MOAN,FS.NFS SN OKERROR,S.OKER,FS.NFS SP PASSWORD,,S.PASS>,.SWASQ##,, SL TOTALS,S.TOTA,TOT,7777,FS.OBV SP USERID,>,S.USER>,.SWUID##,, > DOSCAN(SBMSW) SUBTTL SUBMIT command - SCAN argument blocks ;"SUBMIT" TSCAN PARAMETER BLOCK SBMTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD SBMSWL,SBMSWN ;IOWD POINTER FOR SWITCH NAMES XWD SBMSWD,SBMSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,SBMSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN SBMTL==.-SBMTS ;"SUBMIT" OSCAN BLOCK SBMOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD SBMSWL,SBMSWN ;IOWD POINTER FOR SWITCH NAMES XWD SBMSWD,SBMSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,SBMSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD SBMOSL,SBMOSN ;OPTIONS NAME(S) SBMOL==.-SBMOS SBMOSN: SIXBIT \NSUBMI\ SIXBIT \NIP\ SIXBIT \NFT\ SBMOSL==.-SBMOSN SUBTTL SUBMIT command - I/O CDB initialization vector(s) ;"SUBMIT" INPUT CDB INITIALIZATION VECTOR SBMIV: EXP 10 ;COUNT OF WORDS FOLLOWING 'NS',,102030 ;VERSION WORD 0 ;"EXTRA" SIZE TO ALLOCATE 0 ;DEFAULT BUFFERING 0 ;MAXIMUM BUFFERING .ICASC ;I/O CONTROL (ASCII MODE) 0 ;I/O ERROR CONTROL IM.SBO ;I/O MODE 0 ;(RESERVED) SUBTTL TYPE command ;TYPE COMMAND ; ; TYPE = TTLTYP==0 TTMTYP==0 TYP: SETZM DDCMDF## ;NORMAL COMMAND STUFF JUMPLE CH,ERRNIF## ;EOL HERE IS JUNK PUSHJ P,CLRTOT## ;CLEAR TOTALS PUSHJ P,TYPC ;READ IN THE REST OF THE COMMAND JRST TYP70 ;COMMAND ERROR PUSHJ P,TYPD ;HANDLE ANY DEFAULTING JRST TYP70 ;ERROR PUSHJ P,.TCRLF## ;PRINT BLANK LINE FOR NEATNESS PUSHJ P,COPL ;DO THE FILE TRANSFER(S) ; (PROCESS SAME AS "COPY" COMMAND) JFCL ;IGNORE ERROR (SO COMES OUT IN SUMMARY) PUSHJ P,.TCRLF## ;ANOTHER NEATNESS MOVE T1,[TTLTYP,,TTMTYP] ;/TOTALS CONTROL SKIPLE S.BAUD ;WANT BAUD RATE TOO? TXO T1,TT$BAU ;YES PUSHJ P,.TOTAL## ;ISSUE TOTALS SUMMARY JFCL ;DUH?? ;NOW CLEAN UP ANY RANDOM I/O LEFT OVER ; ;INPUT IS RELEASED FIRST IN ORDER TO DE-ALLOCATE MANAGED MEMORY ;IN OPPOSITE ORDER OF ALLOCATION . . . TYP50: MOVEI T1,CDBLI## ;INPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? MOVEI T1,CDBLO## ;OUTPUT CHANNEL CDB PUSHJ P,.IORLS## ;INDICATE WE ARE DONE WITH IT JFCL ;DUH??? ;NOW FREE UP THE FILE SPEC BLOCKS TYP60: PUSHJ P,FRESB## ;FREE UP THE FILE SPEC BLOCKS JRST TYP77 ;??? ;ALL DONE WITH TYPE COMMAND JRST .POPJ1## ;RETURN FOR NEXT COMMAND ;TYPE ERROR TYP70: PUSHJ P,FRESB## ;MAKE SURE FILE SPEC BLOCKS FREED UP JFCL ;??? TYP77: POPJ P, ;PROPAGATE ERROR SUBTTL TYPE command - parsing ;HERE TO READ THE TYPE FILE SPECIFICATIONS TYPC: SETZM SIFIR## ;CLEAR OUT THE OLD DATA BASE PUSHJ P,.REEAT## ;WANT .TSCAN TO SEE CURRENT CHARACTER! MOVE T1,[TYPTL,,TYPTS] ;.TSCAN BLOCK PUSHJ P,.TSCAN## ;READ A COMMAND LINE PUSHJ P,CLRFIL ;CLEAR FILE ANSWERS BEFORE SWITCH.INI MOVE T1,[TYPOL,,TYPOS] ;.OSCAN BLOCK PUSHJ P,.OSCAN## ;CHECK SWITCH.INI ;ALL FOR NOW JRST .POPJ1## ;RETURN HAPPILY SUBTTL TYPE command - defaulting ;HERE TO SUPPLY INPUT AND OUTPUT DEFAULTS TYPD: SKIPN P1,SIFIR## ;ADDRESS OF FIRST INPUT SPEC JRST ERRNIF## ;NO INPUT FILE SPECIFIED ;HANDLE INPUT DEFAULTING TYPD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;GOT A FILE NAME? JRST TYPD17 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNAM(P1) ;SUPPLY DEFAULT FILE NAME XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNAM(P1) ;SUPPLY DEFAULT FILE NAME MOVX T3,FX.WNM ;THE WILDCARDS-IN-NAME FLAG IORM T3,.FXFLD(P1) ;SET IN FIELDS FLAGS TYPD17: MOVX T1,FX.UQN ; TDNN T1,.FXFLD(P1) ;USER-SPECIFIED QUOTED FILE NAME? SKIPE .FXEXT(P1) ;GOT AN EXTENSION? JRST TYPD18 ;YES MOVSI T1,'* ' ;FULL WILD NAME HLLZM T1,.FXEXT(P1) ;NO, SUPPLY A DEFAULT XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION MOVX T3,FX.WEX ;THE WILDCARDS-IN-EXTENSION FLAG IORM T3,.FXFLD(P1) ;SET THAT TOO TYPD18: MOVX T1,FX.PRT ;THE /OKPROT SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /OKPROT/ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, DEFAULT TO /ERPROT ; CONSIDER "26_NUL:=ACCT.SYS[1,4]" IORM T1,.FXMOM(P1) ;MAKE SURE NOBODY ELSE UNDEFAULTS US! MOVX T1,FX.STR ;THE /STRS SWITCH BIT TDNN T1,.FXMOM(P1) ;EXPLICIT /[NO]STRS? ANDCAM T1,.FXMOD(P1) ;NO, SET IMPLICIT /NOSTRS MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRN ;/QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:NEVER MOVX T1,FX.MCY!FX.MEY!FX.DAM!FX.IOM ;I/O MODE SPECIFIERS MOVX T2,.IOASL ;/DATAMODE:ASCII TDNE T1,.FXCTM(P1) ;I/O MODE OF SOME SORT SPECIFIED? JRST TYPD23 ;YES, USE VALUE AS SPECIFIED DPB T2,[POINTR .FXCTL(P1),FX.DAM] ;NO, DEFAULT TO /DATAMODE:ASCII DPB T2,[POINTR .FXCTM(P1),FX.DAM] ;FLAG THE MASK TOO TYPD23: ADDI P1,.FXMAX ;STEP TO NEXT SPEC CAMG P1,SILAS## ;REACHED LAST ONE YET? JRST TYPD10 ;NOPE, LOOP BACK FOR MORE DEFAULTS ;HANDLE OUTPUT DEFAULTING TYPD50: SKIPE P1,SOFIR## ;OUTPUT FILE SPEC BLOCK JRST TYPD52 ;USER TYPED ONE IN, GO FILL IT OUT ;NO OUTPUT FILE SPECIFIED, DEFAULT TO TTY:[]*.*/BYTESIZE:7 PUSHJ P,CLRFIL## ;CLEAR OUT FILE SPECIFICATION PUSHJ P,OUX## ;ALLOCATE A FILE SPEC BLOCK MOVE P1,T1 ;WANT ADDRESS IN P1 ON G.P.S MOVSI T1,'TTY' ;DEFAULT OUTPUT DEVICE SETO T2, ;NON-WILD MASK DMOVEM T1,.FXDEV(P1) ;SET DEFAULT DEVICE XMOVEI T1,[ASCIZ\TTY\] ;DEFAULT OUTPUT DEVICE MOVEM T1,.FSDEV(P1) ;SUPPLY DEFAULT OUTPUT DEVICE MOVEI T1,^D07 ;ASCII CHARACTERS ARE 7-BITS BY DEFAULT MOVEM T1,.FXBSZ(P1) ;SO FAKE A /BYTESIZE:7 COMMAND ; /ASCII WILL BE DEFAULTED BELOW . . . ;FLESH OUT THE OUTPUT FILE SPEC TYPD52: MOVE T1,P1 ;POSITION ADDRESS OF FILE SPEC BLOCK PUSHJ P,DOSDF ;DO ANY GENERAL FILE-SPEC DEFAULTING SKIPE .FXNAM(P1) ;OUTPUT FILE NAME GIVEN? JRST TYPD57 ;YES MOVSI T1,'* ' ;FULL WILD NAME SETZ T2, ;FULL WILD MASK DMOVEM T1,.FXNAM(P1) ;NO, DEFAULT FULL WILD XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSNAM(P1) ;SUPPLY DEFAULT FILE NAME MOVX T3,FX.WNM ;THE WILDCARDS-IN-NAME FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO TYPD57: MOVX T1,FX.UQN ; TDNN T1,.FXFLD(P1) ;USER-SPECIFIED QUOTED FILE NAME? SKIPE .FXEXT(P1) ;OUTPUT EXTENSION GIVEN? JRST TYPD58 ;YES MOVSI T1,'* ' ;FULL WILD NAME HLLZM T1,.FXEXT(P1) ;NO, DEFAULT TO FULL WILD XMOVEI T1,[ASCIZ\*\] ;FULL WILD NAME MOVEM T1,.FSEXT(P1) ;SUPPLY DEFAULT FILE EXTENSION MOVX T3,FX.WEX ;THE WILDCARDS-IN-EXTENSION FLAG IORM T3,.FXFLD(P1) ;NOTE THAT TOO TYPD58: MOVX T1,FX.PRT ;THE /OKPROT BIT TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? ANDCAM T1,.FXMOD(P1) ;NO, FORCE /ERPROT FOR OUTPUT FILE TDNN T1,.FXMOM(P1) ;DID USER SPECIFY /[NO]ERPROT? IORM T1,.FXMOM(P1) ;AND MAKE IT STICKY MOVX T1,FX.QRY ;/QUERY MASK MOVX T2,FX.QRN ;/QUERY:NEVER TDNN T1,.FXCTM(P1) ;/QUERY OF SOME SORT GIVEN BY USER? IORM T2,.FXCTL(P1) ;NO, DEFAULT TO /QUERY:NEVER MOVX T1,FX.MCY!FX.MEY!FX.DAM!FX.IOM ;I/O MODE SPECIFIERS MOVX T2,.IOASL ;/DATAMODE:ASCII TDNE T1,.FXCTM(P1) ;I/O MODE OF SOME SORT SPECIFIED? JRST TYPD63 ;YES, USE VALUE AS SPECIFIED DPB T2,[POINTR .FXCTL(P1),FX.DAM] ;NO, DEFAULT TO /DATAMODE:ASCII DPB T2,[POINTR .FXCTM(P1),FX.DAM] ;MARK THE MASK TOO TYPD63: ;ALL DONE HERE JRST .POPJ1## ;DEFAULTS DEFAULTED SUBTTL TYPE command - SCAN argument blocks ;"TYPE" TSCAN PARAMETER BLOCK TYPTS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD COPSWL,COPSWN ;IOWD POINTER FOR SWITCH NAMES XWD COPSWD,COPSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,COPSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD CLRALL,CLRFIL ;CLEAR ALL,,CLEAR FILE XWD INX,OUX ;ALLOC INPUT AREA,,ALLOC OUTPUT AREA XWD MEMSTK,APLSTK ;MEMORIZE STICKY,,APPLY STICKY XWD CLRSTK,0 ;CLEAR STICKY,,FLAGS Z ;,,SWITCH VALUE STORAGE RTN TYPTL==.-TYPTS ;"TYPE" OSCAN BLOCK TYPOS: EXP FXVRSN ;PROTOCOL VERSION WORD IOWD COPSWL,COPSWN ;IOWD POINTER FOR SWITCH NAMES XWD COPSWD,COPSWM ;DEFAULT TABLE,,PROCESSOR TABLE XWD 0,COPSWP ;,,STORAGE POINTERS SIXBIT /NIP/ ;HELP XWD TYPOSL,TYPOSN ;OPTIONS NAME(S) TYPOL==.-TYPOS TYPOSN: SIXBIT \TYPE\ SIXBIT \NIP\ SIXBIT \NFT\ TYPOSL==.-TYPOSN SUBTTL Copy file attributes ;CIOX -- COPY INPUT FILE ATTRIBUTES TO OUTPUT FILE ;Call is: ; ; PUSHJ P,CIOX ; error return ; normal return ; ;CIOX copies the input file attributes (data type, byte size, etc) to ;the output file. ; ;On normal return the output CDB is ready for .NXTFO/.IOPOU to create ;the output file. ; ;*** What I really need is a "/X" switch to govern the creation of a ;*** logically "new" file versus an exact "copy" of an old file . . . CIOX: MOVE P3,.IOFSB(CI) ;ADDRESS OF INPUT FILE SPEC BLOCK MOVE P4,.IOFSB(CO) ;ADDRESS OF OUTPUT FILE SPEC BLOCK DMOVE T1,.FXUSW(P3) ;GET INPUT SWITCHES DMOVE T3,.FXUSW(P4) ;AND OUTPUT SWITCHES TDZ T1,T4 ;OUTPUT OVERRIDES INPUT IOR T3,T1 ;MERGE INPUT AND OUTPUT SWITCHES MOVE T1,COPOVC ;INITIAL OUTPUT I/O CONTROL FLAGS TXNE T3,US$LSN ;WANT OUTPUT LINE SEQUENCE NUMBERS TXO T1,IC.LSN ;YES, MUST INFORM NETWORK LEVEL BEFORE THE ; FILE IS OPENED (UNLIKE LOCAL FILES) LDB T2,[POINTR .IOIOC(CI),IC.MOD] ;FETCH CURRENT INPUT MODE DPB T2,[POINTR T1,IC.MOD] ;SELECT DEFAULT OUTPUT MODE LDB T2,[POINTR .IOIOC(CI),IC.RFM] ;FETCH INPUT RECORD FORMAT CAIN T2,.ICRF3 ;*** /RECFORMAT:36? MOVEI T2,.ICRFU ;*** THEN PROBABLY WANT TOPS-10 FILE HERE DPB T2,[POINTR T1,IC.RFM] ;SELECT DEFAULT OUTPUT RECORD FORMAT MOVEM T1,.IOIOC(CO) ;SET OUTPUT I/O CONTROL ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;DEFAULT OUTPUT FIELDS FROM CORRESPONDING INPUT FIELDS CIOX10: SETZM .IOBSZ(CO) ;INITIALLY NO OUTPUT BYTE SIZE SETZM .IOFSZ(CO) ;NOR FRAME SIZE HRLZ T1,.IOBSZ(CI) ;GET INPUT FILE DATA BYTE SIZE HRR T1,.IOFSZ(CI) ;AND INPUT FILE FRAME BYTE SIZE MOVEM T1,.IODBS(CO) ;AND SET OUTPUT FILE DEFAULT BYTE/FRAME SIZE MOVE T1,.IORSZ(CI) ;GET INPUT FILE RECORD SIZE MOVEM T1,.IORSZ(CO) ;AND SET OUTPUT FILE RECORD SIZE ;RDH MOVE T1,.IOBLS(CI) ;GET INPUT FILE BLOCK SIZE ;RDH MOVEM T1,.IOBLS(CO) ;AND SET OUTPUT FILE BLOCK SIZE MOVE T1,.IOLNB(CI) ;GET INPUT FILE DATA LENGTH (BYTES) MOVEM T1,.IOLNB(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER MOVE T1,.IOLNW(CI) ;GET INPUT FILE DATA LENGTH (-10 WORDS) MOVEM T1,.IOLNW(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER ;RDH MOVE T1,.IOALB(CI) ;GET INPUT FILE ALLOCATION (BYTES) ;RDH MOVEM T1,.IOALB(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER ;RDH MOVE T1,.IOALW(CI) ;GET INPUT FILE ALLOCATION (-10 WORDS) ;RDH MOVEM T1,.IOALW(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER MOVE T1,.IOCDT(CI) ;GET INPUT FILE LOGICAL CREATION DATE/TIME MOVEM T1,.IOCDT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER MOVE T1,.IOUDT(CI) ;GET INPUT FILE LAST UPDATE DATE/TIME MOVEM T1,.IOUDT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER MOVE T1,.IOEDT(CI) ;GET INPUT FILE EXPIRATION DATE/TIME MOVEM T1,.IOEDT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER ;RDH MOVE T1,.IOBDT(CI) ;GET INPUT FILE BACKUP DATE/TIME ;RDH MOVEM T1,.IOBDT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER SETZM .IOBDT(CO) ;*** WHAT DO I REALLY WANT TO DO HERE? MOVE T1,.IOADT(CI) ;GET INPUT FILE LAST READ DATE/TIME MOVEM T1,.IOADT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER ;RDH MOVE T1,.IOPDT(CI) ;GET INPUT FILE PHYSICAL MEDIA DATE/TIME ;RDH MOVEM T1,.IOPDT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER SETZM .IOPDT(CO) ;*** WHAT DO I REALLY WANT TO DO HERE? MOVE T1,.IOPRT(CI) ;GET INPUT FILE PROTECTION MOVEM T1,.IOPRT(CO) ;AND SET CORRESPONDING OUTPUT FILE PARAMETER ;ALL DONE HERE JRST .POPJ1## ;SUCCESSFUL RETURN SUBTTL Copy processor (COPY, TYPE, etc. commands) ;COPY -- COPY ONE FILE DATA STREAM ;Call is: ; ; PUSHJ P,COPY ; error return ; normal return ; ;COPY will copy input data into the output file until EOF is reached, ;or a fatal error occurs. ; ;The caller must have OPENed the input and output file streams prior ;to calling COPY (although if multiple files are being concatenated then ;COPY will do the subsequent input OPEN calls itself). When EOF is reached ;(i.e., the copy operation is completed) the output file is CLOSEd. ; ;Various levels of processing are utilized depending on the type of copy ;operation being performed. For example, a straight [local] disk-to-disk ;"/X" copy can be done without even having to actually copy the data ;internally, whereas converting tabs to spaces necessitates a fair number ;of cpu cycles for every character copied. ; ;AC P4 is incremented by the number of "bytes" copied, all other "P" acs ;and the "T" acs are trashed. COPY: XMOVEI T1,COPY70 ;THE RETURN ADDRESS PUSH P,T1 ;FAKE A "PUSHJ P," DISPATCH XMOVEI CI,CDBLI## ;*** XMOVEI CO,CDBLO## ;*** ;RECORD-FORMATTED I/O MUST BE HANDLED DIFFERENTLY LDB T1,[POINTR .IOIOC(CI),IC.RFM] ;INPUT RECORD FORMAT CAIE T1,.ICRFU ;IF UNDEFINED (I.E., NO) RECORD FORMAT CAIN T1,.ICRF3 ;OR 36PACK'ING (WHICH WE SEE AS BYTES) CAIA ;THEN NOT "RECORD-STRUCTURED I/O" JRST COR ;RECORD-STRUCTURED I/O, USE RECORD PROCESSOR LDB T1,[POINTR .IOIOC(CO),IC.RFM] ;OUTPUT RECORD FORMAT CAIE T1,.ICRFU ;IF UNDEFINED RECORD FORMAT CAIN T1,.ICRF3 ;OR 36PACK'ED PDP-10 WORDS CAIA ;THEN DON'T NEED THE RECORD PROCESSOR JRST COR ;NO, RECORD-STRUCTURED I/O PROCESSOR ;CHECK FOR ANY FORCED CHARACTER-MODE PROCESSING MOVE T1,CI ;THE INPUT CDB PUSHJ P,TSCHP ;FORCED CHARACTER PROCESSING? JRST COA ;YES, CHAR PROC LOOP MOVE T1,CO ;THE OUTPUT CDB PUSHJ P,TSCHP ;FORCED CHARACTER PROCESSING? JRST COA ;YES, CHAR PROC LOOP ;USER DID NOT FORCE CHARACTER PROCESSING. IF EITHER SIDE IS A REMOTE ;(NETWORK-BASED) FILE THEN BYTE-AT-A-TIME TRANSFER MUST BE USED. MOVE P1,.IOCCF(CI) ;INPUT CDB CHANNEL CONTROL FLAGS MOVE P2,.IOCCF(CO) ;OUTPUT CDB CHANNEL CONTROL FLAGS TXNN P1,IO.NET ;IF EITHER THE INPUT TXNE P2,IO.NET ; OR THE OUTPUT IS REMOTE JRST COPY40 ;THEN BYTE-AT-A-TIME MUST BE USED ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;BOTH THE INPUT AND THE OUTPUT FILES ARE LOCAL FILES - DO SPECIAL CASE ;CHECKING TO TRY FOR THE FASTEST TRANSFER METHOD DEPENDING ON THE TYPE ;OF DEVICE/FILE BEING TRANSFERRED. ;*** NEED TO CHECK FOR /CONCATENATE COPY20: LDB T1,[POINTR .I1DTY(CI),TY.DEV] ;INPUT DEVICE TYPE LDB T2,[POINTR .I1DTY(CO),TY.DEV] ;OUTPUT DEVICE TYPE ;TRY FOR DISK-TO-DISK CAIN T1,.TYDSK ;IF BOTH INPUT CAIE T2,.TYDSK ; AND OUTPUT ARE DISK CAIA ;(NO) JRST COD ;DO FAST DISK-TO-DISK COPY ;TRY FOR MAGTAPE-TO-MAGTAPE CAIN T1,.TYMTA ;IF BOTH INPUT CAIE T1,.TYMTA ; AND OUTPUT ARE MAGTAPE CAIA ;(NO) JRST COM ;DO FAST TAPE-TO-TAPE COPY ;TRY FOR DISK/TAPE-TO-DISK/TAPE CAIE T1,.TYDSK ;IF INPUT IS EITHER A DISK CAIN T1,.TYMTA ; OR A MAGTAPE CAIA ;(YES) JRST COPY26 ;(NO) CAIE T2,.TYDSK ;AND OUTPUT IS EITHER A DISK CAIN T1,.TYMTA ;OR A MAGTAPE JRST COQ ;THEN DO QUICK BUFFERED COPY ;RANDOM COPY, DO IT A BYTE AT A TIME COPY26: JRST COB ;RELATIVELY FAST BYTE-AT-A-TIME COPY ;HERE WITH EITHER THE INPUT OR THE OUTPUT FILE REMOTE, THEREBY FORCING ;BYTE-AT-A-TIME COPY COPY40: LDB T1,[POINTR .IOIOC(CI),IC.MOD] ;INPUT FILE DATA MODE LDB T2,[POINTR .IOIOC(CO),IC.MOD] ;OUTPUT FILE DATA MODE ;SEE IF CHARACTER PROCESSING IS IMPLICITLY REQUIRED CAIE T1,.ICASC ;IF EITHER THE INPUT FILE CAIN T2,.ICASC ; OR THE OUTPT FILE IS ASCII (7-BIT) JRST COA ;THEN CHARACTER PROCESSING REQUIRED ; (NEEDED TO HANDLE REMOTE LSN'S) CAIE T1,.ICAS8 ;IF EITHER THE INPUT FILE CAIN T2,.ICAS8 ; OR THE OUTPUT FILE IS ASCII (8-BIT) JRST COA ;THEN CHARACTER PROCESSING REQUIRED ;DATA IS NOT ASCII, TREAT AS BINARY, JUST COPY IT BYTE-AT-A-TIME JRST COB ;STRAIGHT BYTE-AT-A-TIME COPY ;HERE AT END OF COPY OPERATION, EITHER DUE TO ERROR OR TO SUCCESSFUL ;COMPLETION (DEFINED AS A "SKIP RETURN" TO THE "PUSHJ" FAKED ABOVE) COPY70: TDZA P1,P1 ;FLAG ERROR RETURN MOVEI P1,1 ;FLAG SUCCESSFUL (SO FAR) RETURN ;NOW FIRST CLOSE THE INPUT FILE (NOTE THAT IF A FILE DATA STREAM CHECKSUM ;ERROR WAS TO OCCUR IT WOULD HAVE BEEN DETECTED IN THE INPUT I/O PRO- ;CESSOR) MOVE T1,CI ;ADDRESS OF THE INPUT CDB PUSHJ P,.IOCLO## ;CLOSE THE INPUT FILE JFCL ;FAILED??? WELL, WE WERE DONE WITH IT ANYWAY JUMPE P1,COPY77 ;ON ERROR ABORT THE OUTPUT FILE ;SUCCESSFUL RETURN, CLOSE OUTPUT FILE MOVE T1,CO ;ADDRESS OF OUTPUT CDB PUSHJ P,.IOCLO## ;CLOSE THE OUTPUT FILE CAIA ;ERROR JRST COPY79 ;SUCCESSFUL, TIME TO RETURN TO CALLER PUSHJ P,NERCL ;HANDLE THE CLOSE-TIME FILE ERROR JRST COPY77 ;ABORT THE OUTPUT FILE MOVE T1,CO ;CHECKSUM ERROR BUT PROCEDE ANYWAY MOVX T2,IO.NCK ;THE NO-CHECKSUM-ON-CLOSE FLAG IORM T2,.IOCCF(T1) ;TELL CLOSE TO IGNORE THE CHECKSUM PUSHJ P,.IOCLO## ;TRY TO CLOSE IT AGAIN JRST COPY76 ;FAILED AGAIN, GIVE UP AND ABORT THE FILE JRST COPY79 ;SUCCESSFUL, RETURN AS APPROPRIATE ;ABORT THE OUTPUT FILE COPY76: SETZ P1, ;FLAG ERROR COPY77: MOVE T1,CO ;ADDRESS OF OUTPUT CDB PUSHJ P,.IOABO## ;ABORT THE OUTPUT FILE JFCL ;THIS JUST ISN'T GONNA WORK COPY79: ADDM P1,(P) ;SKIP IF SUCCESSFUL, ELSE ERROR POPJ P, ;RETURN AS APPROPRIATE ;TSCHP - TEST HELPER FOR COPY PROCESSOR TSCHP: MOVE T2,.IOFSB(T1) ;ADDRESS OF FILE SPEC BLOCK MOVE T3,.FXUSW(T2) ;"USER" SWITCHES TXNE T3,US$CHP ;ANY CHARACTER-PROCESSING SWITCHES? POPJ P, ;YES, CHARACTER PROCESSOR REQUIRED ;NOW CHECK THE FULL-WORD SWITCHES SETO T3, ;THE "NO-VALUE" VALUE MOVEI T4,$FXECH-$FXBCH;LENGTH OF SWITCHES TSCHP2: CAME T3,$FXBCH(T2) ;SWITCH SPECIFIED? POPJ P, ;YES, CHARACTER PROCESSOR REQUIRED SOJLE T4,.POPJ1## ;DONE IF ALL SWITCHES CHECKED AOJA T2,TSCHP2 ;CHECK REST OF SWITCHES SUBTTL Copy processor - ASCII character processing ;COA -- ASCII CHARACTER PROCESSOR COA: MOVE P1,.IOFSB(CI) ;INPUT FILE SPEC BLOCK MOVE P2,.IOFSB(CO) ;OUTPUT FILE SPEC BLOCK ;INITIALIZE LOOP VARIABLES COA000: SETZM ASCCSN ;INITIALIZE CSN COUNTER SETZM ASCLSN ;INITIALIZE LSN COUNTER MOVEI T1,10 ;DEFAULT TAB SIZE MOVEM T1,S.TINC ;SET TAB "INCREMENT" ;SETUP THE SPACE-COMPRESSOR/CHOPPER BUFFER REPEAT 0,< ;*** MOVE T1,.FXRSZ(P1) ;THE INPUT /RECSIZ VALUE (IF ANY) CAMGE T1,.FXRSZ(P2) ;CONTRAST WITH THE OUTPUT /RECSIZ (IF ANY) MOVE T1,.FXRSZ(T2) ;OUTPUT IS BIGGER, USE IT INSTEAD CAIG T1,$SZRSZ ;BIGGER THAN OUR MINIMUM? MOVEI T1,$SZRSZ ;NO, USE OUR MINIMUM THEN ADDI T1,4 ;SIZE IS BYTES, ROUND UP AND IDIVI T1,5 ;CONVERT TO 36-BIT WORDS ASH T1,1 ;NEED TWO BUFFERS PUSHJ P,.MMGWD## ;GET A CHUNK OF MEMORY STOPCD ASH T1,-1 ;CONVERT BACK TO INDIVIDUAL BUFFER SIZE MOVE T3,T1 ;HOLD A COPY FOR A MOMENT IMULI T1,5 ;T1:=CHARACTERS PER BUFFER SUBI T1,4 ;READJUSTED HRLI T2,(POINT 7,) ;T1/T2:=COUNTER/POINTER DMOVEM T1,ASCICP ;SET PROTOTYPE INPUT COUNTER/POINTER ADD T2,T3 ;POINT TO OTHER "BUFFER" DMOVEM T1,ASCOCP ;SET PROTOTYPE OUTPUT COUNTER/POINTER > ;END REPEAT 0 ;*** ;*** DUE TO THE LIMITATIONS OF THE CURRENT MEMORY MANGLER, WE MUST ;*** RESTRICT OURSELF TO A CONSTANT COMPRESSION BUFFER DMOVE T1,[EXP <$SZRSZ-1>,] ;*** DMOVEM T1,ASCICP ;*** SET PROTOTYPE INPUT COUNTER/POINTER DMOVE T1,[EXP <$SZRSZ-1>,] ;*** DMOVEM T1,ASCOCP ;*** SET PROTOTYPE OUTPUT COUNTER/POINTER ;CONTINUED ON NEXT PAGE ;CONTINUED ON NEXT PAGE ;DO THE WORK COA010: PUSHJ P,COAIF ;SETUP PROCESSING PARAMETERS, ETC. STOPCD ;CAN'T HAPPEN MOVE P1,T2 ;POSITION SWITCH MASK PUSHJ P,COASC ;DO THE COPY TDZA P1,P1 ;FLAG ERROR MOVEI P1,1 ;FLAG SUCCESS ;DE-ALLOCATE THE SPACE COMPRESSION BUFFER REPEAT 0,< ;*** MOVE T1,ASCICP ;BYTES ALLOCATED FOR INPUT IDIVI T1,5 ;WORDS ALLOCATED FOR INPUT ASH T1,1 ;WORDS ALLOCATED TOTAL HRRZ T2,ASCICP+1 ;ADDRESS OF THE TWO BUFFERS PUSHJ P,.MMFWD## ;RELINQUISH THE BUFFERS STOPCD > ;END REPEAT 0 ;*** ;ALL DONE, RETURN TO COPY PROCESSOR TO CLOSE THE FILES COA079: ADDM P1,0(P) ;SET RETURN AS APPROPRIATE POPJ P, ;RETURN SUCCESS/FAILURE SUBTTL Copy processor - ASCII character loop ;HERE TO PROCESS AN ASCII DATA STREAM, HANDLING SPACE/TAB CONVERSION, ETC. ; ;AN ISSUE AS YET UNRESOLVED - WHAT TO DO WITH /CSN'ED LINES LONGER THAN ;/CSNCOLUMN - TRUNCATE THEM, OR FREE-CRLF THEM? COASC: SETZ P3, ;START WITH COLUMN POSITION 0 ;LOOP READING INPUT CHARACTERS COASC1: JSP CX,COAIC ;GET NEXT INPUT CHARACTER PUSHJ P,NERIN ; I/O ERROR JRST COASE ; END-OF-FILE JRST COALU ; LINE-SEQUENCE-NUMBER ; ASCII CHARACTER ;NORMAL ASCII CHARACTER, DISPATCH ON CHARACTER UNLESS AT BOL COASC5: ANDI T2,377 ;STRIP OFF GARBAGE FROM CHARACTER JUMPG P3,@ASCDSP(T2) ;IF AT BEGINING OF LINE, SKIPG T3,S.LSN ;AT BEGINING OF LINE, WANT LINE SEQ NO.S? JRST @ASCDSP(T2) ;NO, JUST OUTPUT THE CHARACTER ;WANT LINE SEQUENCE NUMBERS GENERATED COASL0: CAIE T2,.CHCRT ;A ? JRST COASL5 ;NO, LOOK FOR JSP CX,COAIC ;PEEK AT CHARACTER PAST PUSHJ P,NERIN ; I/O ERROR JRST COASL1 ; END-OF-FILE JRST COASL8 ; LINE-SEQUENCE-NUMBER (CAN'T HAPPEN) CAIN T2,.CHFFD ; ASCII CHARACTER - A PAIR? JRST COASL5 ;YES, JUST ISSUE A "PAGE-MARK" HRROM T2,ASCHAR ;NO, SAVE PEEKED CHARACTER FOR NEXT TIME COASL1: MOVEI T2,.CHCRT ;RETRIEVE OUR JRST COALS ;AND TREAT AS RANDOM BLANK LINE COASL5: CAIE T2,.CHFFD ;A CHARACTER? JRST COALS ;NO, JUST FIRE UP A NEW LINE MOVE T1,CO ;ADDRESS OF OUTPUT CDB MOVEI T2,.FULSN ;FUNCTION: WRITE LSN SETO T3, ;-1 = WRITE PAGE MARK PUSHJ P,.IOFUN## ;ISSUE REQUEST PUSHJ P,NERLS ;ERROR? TXNE P1,US$LSC ;/LSNCONTINUOUS? TDZA P3,P3 ;YES, DON'T RESET THE LSN COUNTER SETZB P3,ASCLSN ;START UP A FRESH PAGE JRST COASC1 ;BACK FOR MORE CHARACTERS ;HERE ON INPUT LSN AFTER (CAN'T HAPPEN) COASL8: STOPCD ;HERE TO GENERATE NEW LINE SEQUENCE NUMBERS COALS: MOVEM T2,ASCHAL ;RE-READ THIS CHARACTER LATER COALS1: ADDB T3,ASCLSN ;INCREMENT LSN COUNTER COALS3: MOVEI T2,.FULSN ;FUNCTION: WRITE LINE SEQUENCE NUMBER MOVE T1,CO ;SELECT OUTPUT CHANNEL PUSHJ P,.IOFUN## ;CALL I/O FUNCTION PROCESSOR PUSHJ P,NERLS ;I/O ERROR WRITING LSN SKIPGE ASCLSN ;WAS THAT A LSN OR A PAGE MARK? TDZA P3,P3 ;A SOS PAGE MARK, SO STILL AT COLUMN 0 MOVE P3,S.TINC ;WE ARE NOW POSITIONED TO THE FIRST TAB STOP SETZ T2, ;FLAG 0 EXCH T2,ASCHAL ;RETRIEVE SAVED CHARACTER, IF ANY JUMPN T2,@ASCDSP(T2) ;NOW GO PROCESS CHARACTER JRST COASC1 ;GO READ ANOTHER CHARACTER ;HERE WHEN LINE SEQUENCE NUMBER ENCOUNTERED IN THE INPUT FILE COALU: MOVEM T2,ASCLSN ;SET LSN SETOM S.LSN ;DO NOT GENERATE LSN JUMPE P3,COALU3 ;HAD BETTER BE AT BOL WARN LML, PUSHJ P,COANL ;START A NEW LINE POPJ P, ;DIED COALU3: MOVE T3,ASCLSN ;RETRIEVE INPUT LSN JRST COALS3 ;AND SEND IT ON ITS WAY ;HERE ON INPUT EOF COASE: CAIE M0,$EIEOF ;VALID EOF ON INPUT? POPJ P, ;NO, MUST BE CONCATENATION ERROR COASE1: SKIPN ASCSTP ;[14] GOT ANY OUTPUT BUFFERED UP? JRST COASE3 ;NO PUSHJ P,COAOA7 ;YES, FLUSH IT OUT POPJ P, ;OH WELL, ALMOST MADE IT COASE3: JRST .POPJ1## ;ALL DONE! ;HERE ON BACKSPACE COABS: SOJGE P3,COAQC ;SPACE BACKWARDS, OUTPUT CHARACTER SETZ P3, ;OOPS - PEG AT THE LEFT MARGIN JRST COAQC ;AND OUTPUT THE BACKSPACE ;HERE ON HORIZONTAL TAB COAHT: CAML P3,S.WRAP ;TIME FOR AN WORD-WRAP-CRLF? JRST COAHW ;YES CAMGE P3,S.CRLF ;NO, HOW ABOUT FREE CRLF? JRST COAHT1 ;NO, JUST PROCESS THIS TAB PUSHJ P,COANL ;NEED FREE CRLF, START UP A NEW LINE POPJ P, ;DIED COAHT1: MOVE T3,P3 ;CURRENT POSITION WITHIN LINE IDIV T3,S.TINC ;T3:=TAB STOP; T4:=CHARS IN NEXT PARTIAL STOP MOVN T4,T4 ;DON'T HAVE SUB-FROM-M ADD T4,S.TINC ;T4:=POSITIONS LEFT IN CURRENT PARTIAL TAB ADD P3,T4 ;ADVANCE POSITION COUNTER CAML P3,S.WRAP ;TIME YET FOR WORD-WRAP-CRLF? JRST COAHU1 ;YES CAML P3,S.CRLF ;NO, HOW ABOUT FREE CRLF? JRST COAHU2 ;YES TXNN P1,US$SPA ;/SPACES? JRST COAQC ;NO, OUTPUT TAB AS IS ;/SPACES, FILL OUT THE TAB WITH SPACES MOVEI T2," " ;A SPACE CHARACTER COAHT4: PUSHJ P,COAOC ;OUTPUT ONE ASCII SPACE CHARACTER PUSHJ P,NEROU ;I/O ERROR SOJG T4,COAHT4 ;LOOP FOR REST OF TAB STOP JRST COASC1 ;BACK FOR NEXT ASCII INPUT CHARACTER ;HERE WHEN THIS TAB WOULD BREAK THE WORD-WRAP-CRLF BOUNDRY COAHU1: SUB P3,S.WRAP ;P3:=EXCESSIVE SPACE CAIA ;HANDLE NEW LINE ;HERE WHEN THIS TAB WOULD BREAK THE FREE-CRLF BOUNDRY COAHU2: SUB P3,S.CRLF ;P3:=EXCESSIVE SPACE SUB T4,P3 ;T4:=SPACE TO CRLF BOUNDRY TXNN P1,US$SPA ;/SPACES? TDZA T4,T4 ;NO, OUTPUT TAB DIRECTLY MOVEI T2," " ;YES, NEED TO FILL TRAILING TAB WITH SPACES COAHU4: PUSHJ P,COAOC ;OUTPUT SPACE OR TAB AS APPROPRIATE PUSHJ P,NEROU ;I/O ERROR SOJG T4,COAHU4 ;LOOP FOR ENTIRE SPACE REQUIREMENT ;FALL INTO COAHW TO GENERATE NEW LINE ;SPACE/TAB OVERFLOWED AUTO-CRLF, CONVERT TO NEW LINE COAHW: PUSHJ P,COANL ;START UP A NEW LINE POPJ P, ;DIED MOVE T2,S.CRLF ;GET FREE-CRLF BOUNDRY CAMGE T2,S.WRAP ;HERE FOR WORD-WRAP- OR FREE-CRLF? JRST COASC1 ;FREE-CRLF, PROCESS NEXT CHARACTER ;WORD-WRAP-CRLF, COMPRESS OUT SPACES ;NOW EAT ANY FOLLOWING SPACES/TABS COAHW3: JSP CX,COAIC ;NEXT INPUT CHARACTER PUSHJ P,NERIN ; I/O ERROR JRST COASE ; END-OF-FILE JRST COALU ; LINE-SEQUENCE-NUMBER CAIE T2," " ; ASCII CHARACTER - A SPACE? CAIN T2,.CHTAB ;OR A TAB? JRST COAHW3 ;YES, EAT IT UP JRST COASC5 ;NO, VALID CHARACTER, GO PROCESS IT ;HERE ON COALF: JRST COAQC ;JUST OUTPUT IT ;HERE ON COAVT: JRST COAQC ;JUST OUTPUT IT ;HERE ON COAFF: JRST COAQC ;JUST OUTPUT IT ;HERE ON CARRIAGE-RETURN COACR: SKIPG S.CSN ;WANT CARD SEQUENCE NUMBERS? JRST COACR2 ;NO PUSHJ P,COACS ;YES, OUTPUT THE CSN POPJ P, ;DIED COACR2: JSP CX,COAIC ;READ THE NEXT INPUT CHARACTER PUSHJ P,NERIN ; I/O ERROR JRST COACS9 ; END OF FILE JRST COACS7 ; LINE SEQUENCE NUMBER CAIN T2,.CHFFD ; ASCII CHARACTER - A ? JRST COACS0 ;YES, CONVERT INTO "PAGE MARK" COACR3: HRROM T2,ASCHAR ;SAVE CHARACTER TO BE RE-EATEN MOVEI T2,.CHCRT ;OUR PUSHJ P,COAOC ;OUTPUT THE PUSHJ P,NEROU ;I/O ERROR HRRZ T2,ASCHAR ;RETRIEVE THE INPUT CHARACTER SETZB P3,ASCHAR ;NOW ON COLUMN 0 CAIE T2,.CHLFD ;A ? CAIN T2,.CHFFD ;OR ? JRST COAQC ;YES, OUTPUT THE DIRECTLY SKIPG S.LSN ; - GENERATING LSN'S? JRST COASC5 ;NO, DISPATCH ON THE CHARACTER HRROM T2,ASCHAR ;YES, SAVE FIRST OVER-PRINTED CHARACTER MOVEI T2,.CHTAB ;A TAB CHARACTER TO OVER-SKIP THE LSN MOVE P3,S.TINC ;AND IT'S RESULTANT COLUMN POSITION JRST COAQC ;OUTPUT TAB, RE-READ OVER-PRINTED CHARACTER ;HERE ON - SPECIAL LSN HANDLING NEEDED COACS0: SKIPG S.LSN ;GENERATING LSNS? JRST COACR3 ;NO, NOTHING SPECIAL THEN JUMPE P3,COACS3 ;JUST ISSUE PAGE MARK IF A FREE MOVEI T2,.CHCRT ;A PUSHJ P,COAOC ;ISSUE PUSHJ P,NEROU ;I/O ERROR MOVEI T2,.CHLFD ;A PUSHJ P,COAOC ;ISSUE TO CAP OFF CURRENT LINE PUSHJ P,NEROU ;I/O ERROR COACS3: SETO T3, ;A "PAGE MARK" LSN MOVEI T2,.FULSN ;FUNCTION: WRITE LINE SEQUENCE NUMBER MOVE T1,CO ;FOR THE OUTPUT FILE STREAM PUSHJ P,.IOFUN## ;ISSUE THE PAGE MARK PUSHJ P,NERLS ;ERROR WRITING LSN TXNE P1,US$LSC ;/LSNCONTINUOUS? TDZA P3,P3 ;YES, DON'T RESET THE LSN COUNTER SETZB P3,ASCLSN ;NOW AT LEFT MARGIN AGAIN ON A NEW PAGE JRST COASC1 ;GO FOR NEXT CHARACTER ;HERE ON COACS7: SKIPLE S.LSN ;GENERATING (RE-SEQUENCING)? MOVEM T2,ASCLSN ;SAVE THE LSN MOVEI T2,.CHCRT ;OUR PUSHJ P,COAOC ;OUTPUT THE PUSHJ P,NEROU ;I/O ERROR MOVEI T2,.CHLFD ;A PUSHJ P,COAOC ;CONVERT TO PUSHJ P,NEROU ;I/O ERROR SETZ P3, ;WE ARE NOW AT THE LEFT MARGIN AGAIN SKIPLE T3,S.LSN ;WHOSE LSN TO BELIEVE? JRST COALS1 ;GENERATE NEW ONE JRST COALU3 ;PROCESS RECEIVED ONE ;HERE ON COACS9: MOVEI T2,.CHCRT ;OUR PUSHJ P,COAOC ;OUTPUT THE PUSHJ P,NEROU ;I/O ERROR SETZ P3, ;WE ARE NOW AT THE LEFT MARGIN AGAIN JRST COASE1 ;[14] GO PROCESS ;HERE ON SPACE CHARACTER COASP: CAML P3,S.WRAP ;TIME TO WORD-WRAP YET? JRST COAHW ;YES, WRAP TO A NEW LINE TXNN P1,US$TAB ;/TABS? JRST COAPC ;NO, NORMAL PRINTING CHARACTER MOVE T3,P3 ;YES, GET CURRENT COLUMN COUNTER IDIV T3,S.TINC ;REDUCE TO TAB, POSITION WITH TAB SUB T4,S.TINC ;T4:=- HRLZ T4,T4 ;MAKE INTO AOBJN POINTER JRST COASP5 ;ENTER SPACE COMPRESSION LOOP ;LOOP BUILDING UP SPACES UNTIL THE NEXT TAB STOP IS HIT COASP2: JSP CX,COAIC ;NEXT INPUT CHARACTER PUSHJ P,NERIN ; I/O ERROR JRST COASR0 ; END-OF-FILE JRST COASR1 ; LINE-SEQUENCE-NUMBER CAIN T2,.CHTAB ; ASCII CHARACTER - HIT A TAB? JRST [HLRO T3,T4 ;YES, GET SPACE LEFT TILL TAB SUB P3,T3 ;ADD IT INTO COLUMN POSITION JRST COASP7] ;OUTPUT TAB, CHECKING FREE-CRLF/ETC. CAIE T2," " ;ANOTHER SPACE? JRST COASQ ;NO, END OF EMBEDDED SPACES COASP5: MOVE T3,P3 ;COLUMN POSITION LESS SPACES ADDI T3,1(T4) ;ACCOUNT FOR SPACES SO FAR CAMGE T3,S.WRAP ;WOULD THIS EXCEED WORD-WRAP-CRLF BOUNDRY? CAML T3,S.CRLF ; OR FREE-CRLF BOUNDRY? JRST COASW ;YES TO ONE OF THE ABOVE AOBJN T4,COASP2 ;LOOP TILL TAB STOP REACHED COASP7: ADDI P3,(T4) ;ACCOUNT FOR SPACE(S) COMPRESSED OUT MOVEI T2,.CHTAB ;SELECT ASCII TAB CHARACTER CAMGE P3,S.WRAP ;HAVE WE NOW EXCEEDED WORD-WRAP-CRLF BOUNDRY? CAML P3,S.CRLF ;OR THE FREE-CRLF BOUNDRY? JRST COASW ;YES, NEED A NEW LINE JRST COAQC ;NO, ALL SET, OUTPUT ONE TAB ;HERE WHEN EITHER WORD-WRAP-CRLF OR FREE-CRLF BOUNDRY EXCEEDED COASW: CAIN T2,.CHTAB ;GET UP TO A TAB BOUNDRY? JRST [PUSHJ P,COAOC ;YES, OUTPUT THE TAB CHARACTER PUSHJ P,NEROU ;I/O ERROR JRST COASW2] ;START UP A NEW LINE PUSHJ P,COASS ;FLUSH OUT ACCUMULATED SPACES POPJ P, ;DIED COASW2: PUSHJ P,COANL ;START UP A NEW LINE POPJ P, ;DIED MOVE T3,S.CRLF ;GET THE FREE-CRLF BOUNDRY CAMGE T3,S.WRAP ;WAS THIS A WORD-WRAP-CRLF OR A FREE-CRLF JRST COASC1 ;FREE-CRLF, KEEP COMPRESSING SPACES JRST COAHW3 ;WORD-WRAP-CRLF, EAT FOLLOWING SPACES ;HERE ON EOF WHILE COMPRESSING SPACES COASR0: PUSHJ P,COASS ;DUMP OUT SPACES SO FAR POPJ P, ;DIED JRST COASE ;END OF FILE PROCESSING ;HERE ON LSN WHILE COMPRESSING SPACES COASR1: PUSHJ P,COASS ;DUMP OUT SPACES SO FAR POPJ P, ;DIED JRST COALU ;PROCESS RECEIVED LSN ;HERE ON NON-SPACE FOLLOWING ONE OR MORE SPACE CHARACTERS COASQ: PUSHJ P,COASS ;DUMP OUT SPACES SO FAR POPJ P, ;DIED JRST COASC5 ;PROCESS THIS NON-SPACE CHARACTER ;HELPER TO DUMP OUT ACCUMULATED SPACES COASS: PUSHJ P,TSAV12## ;SAVE THE INPUT CHARACTER IN T2 ANDI T4,-1 ;REDUCE TO COUNT OF SPACES EATEN ADD P3,T4 ;ACCOUNT FOR HORIZONTAL POSITION MOVEI T2," " ;SELECT ASCII SPACE CHARACTER COASS3: PUSHJ P,COAOC ;OUTPUT ONE ASCII CHARACTER PUSHJ P,NEROU ;I/O ERROR SOJG T4,COASS3 ;LOOP FOR ALL EMBEDDED SPACES JRST .POPJ1## ;SUCCESSFULLY FLUSHED OUT THE SPACES ;HERE ON RANDOM CONTROL CHARACTER COACC: TXNN P1,US$ARR ;/ARROW? JRST COAQC ;NO, JUST OUTPUT THE CHARACTER STRAIGHT IORI T2,100 ;YES, CONVERT TO PRINTING GRAPHIC EQUIVILENT CAIE T2,177 ;A RUBOUT? CAIN T2,377 ;OR A RUBOUT? MOVEI T2,"?" ;YES, DISPLAY RUBOUT AS "^?" MOVEI T3,"^" ;THE "FLAG" CHARACTER JRST COAFL0 ;GO PRINT "FLAGGED" CHARACTER ;HERE ON LOWER-CASE ALPHAMERICS COALC: TXNN P1,US$FLL ;/FLAG:LOWER? JRST COAPC ;NO, NORMAL PRINTING CHARACTER JRST COAFL ;YES, FLAG LOWER CASE CHARACTER ;HERE ON UPPER-CASE ALPHAMERICS COAUC: TXNN P1,US$FLU ;/FLAG:UPPER? JRST COAPC ;NO, NORMAL PRINTING CHARACTER ; JRST COAFL ;YES, FLAG UPPER CASE CHARACTER ;HERE TO FLAG THE CHARACTER IN T2 COAFL: MOVEI T3,"'" ;THE "FLAG" CHARACTER COAFL0: HRROM T2,ASCHAR ;SAVE THE FLAGGED CHARACTER CAMGE P3,S.CRLF ;WILL THE FLAG CHARACTER FIT ON THE LINE? JRST COAFL3 ;YES, NO PROBLEMS PUSHJ P,COANL ;NO, START UP A NEW LINE POPJ P, ;DIED COAFL3: MOVE T2,T3 ;POSITION FLAG CHARACTER PUSHJ P,COAOC ;OUTPUT ASCII CHARACTER PUSHJ P,NEROU ;I/O ERROR COAFL7: SETZ T2, ;CLEAR FLAG EXCH T2,ASCHAR ;RETRIEVE FLAGGED CHARACTER AOJA P3,COAPC ;GO FINISH OFF PRINTING CHARACTER ;HERE ON "NORMAL PRINTING ASCII GRAPHIC" CHARACTER COAPC: CAMGE P3,S.CRLF ;EXCEEDED FREE-CRLF BOUNDRY? AOJA P3,COAQC ;NO, OUTPUT THIS CHARACTER PUSHJ P,COANL ;YES, START A NEW LINE POPJ P, ;DIED AOJA P3,COAQC ;OUTPUT PRINTING ASCII CHARACTER IN T2 ;HERE TO OUTPUT ONE ASCII CHARACTER COAQC: PUSHJ P,COAOC ;OUTPUT THE CHARACTER PUSHJ P,NEROU ;I/O ERROR JRST COASC1 ;LOOP BACK FOR NEXT INPUT CHARACTER ;COAIC - RETURN NEXT INPUT ASCII CHARACTER ;Call is: ; ; JSP CX,COAIC ; I/O-Error return ; End-of-File return ; Line-Sequence-Number return ; Normal return ; ;On normal return T2 has the next ASCII character. COAIC: SKIPE T2,ASCHAR ;GOT A SAVED ASCII CHARACTER? JRST [ANDI T2,177 ;YES, REDUCE TO JUST CHARACTER SETZM ASCHAR ;NOTE WE HAVE READ THE SAVED CHARACTER JRST 3(CX)] ;RETURN WITH SAVED CHARACTER SKIPLE ASCSTI ;GOT A SAVED ASCII STRING? JRST [ILDB T2,ASCSTJ ;FETCH NEXT SAVED CHARACTER SOSLE ASCSTI ;COUNT DOWN VALID BYTE COUNT JRST 3(CX) ;RETURN WITH SAVED CHARACTER MOVE M0,ASCSTK ;GET SAVED EXCEPTION CONDITION JUMPE M0,.+1 ;JUST RESUME INPUT IF NONE JRST COAICE] ;TAKE VARIED EXCEPTION RETURN PUSHJ P,COAIB ;READ NEXT INPUT DATA BYTE JRST COAICE ;TAKE EXCEPTION RETURN TXNN P1,US$TRU ;WANT TRAILING SPACES/TABS TRUNCATED? JRST 3(CX) ;NO, JUST RETURN CHARACTER DIRECTLY CAIE T2,.CHTAB ;A TAB? CAIN T2," " ;OR A SPACE? JRST COAIC3 ;YES, COMPRESS THEM A BIT JRST 3(CX) ;NO, RETURN STRAIGHT ;HERE TO SCAN AHEAD TO SEE IF TRAILING BLANKS (AND DELETE THEM IF SO) COAIC3: PUSHJ P,COAIS ;DO SPACE/TAB LOOKAHEAD JRST COAIC ;RETURN APPROPRIATE CHARACTER ;HERE TO "EXCEPTION" RETURN AS APPROPRIATE BY CODE IN M0 COAICE: CAIN M0,$EIEOF ;END OF FILE? JRST 1(CX) ;YES CAIE M0,$EILSN ;NO, HOW ABOUT A LINE SEQUENCE NUMBER? JRST 0(CX) ;MUST BE AN I/O ERROR JUMPN T2,2(CX) ;RETURN VALID LSN JRST COAIC ;A NULL LSN, JUST IGNORE THE EXCEPTION ; THIS HAPPENS IF LSA (DAP) IS SET BUT THE ; REMOTE FILE IS NOT LSN'ED - FAL "PADS" ; WITH A " 00000" SEQUENCE. ;HERE TO HANDLE THE TRAILING SPACE/TAB TRUNCATION FOR COAIC COAIS: PUSHJ P,TSAV14## ;WANT TO PROTECT THE CALLERS ACS DMOVE T3,ASCICP ;GET THE PROTOTYPE INPUT COUNTER/POINTER JRST COAIS5 ;ENTER THE LOOP ;LOOP ACCUMULATING SPACES AND/OR TABS COAIS4: PUSHJ P,COAIB ;GET ANOTHER BYTE JRST [MOVEM M0,ASCSTK ;REMEMBER EXCEPTION STATUS JRST COAIS7] ;RETURN STRING OF SPACES/TABS COAIS5: CAIN T2,.CHCRT ;IF A JRST [MOVEM T2,ASCHAR ;THEN ALL SET, FLAG TO RETURN POPJ P,] ;RETURN, HAVING EATEN THE BLANKS IDPB T2,T4 ;STASH AWAY THIS BYTE CAIE T2,.CHTAB ;IF A TAB CAIN T2," " ; OR A SPACE SOJG T3,COAIS4 ;JUST ACCUMULATE IT CAIG T3,0 ;OVER-FLOW? JRST [PUSHJ P,COATES ;YES, ISSUE WARNING MESSAGE AOJA T3,.+1] ;KEEP T3 CONSISTENT SETZM ASCSTK ;NOTE FINISHED CLEANLY COAIS7: SUB T3,ASCICP ;T3:=NEGATIVE COUNT OF CHARACTERS SAVED SUBI T3,2 ;OFFSET BY ONE FOR LOOP EXIT MOVNM T3,ASCSTI ;SET INPUT SAVED COUNT MOVE T4,ASCICP+1 ;GET THE SPACE POINTER MOVEM T4,ASCSTJ ;SET THE SAVED STRING POINTER POPJ P, ;START RETURNING SAVED STRING ;COAIB - READ NEXT INPUT BYTE COAIB: MOVE T1,CI ;ADDRESS OF INPUT CDB TXNN P1,US$XLI ;ANY SORT OF INPUT TRANSLATION? PJRST @.IOISR(T1) ;NO, QUICK AND FAST CASE PUSHJ P,@.IOISR(T1) ;READ NEXT INPUT DATA BYTE JRST COAIE ;FAILED - SEE WHY TXNE P1,US$EBI ;IS INPUT EBCDIC-ENCODED? HRRZ T2,ASCEBC(T2) ;YES, TRANSLATE (AS BEST WE CAN) INTO USASCII AOS (P) ;SUCCESSFUL POPJ P, ; RETURN ;CAN'T READ NEXT INPUT DATA BYTE, SEE WHY COAIE: CAIN M0,$EILSN ;LINE SEQUENCE NUMBER? JRST [MOVEM T2,ASCLSN ;YES, STASH IT AWAY POPJ P,] ;AND TAKE EXCEPTION RETURN CAIE M0,$EIEOF ;END OF FILE? POPJ P, ;ERROR FOR NOW TXNN P1,US$CON ;/CONCATENATE? POPJ P, ;RETURN VALID EOF COAIE1: PUSHJ P,.NXTFC## ;YES, GO OPEN NEXT CONCATENATED INPUT FILE JRST COAIE3 ;SEE WHY CAN'T GET NEXT INPUT FILE PUSHJ P,COAIF ;HANDLE SWITCH-PROCESSING SETUP POPJ P, ;DUH? ;*** AT THIS POINT SOMETHING SPECIAL NEEDS TO BE DONE ABOUT THE ;*** END OF A CONCATENATED INPUT SET, AS IN: ;*** COPY *.* = *.MAC, *.BAK/CONCATENATE, *.REL MOVE P1,T2 ;SET NEW FLAGS WORD JRST COAIB ;BACK TO READ MORE DATA COAIE3: CAIN M0,$EFIXN ;ALL OUT OF INPUT FILES? JRST [MOVEI M0,$EIEOF ;YES, TIME FOR "END-OF-FILE" RETURN POPJ P,] ;TAKE EXCEPTION RETURN PUSHJ P,NERFAE ;HANDLE FILE ACCESS ERROR POPJ P, ;ABORT ON ERROR JRST COAIE1 ;CONTINUE ON ERROR ;COAIF - SETUP ASCII CONTROL-PROCESSING BASED ON OUTPUT AND INPUT SWITCHES ; ;Returns US$--- switch processing flags in T2. COAIF: PUSHJ P,.SAVE4## ;NEED SOME ACS HERE MOVE P3,.IOFSB(CI) ;ADDRESS OF INPUT FILE SPEC BLOCK MOVE P4,.IOFSB(CO) ;ADDRESS OF OUTPUT FILE SPEC BLOCK DMOVE P1,.FXUSW(P4) ;OUTPUT "USER" (FILE) SWITCHES DMOVE T3,.FXUSW(P3) ;INPUT "USER" SWITCHES TDZ T3,P2 ;OUTPUT SWITCHES TAKE PRECEDENCE OVER INPUT TXZE T3,US$EBC ;/EBCDIC ON INPUT? TXO T3,US$EBI ;YES, REPOSITION INPUT SIDE IOR P1,T3 ;MERGE OUTPUT WITH INPUT SWITCHES IOR P2,T4 ;MERGE SWITCH MASK TOO ;NOW SET UP DEFAULTS/ETC. MOVE T4,.IOIOC(CI) ;GET I/O CONTROL ;SETUP CARD SEQUENCE NUMBER PROCESSING, IF NEEDED TXNN P2,US$CSN ;ANY FLAVOR OF /[NO]CSN MOVNI T1,1 ;NO, NO CSN PROCESSING MOVEI T1,0 ;YES, SOME SORT OF CSN SPECIFIED TXNE P1,US$CSN ;WAS /CSN SPECIFIED? MOVEI T1,1 ;YES, GENERATING CSNS MOVEM T1,S.CSN ;SET /CSN PROCESSING JUMPLE T1,COAIF4 ;IF /CSN, TXNE P2,US$SPA ;AND NO /[NO]SPACE TXO P1,US$SPA ;THEN DEFAULT /SPACE ON /CSN SKIPGE T1,$FXCSC(P4) ;GET OUTPUT /CSNCOLUMN, IF ANY MOVE T1,$FXCSC(P3) ;OTHERWISE USE INPUT /CSNCOLUMN CAIG T1,0 ;GOT A COLUMN? MOVEI T1,AD.CSC ;NO, USE STANDARD CARD SEQUENCE COLUMN MOVEM T1,S.CSNC ;SET CARD SEQUENCE NUMBER COLUMN SKIPGE T1,$FXCSI(P4) ;GET OUTPUT /CSNINCREMENT, IF ANY MOVE T1,$FXCSI(P3) ;OTHERWISE USE INPUT /CSNINCREMENT CAIG T1,0 ;GOT AN INCREMENT? MOVEI T1,AD.CSI ;NO, USE STANDARD CARD SEQUENCE INCREMENT MOVEM T1,S.CSN ;SET CARD SEQUENCE NUMBER INCREMENT ; .GT. 0 IS FLAG /CSN PROCESSING SKIPGE T1,$FXCSW(P4) ;GET OUTPUT /CSNWIDTH, IF ANY MOVE T1,$FXCSW(P3) ;OTHERWISE USE INPUT /CSNWIDTH CAIG T1,0 ;GOT A WIDTH? MOVEI T1,AD.CSW ;NO, USE STANDARD CARD SEQUENCE WIDTH MOVEM T1,S.CSNW ;SET CARD SEQUENCE NUMBER WIDTH ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;SETUP LINE SEQUENCE NUMBER PROCESSING, IF NEEDED COAIF4: TXNN P2,US$LSN ;WAS ANY FLAVOR OF /[NO]LSN SPECIFIED? JRST [SKIPGE T1,$FXLSI(P4) ;NO, GET OUTPUT /LSNINCREMENT, IF ANY MOVE T1,$FXLSI(P3) ;OTHERWISE USE INPUT /LSNINCREMENT MOVEM T1,S.LSN ;SET /LSN PROCESSING (IF ANY) TXZ T4,IC.LSN ;DISCARD ANY INPUT LSN(S) JRST COAIF5] ;THAT'S IT FOR LSN PROCESSING TXNN P1,US$LSN ;WAS IT /LSN OR /NOLSN? JRST [TXZ T4,IC.LSN ;DISCARD ANY INPUT LSN(S) SETOM S.LSN ;DO NOT GENERATE OUTPUT LSNS JRST COAIF5] ;AND THAT IT THAT SKIPGE T1,$FXLSI(P4) ;GET OUTPUT /LSNINCREMENT, IF ANY MOVE T1,$FXLSI(P3) ;OTHERWISE USE INPUT /LSNINCREMENT CAIG T1,0 ;WAS A GOOD INCREMENT GIVEN? MOVEI T1,AD.LSI ;NO, USE ABSENT DEFAULT MOVEM T1,S.LSN ;SET /LSN PROCESSING DMOVE T1,.FXUSW(P3) ;SPECIAL CHECK FOR INPUT SWITCH TXNN T1,US$LSN ;DID USER SPECIFY /LSN TXNN T2,US$LSN ;DID USER SPECIFY /NOLSN? CAIA ;EITHER NO /[NO]LSN OR /LSN TXZ T4,IC.LSN ;/NOLSN, SUPPRESS ANY INPUT LSN ;SETUP FREE-CRLF PROCESSING, IF NEEDED COAIF5: SKIPGE T1,$FXCRL(P4) ;GET OUTPUT /CRLF, IF ANY MOVE T1,$FXCRL(P3) ;OTHERWISE USE INPUT /CRLF CAIG T1,0 ;WANT FREE-CRLF PROCESSING? HRLOI T1,377777 ;NO, SET BOUNDRY AT INFINITY SKIPLE S.CSN ;/CSN IN EFFECT? MOVE T1,S.CSNC ;YES, THEN BREAK LINE AT CSN COLUMN MOVEM T1,S.CRLF ;SET FREE-CRLF BOUNDRY ;SETUP AUTO-CRLF PROCESSING, IF NEEDED SKIPGE T1,$FXWRA(P4) ;GET OUTPUT /WRAP, IF ANY SKIPG T1,$FXWRA(P3) ;OTHERWISE USE INPUT /WRAP JUMPLE T1,COAIF7 ;IF /WRAP TXNN P2,US$TRU ;AND NO /[NO]TRUNCATE TXO P1,US$TRU ;THEN DEFAULT /TRUNCATE ON /WRAP COAIF7: CAIG T1,0 ;WANT WORD-WRAP-CRLF PROCESSING? HRLOI T1,377777 ;NO, SET BOUNDRY AT INFINITY MOVEM T1,S.WRAP ;SET WORD-WRAP-CRLF BOUNDRY CAMLE T1,S.CRLF ;WORD-WRAP-CRLF SET LESS THAN FREE-CRLF? TLNE T1,377777 ;NO, ERROR UNLESS INFINITY JRST COAIF8 ;YES, ALL SET WARN CLW, HRLOI T1,377777 ;POSITIVE INFINITY MOVEM T1,S.WRAP ;DEFEAT /WRAP PROCESSING ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE ;SETUP NULL PROCESSING AS NEEDED COAIF8: TXNE P1,US$NUL ;WANT NULLS? TXOA T4,IC.NLC ;YES, FLAG NULLS LEGAL CHARACTERS TXZ T4,IC.NLC ;NO, CHUCK NULLS MOVEM T4,.IOIOC(CI) ;SET I/O CONTROL PROCESSING MOVE T2,P1 ;RETURN IN T2 DUE TO .SAVE4 JRST .POPJ1## ;PROCESSING VARIABLES ALL SET ;COANL - WRITE EOL/BOL (READ ) COANL: PUSHJ P,TSAV14## ;NEED TO PROTECT ALL THE ACS HERE SKIPG S.CSN ;WANT CARD SEQUENCE NUMBERS? JRST COANL2 ;NO PUSHJ P,COACS ;YES, OUTPUT THE CSN POPJ P, ;DIED COANL2: MOVEI T2,.CHCRT ;A CARRIAGE RETURN CHARACTER PUSHJ P,COAOC ;OUTPUT ONE CHARACTER PUSHJ P,NEROU ;I/O ERROR MOVEI T2,.CHLFD ;THE TRAILING LINE-FEED CHARACTER PUSHJ P,COAOC ;OUTPUT ONE MORE CHARACTER PUSHJ P,NEROU ;I/O ERROR SETZ P3, ;NOW AT BEGINING OF LINE SKIPG T3,S.LSN ;GENERATING LINE SEQUENCE NUMBERS? JRST .POPJ1## ;NO, JUST RETURN ADDB T3,ASCLSN ;YES, GET NEXT LSN MOVEI T2,.FULSN ;FUNCTION: LINE SEQ NO MOVE T1,CI ;ADDRESS OF INPUT CDB PUSHJ P,.IOFUN## ;WRITE NEW LINE SEQUENCE NUMBER POPJ P, ;DIED MOVE P3,S.TINC ;WE ARE NOW AT THE FIRST TAB STOP JRST .POPJ1## ;NOW RETURN ;COACS - WRITE OUT CARD SEQUENCE NUMBER COACS: PUSHJ P,TSAV14## ;SAVE THE T'S MOVE T4,S.CSNC ;CSN COLUMN SUB T4,P3 ;T4:=SPACES TO GO JUMPLE T4,COACS5 ;JUST ISSUE CSN IF ALREADY THERE TXNN P1,US$TAB ;USER REALLY WANT TABS? TDZA T3,T3 ;NO, USE SPACES JRST [MOVE T1,P3 ;CURRENT POSITION IDIV T1,S.TINC ;T1:=CURRENT TAB COLUMN MOVE T3,S.CSNC ;DESIRED POSITION IDIV T3,S.TINC ;T3:=DESIRED TAB COLUMN ;T4:=EXTRA SPACES NEEDED FOR CSN SUB T3,T1 ;T3:=EXTRA TABS NEEDED FOR CSN JRST .+1] ;ISSUE SPACING REQUEST PUSHJ P,COACT2 ;ISSUE TAB/SPACES AS NEEDED POPJ P, ;DIED ;AT START OF CARD SEQUENCE NUMBER FIELD, ISSUE NEXT NUMBER COACS5: MOVE T2,S.CSN ;CSCNINCREMENT VALUE ADDB T2,ASCCSN ;CALCULATE NEXT NUMBER TO ISSUE MOVE T4,S.CSNW ;PICK UP WIDTH OF CSN FIELD COACS6: IDIVI T2,^D10 ;GENERATE ANOTHER DECADE PUSH P,T3 ;SAVE LATEST DIGIT SOJLE T4,COACS8 ;LOOP FOR FULL "EIGHT" DIGITS PUSHJ P,COACS6 ;GO FOR ANOTHER DECADE JRST [POP P,T2 ;DIED, ADJUST STACK POPJ P,] ;PROPAGATE DEATH COACS8: POP P,T2 ;RETRIEVE NEXT DIGIT ADDI T2,"0" ;ASCIIZE THE DIGIT PUSHJ P,COAOC ;OUTPUT THIS CHARACTER PUSHJ P,NEROU ;I/O ERROR JRST .POPJ1## ;SUCCESSFUL RETURN ;HELPER TO COACS TO ISSUE TABS/SPACES AS NEEDED COACT0: MOVEI T2,.CHTAB ;A TAB CHARACTER PUSHJ P,COAOC ;OUTPUT ONE CHARACTER PUSHJ P,NEROU ;I/O ERROR COACT2: SOJG T3,COACT0 ;LOOP FOR ALL NEEDED TABS JUMPN T4,COASS ;ISSUE (T4) SPACES JRST .POPJ1## ;NO SPACES NEEDED ;COAOC - WRITE NEXT OUTPUT CHARACTER ;Call is: ; ; PUSHJ P,COAOC ; I/O error return ; Normal return COAOC: TXNE P1,US$TRU ;/TRUNCATE? JRST COAOA ;YES, NEED TO CHECK THINGS OUT ;COAOB - WRITE NEXT OUTPUT DATA BYTE ;Call is: ; ; PUSHJ P,COAOB ; I/O error return ; Normal return COAOB: TXNE P1,US$EBC ;WANT TO EBCDIC-ENCODE THE OUTPUT? HLRZ T2,ASCEBC(T2) ;YES, TRANSLATE (AS BEST WE CAN) INTO EBCDIC MOVE T1,CO ;ADDRESS OF OUTPUT CDB PUSHJ P,@.IOOSR(T1) ;WRITE OUT THE CHARACTER JRST COAOB3 ;I/O ERROR, SEE IF NEED TO ABORT AOJA P4,.POPJ1## ;7 MORE BITS WRITTEN OUT ;HERE ON OUTPUT ERROR, SEE IF SHOULD ABORT COAOB3: POPJ P, ;ABORT FOR NOW ;HERE TO HANDLE COAOC'S /TRUNCATED OUTPUT COAOA: SKIPE ASCSTP ;ALREADY STARTED AN OUTPUT STRING? JRST COAOA3 ;YES, APPEND THIS CHARACTER CAIE T2,.CHTAB ;NO, IS THIS A TAB? CAIN T2," " ; OR A SPACE? CAIA ;YES, NEED TO START UP AN OUTPUT STRING PJRST COAOB ;NO, JUST OUTPUT THIS BYTE ;HERE ON FIRST SPACE/TAB, NEED TO START UP AN OUTPUT STRING PUSHJ P,TSAV14## ;SAVE ALL ACS DMOVE T3,ASCOCP ;FETCH PROTOTYPE OUTPUT COUNTER/POINTER DMOVEM T3,ASCSTO ;SET NEW OUTPUT COUNTER/POINTER ;NOW ACCUMLATE THE SPACES AND/OR TABS UNTIL SOMETHING EXCITING COMES ALONG COAOA3: CAIN T2,.CHCRT ;A ? JRST [SETZM ASCSTP ;YES, FLUSH SAVED SPACES/TABS PJRST COAOB] ;AND WRITE THE DATA BYTE DIRECTLY IDPB T2,ASCSTP ;STASH AWAY THIS CHARACTER SOSG ASCSTO ;AND ACCOUNT FOR IT JRST COAOA6 ;OVERFLOWED-DUMP THE STRING OUT CAIE T2,.CHTAB ;ON ANOTHER TAB? CAIN T2," " ;OR ANOTHER SPACE? JRST .POPJ1## ;YES, JUST HOLD ONTO IT FOR NOW JRST COAOA7 ;NO, FLUSH OUT SAVED CHARACTERS ;NON-SPACE CHARACTER, NEED TO RETRIEVE THE SAVED BLANKS AND OUTPUT 'EM COAOA6: PUSHJ P,COATES ;ISSUE TOO MANY SPACES MESSAGE COAOA7: PUSHJ P,TSAV14## ;SAVE THE ACS DMOVE T3,ASCOCP ;PROTOTYPE OUTPUT COUNTER/POINTER SUB T3,ASCSTO ;T3:=COUNT OF BYTES SAVED COAOA8: ILDB T2,T4 ;NEXT SAVED OUTPUT CHARACTER PUSHJ P,COAOB ;OUTPUT IT POPJ P, ;DIED SOJG T3,COAOA8 ;LOOP FOR ALL SAVED CHARACTERS SETZM ASCSTP ;CLEAR SAVED-CHARACTERS FLAG JRST .POPJ1## ;RETURN SUCCESSFULLY COATES: WARN TES, POPJ P, ;SIMPLY RETURN SUBTTL Copy processor - ASCII character dispatch table ASCDSP: IFIW COACC ; 000 = 000 = 00 NUL Null IFIW COACC ; 001 = 001 = 01 SOH Control-A IFIW COACC ; 002 = 002 = 02 STX Control-B IFIW COACC ; 003 = 003 = 03 ETX Control-C IFIW COACC ; 004 = 004 = 04 EOT Control-D IFIW COACC ; 005 = 005 = 05 ENQ Control-E IFIW COACC ; 006 = 006 = 06 ACK Control-F IFIW COACC ; 007 = 007 = 07 BEL Control-G IFIW COABS ; 010 = 008 = 08 BS Control-H Backspace IFIW COAHT ; 011 = 009 = 09 HT Control-I Horizontal-Tab IFIW COALF ; 012 = 010 = 0A LF Control-J Line-Feed IFIW COAVT ; 013 = 011 = 0B VT Control-K Vertical-Tab IFIW COAFF ; 014 = 012 = 0C FF Control-L Form-Feed IFIW COACR ; 015 = 013 = 0D CR Control-M Carriage-Return IFIW COACC ; 016 = 014 = 0E SO Control-N IFIW COACC ; 017 = 015 = 0F SI Control-O IFIW COACC ; 020 = 016 = 10 DLE Control-P IFIW COACC ; 021 = 017 = 11 DC1 Control-Q XON IFIW COACC ; 022 = 018 = 12 DC2 Control-R IFIW COACC ; 023 = 019 = 13 DC3 Control-S XOFF IFIW COACC ; 024 = 020 = 14 DC4 Control-T IFIW COACC ; 025 = 021 = 15 NAK Control-U IFIW COACC ; 026 = 022 = 16 SYN Control-V IFIW COACC ; 027 = 023 = 17 ETB Control-W IFIW COACC ; 030 = 024 = 18 CAN Control-X IFIW COACC ; 031 = 025 = 19 EM Control-Y IFIW COACC ; 032 = 026 = 1A SUB Control-Z IFIW COACC ; 033 = 027 = 1B ESC Control-[ Escape IFIW COACC ; 034 = 028 = 1C FS Control-\ IFIW COACC ; 035 = 029 = 1D GS Control-] IFIW COACC ; 036 = 030 = 1E RS Control-^ IFIW COACC ; 037 = 031 = 1F US Control-_ ;CONTINUED ON NEXT PAGE ;ASCII CHARACTER DISPATCH TABLE (CONTINUED) IFIW COASP ; 040 = 032 = 20 Space IFIW COAPC ; 041 = 033 = 21 ! IFIW COAPC ; 042 = 034 = 22 " IFIW COAPC ; 043 = 035 = 23 # IFIW COAPC ; 044 = 036 = 24 $ IFIW COAPC ; 045 = 037 = 25 % IFIW COAPC ; 046 = 038 = 26 & IFIW COAPC ; 047 = 039 = 27 ' IFIW COAPC ; 050 = 040 = 28 ( IFIW COAPC ; 051 = 041 = 29 ) IFIW COAPC ; 052 = 042 = 2A * IFIW COAPC ; 053 = 043 = 2B + IFIW COAPC ; 054 = 044 = 2C , IFIW COAPC ; 055 = 045 = 2D - IFIW COAPC ; 056 = 046 = 2E . IFIW COAPC ; 057 = 047 = 2F / IFIW COAPC ; 060 = 048 = 30 IFIW COAPC ; 061 = 049 = 31 1 IFIW COAPC ; 062 = 050 = 32 2 IFIW COAPC ; 063 = 051 = 33 3 IFIW COAPC ; 064 = 052 = 34 4 IFIW COAPC ; 065 = 053 = 35 5 IFIW COAPC ; 066 = 054 = 36 6 IFIW COAPC ; 067 = 055 = 37 7 IFIW COAPC ; 070 = 056 = 38 8 IFIW COAPC ; 071 = 057 = 39 9 IFIW COAPC ; 072 = 058 = 3A : IFIW COAPC ; 073 = 059 = 3B ; IFIW COAPC ; 074 = 060 = 3C < IFIW COAPC ; 075 = 061 = 3D = IFIW COAPC ; 076 = 062 = 3E > IFIW COAPC ; 077 = 063 = 3F ? ;CONTINUED ON NEXT PAGE ;ASCII DISPATCH TABLE (CONTINUED) IFIW COAPC ; 100 = 064 = 40 @ IFIW COAUC ; 101 = 065 = 41 A IFIW COAUC ; 102 = 066 = 42 B IFIW COAUC ; 103 = 067 = 43 C IFIW COAUC ; 104 = 068 = 44 D IFIW COAUC ; 105 = 069 = 45 E IFIW COAUC ; 106 = 070 = 46 F IFIW COAUC ; 107 = 071 = 47 G IFIW COAUC ; 110 = 072 = 48 H IFIW COAUC ; 111 = 073 = 49 I IFIW COAUC ; 112 = 074 = 4A J IFIW COAUC ; 113 = 075 = 4B K IFIW COAUC ; 114 = 076 = 4C L IFIW COAUC ; 115 = 077 = 4D M IFIW COAUC ; 116 = 078 = 4E N IFIW COAUC ; 117 = 079 = 4F O IFIW COAUC ; 120 = 080 = 50 P IFIW COAUC ; 121 = 081 = 51 Q IFIW COAUC ; 122 = 082 = 52 R IFIW COAUC ; 123 = 083 = 53 S IFIW COAUC ; 124 = 084 = 54 T IFIW COAUC ; 125 = 085 = 55 U IFIW COAUC ; 126 = 086 = 56 V IFIW COAUC ; 127 = 087 = 57 W IFIW COAUC ; 130 = 088 = 58 X IFIW COAUC ; 131 = 089 = 59 Y IFIW COAUC ; 132 = 090 = 5A Z IFIW COAPC ; 133 = 091 = 5B [ IFIW COAPC ; 134 = 092 = 5C \ IFIW COAPC ; 135 = 093 = 5D ] IFIW COAPC ; 136 = 094 = 5E ^ IFIW COAPC ; 137 = 095 = 5F _ ;CONTINUED ON NEXT PAGE ;ASCII DISPATCH TABLE (CONTINUED) IFIW COAPC ; 140 = 096 = 60 ` IFIW COALC ; 141 = 097 = 61 a IFIW COALC ; 142 = 098 = 62 b IFIW COALC ; 143 = 099 = 63 c IFIW COALC ; 144 = 100 = 64 d IFIW COALC ; 145 = 101 = 65 e IFIW COALC ; 146 = 102 = 66 f IFIW COALC ; 147 = 103 = 67 g IFIW COALC ; 150 = 104 = 68 h IFIW COALC ; 151 = 105 = 69 i IFIW COALC ; 152 = 106 = 6A j IFIW COALC ; 153 = 107 = 6B k IFIW COALC ; 154 = 108 = 6C l IFIW COALC ; 155 = 109 = 6D m IFIW COALC ; 156 = 110 = 6E n IFIW COALC ; 157 = 111 = 6F o IFIW COALC ; 160 = 112 = 70 p IFIW COALC ; 161 = 113 = 71 q IFIW COALC ; 162 = 114 = 72 r IFIW COALC ; 163 = 115 = 73 s IFIW COALC ; 164 = 116 = 74 t IFIW COALC ; 165 = 117 = 75 u IFIW COALC ; 166 = 118 = 76 v IFIW COALC ; 167 = 119 = 77 w IFIW COALC ; 170 = 120 = 78 x IFIW COALC ; 171 = 121 = 79 y IFIW COALC ; 172 = 122 = 7A z IFIW COAPC ; 173 = 123 = 7B { IFIW COAPC ; 174 = 124 = 7C | IFIW COAPC ; 175 = 125 = 7D } IFIW COAPC ; 176 = 126 = 7E ~ IFIW COACC ; 177 = 127 = 7F DEL Control-? Delete ;CONTINUED ON NEXT PAGE ;ASCII DISPATCH TABLE (CONTINUED) ; ;THE "UPPER HALF" IS FOR NOW A DUPLICATE OF THE "LOWER HALF": IFIW COACC ; 200 = 128 = 80 NUL Null IFIW COACC ; 201 = 129 = 81 SOH Control-A IFIW COACC ; 202 = 130 = 82 STX Control-B IFIW COACC ; 203 = 131 = 83 ETX Control-C IFIW COACC ; 204 = 132 = 84 EOT Control-D IFIW COACC ; 205 = 133 = 85 ENQ Control-E IFIW COACC ; 206 = 134 = 86 ACK Control-F IFIW COACC ; 207 = 135 = 87 BEL Control-G IFIW COABS ; 210 = 136 = 88 BS Control-H Backspace IFIW COAHT ; 211 = 137 = 89 HT Control-I Horizontal-Tab IFIW COALF ; 212 = 138 = 8A LF Control-J Line-Feed IFIW COAVT ; 213 = 139 = 8B VT Control-K Vertical-Tab IFIW COAFF ; 214 = 140 = 8C FF Control-L Form-Feed IFIW COACR ; 215 = 141 = 8D CR Control-M Carriage-Return IFIW COACC ; 216 = 142 = 8E SO Control-N IFIW COACC ; 217 = 143 = 8F SI Control-O IFIW COACC ; 220 = 144 = 90 DLE Control-P IFIW COACC ; 221 = 145 = 91 DC1 Control-Q XON IFIW COACC ; 222 = 146 = 92 DC2 Control-R IFIW COACC ; 223 = 147 = 93 DC3 Control-S XOFF IFIW COACC ; 224 = 148 = 94 DC4 Control-T IFIW COACC ; 225 = 149 = 95 NAK Control-U IFIW COACC ; 226 = 150 = 96 SYN Control-V IFIW COACC ; 227 = 151 = 97 ETB Control-W IFIW COACC ; 230 = 152 = 98 CAN Control-X IFIW COACC ; 231 = 153 = 99 EM Control-Y IFIW COACC ; 232 = 154 = 9A SUB Control-Z IFIW COACC ; 233 = 155 = 9B ESC Control-[ Escape IFIW COACC ; 234 = 156 = 9C FS Control-\ IFIW COACC ; 235 = 157 = 9D GS Control-] IFIW COACC ; 236 = 158 = 9E RS Control-^ IFIW COACC ; 237 = 159 = 9F US Control-_ ;CONTINUED ON NEXT PAGE ;ASCII CHARACTER DISPATCH TABLE (CONTINUED) IFIW COASP ; 240 = 160 = A0 Space IFIW COAPC ; 241 = 161 = A1 ! IFIW COAPC ; 242 = 162 = A2 " IFIW COAPC ; 243 = 163 = A3 # IFIW COAPC ; 244 = 164 = A4 $ IFIW COAPC ; 245 = 165 = A5 % IFIW COAPC ; 246 = 166 = A6 & IFIW COAPC ; 247 = 167 = A7 ' IFIW COAPC ; 250 = 168 = A8 ( IFIW COAPC ; 251 = 169 = A9 ) IFIW COAPC ; 252 = 170 = AA * IFIW COAPC ; 253 = 171 = AB + IFIW COAPC ; 254 = 172 = AC , IFIW COAPC ; 255 = 173 = AD - IFIW COAPC ; 256 = 174 = AE . IFIW COAPC ; 257 = 175 = AF / IFIW COAPC ; 260 = 176 = B0 IFIW COAPC ; 261 = 177 = B1 1 IFIW COAPC ; 262 = 178 = B2 2 IFIW COAPC ; 263 = 179 = B3 3 IFIW COAPC ; 264 = 180 = B4 4 IFIW COAPC ; 265 = 181 = B5 5 IFIW COAPC ; 266 = 182 = B6 6 IFIW COAPC ; 267 = 183 = B7 7 IFIW COAPC ; 270 = 184 = B8 8 IFIW COAPC ; 271 = 185 = B9 9 IFIW COAPC ; 272 = 186 = BA : IFIW COAPC ; 273 = 187 = BB ; IFIW COAPC ; 274 = 188 = BC < IFIW COAPC ; 275 = 189 = BD = IFIW COAPC ; 276 = 190 = BE > IFIW COAPC ; 277 = 191 = BF ? ;CONTINUED ON NEXT PAGE ;ASCII DISPATCH TABLE (CONTINUED) IFIW COAPC ; 300 = 192 = C0 @ IFIW COAUC ; 301 = 193 = C1 A IFIW COAUC ; 302 = 194 = C2 B IFIW COAUC ; 303 = 195 = C3 C IFIW COAUC ; 304 = 196 = C4 D IFIW COAUC ; 305 = 197 = C5 E IFIW COAUC ; 306 = 198 = C6 F IFIW COAUC ; 307 = 199 = C7 G IFIW COAUC ; 310 = 200 = C8 H IFIW COAUC ; 311 = 201 = C9 I IFIW COAUC ; 312 = 202 = CA J IFIW COAUC ; 313 = 203 = CB K IFIW COAUC ; 314 = 204 = CC L IFIW COAUC ; 315 = 205 = CD M IFIW COAUC ; 316 = 206 = CE N IFIW COAUC ; 317 = 207 = CF O IFIW COAUC ; 320 = 208 = D0 P IFIW COAUC ; 321 = 209 = D1 Q IFIW COAUC ; 322 = 210 = D2 R IFIW COAUC ; 323 = 211 = D3 S IFIW COAUC ; 324 = 212 = D4 T IFIW COAUC ; 325 = 213 = D5 U IFIW COAUC ; 326 = 214 = D6 V IFIW COAUC ; 327 = 215 = D7 W IFIW COAUC ; 330 = 216 = D8 X IFIW COAUC ; 331 = 217 = D9 Y IFIW COAUC ; 332 = 218 = DA Z IFIW COAPC ; 333 = 219 = DB [ IFIW COAPC ; 334 = 220 = DC \ IFIW COAPC ; 335 = 221 = DD ] IFIW COAPC ; 336 = 222 = DE ^ IFIW COAPC ; 337 = 223 = DF _ ;CONTINUED ON NEXT PAGE ;ASCII DISPATCH TABLE (CONTINUED) IFIW COAPC ; 340 = 224 = E0 ` IFIW COALC ; 341 = 225 = E1 a IFIW COALC ; 342 = 226 = E2 b IFIW COALC ; 343 = 227 = E3 c IFIW COALC ; 344 = 228 = E4 d IFIW COALC ; 345 = 229 = E5 e IFIW COALC ; 346 = 230 = E6 f IFIW COALC ; 347 = 231 = E7 g IFIW COALC ; 350 = 232 = E8 h IFIW COALC ; 351 = 233 = E9 i IFIW COALC ; 352 = 234 = EA j IFIW COALC ; 353 = 235 = EB k IFIW COALC ; 354 = 236 = EC l IFIW COALC ; 355 = 237 = ED m IFIW COALC ; 356 = 238 = EE n IFIW COALC ; 357 = 239 = EF o IFIW COALC ; 360 = 240 = F0 p IFIW COALC ; 361 = 241 = F1 q IFIW COALC ; 362 = 242 = F2 r IFIW COALC ; 363 = 243 = F3 s IFIW COALC ; 364 = 244 = F4 t IFIW COALC ; 365 = 245 = F5 u IFIW COALC ; 366 = 246 = F6 v IFIW COALC ; 367 = 247 = F7 w IFIW COALC ; 370 = 248 = F8 x IFIW COALC ; 371 = 249 = F9 y IFIW COALC ; 372 = 250 = FA z IFIW COAPC ; 373 = 251 = FB { IFIW COAPC ; 374 = 252 = FC | IFIW COAPC ; 375 = 253 = FD } IFIW COAPC ; 376 = 254 = FE ~ IFIW COACC ; 377 = 255 = FF DEL Control-? Delete SUBTTL Copy processor - ASCII <=> EBCDIC translation table ;INDEX VIA CHARACTER: ; ; LH = EBCDIC <== ASCII ; RH = EBCDIC ==> ASCII ; ;THIS TABLE IS TAKEN FROM THE VERSION 10 COBOL/LIBOL MANUAL "DEC-10-LCPRA-B-DN1" ASCEBC: XWD 000, .CHNUL ; 000 = 000 = 00 XWD 001, "\" ; 001 = 001 = 01 XWD 002, "\" ; 002 = 002 = 02 XWD 003, "\" ; 003 = 003 = 03 XWD 067, .CHDC4 ; 004 = 004 = 04 XWD 055, .CHTAB ; 005 = 005 = 05 XWD 056, .CHCNN ; 006 = 006 = 06 XWD 057, .CHDEL ; 007 = 007 = 07 XWD 026, "\" ; 010 = 008 = 08 XWD 005, "\" ; 011 = 009 = 09 XWD 045, "\" ; 012 = 010 = 0A XWD 013, "\" ; 013 = 011 = 0B XWD 014, "\" ; 014 = 012 = 0C XWD 025, "\" ; 015 = 013 = 0D XWD 006, "\" ; 016 = 014 = 0E XWD 066, "\" ; 017 = 015 = 0F XWD 044, "\" ; 020 = 016 = 10 XWD 024, "\" ; 021 = 017 = 11 XWD 064, "\" ; 022 = 018 = 12 XWD 065, .CHCBS ; 023 = 019 = 13 XWD 004, .CHDC1 ; 024 = 020 = 14 XWD 075, .CHCRT ; 025 = 021 = 15 XWD 027, .CHCNH ; 026 = 022 = 16 XWD 046, .CHCNV ; 027 = 023 = 17 XWD 052, "\" ; 030 = 024 = 18 XWD 031, .CHCNY ; 031 = 025 = 19 XWD 032, "\" ; 032 = 026 = 1A XWD 047, "\" ; 033 = 027 = 1B XWD 023, "\" ; 034 = 028 = 1C XWD 041, "\" ; 035 = 029 = 1D XWD 040, "\" ; 036 = 030 = 1E XWD 042, "\" ; 037 = 031 = 1F ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 100, .CHCCF ; 040 = 032 = 20 XWD 132, .CHCRB ; 041 = 033 = 21 XWD 177, .CHCUN ; 042 = 034 = 22 XWD 173, "\" ; 043 = 035 = 23 XWD 133, .CHDLE ; 044 = 036 = 24 XWD 154, .CHLFD ; 045 = 037 = 25 XWD 120, .CHCNW ; 046 = 038 = 26 XWD 175, .CHESC ; 047 = 039 = 27 XWD 115, "\" ; 050 = 040 = 28 XWD 135, "\" ; 051 = 041 = 29 XWD 134, .CHCNX ; 052 = 042 = 2A XWD 116, "\" ; 053 = 043 = 2B XWD 153, "\" ; 054 = 044 = 2C XWD 140, .CHCNE ; 055 = 045 = 2D XWD 113, .CHCNF ; 056 = 046 = 2E XWD 141, .CHBEL ; 057 = 047 = 2F XWD 360, "\" ; 060 = 048 = 30 XWD 361, "\" ; 061 = 049 = 31 XWD 362, "\" ; 062 = 050 = 32 XWD 263, "\" ; 063 = 051 = 33 XWD 364, .CHDC2 ; 064 = 052 = 34 XWD 365, .CHDC3 ; 065 = 053 = 35 XWD 366, .CHCNO ; 066 = 054 = 36 XWD 367, .CHCND ; 067 = 055 = 37 XWD 370, "\" ; 070 = 056 = 38 XWD 371, "\" ; 071 = 057 = 39 XWD 172, "\" ; 072 = 058 = 3A XWD 136, "\" ; 073 = 059 = 3B XWD 114, "\" ; 074 = 060 = 3C XWD 176, .CHCNU ; 075 = 061 = 3D XWD 156, "\" ; 076 = 062 = 3E XWD 157, "\" ; 077 = 063 = 3F ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 174, " " ; 100 = 064 = 40 XWD 301, "\" ; 101 = 065 = 41 XWD 302, "\" ; 102 = 066 = 42 XWD 303, "\" ; 103 = 067 = 43 XWD 304, "\" ; 104 = 068 = 44 XWD 305, "\" ; 105 = 069 = 45 XWD 306, "\" ; 106 = 070 = 46 XWD 307, "\" ; 107 = 071 = 47 XWD 310, "\" ; 110 = 072 = 48 XWD 311, "\" ; 111 = 073 = 49 XWD 321, "\" ; 112 = 074 = 4A XWD 322, "." ; 113 = 075 = 4B XWD 323, "<" ; 114 = 076 = 4C XWD 324, "(" ; 115 = 077 = 4D XWD 325, "+" ; 116 = 078 = 4E XWD 326, "|" ; 117 = 079 = 4F XWD 327, "&" ; 120 = 080 = 50 XWD 330, "\" ; 121 = 081 = 51 XWD 331, "\" ; 122 = 082 = 52 XWD 342, "\" ; 123 = 083 = 53 XWD 343, "\" ; 124 = 084 = 54 XWD 344, "\" ; 125 = 085 = 55 XWD 345, "\" ; 126 = 086 = 56 XWD 346, "\" ; 127 = 087 = 57 XWD 347, "\" ; 130 = 088 = 58 XWD 350, "\" ; 131 = 089 = 59 XWD 351, "!" ; 132 = 090 = 5A XWD 340, "$" ; 133 = 091 = 5B XWD 155, "*" ; 134 = 092 = 5C XWD 320, ")" ; 135 = 093 = 5D XWD 117, ";" ; 136 = 094 = 5E XWD 155, "\" ; 137 = 095 = 5F ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 174, "-" ; 140 = 096 = 60 XWD 201, "/" ; 141 = 097 = 61 XWD 202, "\" ; 142 = 098 = 62 XWD 203, "\" ; 143 = 099 = 63 XWD 204, "\" ; 144 = 100 = 64 XWD 205, "\" ; 145 = 101 = 65 XWD 206, "\" ; 146 = 102 = 66 XWD 207, "\" ; 147 = 103 = 67 XWD 210, "\" ; 150 = 104 = 68 XWD 211, "\" ; 151 = 105 = 69 XWD 221, "\" ; 152 = 106 = 6A XWD 222, "," ; 153 = 107 = 6B XWD 223, "%" ; 154 = 108 = 6C XWD 224, "_" ; 155 = 109 = 6D XWD 225, ">" ; 156 = 110 = 6E XWD 226, "?" ; 157 = 111 = 6F XWD 227, "\" ; 160 = 112 = 70 XWD 230, "\" ; 161 = 113 = 71 XWD 231, "\" ; 162 = 114 = 72 XWD 242, "\" ; 163 = 115 = 73 XWD 243, "\" ; 164 = 116 = 74 XWD 244, "\" ; 165 = 117 = 75 XWD 245, "\" ; 166 = 118 = 76 XWD 246, "\" ; 167 = 119 = 77 XWD 247, "\" ; 170 = 120 = 78 XWD 250, "\" ; 171 = 121 = 79 XWD 251, ":" ; 172 = 122 = 7A XWD 300, "#" ; 173 = 123 = 7B XWD 117, "@" ; 174 = 124 = 7C XWD 260, "'" ; 175 = 125 = 7D XWD 155, "=" ; 176 = 126 = 7E XWD 007, """" ; 177 = 127 = 7F ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 000, "\" ; 200 = 128 = 80 XWD 001, "a" ; 201 = 129 = 81 XWD 002, "b" ; 202 = 130 = 82 XWD 003, "c" ; 203 = 131 = 83 XWD 067, "d" ; 204 = 132 = 84 XWD 055, "e" ; 205 = 133 = 85 XWD 056, "f" ; 206 = 134 = 86 XWD 057, "g" ; 207 = 135 = 87 XWD 026, "h" ; 210 = 136 = 88 XWD 005, "i" ; 211 = 137 = 89 XWD 045, "\" ; 212 = 138 = 8A XWD 013, "\" ; 213 = 139 = 8B XWD 014, "\" ; 214 = 140 = 8C XWD 025, "\" ; 215 = 141 = 8D XWD 006, "\" ; 216 = 142 = 8E XWD 066, "\" ; 217 = 143 = 8F XWD 044, "\" ; 220 = 144 = 90 XWD 024, "j" ; 221 = 145 = 91 XWD 064, "k" ; 222 = 146 = 92 XWD 065, "l" ; 223 = 147 = 93 XWD 004, "m" ; 224 = 148 = 94 XWD 075, "n" ; 225 = 149 = 95 XWD 027, "o" ; 226 = 150 = 96 XWD 046, "p" ; 227 = 151 = 97 XWD 052, "q" ; 230 = 152 = 98 XWD 031, "r" ; 231 = 153 = 99 XWD 032, "\" ; 232 = 154 = 9A XWD 047, "\" ; 233 = 155 = 9B XWD 023, "\" ; 234 = 156 = 9C XWD 041, "\" ; 235 = 157 = 9D XWD 040, "\" ; 236 = 158 = 9E XWD 042, "\" ; 237 = 159 = 9F ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 100, "\" ; 240 = 160 = A0 XWD 132, "\" ; 241 = 161 = A1 XWD 177, "s" ; 242 = 162 = A2 XWD 173, "t" ; 243 = 163 = A3 XWD 133, "u" ; 244 = 164 = A4 XWD 154, "v" ; 245 = 165 = A5 XWD 120, "w" ; 246 = 166 = A6 XWD 175, "x" ; 247 = 167 = A7 XWD 115, "y" ; 250 = 168 = A8 XWD 135, "z" ; 251 = 169 = A9 XWD 134, "\" ; 252 = 170 = AA XWD 116, "\" ; 253 = 171 = AB XWD 153, "\" ; 254 = 172 = AC XWD 140, "\" ; 255 = 173 = AD XWD 113, "\" ; 256 = 174 = AE XWD 141, "\" ; 257 = 175 = AF XWD 360, "}" ; 260 = 176 = B0 XWD 361, "\" ; 261 = 177 = B1 XWD 362, "\" ; 262 = 178 = B2 XWD 363, "\" ; 263 = 179 = B3 XWD 364, "\" ; 264 = 180 = B4 XWD 465, "\" ; 265 = 181 = B5 XWD 366, "\" ; 266 = 182 = B6 XWD 367, "\" ; 267 = 183 = B7 XWD 370, "\" ; 270 = 184 = B8 XWD 371, "\" ; 271 = 185 = B9 XWD 172, "\" ; 272 = 186 = BA XWD 136, "\" ; 273 = 187 = BB XWD 114, "\" ; 274 = 188 = BC XWD 176, "\" ; 275 = 189 = BD XWD 156, "\" ; 276 = 190 = BE XWD 157, "\" ; 277 = 191 = BF ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 174, "{" ; 300 = 192 = C0 XWD 301, "A" ; 301 = 193 = C1 XWD 302, "B" ; 302 = 194 = C2 XWD 303, "C" ; 303 = 195 = C3 XWD 304, "D" ; 304 = 196 = C4 XWD 305, "E" ; 305 = 197 = C5 XWD 306, "F" ; 306 = 198 = C6 XWD 307, "G" ; 307 = 199 = C7 XWD 310, "H" ; 310 = 200 = C8 XWD 311, "I" ; 311 = 201 = C9 XWD 321, "\" ; 312 = 202 = CA XWD 322, "\" ; 313 = 203 = CB XWD 323, "\" ; 314 = 204 = CC XWD 324, "\" ; 315 = 205 = CD XWD 324, "\" ; 316 = 206 = CE XWD 326, "\" ; 317 = 207 = CF XWD 327, "]" ; 320 = 208 = D0 XWD 330, "J" ; 321 = 209 = D1 XWD 331, "K" ; 322 = 210 = D2 XWD 342, "L" ; 323 = 211 = D3 XWD 343, "M" ; 324 = 212 = D4 XWD 344, "N" ; 325 = 213 = D5 XWD 345, "O" ; 326 = 214 = D6 XWD 346, "P" ; 327 = 215 = D7 XWD 347, "Q" ; 330 = 216 = D8 XWD 350, "R" ; 331 = 217 = D9 XWD 351, "\" ; 332 = 218 = DA XWD 340, "\" ; 333 = 219 = DB XWD 155, "\" ; 334 = 220 = DC XWD 320, "\" ; 335 = 221 = DD XWD 117, "\" ; 336 = 222 = DE XWD 155, "\" ; 337 = 223 = DF ;CONTINUED ON NEXT PAGE ;ASCII <=> EBCDIC TRANSLATION TABLE (CONTINUED) XWD 174, "[" ; 340 = 224 = E0 XWD 201, "\" ; 341 = 225 = E1 XWD 202, "S" ; 342 = 226 = E2 XWD 203, "T" ; 343 = 227 = E3 XWD 204, "U" ; 344 = 228 = E4 XWD 205, "V" ; 345 = 229 = E5 XWD 206, "W" ; 346 = 230 = E6 XWD 207, "X" ; 347 = 231 = E7 XWD 210, "Y" ; 350 = 232 = E8 XWD 211, "Z" ; 351 = 233 = E9 XWD 221, "\" ; 352 = 234 = EA XWD 222, "\" ; 353 = 235 = EB XWD 223, "\" ; 354 = 236 = EC XWD 224, "\" ; 355 = 237 = ED XWD 225, "\" ; 356 = 238 = EE XWD 226, "\" ; 357 = 239 = EF XWD 227, "0" ; 360 = 240 = F0 XWD 230, "1" ; 361 = 241 = F1 XWD 231, "2" ; 362 = 242 = F2 XWD 242, "3" ; 363 = 243 = F3 XWD 243, "4" ; 364 = 244 = F4 XWD 244, "5" ; 365 = 245 = F5 XWD 245, "6" ; 366 = 246 = F6 XWD 246, "7" ; 367 = 247 = F7 XWD 247, "8" ; 370 = 248 = F8 XWD 250, "9" ; 371 = 249 = F9 XWD 251, "\" ; 372 = 250 = FA XWD 300, "\" ; 373 = 251 = FB XWD 117, "\" ; 374 = 252 = FC XWD 260, "\" ; 375 = 253 = FD XWD 155, "\" ; 376 = 254 = FE XWD 007, "\" ; 377 = 255 = FF SUBTTL Copy processor - "Byte-At-A-Time" processing COB: PUSHJ P,COBIF ;SETUP PROCESSING PARAMETERS, ETC. STOPCD ;CAN'T HAPPEN MOVE P1,T2 ;POSITION SWITCH MASK PUSHJ P,COBYT ;DO THE GRUNDGE POPJ P, ;PROPAGATE FAILURE JRST .POPJ1## ;SUCCESSFUL ;COBYT - BYTE-AT-A-TIME PROCESSOR LOOP COBYT: MOVE T1,CI ;ADDRESS OF INPUT CDB PUSHJ P,@.IOISR(T1) ;GET NEXT INPUT DATA BYTE JRST COBIE ;CHECK OUT EXCEPTION RETURN ;HERE WITH NEXT VALID DATA BYTE COBYT5: MOVE T1,CO ;ADDRESS OF OUTPUT CDB PUSHJ P,@.IOOSR(T1) ;CALL OUTPUT SERVICE ROUTINE PUSHJ P,NEROU ;I/O ERROR AOJA P4,COBYT ;COUNT BYTES SUCCESSFULLY OUTPUT ;CAN'T READ INPUT DATA, SEE WHY COBIE: CAIE M0,$EIEOF ;END OF FILE? JRST COBIE7 ;NO, I/O ERROR TXNN P1,US$CON ;YES, CONCATENATING INPUT FILES? JRST COBYE ;NO, RETURN END OF FILE COBIE1: PUSHJ P,.NXTFC## ;YES, GO OPEN NEXT CONCATENATED INPUT FILE JRST COBIE3 ;SEE ABOUT FAILURE JRST COBYT ;GO GET FIRST DATA BYTE OF NEXT FILE COBIE3: CAIN M0,$EFIXN ;INPUT STREAM EXHAUSTED? JRST [MOVEI M0,$EIEOF ;YES, TIME FOR "END-OF-FILE" RETURN JRST COBYE] ;RETURN END OF FILE PUSHJ P,NERFAE ;HANDLE FILE ACCESS ERROR JRST COBYE ;ABORT ON ERROR (TAKE EOF RETURN) JRST COBIE1 ;CONTINUE ON ERROR ;ISSUE I/O ERROR MESSAGE JRST COBYT ;I/O ERROR RETRY COBIE7: PUSHJ P,NERIN ;ISSUE INPUT I/O ERROR MESSAGE JRST COBYT5 ;I/O ERROR IGNORE/CONTINUE ;HERE ON INPUT EOF COBYE: CAIN M0,$EIEOF ;EOF CODE? AOS (P) ;YES, SUCCESSFUL COPY POPJ P, ;RETURN AS INDICATED ;COBIF - SETUP BINARY CONTROL-PROCESSING BASED ON OUTPUT AND INPUT SWITCHES ; ;Returns US$--- switch processing flags in T2. COBIF: PUSHJ P,.SAVE4## ;NEED SOME ACS HERE MOVE P3,.IOFSB(CI) ;ADDRESS OF INPUT FILE SPEC BLOCK MOVE P4,.IOFSB(CO) ;ADDRESS OF OUTPUT FILE SPEC BLOCK DMOVE P1,.FXUSW(P4) ;OUTPUT "USER" (FILE) SWITCHES DMOVE T3,.FXUSW(P3) ;INPUT "USER" SWITCHES TDZ T3,P2 ;OUTPUT SWITCHES TAKE PRECEDENCE OVER INPUT TXZE T3,US$EBC ;/EBCDIC ON INPUT? TXO T3,US$EBI ;YES, REPOSITION INPUT SIDE IOR P1,T3 ;MERGE OUTPUT WITH INPUT SWITCHES IOR P2,T4 ;MERGE SWITCH MASK TOO ;NOW SET UP DEFAULTS/ETC. MOVE T2,P1 ;RETURN IN T2 DUE TO .SAVE4 MOVX P1,IC.LSN ;I/O CONTROL LSN FLAG ANDCAM P1,.IOIOC(CI) ;DISCARD INPUT LSN'S, IF ANY ENCOUNTERED JRST .POPJ1## ;SUCCESSFUL RETURN SUBTTL Copy processor - fast disk-to-disk processing COD: JRST COB ;HOHUM SUBTTL Copy processor - fast tape-to-tape processing COM: JRST COB ;HOHUM SUBTTL Copy processor - quick buffered-mode processing COQ: JRST COB ;HOHUM SUBTTL Copy processor - record-formatted I/O processor COR: PUSHJ P,COBIF ;SETUP PROCESSING PARAMETERS, ETC. STOPCD ;CAN'T HAPPEN MOVE P1,T2 ;POSITION SWITCH MASK MOVE T1,.IORSZ(CI) ;GET INPUT RECORD SIZE CAMGE T1,.IORSZ(CO) ;IS OUTPUT BIGGER? MOVE T1,.IORSZ(CO) ;YES, USE OUTPUT RECORD SIZE THEN CAIG T1,0 ;GOT A RECORD SIZE? MOVEI T1,1234 ;NO, HALLUCINATE ONE THEN MOVEM T1,RSIBT3 ;SAVE FOR ISR CALLS ADDI T1,3 ;*** 8-BIT BYTES LSH T1,-2 ;*** 8-BIT BYTES PUSHJ P,.MMGWD## ;ALLOCATE A RECORD-BUFFER POPJ P, ;NO MEMORY DMOVEM T1,RSIBFA ;SAVE THE PAIR HRLI T2,(POINT 8,) ;CONCOCT A RECORD-BUFFER BYTE POINTER MOVEM T2,RSIBT4 ;SAVE FOR ISR CALLS SETZ T1, ;CLEAN SLATE COR003: LDB T2,[POINTR .IOIOC(CI),IC.RFM] ;INPUT RECORD FORMAT (IF ANY) CAIE T2,.ICRFU ;IF NO RECORD FORMAT CAIN T2,.ICRF3 ;OR 36PACK'ED PDP-10 WORDS JRST COR004 ;THEN INPUT NOT "RECORD-STRUCTURED" I/O IORI T1,1 ;NOTE INPUT RECORD FORMATTED MOVX T2,IC.RSI ;SELECT RECORD-STRUCTURED-I/O IORM T2,.IOIOC(CI) ;AND SET IN CDB FOR .IOIIN COR004: LDB T2,[POINTR .IOIOC(CO),IC.RFM] ;OUTPUT RECORD FORMAT (IF ANY) CAIE T2,.ICRFU ;IF NO RECORD FORMAT CAIN T2,.ICRF3 ;OF 36PACK'ED PDP-10 WORDS JRST COR005 ;THEN OUTPUT NOT "RECORD-STRUCTURED" I/O IORI T1,2 ;NOTE OUTPUT RECORD FORMATTED MOVX T2,IC.RSI ;SELECT RECORD-STRUCTURED-I/O IORM T2,.IOIOC(CO) ;AND SET IN THE CDB FOR .IOOIN COR005: PUSHJ P,@[IFIW CORXX ;NO RECORD-STRUCTURE? IFIW CORIX ;INPUT-ONLY IFIW COROX ;OUTPUT-ONLY IFIW CORSI](T1) ;INPUT AND OUTPUT RECORD-FORMATTED TDZA P1,P1 ;FLAG FILE COPY FAILED MOVEI P1,1 ;FLAG FILE COPY SUCCEEDED DMOVE T1,RSIBFA ;GET RECORD BUFFER PUSHJ P,.MMFWD## ;AND FREE UP THE MEMORY JFCL ;??? SETZM RSIBFA ;NOTE NO MORE RECORD BUFFER ALLOCATION ADDM P1,0(P) ;INDICATE APPROPRIATE RETURN POPJ P, ;AND TAKE IT ;NO RECORD-STRUCTURE???? CORXX: STOPCD COROX: ERROR CRO, ;CORIX - INPUT RECORD-FORMATTED, OUTPUT BYTE-ORIENTED CORIX: MOVE T1,CI ;ADDRESS OF INPUT CDB SETO T2, ;IGNORE RECORD "ADDRESS" DMOVE T3,RSIBT3 ;T3 GETS RECORD COUNT, T4 RECORD POINTER PUSHJ P,@.IOISR(T1) ;GET NEXT INPUT RECORD JRST CORIE ;CHECK OUT EXCEPTION RETURN ;HERE WITH NEXT VALID DATA RECORD, LOOP OUTPUTTING INDIVIDUAL BYTES CORIX5: MOVE T1,CO ;ADDRESS OF OUTPUT CDB JUMPE T3,CORIX ;IGNORE NULL RECORDS CORIX6: ILDB T2,T4 ;NEXT DATA BYTE PUSHJ P,@.IOOSR(T1) ;CALL OUTPUT SERVICE ROUTINE PUSHJ P,NEROU ;I/O ERROR ADDI P4,1 ;COUNT BYTES SUCCESSFULLY OUTPUT SOJG T3,CORIX6 ;[20] LOOP FOR ALL BYTES WITHIN RECORD JRST CORIX ;LOOP FOR ALL RECORDS WITHIN FILE ;CAN'T READ INPUT DATA, SEE WHY CORIE: CAIE M0,$EIEOF ;END OF FILE? JRST CORIE7 ;NO, I/O ERROR TXNN P1,US$CON ;YES, CONCATENATING INPUT FILES? JRST CORIE9 ;NO, RETURN END OF FILE CORIE1: PUSHJ P,.NXTFC## ;YES, GO OPEN NEXT CONCATENATED INPUT FILE JRST CORIE3 ;SEE ABOUT FAILURE JRST CORIX ;GO GET FIRST DATA RECORD OF NEXT FILE CORIE3: CAIN M0,$EFIXN ;INPUT STREAM EXHAUSTED? JRST [MOVEI M0,$EIEOF ;YES, TIME FOR "END-OF-FILE" RETURN JRST CORIE9] ;RETURN END OF FILE PUSHJ P,NERFAE ;HANDLE FILE ACCESS ERROR JRST CORIE9 ;ABORT ON ERROR (TAKE EOF RETURN) JRST CORIE1 ;CONTINUE ON ERROR ;ISSUE I/O ERROR MESSAGE JRST CORIX ;I/O ERROR RETRY CORIE7: PUSHJ P,NERIN ;ISSUE INPUT I/O ERROR MESSAGE JRST CORIX ;I/O ERROR IGNORE/CONTINUE ;HERE ON INPUT EOF CORIE9: CAIN M0,$EIEOF ;EOF CODE? AOS (P) ;YES, SUCCESSFUL COPY POPJ P, ;RETURN AS INDICATED ;CORSI - RECORD-AT-A-TIME PROCESSOR LOOP CORSI: MOVE T1,CI ;ADDRESS OF INPUT CDB SETO T2, ;IGNORE RECORD "ADDRESS" DMOVE T3,RSIBT3 ;T3 GETS RECORD COUNT, T4 RECORD POINTER PUSHJ P,@.IOISR(T1) ;GET NEXT INPUT RECORD JRST CORSE ;CHECK OUT EXCEPTION RETURN ;HERE WITH NEXT VALID DATA RECORD CORSI5: MOVE T1,CO ;ADDRESS OF OUTPUT CDB MOVE P3,T3 ;COUNT OF BYTES CONTAINED WITHIN RECORD PUSHJ P,@.IOOSR(T1) ;CALL OUTPUT SERVICE ROUTINE PUSHJ P,NEROU ;I/O ERROR ADD P4,P3 ;COUNT BYTES SUCCESSFULLY OUTPUT JRST CORSI ;LOOP BACK FOR REST OF FILE ;CAN'T READ INPUT DATA, SEE WHY CORSE: CAIE M0,$EIEOF ;END OF FILE? JRST CORSE7 ;NO, I/O ERROR TXNN P1,US$CON ;YES, CONCATENATING INPUT FILES? JRST CORSE9 ;NO, RETURN END OF FILE CORSE1: PUSHJ P,.NXTFC## ;YES, GO OPEN NEXT CONCATENATED INPUT FILE JRST CORSE3 ;SEE ABOUT FAILURE JRST CORSI ;GO GET FIRST DATA RECORD OF NEXT FILE CORSE3: CAIN M0,$EFIXN ;INPUT STREAM EXHAUSTED? JRST [MOVEI M0,$EIEOF ;YES, TIME FOR "END-OF-FILE" RETURN JRST CORSE9] ;RETURN END OF FILE PUSHJ P,NERFAE ;HANDLE FILE ACCESS ERROR JRST CORSE9 ;ABORT ON ERROR (TAKE EOF RETURN) JRST CORSE1 ;CONTINUE ON ERROR ;ISSUE I/O ERROR MESSAGE JRST CORSI ;I/O ERROR RETRY CORSE7: PUSHJ P,NERIN ;ISSUE INPUT I/O ERROR MESSAGE JRST CORSI5 ;I/O ERROR IGNORE/CONTINUE ;HERE ON INPUT EOF CORSE9: CAIN M0,$EIEOF ;EOF CODE? AOS (P) ;YES, SUCCESSFUL COPY POPJ P, ;RETURN AS INDICATED SUBTTL Error routines - File access level ;NERFAE -- TYPE FILE ACCESS ERROR MESSAGE NERFAE: AOS ERRORS## ;COUNT UP ERRORS MOVEI T1,CDBLI## ;*** ADDRESS OF INPUT CDB PUSHJ P,.ERPIN## ;TYPE OUT FILE ACCESS ERROR MESSAGE PJRST ONERCK## ;WANT TO ABORT COMMAND ON ERROR? ;NERFAB -- ABORT INPUT AND OUTPUT FILES NERFAB: MOVEI T1,CDBLO## ;FOR THE TIME BEING, PUSHJ P,.IOABO## ;SO DOES THE OUTPUT FILE JFCL ;HO HUM NERFAI: MOVEI T1,CDBLI## ;IN ANY EVENT, THE INPUT FILE PUSHJ P,.IOABO## ;GETS ABORTED JFCL ;HO HUM POPJ P, ;NON-SKIP ALWAYS SUBTTL Error routines - File I/O level ;NERIN -- ERROR IN INPUT FILE ; ;IF NOT A FATAL I/O ERROR THE CALLER WILL BE RE-EXECUTED NERIN: PUSHJ P,NEMIN ;ISSUE MESSAGE JRST NERAB ;ABORT TRANSFER JRST NERCC ;CONTINUE TRANSFER ;DO THE WORK OF NERIN NEMIN: AOS ERRORS## ;COUNT UP I/O ERRORS PUSHJ P,.ERISR## ;ISSUE INPUT SERVICE ERROR MESSAGE PJRST NEMAC ;SEE IF ABORT OR CONTINUE ;NEROU -- ERROR IN OUTPUT FILE ; ;IF NOT A FATAL I/O ERROR THE CALLER WILL BE RE-EXECUTED NEROU: PUSHJ P,NEMOU ;ISSUE MESSAGE JRST NERAB ;ABORT TRANSFER JRST NERCC ;CONTINUE TRANSFER ;DO THE WORK OF NEROU NEMOU: AOS ERRORS## ;COUNT UP I/O ERRORS PUSHJ P,.EROSR## ;ISSUE OUTPUT SERVICE ERROR MESSAGE PJRST NEMAC ;SEE IF ABORT OR CONTINUE ;NERLS -- ERROR WRITING LSN TO OUTPUT FILE ; ;IF NOT A FATAL I/O ERROR THE CALLER WILL BE RE-EXECUTED NERLS: PUSHJ P,NEMLS ;ISSUE MESSAGE JRST NERAB ;ABORT TRANSFER POPJ P, ;CONTINUED TRANSFER ;DO THE WORK OF NERLS NEMLS: AOS ERRORS## ;COUNT UP ERRORS PUSHJ P,.EROSR## ;ISSUE OUTPUT SERVICE ERROR MESSAGE PJRST NEMAC ;SEE IF CONTINUE OR ABORT ;NERCL - ERROR CLOSING OUTPUT FILE NERCL: PUSHJ P,NEMCL ;ISSUE MESSAGE POPJ P, ;ABORT RETURN JRST .POPJ1## ;SUCCESSFUL RETURN ;DO THE WORK OF NERCL NEMCL: AOS ERRORS## ;COUNT UP ERRORS CAIN M0,$EICKE ;REMOTE CHECKSUM FAILURE? JRST NEMCK ;YES, DIFFERENT PUSHJ P,ONERCK## ;NO, I/O ERROR, WANT TO ABORT? ERROR OCF, WARN OCW, JRST .POPJ1## ;HERE ON REMOTE-DETECTED CHECKSUM ERROR NEMCK: PUSHJ P,.EROSR## ;ISSUE OUTPUT ERROR MESSAGE JRST .POPJ1## ;DO THE CLOSE SANS CHECKSUM ;HELPERS TO NERIN/NEROU ;NEMAC - SEE IF ABORT OR CONTINUE ON ERROR NEMAC: POPJ P, ;ABORT (CONTINUE NOT YET WRITTEN) ;NEIEC - DO I/O ERROR RECOVERY SO CAN CONTINUE NEIEC: MOVE T1,-T1(P) ;RETRIEVE SAFE COPY OF CDB ADDRESS MOVE T2,.IOCCF(T1) ;COPY OF CHANNEL CONTROL TXNN T2,IO.OPN ;STILL GOT A FILE OPEN? ERROR IEA, MOVEI T2,.FUIEC ;FUNCTION: I/O ERROR CONTINUATION PUSHJ P,.IOFUN## ;TRY TO CONTINUE ERROR IEC, JRST .POPJ1## ;CONTINUE THE TRANSFER ;HERE TO TAKE I/O ABORT RETURN NERAB: POP P,0(P) ;KILL OUR CALLER POPJ P, ;AND TAKE HIS ERROR RETURN ;HERE TO TAKE I/O CONTINUE RETURN NERCC: SOS 0(P) ;BACKUP CALLER'S PC POPJ P, ;RE-EXECUTE CALLER'S I/O CALL SUBTTL DDCVFY helper for "D" class commands ;DDCVFY IS USED BY THE "D" CLASS COMMANDS ("DDELETE, DDIRECTORY, ETC.) ;TO VERIFY THAT THE COMMAND REQUESTED CAN BE READILY ASSIMILATED BY ;GOOD OLE CRUFTY DAP DDCVFY: MOVE T1,SIFIR## ;GET FIRST INPUT SPEC CAME T1,SILAS## ;EXACTLY ONE SPEC SUPPLIED? JRST DDCVE1 ;NOPE SKIPN T2,.FXNOD(T1) ;DOES THE SINGULAR INPUT SPEC HAVE A NODE? JRST DDCVE2 ;NOPE ;RDH CAMN T2,.MYNOD## ;YES, DOES IT POINT TO A REMOTE NODE? ;RDH JRST DDCVE3 ;NOPE JRST .POPJ1## ;LOOKS LIKE IT MIGHT WORK DDCVE1: ERROR DD1, DDCVE2: ERROR DD2, DDCVE3: ERROR DD3, ;DAP-MODE EXECUTION ERRORS DDCERM: CAIN M0,$EFRNR ;NO REMOTE RENAME SUPPORT? ERROR RNR, CAIN M0,$EFRND ;NO REMOTE DELETE? ERROR RND, CAIN M0,$EFRNX ;NO REMOTE EXECUTE? ERROR RNX, CAIN M0,$EFRNL ;NO REMOTE DIRECTORY LIST? ERROR RNL, CAIN M0,$EFRNW ;NO REMOTE WILDCARDS? ERROR RNW, CAIN M0,$EFRNG ;NO GO/NOGO SUPPORT? ERROR RNG, CAIN M0,$EFRNC ;NO REMOTE FILE CONSTRAINT? ERROR RNC, CAIN M0,$EFRNS ;REMOTE NO SUPPORT? ERROR RNS, ERROR DCF,,.TOCTW##,M0 SUBTTL Variables - Miscellaneous XLIST ;THE LITERALS LIT ;THE LITERALS LIST ;EVERYTHING AFTER THE LITERALS RELOC 0 ;"VARIABLES" GO INTO THE LOW SEG TOTBSZ: BLOCK 1 ;SAVED BYTESIZE FOR TOTALS CALCULATION ;NIPFSB: BLOCK .FXMAX ;FILE SPEC BLOCK FOR /INITFILE SUBTTL Variables - NETWORK command NETNOD: BLOCK 1 ;SCRATCH LAST NODE NAME USED NETFSB: BLOCK .FXMAX ;SCRATCH FILE SPEC BLOCK FOR NETWORK COMMAND SUBTTL Variables - SET DEFAULT command SDFFIR: BLOCK 1 ;FIRST DEFAULT SPEC SDFLAS: BLOCK 1 ;LAST DEFAULT SPEC IN CHAIN SDFMAS: BLOCK 1 ;MASTER DEFAULT SPEC SUBTTL Variables - Copy processor, ASCII mode ;ASCII copy loop data S.CSN: BLOCK 1 ;.GT. 0 THEN DOING CARD SEQUENCE NUMBERS S.CSNC: BLOCK 1 ;CARD SEQUENCE NUMBER COLUMN S.CSNW: BLOCK 1 ;CARD SEQUENCE NUMBER WIDTH S.LSN: BLOCK 1 ;.GT. 0 THEN DOING LINE SEQUENCE NUMBERS S.CRLF: BLOCK 1 ;FREE-CRLF BOUNDRY S.TINC: BLOCK 1 ;TAB SIZE INCREMENT S.WRAP: BLOCK 1 ;WORD-WRAP-CRLF BOUNDRY ASCHAL: BLOCK 1 ;ASCII CHARACTER SAVED BY COALS ASCHAR: BLOCK 1 ;ASCII CHARACTER TO BE SEEN NEXT ASCCSN: BLOCK 1 ;CARD SEQUENCE NUMBER ASCLSN: BLOCK 1 ;LINE SEQUENCE NUMBER ASCICP: BLOCK 2 ;PROTOTYPE INPUT SAVED COUNTER/POINTER PAIR ASCOCP: BLOCK 2 ;PROTOTYPE OUTPUT SAVED COUNTER/POINTER PAIR ASCSTI: BLOCK 1 ;INPUT SAVED BYTE COUNT ASCSTJ: BLOCK 1 ;INPUT SAVED BYTE POINTER ASCSTK: BLOCK 1 ;INPUT SAVED STATUS ASCSTO: BLOCK 1 ;OUTPUT SAVED BYTE COUNT ASCSTP: BLOCK 1 ;OUTPUT SAVED BYTE POINTER ASCICB: BLOCK <$SZRSZ+4>/5 ;*** INPUT SPACE COMPRESSION BUFFER ASCOCB: BLOCK <$SZRSZ+4>/5 ;*** OUTPUT SPACE COMPRESSION BUFFER SUBTTL Variables - Copy processor, binary/record-structured mode RSIBFA: BLOCK 2 ;LENGTH, ADDRESS OF RECORD BUFFER RSIBT3: BLOCK 1 ;BYTE COUNT (T3) FOR ISR RSIBT4: BLOCK 1 ;BYTE POINTER (T4) FOR ISR END