Trailing-Edge
-
PDP-10 Archives
-
BB-X116A-BB_1984
-
nip.mac
There are 8 other files named nip.mac in the archive. Click here to see a list.
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.
COMMENT \
NIP -- NFT "Network Interchange Program" module
Copyright (C) 1984
Digital Equipment Corporation, Maynard, Massachusetts, U.S.A.
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 copyright notice. This software or any other copies thereof may not
be provided or otherwise made available to any other person. No title to
and ownership of the 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
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,<Make new copy(s) of extant file(s)>
CM DDELET,DDEL,<DAP-mode DELETE command>
CM DDIREC,DDIR,<DAP-mode DIRECT command>
CM DRENAM,DREN,<DAP-mode RENAME command>
CM DSUBMI,DSBM,<DAP-mode SUBMIT command>
;CM DEFAUL,DEF,<Set/show program defaults>
CM DELETE,DEL,<Delete extant file(s)>
CM DIRECT,DIR,<List extant file(s)>
;CM MOVE,MOV,<Move extant file(s) - effectively COPY then DELETE>
CM NETWOR,NET,<List network/node information>
CM PRINT,PRI,<Print ("spool") to line printer>
CM RENAME,REN,<Change the name(s) and/or attribute(s) of extant file(s)>
;CM REVIEW,REV,<Peruse extant file(s)>
CM SUBMIT,SBM,<Submit control files to batch processor>
CM TYPE,TYP,<Type extant file(s) on controlling terminal>
IFN FT$FAL,<
CM FAL,FAL##,<Enter File Access Listner mode>
>
IFN FT$TSC,<
CM TLINK,TLINK##,<Cross-connect ("link") two terminals>
CM TSC,TSC##,<Enter Terminal Services Controller mode>
>
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,<BITS,BYTES,WORDS,RECORDS,BLOCKS,PAGES,FILES,BAUD,ERRORS>)
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
JRST .POPJ1## ;NIP INITIALIZED
SUBTTL COPY command
;COPY COMMAND
;
; COPY <OUTPUT-SPECIFICATION> = <INPUT-EXPRESSION>
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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
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: 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
MOVEI T2,.FXMAX ;AND LENGTH OF SAME
PUSHJ P,DOOSDF## ;HANDLE ANY SWITCH.INI 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: 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
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,<More than 3435938367 data bits, /TOTALS overflowed!>
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,<POINTR (F.BLK##+.FXUSW,US$ARR)>,
SN BAUD,S.BAUD,FS.NFS
;SN CHOP,<POINTR (F.BLK##+.FXUSW,US$CHO)>,
SN CONCATENATE,<POINTR (F.BLK##+.FXUSW,US$CON)>,
SP CRLF,S.XUO0,.SWDEC##,,FS.VRQ
SN CSN,<POINTR (F.BLK##+.FXUSW,US$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,<POINT <^D65-2>,S.DIAL>,.SWPNM##,,
SN EBCDIC,<POINTR (F.BLK##+.FXUSW,US$EBC)>,
SL FLAG,<POINTR (F.BLK##+.FXUSW,US$FLG)>,FLG,FLGLOW
SN LSN,<POINTR (F.BLK##+.FXUSW,US$LSN)>,
SN LSNCONTINUOUS,<POINTR (F.BLK##+.FXUSW,US$LSC)>,
SP LSNINCREMENT,S.XUO6,.SWDEC##,LSI,
SN MOAN,S.MOAN,FS.NFS
SN NONULLS,<POINTR (F.BLK##+.FXUSW,US$NUL)>,
SN OKERROR,S.OKER,FS.NFS
SP PASSWORD,<POINT <^D65-$ASCMX>,S.PASS>,.SWASQ##,,
SN SPACES,<POINTR (F.BLK##+.FXUSW,US$SPA)>,
SN TABS,<POINTR (F.BLK##+.FXUSW,US$TAB)>,
SL TOTALS,S.TOTA,TOT,7777,FS.OBV
SN TRUNCATE,<POINTR (F.BLK##+.FXUSW,US$TRU)>,
SP USERID,<POINT <^D65-<3*$ASCMX>>,S.USER>,.SWUID##,,
;*** SP UACCOUNT,<POINT <^D65-$ASCMX>,S.UACC>,.SWUAC##,,
;*** SP UPASSWORD,<POINT <^D65-$ASCMX>,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,<LOWER,UPPER>)
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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,<DEFAULT command not yet implemented>
SUBTTL DELETE command
;DELETE COMMAND
;
; DELETE <INPUT-EXPRESSION>
; DDELET <INPUT-SPECIFICATION>
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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
SKIPN .FXNAM(P1) ;USER TYPE AN EXPLICIT FILE NAME?
ERROR FRD,<Filename is required in DELETE command>
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,<
SN MOAN,S.MOAN,FS.NFS
SN OKERROR,S.OKER,FS.NFS
SP PASSWORD,<POINT <^D65-$ASCMX>,S.PASS>,.SWASQ##,,
SL TOTALS,S.TOTA,TOT,7777,FS.OBV
SP USERID,<POINT <^D65-<3*$ASCMX>>,S.USER>,.SWUID##,,
;*** SP UACCOUNT,<POINT <^D65-$ASCMX>,S.UACC>,.SWUAC##,,
;*** SP UPASSWORD,<POINT <^D65-$ASCMX>,S.UPAS>,.SWUPA##,,
>
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;I/O MODE
0 ;(RESERVED)
SUBTTL DIRECTORY command
;DIRECTORY COMMAND
;
; DIRECT <LIST-SPECIFICATION> = <INPUT-EXPRESSION>
; DDIREC <LIST-SPECIFICATION> = <INPUT-SPECIFICATION>
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,<Error CLOSEing directory listing file>
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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
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: 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
MOVEI T2,.FXMAX ;AND LENGTH OF SAME
PUSHJ P,DOOSDF## ;HANDLE ANY SWITCH.INI 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,<Error OPENing directory listing file>
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,<
SN MOAN,S.MOAN,FS.NFS
SN OKERROR,S.OKER,FS.NFS
SP PASSWORD,<POINT <^D65-$ASCMX>,S.PASS>,.SWASQ##,,
SL TOTALS,S.TOTA,TOT,7777,FS.OBV
SP USERID,<POINT <^D65-<3*$ASCMX>>,S.USER>,.SWUID##,,
;*** SP UACCOUNT,<POINT <^D65-$ASCMX>,S.UACC>,.SWUAC##,,
;*** SP UPASSWORD,<POINT <^D65-$ASCMX>,S.UPAS>,.SWUPA##,,
>
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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,<MOVE command not yet implemented>
SUBTTL NETWORK command
;NETWORK COMMAND
;
; NETWORK <INPUT-EXPRESSION>
;
;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,<Error CLOSEing network listing file>,,,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,<No nodes specified for NETWORK command>
;HANDLE INPUT DEFAULTING
NETD10: MOVE T1,P1 ;ADDRESS OF CURRENT INPUT SPEC
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
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,<No node name specified>
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
MOVEI T2,.FXMAX ;AND LENGTH OF SAME
PUSHJ P,DOOSDF## ;HANDLE ANY SWITCH.INI 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,<Error OPENing network listing file>
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 <<CFA,CFD,CFP,CFN>>,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
IFN <$DVOMX-<.-NETOST>+1>,<IF1,<
PRINTX ? NETOST table out of sync with protocol maximum>>
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
IFN <$DVFMX-<.-NETFST>+1>,<IF1,<
PRINTX ? NETFST table out of sync with protocol maximum>>
SUBTTL NETWORK command - switch definitions
;"NETWORK" SWITCHS
DEFINE SWTCHS,<
SN MOAN,S.MOAN,FS.NFS
SN OKERROR,S.OKER,FS.NFS
SP USERID,<POINT <^D65-<3*$ASCMX>>,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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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 <INPUT-EXPRESSION>
;
;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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
SKIPN .FXNAM(P1) ;USER TYPE AN EXPLICIT FILE NAME?
ERROR FRP,<Filename is required in PRINT command>
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,<
SN MOAN,S.MOAN,FS.NFS
SN OKERROR,S.OKER,FS.NFS
SP PASSWORD,<POINT <^D65-$ASCMX>,S.PASS>,.SWASQ##,,
SL TOTALS,S.TOTA,TOT,7777,FS.OBV
SP USERID,<POINT <^D65-<3*$ASCMX>>,S.USER>,.SWUID##,,
;*** SP UACCOUNT,<POINT <^D65-$ASCMX>,S.UACC>,.SWUAC##,,
;*** SP UPASSWORD,<POINT <^D65-$ASCMX>,S.UPAS>,.SWUPA##,,
>
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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 <NEW-SPECIFICATION> = <INPUT-EXPRESSION>
; DRENAM <NEW-SPECIFICATION> = <INPUT-SPECIFICATION>
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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
SKIPN .FXNAM(P1) ;GOT AN EXPLICIT FILE NAME?
ERROR FRR,<Filename is required in RENAME command>
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
MOVEI T2,.FXMAX ;AND LENGTH OF SAME
PUSHJ P,DOOSDF## ;HANDLE ANY SWITCH.INI 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,<
SN MOAN,S.MOAN,FS.NFS
SN OKERROR,S.OKER,FS.NFS
SP PASSWORD,<POINT <^D65-$ASCMX>,S.PASS>,.SWASQ##,,
SL TOTALS,S.TOTA,TOT,7777,FS.OBV
SP USERID,<POINT <^D65-<3*$ASCMX>>,S.USER>,.SWUID##,,
;*** SP UACCOUNT,<POINT <^D65-$ASCMX>,S.UACC>,.SWUAC##,,
;*** SP UPASSWORD,<POINT <^D65-$ASCMX>,S.UPAS>,.SWUPA##,,
>
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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 REVIEW command
REV: ERROR RVY,<REVIEW command not yet implemented>
SUBTTL SUBMIT command
;SUBMIT COMMAND
;
; SUBMIT <INPUT-EXPRESSION>
; DSUBMI <INPUT-SPECIFICATION>
;
;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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
SKIPN .FXNAM(P1) ;USER TYPE AN EXPLICIT FILE NAME?
ERROR FRS,<Filename is required in SUBMIT command>
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,<
SN MOAN,S.MOAN,FS.NFS
SN OKERROR,S.OKER,FS.NFS
SP PASSWORD,<POINT <^D65-$ASCMX>,S.PASS>,.SWASQ##,,
SL TOTALS,S.TOTA,TOT,7777,FS.OBV
SP USERID,<POINT <^D65-<3*$ASCMX>>,S.USER>,.SWUID##,,
;*** SP UACCOUNT,<POINT <^D65-$ASCMX>,S.UACC>,.SWUAC##,,
;*** SP UPASSWORD,<POINT <^D65-$ASCMX>,S.UPAS>,.SWUPA##,,
>
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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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 <OUTPUT-SPECIFICATION> = <INPUT-EXPRESSION>
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
MOVEI T2,.FXMAX ;AND ITS LENGTH
PUSHJ P,DOOSDF## ;APPLY SWITCH.INI DEFAULTS
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: 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
MOVEI T2,.FXMAX ;AND LENGTH OF SAME
PUSHJ P,DOOSDF## ;HANDLE ANY SWITCH.INI 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: 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 ;<FUTURE>,,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 ;<FUTURE>,,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 ;<FUTURE>,,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
;DEFAULT OUTPUT FIELDS FROM CORRESPONDING INPUT FIELDS
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 <MMGWD failed in COA>
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>,<POINT 7,ASCICB>] ;***
DMOVEM T1,ASCICP ;*** SET PROTOTYPE INPUT COUNTER/POINTER
DMOVE T1,[EXP <$SZRSZ-1>,<POINT 7,ASCOCB>] ;***
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 <MMFWD failed in COA010>
> ;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 <CR>?
JRST COASL5 ;NO, LOOK FOR <FF>
JSP CX,COAIC ;PEEK AT CHARACTER PAST <CR>
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 <CR><FF> 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 <CR>
JRST COALS ;AND TREAT AS RANDOM BLANK LINE
COASL5: CAIE T2,.CHFFD ;A <FF> 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 <CR> (CAN'T HAPPEN)
COASL8: STOPCD <Returned LSN in COASL>
;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
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: JUMPE P3,COALU3 ;HAD BETTER BE AT BOL
WARN LML,<Line Sequence Number in middle of line, starting new line>
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
SKIPN ASCSTP ;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 <LF>
COALF: JRST COAQC ;JUST OUTPUT IT
;HERE ON <VT>
COAVT: JRST COAQC ;JUST OUTPUT IT
;HERE ON <FF>
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 <FF>?
JRST COACS0 ;YES, CONVERT INTO "PAGE MARK"
COACR3: HRROM T2,ASCHAR ;SAVE CHARACTER TO BE RE-EATEN
MOVEI T2,.CHCRT ;OUR <CR>
PUSHJ P,COAOC ;OUTPUT THE <CR>
PUSHJ P,NEROU ;I/O ERROR
HRRZ T2,ASCHAR ;RETRIEVE THE INPUT CHARACTER
SETZB P3,ASCHAR ;NOW ON COLUMN 0
CAIE T2,.CHLFD ;A <CR><LF>?
CAIN T2,.CHFFD ;OR <CR><FF>?
JRST COAQC ;YES, OUTPUT THE <LF> DIRECTLY
SKIPG S.LSN ;<CR><RANDOM> - 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 <CR><FF> - 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 <FF>
MOVEI T2,.CHCRT ;A <CR>
PUSHJ P,COAOC ;ISSUE <CR>
PUSHJ P,NEROU ;I/O ERROR
MOVEI T2,.CHLFD ;A <LF>
PUSHJ P,COAOC ;ISSUE <CR><LF> 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 <CR><LSN>
COACS7: SKIPLE S.LSN ;GENERATING (RE-SEQUENCING)?
MOVEM T2,ASCLSN ;SAVE THE LSN
MOVEI T2,.CHCRT ;OUR <CR>
PUSHJ P,COAOC ;OUTPUT THE <CR>
PUSHJ P,NEROU ;I/O ERROR
MOVEI T2,.CHLFD ;A <LF>
PUSHJ P,COAOC ;CONVERT TO <CR><LF><LSN>
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 <CR><EOF>
COACS9: MOVEI T2,.CHCRT ;OUR <CR>
PUSHJ P,COAOC ;OUTPUT THE <CR>
PUSHJ P,NEROU ;I/O ERROR
SETZ P3, ;WE ARE NOW AT THE LEFT MARGIN AGAIN
JRST COASE ;GO PROCESS <EOF>
;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:=-<COUNT TILL NEXT TAB>
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,$EILSN ;A LINE SEQUENCE NUMBER?
JRST 2(CX) ;YES
CAIN M0,$EIEOF ;NO, HOW ABOUT EOF?
JRST 1(CX) ;YES
JRST 0(CX) ;MUST BE AN I/O ERROR
;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 <CR>
JRST [MOVEM T2,ASCHAR ;THEN ALL SET, FLAG TO RETURN <CR>
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?
MOVNI T1,1 ;NO, NO LSN PROCESSING
MOVEI T1,0 ;YES, SOME FLAVOR OF LSN PROCESSING
TXNE P1,US$LSN ;WAS /LSN SPECIFIED?
MOVEI T1,1 ;YES, GENERATE LSNS
MOVEM T1,S.LSN ;SET /LSN PROCESSING
CAIGE T1,0 ;ANY LSN PROCESSING SPECIFIED?
TXOA T4,IC.LSN ;NO, PRESERVE INPUT LSNS THEN
TXZ T4,IC.LSN ;YES, SUPPRESS INPUT LSNS
JUMPLE T1,COAIF5 ;NO INCREMENT IS /NOLSN
SKIPGE T1,$FXLSI(P4) ;GET OUTPUT /LSNINCREMENT, IF ANY
MOVE T1,$FXLSI(P3) ;OTHERWISE USE INPUT /LSNINCREMENT
CAIG T1,0 ;WAS AN GOOD INCREMENT GIVEN?
MOVEI T1,AD.LSI ;NO, USE ABSENT DEFAULT
MOVEM T1,S.LSN ;SET /LSN PROCESSING
;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,</CRLF boundry set before /WRAP, ignoring /WRAP>
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 <CR><LF>)
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 <CR>?
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,<Too many embedded spaces for space compressor, ignored>
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
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,<Can't create record-structured output from non-record-structured input>
;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
SOJGE T3,CORIX6 ;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,<Error CLOSEing output file>
WARN OCW,<Error CLOSEing output file>
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,<File aborted, can't continue, aborting>
MOVEI T2,.FUIEC ;FUNCTION: I/O ERROR CONTINUATION
PUSHJ P,.IOFUN## ;TRY TO CONTINUE
ERROR IEC,<I/O error-continuation attempt failed, aborting>
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,<Only 1 file specification allowed>
DDCVE2: ERROR DD2,<No node specified>
DDCVE3: ERROR DD3,<Specified node is local host>
;DAP-MODE EXECUTION ERRORS
DDCERM: CAIN M0,$EFRNR ;NO REMOTE RENAME SUPPORT?
ERROR RNR,<Remote does not support "RENAME" operation>
CAIN M0,$EFRND ;NO REMOTE DELETE?
ERROR RND,<Remote does not support "DELETE" operation>
CAIN M0,$EFRNX ;NO REMOTE EXECUTE?
ERROR RNX,<Remote does not support "EXECUTE" operation>
CAIN M0,$EFRNL ;NO REMOTE DIRECTORY LIST?
ERROR RNL,<Remote does not support directory list operation>
CAIN M0,$EFRNW ;NO REMOTE WILDCARDS?
ERROR RNW,<Remote does not support wildcard operations>
CAIN M0,$EFRNG ;NO GO/NOGO SUPPORT?
ERROR RNG,<Remote does not support "NO/GONO" option>
CAIN M0,$EFRNC ;NO REMOTE FILE CONSTRAINT?
ERROR RNC,<Remote does not support file constraint switches>
CAIN M0,$EFRNS ;REMOTE NO SUPPORT?
ERROR RNS,<Remote does not support requested functionality>
ERROR DCF,<DAP-mode command failed, code >,.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
NETNOD: BLOCK 1 ;SCRATCH LAST NODE NAME USED
NETFSB: BLOCK .FXMAX ;SCRATCH FILE SPEC BLOCK FOR NETWORK COMMAND
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