home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
ibmtsonih.tar.gz
/
ibmtsonih.tar
/
tsnker.alp
< prev
next >
Wrap
Text File
|
1986-12-18
|
236KB
|
8,104 lines
KERMIT: TITLE 'NIH TSO KERMIT';
SUBTITLE 'MACRO DEFINITIONS';
MACRO &&L: CHAR &® % MAKES INTEGER PRINTABLE
&&L:
AI &®,32;
MEND;
MACRO &&L: BCCTYPE &&LIT; % SETS BLOCK CHECK TYPE
&&L:
MVI LEVELCK,&&LIT; % BCC LEVEL CHECKING
MVI BCCLEN+1,&&LIT;
MEND;
MACRO &&L: BUMPSEQ &® % INCREMENTS SEQUENCE NUMBER
&&L:
LH &®,SEQNUM; % GET PREVIOUS SEQ NUMBER
STH &®,OLDSEQ;
AI &®,1; % INCREMENT IT
N &®,MOD64; % GET MOD 64
STH &®,SEQNUM;
MEND;
% SPSPACK - PASS PARAMETERS TO SPACK
MACRO &&L: SPSPACK &&PTYPE,&&PNUM,&&SDATALEN,&® % n
&&L:
MVI PTYPE,&&PTYPE; % PACKET TYPE
LH &®,&&PNUM;
CHAR &® % MAKE IT A CHARACTER
STC &®,PNUM;
MMVC PUTLEN,&&SDATALEN,2; % DATA LEN OF SEND PACK
MEND;
MACRO &&L: RPSPACK &&SMARK,&&PTYPE,&&PNUM,&&SDATALEN,&&PTRDATA; % n
&&L:
MMVC &&SMARK,SSOH; % SOH PACKET FOR PACKET
MEND;
MACRO &&L: BUMPRTRY &® % INCREMENT RETRY
&&L:
L &®,NUMTRY; % GET RETRY COUNT
AI &®,1; % INCREMENT BY 1
ST &®,NUMTRY;
MEND;
MACRO &&L: BUMPOTRY &® % INCREMENT RETRY
&&L:
L &®,OLDTRY; % GET RETRY COUNT
AI &®,1; % INCREMENT BY 1
ST &®,OLDTRY;
MEND;
MACRO &&L: ZEROSEQ; % ZERO OUT RETRY
&&L:
MVI OLDSEQ,0;
MVI OLDSEQ,63; % FORMER NUMBER
MZC SEQNUM,L'SEQNUM; % GET RETRY COUNT
MEND;
MACRO &&L: ZERORTRY; % ZERO OUT RETRY
&&L:
MMVC OLDTRY,NUMTRY,4;
MZC NUMTRY,L'NUMTRY; % GET RETRY COUNT
MEND;
MACRO &&L: ZEROSDAT; % ZERO OUT LENGTH OF DATA TO PUT
&&L:
MZC PUTLEN,2; % ZERO LENGTH OF DATA TO PUT
MEND;
MACRO &&L: LENCALC &®1;
&&L:
LH &®1,BCCLEN; % LEN OF BCC
AH &®1,PUTLEN;
AI &®1,YLEN; % HEADER LENGTH
MEND;
MACRO &&L: MAKESLEN &&LIT,&®1;
&&L:
LI &®1,&&LIT; % GET THE LITERAL
STH &®1,PUTLEN;
MEND;
MACRO &&L: UNCHAR &® % TRANSFORMS PRINTABLE TO INTEGER
&&L:
SI &®,32;
MEND;
MACRO &&L: PACKTYPE &&LIT; % MOVES PACKET TYPE USED BY SPACK
&&L:
MVI TYPE,&&LIT;
MEND;
MACRO &&L: CNTLLOC &&STORAGE; % MAKES CNTL CHAR PRINT
&&L:
XI &&STORAGE,X'40';
MEND;
MACRO &&L: MOVEALL; % MOVE ALL DATA
&&L:
LR VR0,VR1;
SR VR0,XRB; % LENGTH
LR VR1,XRB; % SET UP POINTER FOR SUB
CCALL PUTEM,A; % SUB PUTS IN
AR VR1,VR0; % VR1-> BACK WHERE WAS
%LH XRB,RDATALEN;
%SR XRB,VR0;
%STH XRB,RDATALEN; % UPDATE GET LENGTH
DECREGDD XRB,VR0; % DECREMENT COUNTER
MEND;
MACRO &&L: ACKIT &® % ACKNOWLEDGE PACKET
&&L:
MMVC PNUM,RSEQ,1; % MOVE SEQUENCE NUMBER
ADCONLEN &®,YLEN,PLEN; % COMPUTE LENGTH
MVI PTYPE,YCOMLIT; % YACK TYPE
CCALL SPACK,A;
ZR &®
IC &®,RSEQ; % GET SEQUENCE NUMBER
UNCHAR &® % MAKE INTEGER
STH &®,RECSEQ; % STORE OFF COUNTER
MEND;
MACRO &&L: NACKIT &® % NEGATIVE ACKNOWLEDGE PACKET
&&L:
MMVC PHDR,SSOH; % PUT IN START OF HEADER
MMVC PNUM,RSEQ,1; % MOVE SEQUENCE NUMBER
ADCONLEN &®,NLEN,PLEN; % COMPUTE LENGTH
MVI PTYPE,NCOMLIT; % NACK TYPE
CCALL SPACK,A;
MEND;
MACRO &&L: NACKPACK &&SEQ,&® % NEGATIVE ACKNOWLEDGE PACKET
&&L:
SPSPACK AN,&&SEQ,ZERO,&® % N PACKET,SEND PARAMETERS FOR SPACK
CCALL SPACK,A;
MEND;
MACRO &&L: SERVNACK &® % NEGATIVE ACKNOWLEDGE PACKET
&&L:
MMVC PHDR,SSOH; % PUT IN START OF HEADER
MVI PNUM,X'20'; % MOVE SERVER 0 NUMBER
ADCONLEN &®,NLEN,PLEN; % COMPUTE LENGTH
MVI PTYPE,NCOMLIT; % NACK TYPE
CCALL SPACK,A;
MEND;
MACRO &&L: ACKPACK &&SEQ,&® % POSTIVE ACKNOWLEDGE PACKET
&&L:
SPSPACK AY,&&SEQ,ZERO,&® % N PACKET,SEND PARAMETERS FOR SPACK
CCALL SPACK,A;
MEND;
MACRO &&L: ZAP8BIT &&STORAGE; % MAKES CNTL CHAR PRINT
&&L:
NI &&STORAGE,X'7F';
MEND;
MACRO &&L: CNTLREG &®
&&L:
X &®,O1H; % XOR '64'
MEND;
MACRO &&L: ADCONLEN &®1,&&LITEQU,&&PACLEN;
&&L:
LI &®1,&&LITEQU;
% CHAR &®1; % MAKE IT ALPHA INTEGER
MMVC PUTLEN,=X'0000',2;
STC &®1,&&PACLEN;
MEND;
MACRO &&L: DECRDATA &®1,&&LIT;
&&L: % THIS MACRO DECREMENT RDATALEN + UPDATES RDATAADD
LH &®1,RDATALEN;
SI &®1,&&LIT;
STH &®1,RDATALEN;
L &®1,RDATAADD;
AI &®1,&&LIT;
ST &®1,RDATAADD;
MEND;
MACRO &&L: DECREGDD &®1,&®2;
&&L: %THIS MACRO DECREMENT RDATALEN UPDATES RDATAADD USING REGISTERS
L &®1,RDATAADD;
AR &®1,&®2;
ST &®1,RDATAADD;
LH &®1,RDATALEN;
SR &®1,&®2;
STH &®1,RDATALEN;
MEND;
BAL; % FOR MACRO DEFINITIONS
MACRO
&LAB WRTERM &MSG
LCLC &MS
LCLA &LN
&MS SETC '&MSG'
&LN SETA K'&MS
&LN SETA &LN-2
&LAB TPUT =C&MS,&LN
MEND
MACRO
&LAB ERRORCON &MSG
LCLC &MS
LCLA &LN
&MS SETC '&MSG'
&LN SETA K'&MS
&LN SETA &LN-2
&LAB LA 1,=C&MS
LA 0,&LN
MEND
MACRO
&LAB PROMPT &MSG
LCLC &MS
LCLA &LN
&MS SETC '&MSG'
&LN SETA K'&MS
&LN SETA &LN-2
&LAB TPUT =C&MS,&LN,ASIS
MEND
MACRO
RDTERM &BUFF
TGET &BUFF,130
MEND
ALP;
SUBTITLE 'DEFINITIONS';
COPY CPARMGBL; % COPY GLOBAL SYMBOLS
KERMIT: CSETUP MDC=YES,S99=YES;
SPLEVEL SET=1; % INSURE MVS/370 MACRO EXPANSIONS
EJECT;
WA: AREA; BEGIN
CSA VRE,HIGHR,EQU=(WAVRF,VRF);
WASIZE: AREAEND; END;
EJECT;
IKJCPPL;
IKJLSD;
IKJGTPB;
IKJUPT;
IKJPSCB;
IKJTAIE;
KERMIT: CSECT;
EJECT;
AD: EQU 68; % DATA PACKET (ASCII 'D')
AN: EQU 78; % NAK
AZ: EQU 90; % EOF PACKET
AS: EQU 83; % INIT PACKET
AY: EQU 89; % ACK
AF: EQU 70; % FILE PACKET
AB: EQU 66; % BREAK PACKET
AE: EQU 69; % ERROR PACKET
AX: EQU 88;
ERCOD: EQU 12; % MEANS EOF WITH 'FSREAD'
FLG1: EQU X'80'; % IS FILE THE FIRST OR NOT
FLG2: EQU X'40'; % OVERWRITE SENT FILENAME?
FLG3: EQU X'20'; % ONE = SENT ONLY PARTIAL RECORD
FLG4: EQU X'10'; % NAK FROM MICRO(0) OR RPACK(1)?
FLG5: EQU X'08'; % ALLOCATED MORE SPACE (DMSFREE)
FLGBIN: EQU X'04'; % BINARY FILE TRANSFER
BIT8ON: EQU X'80'; % MASK FOR CHECKING AND TURNING
BIT8OFF: EQU X'7F'; % BITS ON OR OFF !!
QUOTEYES: EQU X'01'; % SWITCH FOR EIGHT BIT QUOTING
FILEWRIT: EQU X'80'; % FILE WRITE OCCURRED ?
SUBTITLE 'KERMCNTL';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MODULE NAME - KERMCNTL
%
%
% FUNCTION- THE DRIVER MODULE FOR KERMIT TSO
%
%
%
% INPUTS - NONE
%
%
%
%
% OUTPUTS- KERMIT PROCESSING COMPLETED
%
%
% RETURN
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
OSENTER (14,12),SAVE=SAVECNTL,FORWARD=YES;
L XRF,PARMSADD;
LA XRG,4095(,XRF); % SET UP STORAGE BASE REGS
USING PARMS,XRF;
USING PARMS+4095,XRG;
ST STKR,OSAVE; % NEW STACK POINTER
LA STKR,STACK; % INTERNAL STACK
ST VR1,CPPLADD; % ADDRESS OF COMMAND PROCESSOR PARAMETER LIST
USE VR1 AS CPPL IN BEGIN
L XRA,CPPLUPT; % FOR PUT GET STUFF
ST XRA,UPTADD;
L XRA,CPPLECT;
ST XRA,ECTADD;
MMVC CBUFFADD,CPPLCBUF,4; % ADDRESS TO COMMAND
END; % OF CPPL BLOCK
L VR1,CPPLADD; % ADDRESS OF COMMAND PROCESSOR PARMETER LIST
L VR0,UPTADD; % ADDRESS OF UPT
CALL USERID; % EXTERNAL ROUTINE RETURNS ADDRESS AND LENGTH
% OF USER PREFIX IN VR1 & VR0 RESPECTIVELY
IF <CI VR0,44; CC H> THEN BEGIN % REAL PROBLEMS CAN NOT GET USER ID
WRTERM 'Length of user prefix greater than 44.'_
' Check USERID external routine.';
WRTERM 'Must terminate';
GOTO DOEXIT;
END;
ST VR1,USERPREA; % STORE OFF PREFIX ADDRESS
STH VR0,USERPREL; % LENGTH OF PREFIX
L XRD,STAXOLD; % SAVE THE REPLACE
L XRB,STAXADD; % PARMETER EXIT ROUTINE ADDRESS
L XRC,STAXLADD; % PARM LIST ADDRESS
STAX (XRB),DEFER=NO,REPLACE=YES,MF=(E,(XRD));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
LOAD EP=TSOLNK;
ST VR0,TSOADD; % STORE OFF ADDRESS
L XRB,TGETADD; % ADDRESS OF TGET MODULE
IDENTIFY EP=KERMTGET,ENTRY=(XRB);
IF <RNZ VRF> THEN BEGIN % ERROR IN IDENTIFY
TPUT =C'ERROR IN IDENTIFY',17;
END;
LOAD EP=IKJGETL; % GET LINE ROUTINE ADDRESS
ST VR0,GETLINAD; % STORE IT OFF
ATTACH EP=KERMTGET,PARAM=((XRF));
IF <RNZ VRF> THEN BEGIN
TPUT =C'ERROR IN ATTACH ',16;
END;
ST VR1,TASKADD; % STORE OFF ADDRESS FOR DETACH
LOAD EP=IKJSTCK; % STACK ROUTINE
ST VR0,STACKADD; % STORE OFF POINTER TO STACK ROUTINE
CCALL STCKMOD,A; % STACK ROUTINE TO CHECK FOR PARAMETER ON ENTRY
CALL EDINIT,(EDCNTRL,EDRETURN); % INITIALIZATION FOR ED ROUTINES
CCALL KRESET,A; % INITALIZATION SUB
CCALL PROFILES,A; % EXECUTES SYSTEM AND USER PROFILES
%WRTERM ' '; % BLANK LINE
WRTERM 'NIH TSO KERMIT VERSION 1.1A'; % VERSION LOGON
%WRTERM ' '; % BLANK LINE
MAINLOOP: FOREVER DO BEGIN % MAIN LOOP
DO BEGIN % LOOP IF NO INPUT
%PROMPT: ; % MAIN PROMPT FOR PROGRAM
ZF STOPF; % ZERO STOP FLAG INCASE IT WAS SET
IF <TF SENDDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN); % CLOSE INPUT
IF <TF RECVDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN); %CLOSE OUTPUT
% PROMPT 'KERMIT-TSO> '; % MAIN PROMPT FOR PROGRAM
% RDTERM INPUT; % GET INPUT FROM USER
CCALL PROMPTIT,A;
LH VR1,INPUT; % SET UP FOR DEBLANK
SI VR1,4; % SUBTRACT OFF HEADER
END UNTIL <RNZ VR1>; % IF NO INPUT REPROMPT
SCINIT INPUT+4,(VR1); % SET UP SCANNER
SCTYPE NEW=1;
SCERROR NEW=PARSEERR;
SCANBLCK: DO BEGIN SCAN *; % SCAN OFF FUNCTIONS
SCKW (RECEIVE,REC,R),DOREC; % RECEIVE COMMAND
SCKW (SEND,S),DOSEND; % SEND COMMAND - 44 CHAR
SCKW SHOW,DOSHOW; % SHOW COMMAND
SCKW (ST,STATUS),DOSTATUS; % STATUS COMMAND
SCKW EXIT,DOQUIT; % EXIT COMMAND -
SCKW END,DOQUIT; % END ALSO QUIT COMMAND -
SCKW QUIT,DOQUIT; % QUIT COMMAND -
SCKW SERVER,DOSERVER; % SERVER COMMAND -
SCKW ?,DOQUES; % QUESTION COMMAND -
SCKW HELP,DOHELP; % HELP COMMAND -
SCKW RESET,DORESET; % RESET COMMAND -
SCKW SET,DOSET; % SET COMMAND -
SCKW TSO,DOTSO; % TSO COMMAND -
SCKW TEST,DOTEST; %
SCKW EXECUTE,DOEXEC; % EXEC COMMAND -
SCKW (KERMIT,K),DOKERM; % FOR EXEC COMMANDS TO CRUCOMVENT TSO
SCKW STOP,STOPHELP; % COMMAND ONLY USED TO STOP TRANSFER
SCKW ,INVALKEY; % UNKNOWN COMMAND -
SCANEND;
PARSEERR:
WRTERM 'Unknown TSO KERMIT command';
NEXT OF MAINLOOP;
DOREC:
<CCALL KRECEIVE,A>; % WE HAVE A RECEIVE COM
NEXT OF MAINLOOP;
DOSEND:
<CCALL KSEND,A>; % WE HAVE A SEND COMMAND
NEXT OF MAINLOOP;
DOSHOW:
<CCALL KSHOW,A>; % WE HAVE A SHOW COMMAND
NEXT OF MAINLOOP;
DOSTATUS:
SCTELL;
IF <RP VR0> THEN BEGIN
WRTERM 'STATUS displays messages that tell what happened during the';
WRTERM 'last file transfer operation.';
END
ELSE <CCALL KSTATUS,A>; % WE HAVE A STATUS COMMAND
NEXT OF MAINLOOP;
DOTEST:
%IF YOUR SYSTEM PROGRAMMER THEN BEGIN
SF TESTF;
SCAN;
%SCANEND;
IF <MCLC 0(VR1),=C'OFF',3> THEN BEGIN
ZF TESTF;
CLOSE TESTFILE;
END
ELSE BEGIN
DATA BEGIN
TESTX: DC C'ALLOC FI(TESTFILE) DS(KERMIT.TESTFILE)'
END;
TESTXLEN: EQU *-TESTX;
LI VR0,TESTXLEN;
%CCALL TSOCMD,A,VR1=TESTX;
OPEN (TESTFILE,(INPUT));
IF ^<OPENP TESTFILE> THEN BEGIN
WRTERM 'UNABLE TO OPENTEST FILE';
END;
END;
% END;
NEXT OF MAINLOOP;
DORESET:
SCAN *;
SCKW ?,RESETHLP;
SCKW HELP,RESETHLP;
SCANEND;
<CCALL KRESET,A>; % WE HAVE A RESET COMMAND
NEXT OF MAINLOOP;
DOKERM:
SCAN *;
SCKW ?,KERHELP;
SCKW ,*,B; % PAST ON THROUGH
SCANEND;
NEXT OF SCANBLCK;
KERHELP :
WRTERM 'The KERMIT command allows TSO KERMIT to process TSO KERMIT';
WRTERM 'SET comands from an EXEC (CLIST) data set.';
WRTERM 'Any TSO KERMIT SET command '_
'in an EXEC data set must be prefixed by KERMIT.';
NEXT OF MAINLOOP;
RESETHLP:
WRTERM 'RESET resets TSO KERMIT options to initial defaults.';
NEXT OF MAINLOOP;
DOHELP:
SCTELL;
IF <RP VR0> THEN BEGIN
WRTERM 'HELP tells how to use the TSO KERMIT help facility to get';
WRTERM 'information about TSO KERMIT commands.';
END
ELSE BEGIN % WE HAVE A HELP COMMAND
WRTERM 'Enter ? at prompt to receive list of commands.';
WRTERM 'Enter ? after a command to receive list of operands.';
END; % OF HELP
NEXT OF MAINLOOP;
DOQUES:
BEGIN % WE HAVE A ? COMMAND
CCALL MAINHELP,A; % HELP ROUTINE
NEXT OF MAINLOOP;
END; % OF QUESTION BLOCK
DOSET:
<CCALL KSET,A>; % WE HAVE A SET COMMAND
NEXT OF MAINLOOP;
STOPHELP:
WRTERM 'STOP is used to abort a file transfer currently in progress.';
NEXT OF MAINLOOP;
DOEXEC: % EXEC A FILE FULL OF KERMIT COMMANDS
IF <CI VR0,7> THEN <MMVC 4(VR1),=C' ',3>;
SCBACK; % BACK UP TO INCLUDE COMMAND
SCTELL; % GET REMAINDER
ST VR1,TSOCMDA;
STH VR0,TSOCMDL;
SCAN;
DO BEGIN SCAN *; % CHECK FOR HELP REQUEST
SCKW ?,EXECHELP;
SCKW ,SENDEXEC;
SCANEND;
END;
WRTERM 'EXECUTE command requires a data set name of TSO KERMIT'_
' commands.';
NEXT OF MAINLOOP;
EXECHELP:
WRTERM 'The EXECUTE command processes a data set containing TSO '_
'KERMIT commands. The only parameter is the';
WRTERM 'name of the data set.';
NEXT OF MAINLOOP;
SENDEXEC:
CCALL TSOCMD,A,VR1=L:TSOCMDA,VR0=LH:TSOCMDL; % LET TSO FEED
NEXT OF MAINLOOP;
DOTSO:
SCTELL;
DEBLANK VR1,VR0,XRA; % DEBLANK STRING
IF <RNP VR0> THEN BEGIN % NO PARMS
% NO MESSAGE
WRTERM 'TSO Command requires a command string ';
NEXT OF MAINLOOP;
END
ELSE BEGIN
UNTIL ^<CLI 0(VR1),C' '>
DO BEGIN
SI VR0,1; % DECREMENT COUNTER
AI VR1,1;
END;
IF <CI VR0,1> & <CLI 0(VR1),C'?'> THEN BEGIN
TSOHELP:
WRTERM _
'The TSO command is followed (on the same line) by a TSO command'_
' to be executed.';
NEXT OF MAINLOOP;
END
ELSE BEGIN
TSOKEY: CCALL TSOCMD,A; % WE HAVE A TSO COMMAND
END;
END;
NEXT OF MAINLOOP;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOQUIT:
DO BEGIN
SCAN *;
SCKW (HELP,?),EXITHELP;
SCKW ,BADEXIT;
SCANEND;
GOTO DOEXIT; % REALLY WANT TO LEAVE
EXITHELP:
WRTERM 'END, EXIT, and QUIT terminate TSO KERMIT '_
'and return the user to TSO.';
NEXT OF MAINLOOP;
BADEXIT:
WRTERM 'No parameters except HELP for QUIT or END ';
NEXT OF MAINLOOP;
END; % OF QUIT BLOCK
DOSERVER:
DO BEGIN
SCAN *;
SCKW (HELP,?),SERVHELP;
SCKW ,BADSERV;
SCANEND;
SF SERVERF; % TURN ON SERVER INDICATOR
CCALL SERVER,A; % ENGAGE SERVER SLAVE MODE
ZF SERVERF; % TURN OFF SERVER INDICATOR
GOTO DOEXIT IF <TF LOGOUT>; % IF LOGPOFF GET OUT
NEXT OF MAINLOOP;
SERVHELP:
WRTERM 'The SERVER command invokes TSO KERMIT '_
'as a slave server of the microcomputer.';
WRTERM 'While TSO KERMIT is in server mode, all commands are'_
' normally';
WRTERM 'issued to the microcomputer only. However, '_
'TSO KERMIT will recognize';
WRTERM '"FINISH" as a command to leave server mode.';
NEXT OF MAINLOOP;
BADSERV:
WRTERM 'No parameters except ? for SERVER';
NEXT OF MAINLOOP;
END; % OF SERV BLOCK
% INVALID COMMAND
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
INVALKEY:
WRTERM 'Invalid TSO KERMIT Command.'_
' Type in HELP if you need assistance.';
END; % OF SCANBLCK
END; % OF FOREVER MAIN DO LOOP
DOEXIT:
IF <TF SENDDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN); % CLOSE INPUT
IF <TF RECVDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN); %CLOSE OUTPUT
IF <OPENP DEBUG> THEN CLOSE DEBUG; % CLOSE FILES
CALL EDTERM,(EDCNTRL,EDRETURN); % TERMINATE ED ROUTINE PROCESSING
DETACH TASKADD; % RELEASE AYSN TGET READ ROUTINE
FREEMAIN RC,SP=18; % FREE TAB BUFFER
L STKR,OSAVE; % RESTORE STACK POINTER
ZR VRF; % OK PROCESSING FOR CP
OSEXIT (14,14),(0,12),SAVE=SAVECNTL;
SAVECNTL: DC 18F'0'; % SAVE AREA
USE VRF AS STAXEXIT IN BEGIN
STAXEXIT: DS 0H;
% THE STAX EXIT HERE DO NOTHING BUT KEEP GOING BR ON 14
RGOTO 14; % GO REG 14
%
END; % OF USING
PARMSADD: DC A(PARMS); % ADDRESS OF STORAGE
LTORG;
STAXLIST: STAX 0,DEFER=NO,REPLACE=NO,MF=L;
STAXOLDL: STAX 0,DEFER=NO,REPLACE=YES,MF=L;
EXORG;
SUBTITLE 'MAINHELP';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%MOD: MAINHELP
% FUNCTION: PRINTS HELPS FOR DRIVER LOOP
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MAINHELP: CENTER VRE,HIGHR,ENTRY=NO;
WRTERM 'Legal commands are: ';
WRTERM ' ';
WRTERM 'RECEIVE uploads a data set (file) from the micro'_
'computer to the mainframe';
WRTERM 'SEND downloads a data set (file) from the mainframe '_
'to the microcomputer';
WRTERM 'STOP aborts a file transfer in progress '_
'(valid only during file transfer)';
WRTERM 'STATUS displays the status of the last file transfer';
WRTERM 'SERVER invokes TSO KERMIT as a slave server';
WRTERM 'END terminates TSO KERMIT and returns user to TSO ';
WRTERM 'QUIT and EXIT are synonyms of END';
WRTERM 'SET changes KERMIT protocol and data set options ';
WRTERM 'SHOW displays the current KERMIT option settings ';
WRTERM 'RESET reinitializes KERMIT to default settings ';
WRTERM 'HELP tells how to use the TSO KERMIT help facility';
WRTERM 'TSO issues a command to TSO';
WRTERM 'EXEC reads a data set of TSO KERMIT commands '_
'(a TSO CLIST)';
WRTERM 'KERMIT allows TSO KERMIT EXEC files to process the '_
'TSO KERMIT SET commands';
WRTERM '(must prefix each SET cmd)';
WRTERM ' '; % BLANK LINE
WRTERM 'TSO KERMIT executes a profile containing TSO KERMIT'_
' commands at program startup. ';
WRTERM 'KERMIT.PROFILE.CLIST is the profile data set name.';
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'PROMPTIT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: PROMPIT
% FUNCTION: DO A PUT GET FOR INPUT AT THE TERMINAT
% INPUT : NONE
% OUTPUT: INFO MOVED INTO INPUT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PROMPTIT: CENTER VRE,HIGHR,ENTRY=NO;
L XRA,UPTADD;
L XRB,ECTADD;
DO BEGIN
L 15,GETLINAD; % ENTRY POINT FOR GETLINE ROUTINES
GETLINE PARM=APGPB,UPT=(XRA),ECT=(XRB),ECB=ECBGETLN,_
TERMGET=(EDIT,NOWAIT),ENTRY=(15),_
MF=(E,IOPLADS);
PROMPCAS: CASE VRF MAX 36 MIN 0 CHECK;
0: BEGIN % LINE FROM TERMINAL
%PROMPT 'KERMIT-TSO> '; % MAIN PROMPT FOR PROGRAM
ZR VRF; % ZERO RETURN AFTER TPUT
END; % JUST FALL OUT
4: BEGIN % INPUT FROM STACK - CLIST ETC
% JUST FALL OUT DON'T ISSUE PROMPT;
END;
8: ; % EOD JUST FALL THROUGH
12: BEGIN % NO INPUT ISSUE PROMPT AND WAIT
PROMPT 'KERMIT-TSO> '; % MAIN PROMPT FOR PROGRAM
L 15,GETLINAD; % ENTRY POINT FOR GETLINE ROUTINES
GETLINE PARM=APGPB,UPT=(XRA),ECT=(XRB),ECB=ECBGETLN,_
TERMGET=(EDIT,WAIT),_
ENTRY=(15),MF=(E,IOPLADS);
NEXT OF PROMPCAS;
END;
16 THRU 36: ; % FALL THROUGH
ENDCASE
ELSE WRTERM 'UNKNOWN VALUE RETURNED FROM GETLINE';
END UNTIL <CI VRF,0> | <CI VRF,4>;
DATA BEGIN
APGPB: GETLINE MF=L;
END;
LA XRA,APGPB;
USE XRA AS GTPB IN L VR1,GTPBIBUF;
LH XRB,0(VR1); % LENGTH OF STUFF
EXI XRB,MMVC,INPUT,(VR1),0,INCR=YES,DECR=YES;
%O XRB,=X'01000000'; % OR LENGTH PER GTWTMP MANUAL PAGE 12-79
FREEMAIN RC,LV=(XRB),A=(VR1),SP=1; % FREE UP THE INPUT BUFFER
SI XRB,4 ; % REMOVE LENGTH
EXI XRB,MTR,INPUT+4,UPPER,*-*,INCR=YES,DECR=YES ; % UPPER CASE
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KERMIT WORKING STORAGE';
PARMS: DS 0H; % GLOBAL DATA LIST;
TESTFILE: DCB DDNAME=TESTFILE,DSORG=PS,MACRF=(GL),_
EODAD=KLUDGCIT,LRECL=264,RECFM=VB,BLKSIZE=2048;
TESTEOF: DC A(KLUDGCIT); % IN RPACK ROUTINE
%KEROUT: DCB DDNAME=KEROUT,DSORG=PS,MACRF=(PM),LRECL=80,BLKSIZE=84,_
% RECFM=VB;
DEBUG: DCB DDNAME=DEBUG,DSORG=PS,MACRF=(PM),LRECL=260,BLKSIZE=2048,_
RECFM=VB;
%MODDCBF: DCB DDNAME=KEROUT,DSORG=PS,MACRF=(PM),LRECL=80,BLKSIZE=80,_
% RECFM=FB;
%MODDCBFL: EQU *-MODDCBF;
%MODDCBV: DCB DDNAME=KEROUT,DSORG=PS,MACRF=(PM),LRECL=80,BLKSIZE=84,_
% RECFM=VB;
%MODDCBVL: EQU *-MODDCBV;
DF SAMEPKTF,RECFLAG,SENDFLAG,SHOWFLAG,DATAFLAG,_ % DEFINE FLAGS
STOPF,STURNRND,RTURNRND;
DF QUITFLAG,HELPFLAG,SETFLAG,EXITFLAG,QUESFLAG,_% DEFINE FLAGS
PREFPDSF,ACKX,ACKZ; % FOR ACK WITH X DATA OR Z DATA
DF DBUGFLAG,TESTF,BIT8FLAG,CRFLAG,QUOFLAG,QUO8FLAG,KINEOF,_
LOGOUT;
DF SENDDSNF,RECVDSNF,EDITF,TABF,TABFOUND,FORWARDF,HIGHBITF,REPTF;
DF FORWARD,SERVERF,TIMERF,WARNINGF,PDSF,ASTERISK,_
FULLQUOF,PREFXQUO; % MORE FLAGS
DF WARNTPCK,FULLQDSN ;
STAXADD: DC A(STAXEXIT); % ADDRESS OF STAX ROUTINE
STAXLADD: DC A(STAXLIST); % ADDRESS OF STAX PARM LIST
STAXOLD: DC A(STAXOLDL);
UPTADD: DS A; % ADDRESS OF UPT FROM CPPL
STACKADD: DS A; % ADDRESS OF STACK MODULE
CBUFFADD: DS A; % ADDRESS OF CPPLCBUFF ON LOG IN
ECTADD: DS A; % ADDRESS OF ECT FROM CPPL
ECBGETLN: DC F'0'; % PUT GET ECB
OLD: DC F'1'; % OUT PUT LINE DESCRIPTOR ONLY ONE ON CHAIN
% DC F'1'; % NUMBER OF MESSAGE SEGMENTS ONLY ONE
DC A(PROMPT); % MESSAGE TO PUT OUT
PROMPT: DC H'17'; % LENGTH OF MESSAGE
DC H'0'; % FOR PROMPT
DC C' KERMIT-TSO> '; % THE PROMPT MESSAGE
IOPLADS: DC 4F'0'; % INPUT OUPUT PARM LIST PUT GET
PUTADD: DC A(PDATA); % ADDRESS POINTER
TGETADD: DC A(KERMTGET); % ADDRESS FOR ATTACH
PUTLEN: DC H'0'; % NUMBER OF CHARACTERS IN DATA
LASTTAB: DC H'0'; % LAST TAB FOR SENDS
TABADDR: DS A; % ADDRESS OF TABBING BUFFER
LASTADDR: DS A; % ADDRESS OF PLACE IN REC BUFFER TABBING
ECBREAD: DC F'0';
TASKADD: DS A; % ASYNC TASK ADDRESS
ECBTGET: DC F'0';
ECBTREAD: EQU X'AA'; % DO A READ
ECBTIMER: EQU X'BB'; % TIME OUT ECB
TABCNT: DS H; % TAB COUNTER
GETADD: DC A(BUF); % ADDRESS OF GET BUFER
TSOADD: DS A; % TSO ADDRESS OF LOAD MOD
GETLINAD: DS A; % ADDRESS OF GET LINE ROUTINE
CPPLADD: DS A; % ADDRESS OF COMMAND PROCESSOR PARM LIST
GETLEN: DS H; % LENGTH OF GET BUFFER
ADDBUF: DC A(BUF); % ADDRESS OF BUFFER
BUFADCON: DC A(BUF); % ADDRESS OF BUFFER
TGETBUFA: DC A(TGETBUFF);
TGETLEN: DS F; % LENGTH OF RECEIVED DATA FROM TGET
SETADD: DC A(SETLABEL); % ADDRESS OF SET AREA
BUFADD: DS F; % POINTER TO PLACE IN BUF
BUFCNT: DS H; % NUMBER OF CHARACTERS IN BUFCNT
RDATALEN: DS H; % COUNTER OF RECEIVED DATA
RDATAADD: DS F; % ADDRESS POINTER TO DATA
DACKRC: DS F; % RETURN FROM DYNAL ALLOCATE
MAXPUT: DC H'91'; % MAX CHARACTERS TO PUT
MAXWRITE: DS H; % MAXIMUM SIZE OF WRITE TO DISK
BCCLEN: DC H'1'; % LEN OF VARIOUS BCC CHECKING
OLDBCC: DC H'0'; % SAVE BCC VALUE
TRFBCC: DS X; % TRANSFER BCC
LFCR: DC X'234D234A'; % LIN FEE C R
LFCRLEN: EQU *-LFCR;
REPTBUFF: DS CL120; % BUFFER FOR REPEAT CHARACTER
OLDSEQ: DS H; % PREVIOUS SEQ NUMBER
SNDPKT: DS CL130; % SEND THIS TO MICRO;
ORG SNDPKT;
PHDR: DS X;
PLEN: DS X;
PNUM: DS X;
PTYPE: DS X;
PDATA: DS 0C;
ORG ,;
RECPKT: DS CL130; % RECEIVE THIS FROM MICRO;
ORG RECPKT;
RMARK: DS X; % RECEIVE MARK
RLEN: DS X; % RECEIVE LENGTH
RSEQ: DS X; % RECEIVE SEQUENCE NUMBER
RTYPE: DS X; % RECEIVE TYPE
% THESE LENGTHS ARE FOR FIXED LENGTH MESSAGES
YLEN: EQU *-RSEQ; % ACK LENGTH
NLEN: EQU *-RSEQ; % NACK LENGTH
ZLEN: EQU *-RSEQ; % EOF PACKET LENGTH
CLEN: EQU *-RSEQ; % COMPLETE PACKET LENGTH
BLEN: EQU *-RSEQ; % EOT PACKET LENGTH
ALEN: EQU *-RSEQ; % ABORT PACKET LENGTH
RDATA: DS 0C;
ORG ,; % RESET ORG COUNTER
LSDAT: DS F; % SEND PACKET SIZE;
LRDAT: DS F; % RECEIVE PACKET SIZE;
EDCNTRL: DS F; % FOR EDIT ROUTINES
EDRETURN: DS F; % RETURN CODE
EDTYPE: DS F; % EDIT TYPE
EDCOL1: DS F; % 1ST COLUMN POSTION
EDCOL2: DS F; % 2ND COLUMN POSITION
EDLMAX2: DC F'132'; % MAX OF LINE
EDLENACT: DS F; % AMOUNT RECEIVEDD
EDLINE: DS CL132; % DATA FROM ERROR MESSAGE
EDLINENO: DS F; % LINENUMBER RETURNED FROM EDGET
EDPNTR: DS F; % POINTER TO DATA ADDRESS
EDLINEN: DC XL4'FFFFFFFF'; % LINE NUMBER OF PUT AUTO
EDLINER: DS F; % LINE NUMBER RETURNED FROM PUT
EDLEN: DS F; % LENGTH FOR PUT
OTHERLEN: DS H; % USED IN FILL DPCK
SEQNUM: DS H; % NUMBER OF PACKET
RPSEQ: DS H; % REC PACKET NUMBER
RECLEN: DS H; % LENGTH OF REC DATA
RECPNTR: DS F; % POINTER TO RECEIVED DATA
LENERROR: DC XL4'FFFFFFEE'; % LENGTH ERROR
FLAGS: DC X'00'; % USE TO TEST OUR FLAGS;
FLAGS2: DC X'00'; % USE TO TEST OUR FLAGS2;
NAME: DC 18X'20'; % NAME OF FILE(S) TO SEND;
DS 0F;
DS 0F;
INPUT: DS CL130; % INPUT BUFFER;
INPUT2: DS CL130; % INPUT BUFFER;
DS 0F;
DS F; % RDW FOR VARIABLE RECORDS;
DS F; % RDW FOR VARIABLE RECORDS;
N: DC F'0'; % SEND PACKET NUMBER;
NUM: DC F'0'; % RECEIVE PACKET NUMBER;
RETRY: DC F'20'; % RETRY COUNTER
NUMTRY: DC F'0'; % TRIAL COUNTER FOR TRANSFERS;
OLDTRY: DS F; % COUNTER FOR PREVIOUS PACKET;
STORLOC: DS F; % POINTER TO EXTRA STORAGE;
MAXPACK: DC F'94'; % MAX PACKET SIZE;
RECL: DS F; % RECORD LEN (IF RECFM = V);
RPSIZ: DC F'94'; % MAX RECEIVE PACKET SIZE;
DSSIZ: DC F'40'; % DEFAULT MAX SEND PACKET SIZE
MAXTRY: DC F'5'; % NO. OF TIMES TO RETRY PACKET
IMXTRY: DC F'16'; % NO. OF INITIAL TRIALS ALLOWE
SIZE: DS F; % MAX SIZE FOR SEND DATA;
CRTLINE#: DS H; % SCREEN LINE NUMBER IN SHOW
MAXCRC#: DC H'11'; % MAX LINES ON SCREEN FOR SHOW AT PRESENT
RECSEQ: DC H'0'; % NUMBER COUNTER
DEL: DC F'127'; % OCTAL 177 (DELETE CHAR);
MOD64: DC XL4'0000003F'; % MODUL 64
ASCIIONE: DC X'31'; % ASCII LIT 1
ASCII2: DC X'32'; % ASCII LIT 1
ASCII3: DC X'33'; % ASCII LIT 1
ZERO: DC F'0';
ONE: DC F'1';
ONETHOU: DC F'1000';
FIVE: DC F'5';
SIX: DC F'6';
TWO: DC F'2';
THREE: DC F'3'; % CONSTANT FOR EDSETS
FOUR: DC F'4'; % "
ONEOONE: DC F'101'; % FOR EDIT ROUTINES
TEN: DC F'10';
SPACE: DC F'32'; % ASCII SPACE;
O1H: DC F'64'; % OCTAL 100;
O2H: DC F'128'; % OCTAL 200;
SAVPL: DC F'0'; % POINTER WITHIN BUF,INIT=0;
RSAVPL: DC F'0'; % POINTER IN 'PTCHR',INIT=0;
RCRCREAL: DS H; % RECEIVE CHARACTER
DQUOTE: DC X'23'; % DEFAULT QUOTE CHARACTER = #;
QUOCHAR: DS X; % QOUTE CHAR WE'LL SEND;
RQUO: DS X; % MICRO'S QUOTE CHAR;
DOT: DC C'.'; % DOT FOR DS NAME SCAN
DBINQC: DC X'26'; % DEFAULT 8 BIT QUOTE CHAR = &
BINQC: DC X'26'; % 8 BIT QUOTE CHARACTER
DTABCHAR: DC X'09'; % ASCII HT
TABCHAR: DS X; % TABCHAR
TABCHAR#: DC X'49'; % ASCII HT+ CNTL QUOTE VALUE
TEMP: DS D; % TEMPORARY SPACE;
DS 0D;
SDAT: DS CL130; % TEMP PLACE FOR SEND DATA;
RDAT: DS CL130; % TEMP PLACE FOR RECEIVE DATA;
FILNAML: DS H; % LENGTH OF FILENAME;
FILNAM: DS CL18; % SEND/REC FILENAME;
STATE: DS C; % OUR CURRENT STATE;
DEOL: DC X'0D'; % DEFAULT END OF PACKET (CR);
REOL: DS X'0D'; % EOL CHAR I NEED (CR);
SEOL: DS X'0D'; % EOL I'LL SEND;
QBINCHAR: DC X'26'; % EIGHTTH BIT QUOTE CHARA
DQBIN: DC X'26'; % EIGHTTH BIT QUOTE CHARACTER;
DREPT: DC X'7E'; % ASCII ~
REPTCHAR: DS X; % CHARACTER USED FOR REPEAT QUOTING
DCAPA1: DC X'0'; % CAPABILITIES ZERO NOW
DSOH: DC X'01'; % DEFAULT START OF HEADER (CTL
RSOH: DS X; % RECEIVE START OF HEADER;
SSOH: DS X; % SEND START OF HEADER;
DLRECL: DC H'504'; % DEFAULT LRECL SIZE OF 80;
LRECL: DS H'255'; % LRECL PROGRAM WILL USE;
DBLKSIZE: DC H'6356'; % DEFAULT BLKSIZE OF 6356;
BLKSIZE: DS H; % BLKSIZE PROGRAM WILL USE;
DTRACK: DC F'5'; % DEFAULT SPACE ALLOCATION;
DRECFM: DC CL2'VB'; % W DEFAULT WITH VARIE RECFM;
RFM: DC CL2'UB'; % RECFM PROGRAM WILL USE;
RRECFM: DS C; % REC FORMAT OF FILE IN USE
VOLUME: DC CL7'TMP '; % JDW VOLUME FOR ALLOCATE;
OUTUNIT: DC CL8'FILE '; % FOR DYNAL
OUTSTATS: DS X; % STATUS FOR DYNAL
OUTNDISP: DS X; % NORMAL DISPOSITION DYNAL
OUTCDISP: DS X; % CONDITIONAL DISPOSITION DYNAL
DATA: DC CL7'TEXT '; % JDW DATA TYPE BIN OR TEXT;
% DALRTVOL: DS CL6; % VOL SERIAL OF RETURNED DYNAL
BLIP: DS X; % SAVE USER'S BLIP CHAR;
LINSIZ: DS F; % SAVE USER'S CONSOLE LINESIZE
%STYPE: DS C; % TYPE OF PACKET SENT;
%RTYPE: DS C; % TYPE OF PACKET RECEIVED;
READSAVE: DS 4F;
WRITSAVE: DS 4F;
PARSELST: DS 3F; % PTRS TO OPERAND STACK;
PTRTBL: DS 15F; % OPERAND STACK;
PTRTBLL: EQU *-PTRTBL; % LENGTH OF PTRTBL;
DBLWRK: DS D;
IDSYS: DC F'2'; % MVS TSO;
DDNAME: DC CL8' '; % DDNAME TO ALLOCATE;
DSNAME: DC CL80' '; % DSNAME TO ALLOCATE;
DSMEMBER: DC CL8' '; % MEMBER NAME
DSNAMEX: DC CL80' '; % WRKBUFFER;
MEMBER: DC CL8' '; % MEMBER NAME FOR PDS ALLOC;
LASTDSN: DC CL44' '; % FOR THE WILDCARD SEND
DISP1: DC F'2'; % DISP (0=NEW,1=OLD,2=SHR);
DISP2: DC F'3'; % DISP (0=UNCAT,1=CAT,3=KEEP);
INOUT: DC F'2'; % 0=INPUT,1=OUTPUT,2=INOUT);
RECFMX: DC F'1'; % 1=FB,2=VBS;
BLKSIZEX: DC F'3600'; % FOR NEW DATA SETS ONLY;
LRECLX: DC F'80'; % ....;
DEV: DC CL8'FILE '; % DEVICE;
TRACK: DC F'20'; % # TRACKS TO ALLOC FOR NEW DS
DYNALCRC: DC F'0'; % RETURN CODE FROM FUNCTION;
VOLAD: DC F'0'; % ADDRESS OF VOLUME FOR DYNAL;
WRKBUFF: DS CL280;
PREFIX: DC CL44' '; % USERS DSET PREFIX FROM SET
PREFIXL: DC H'0'; % PREFIX LENGTH-1;
PREFMEM: DS CL8; % MEMBER NAME FOR PDS PREFIX
PREFMEML: DC H'0'; % LENGTH OF PREFIX PDS MEMBER
DSNPFIX: DC CL44' '; % PREFIX IF WILDCARD SEND
DSNPFL: DC H'0'; % PREFIX LENGTH
DSNSFIX: DC CL44' '; % SUFFIX LENGTH
DSNSFL: DC H'0'; % SUFFIX LENGTH
MATCHDSN: DC CL44' '; % NAME TO MATCH
MATCHDSL: DS H; % LENGTH OF MATCHNAME
DDELAY: DC F'2000'; % DEFAULT DELAY TIME;
DELAY: DS F; % DELAY TIME;
DC CL8'CRC*****'; % DUMP BUSTERS
BCC: DS F; % FOR BCC COMP
TIMEOUT: DC F'8'; % TIMEOUT FOR OTHER KERMIT
TIMEOUT2: DC F'800'; % TIMEOUT FOR OTHER KERMIT
RTIMEOUT: DC F'800'; % RDATA TIMEOUT
ATIMEOUT: DC F'50'; % ATTACH TIMEOUT
SERVTOUT: DC F'3000'; % SERVER TIMEOUT FOR NACKING 30 SECONDS
SERVWAIT: DC F'720000' ; % SERVER LOGOFF AFTER SIXTY MINUTES
SERVTIME: DC F'0' ; % TIME BUFFER FOR SERVER
STURNTIM: DC F'100'; % SEND TURN TABLE
RTURNTIM: DC F'100'; % RECEIVE TURN TABLE
DSNLEN: DS H; % LENGTH OF DSNAME
DSNADD: DS A; % ADDRESS OF DSNAME
PARM1: DC F'1'; % NO DUMP - TSO COMMAND =1
PARM2: DS CL255; % COMMAND STRING
PARM3: DC F'0'; % LENGTH OF COMMAND STRING
PARM4: DS F; % RETURN CODE HERE
PARM5: DS F; % SERVICE RETURN CODE
PARM6: DS F; % ABEND CODE
KERMDDNM: DS CL8; % DDNAME BUFFER
DSNSIZE: EQU 44; % LEN OF DSNAME
LEVELCK: DC X'01'; % ASCII BCC LEVEL CH 1
HIGHBCC: DC X'03'; % HIGHEST BCC WE SUPPORT
DBCC: DC X'03'; % DEFAULT BCC CHECKING
BLANKS: DC 100CL1' '; % BLANKS
ASCBLANK: DC 100XL1'20'; % BLANKS
AAAAIII: DS XL7; % USER ACCOUNT AND INITIALS
DC CL1'.'; % DOT FOR THE DSNAME
USERPREA: DC A(AAAAIII);
USERPREL: DC H'7'; % LENGTH OF USER PREFIX
TMPDISKA: DC A(TMPVOLID); % INSTALLATION DEFAULT DISK DRIVE NAME
TMPDISKL: DC H'3'; % LENGTH OF TMP NAME
TMPVOLID: DC CL3'TMP'; % REMOVEME
TSOCMDA: DS A; % ADDRESS OF TSO COMMAND TO ISSUE
TSOCMDL: DS H; % LENGTH OF TSO COMMAND
XUSERPRO: AREA H,DSECT=NO;
DC CL3'EX ';
USERPROF: DS 0X; % LABEL FOR USERPROFILE NAME
DC C'KERMIT.PROFILE.CLIST';
USERPROL: EQU *-USERPROF; % LENGTH OF NAME
XUSERPRL: EQU *-XUSERPRO; % LENGTH OF COMMAND
AREAEND; % LENGTH OF COMMAND
XSYSPRO: AREA H,DSECT=NO;
DC CL3'EX '; % EXECUTE COMMAND FOR PROFILE OF SYSTEM
DC CL1'"'; % QUOTE AROUND DSNAME
DC CL1'"'; % QUOTE AROUND DSNAME
XSYSPROL: AREAEND 0X;
STATBUFF: DC CL256' '; % FINAL STATUS OF KERMIT
CATDSPTR: DS A; % ADDRESS OF PLACE IN CATALOG BUFFER
STATLEN: DS H;
WARNBUFF: DC CL255' '; % WARNING BUFFER
WARNLEN: DS H;
WARNAD1: DC A(0); % WARNING BEGINNING OF CHAIN
WARNADL: DC A(0); % ADDRESS OF LAST WARNING ENTRY
SUCESSCC: DC C'TSO KERMIT completed successfully';
ATOEVCON: DC V(ATOETBL); % ASCII TO EBCIDIC TRANSLATE TABLE
ETOAVCON: DC V(ETOATBL); % EBCIDIC TO ASCII TRANSLATE TABLE ADD
ETOAERRV: DC V(ETOAERRT); % TABLE OF UNTRANSLATABLE CHARACTERS
BAL;
*; % TABLE TO TRANSLATE TO UPPER CASE
*;
UPPER DC 256AL1(*-UPPER)
ORG UPPER+X'81'
DC C'ABCDEFGHI'
ORG UPPER+X'91'
DC C'JKLMNOPQR'
ORG UPPER+X'A2'
DC C'STUVWXYZ'
ORG
*; % THIS IS THE ASCII TO EBCDIC TABLE
ATOE DC X'00010203372D2E2F1605250B0C0D0E0F'
DC X'101112133C3D322618193F271C1D1E1F'
DC X'405A7F7B5B6C507D4D5D5C4E6B604B61'
DC X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'
DC X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'
DC X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D' NIH JDW
DC X'79818283848586878889919293949596' NIH JDW
DC X'979899A2A3A4A5A6A7A8A98B4F9BA107' NIH JDW
DC X'00010203372D2E2F1605250B0C0D0E0F' NIH JDW
DC X'101112133C3D322618193F271C1D1E1F' NIH JDW
DC X'405A7F7B5B6C507D4D5D5C4E6B604B61' NIH JDW
DC X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F' NIH JDW
DC X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6' NIH JDW
DC X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D' NIH JDW
DC X'79818283848586878889919293949596' NIH JDW
DC X'979899A2A3A4A5A6A7A8A98B4F9BA107' NIH JDW
*THIS IS THE EBCDIC TO ASCII CONVERSION TABLE
*CHARACTERS NOT REPRESENTABLE IN ASCII ARE REPLACED BY A X'3A'
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
ETOA DC X'000102033A093A7F3A3A3A0B0C0D0E0F' 0 EBCDIC
DC X'101112133A0A080018193A3A1C1D1E1F' 1 TO NI
DC X'3A3A3A3A3A0A171B3A3A3A3A3A050607' 2 ASCII
DC X'3A3A163A3A3A3A043A3A3A3A14153A1A' 3 NI
DC X'203A3A3A3A3A3A3A3A3A3A2E3C282B7C' 4 NI
DC X'263A3A3A3A3A3A3A3A3A21242A293B5E' 5 NI
DC X'2D2F2D3A3A3A3A3A3A3A3A2C255F3E3F' 6 NI
DC X'3A3A3A3A3A3A3A3A3A603A2340273D22' 7 NI
DC X'3A6162636465666768693A7B3A3A3A3A' 8
DC X'3A6A6B6C6D6E6F7071723A7D3A3A3A3A' 9
DC X'3A7E737475767778797A3A3A3A5B3A3A' A NI
DC X'3A3A3A3A3A3A3A3A3A3A3A3A3A5D5E3A' B NI
DC X'3A4142434445464748493A3A3A3A3A3A' C
DC X'3A4A4B4C4D4E4F5051523A3A3A3A3A3A' D
DC X'5C3A535455565758595A3A3A3A3A3A3A' E NI
DC X'303132333435363738393A3A3A3A3A3A' F
SPACE 1
*
* THIS IS TABLE FOR SEARCHING FOR SPECIAL CHARACTER
* QUOTING - TRT FOR QUOTE,BINARY, OR REPEAT
RECTABLE DC 256X'00'
*
ALP;
TMPDSMES: AREA H,DSECT=NO;
DC C'Data set ';
TMPDSN: DS CL44;
DC C' is on Volume ';
TMPVOL: DS CL6; % RETURN ED VOL SERIAL NUMBER
TMPMSL: AREAEND;
BAL;
DATASET CAMLST NAME,DSNAME,,WRKBUFF
DELDSN CAMLST SCRATCH,DSNAME,,WRKBUFF,,OVRD
UNCAT CAMLST UNCAT,DSNAME
ALP;
PARMLEN1: EQU *-PARMS;
WORK2: DS 0F; % WORK AREA 2
DDSN: DS CL44; % DELETE DSNAME
VOLIST: DC H'1'; % ONE VOLUME ON LIST
TSOVOL: DS CL6; % VOLUME
KERMVA: VAREA; % THE V AREA FOR MACROS
KERMBUFF: DS CL80; % BUFFER FOR VOUT
SCT: DS 0F; SCT;
STACK: DS 1024X'FF';
OSAVE: DC A(0);
%%WORKING STORAGE
%% SOME LITS FOR SEND TABLE
SENDTBL: AREA F,DSECT=NO;
DC 256AL1(0); % FILL ARRAY WITH ZEROS
ORG SENDTBL;
DC 32AL1(ASCIIQUO); % CONTROL QUOTE
ORG SENDTBL+127;
DC AL1(ASCIIQUO); % THE DELETE CHARACTER
ORG SENDTBL+128; % CONTROL + 8BIT
DC 32AL1(ASCIQUO8); % CONTROL + 8BIT
DC 95AL1(ASCI8BIT);
ORG SENDTBL+255; % CONTROL + 8BIT
DC AL1(ASCIQUO8); % CONTROL + 8BIT
SENDTBLL: AREAEND;
REPTABLE: AREA F,DSECT=NO; % THESE LENGTHS ARE ALEAST THE NUMBER
DC 256AL1(4); % FILL ARRAY WITH 4'S WORTH WHILE TO QUOTE
ORG REPTABLE; % LESS THAN THESE WOULDN'T BE WORTHWHILE
DC 32AL1(3); % CONTROL QUOTE
ORG REPTABLE+127;
DC AL1(3); % THE DELETE CHARACTER
ORG REPTABLE+128; % CONTROL + 8BIT
DC 32AL1(2); % CONTROL + 8BIT
DC 95AL1(3);
ORG REPTABLE+255; % CONTROL + 8BIT
DC AL1(2); % CONTROL + 8BIT
REPTABLL: AREAEND;
TABTBLAD: DC A(TABTABLE); % ADDRESS OF TAB TABLE
TABWRKA: DS D; % WORK AREA FOR TAB ROUTINE
TABTABLE: AREA H,DSECT=NO; % HALF WORD TABLE OF TAB SETS
DC 256AL1(0);
TABTLEN: AREAEND;
ASTRKTBL: AREA H,DSECT=NO; % SHACT TABLE FOR ********** IN WILDCAR
DC 256AL1(0);
ORG ASTRKTBL+C'*'; % THE "*"
DC AL1(4);
ORG ,; % RESET COUNTER
AREAEND;
SERVCOMM: AREA F,DSECT=NO; % TABLE FOR SERVER COMMANDS
DC 256AL1(0); % ZERO TABLE
ORG SERVCOMM+YOFF;
DC AL1(YCASE); % ACK PACKET
ORG SERVCOMM+NOFF;
DC AL1(NCASE); % NACK PACKET
ORG SERVCOMM+GOFF;
DC AL1(GCASE); % SERVER GENERIC COMMANDS
ORG SERVCOMM+R2OFF;
DC AL1(R2CASE); % SERVER GET COMMAND
ORG SERVCOMM+IOFF;
DC AL1(ICASE); % SERVER I PACKET
ORG SERVCOMM+ROFF;
DC AL1(SCASE); % SENDINIT PACKET
ORG ,; % RESET COUNTER
AREAEND;
COMMAND: AREA F,DSECT=NO; % TABLE FOR COMMANDS
DC 256AL1(0); % ZERO TABLE
ORG COMMAND+YOFF;
DC AL1(YCASE); % ACK PACKET
ORG COMMAND+NOFF;
DC AL1(NCASE); % NACK PACKET
ORG COMMAND+FOFF;
DC AL1(FCASE); % FILE INIT PACKET
ORG COMMAND+DOFF;
DC AL1(DCASE); % DATA PACKET
ORG COMMAND+ZOFF;
DC AL1(ZCASE); % EOF PACKET
ORG COMMAND+COFF;
DC AL1(CCASE); % COMPLETEPACKET
ORG COMMAND+BOFF;
DC AL1(BCASE); % EOT PACKET
ORG COMMAND+EOFF;
DC AL1(ECASE); % ERROR PACKET
ORG COMMAND+AOFF;
DC AL1(ACASE); % ABORT PACKET
ORG COMMAND+ROFF;
DC AL1(SCASE); % SENDINIT PACKET
ORG ,; % RESET COUNTER
AREAEND;
KOUTADDR: DC A(KERMVOUT); % ADDRESS OF OUTPUT
ADDSTATA: DC A(ADSTATUS); % ROUTINE TO ADD TO STATUS BUFFER
ASCILITS: AREA H,DSECT=NO; % TABLE OF VALUES FOR SHOW ROUTINE
DC CL3'NUL';
DC CL3'SOH';
DC CL3'STX';
DC CL3'ETX';
DC CL3'EOT';
DC CL3'ENQ';
DC CL3'ACK';
DC CL3'BEL';
DC CL3'BS ';
DC CL3'HT ';
DC CL3'LF ';
DC CL3'VT ';
DC CL3'FF ';
DC CL3'CR ';
DC CL3'SO ';
DC CL3'SI ';
DC CL3'DLE';
DC CL3'DC1';
DC CL3'DC2';
DC CL3'DC3';
DC CL3'DC4';
DC CL3'NAK';
DC CL3'SYN';
DC CL3'ETB';
DC CL3'CAN';
DC CL3'EM ';
DC CL3'SUB';
DC CL3'ESC';
DC CL3'FS ';
DC CL3'GS ';
DC CL3'RS ';
DC CL3'US ';
ASCLITLN: AREAEND;
ASCCNTLC: AREA H,DSECT=NO; % TABLE FOR CONTROL CHARACTER IN SHOW
DC CL2'^@';
DC CL2'^A';
DC CL2'^B';
DC CL2'^C';
DC CL2'^D';
DC CL2'^E';
DC CL2'^F';
DC CL2'^G';
DC CL2'^H';
DC CL2'^I';
DC CL2'^J';
DC CL2'^K';
DC CL2'^L';
DC CL2'^M';
DC CL2'^N';
DC CL2'^O';
DC CL2'^P';
DC CL2'^Q';
DC CL2'^R';
DC CL2'^S';
DC CL2'^T';
DC CL2'^U';
DC CL2'^V';
DC CL2'^W';
DC CL2'^X';
DC CL2'^Y';
DC CL2'^Z';
DC CL2'^[';
DC CL2'^\';
DC CL2'^]';
DC CL2'^^';
DC CL2'^_';
DC CL2'^`';
ASCCNTLL: AREAEND;
CRCCONAD: DC A(CRCCONST); % ADDRESS OF CRC TABLE
NOQUADD: DC A(NOQUOTE); % TABLE FOR CONTROL CHARACTERS
CIRPARM: AREA F,DSECT=NO;
CIROPT: DC X'02'; % OPTION GET NEX LEVEL DATA SET NAME AND VOL
DC 2AL1(0); % RESERVED BY SYSTEM
CIRLOCRC: DC AL1(0); % LOCATE RETURN CODE
CIRSRCH: DC A(LASTDSN); % SEARCH ARG ADDRESS OF LAST DATA SET NAME
CIRCVOL: DC F'0'; % ADDRESS OF VOL ALWAYS 0 FORCE CAT LOOKUP
CIRWA: DC A(USERWORK); % USER WORK AREA
CIRSAVE: DC A(SAVECAT); % SAVE AREA FOR MACRO
CIRPSWD: DC F'0'; % ADDRESS OF PASSWORD
AREAEND;
SAVECAT: DC 18F'0'; % SAVE AREA FOR CATALOG ROUTINE
CRCCONST: AREA H,DSECT=NO; % BCC VALUE CONSTANTS
% GIVEN BY DIVIDING ANY GIVEN BYTE VALUE BY
% THE CCITT POLYNOMIAL X^16+X^12+X^5+1
% THIS VALUE IS THE REMAINDER
%
DC AL2(0); % 0
DC AL2(4489); % 1
DC AL2(8978); % 2
DC AL2(12955); % 0
DC AL2(17956); % 0
DC AL2(22445); % 0
DC AL2(25910); % 0
DC AL2(29887); % 0
DC AL2(35912); % 0
DC AL2(40385); % 0
DC AL2(44890); % 0
DC AL2(48851); % 0
DC AL2(51820); % 0
DC AL2(56293); % 0
DC AL2(59774); % 0
DC AL2(63735); % 0
DC AL2(4225); % 0
DC AL2(264); % 0
DC AL2(13203); % 0
DC AL2(8730); % 0
DC AL2(22181); % 0
DC AL2(18220); % 0
DC AL2(30135); % 0
DC AL2(25662); % 0
DC AL2(40137); % 0
DC AL2(36160); % 0
DC AL2(49115); % 0
DC AL2(44626); % 0
DC AL2(56045); % 0
DC AL2(52068); % 0
DC AL2(63999); % 0
DC AL2(59510); % 0
DC AL2(8450); % 0
DC AL2(12427); % 0
DC AL2(528); % 0
DC AL2(5017); % 0
DC AL2(26406); % 0
DC AL2(30383); % 0
DC AL2(17460); % 0
DC AL2(21949); % 0
DC AL2(44362); % 0
DC AL2(48323); % 0
DC AL2(36440); % 0
DC AL2(40913); % 0
DC AL2(60270); % 0
DC AL2(64231); % 0
DC AL2(51324); % 0
DC AL2(55797); % 0
DC AL2(12675); % 0
DC AL2(8202); % 0
DC AL2(4753); % 0
DC AL2(792); % 0
DC AL2(30631); % 0
DC AL2(26158); % 0
DC AL2(21685); % 0
DC AL2(17724); % 0
DC AL2(48587); % 0
DC AL2(44098); % 0
DC AL2(40665); % 0
DC AL2(36688); % 0
DC AL2(64495); % 0
DC AL2(60006); % 0
DC AL2(55549); % 0
DC AL2(51572); % 0
DC AL2(16900); % 0
DC AL2(21389); % 0
DC AL2(24854); % 0
DC AL2(28831); % 0
DC AL2(1056); % 0
DC AL2(5545); % 0
DC AL2(10034); % 0
DC AL2(14011); % 0
DC AL2(52812); % 0
DC AL2(57285); % 0
DC AL2(60766); % 0
DC AL2(64727); % 0
DC AL2(34920); % 0
DC AL2(39393); % 0
DC AL2(43898); % 0
DC AL2(47859); % 0
DC AL2(21125); % 0
DC AL2(17164); % 0
DC AL2(29079); % 0
DC AL2(24606); % 0
DC AL2(5281); % 0
DC AL2(1320); % 0
DC AL2(14259); % 0
DC AL2(9786); % 0
DC AL2(57037); % 0
DC AL2(53060); % 0
DC AL2(64991); % 0
DC AL2(60502); % 0
DC AL2(39145); % 0
DC AL2(35168); % 0
DC AL2(48123); % 0
DC AL2(43634); % 0
DC AL2(25350); % 0
DC AL2(29327); % 0
DC AL2(16404); % 0
DC AL2(20893); % 0
DC AL2(9506); % 0
DC AL2(13483); % 0
DC AL2(1584); % 0
DC AL2(6073); % 0
DC AL2(61262); % 0
DC AL2(65223); % 0
DC AL2(52316); % 0
DC AL2(56789); % 0
DC AL2(43370); % 0
DC AL2(47331); % 0
DC AL2(35448); % 0
DC AL2(39921); % 0
DC AL2(29575); % 0
DC AL2(25102); % 0
DC AL2(20629); % 0
DC AL2(16668); % 0
DC AL2(13731); % 0
DC AL2(9258); % 0
DC AL2(5809); % 0
DC AL2(1848); % 0
DC AL2(65487); % 0
DC AL2(60998); % 0
DC AL2(56541); % 0
DC AL2(52564); % 0
DC AL2(47595); % 0
DC AL2(43106); % 0
DC AL2(39673); % 0
DC AL2(35696); % 0
DC AL2(33800); % 0
DC AL2(38273); % 0
DC AL2(42778); % 0
DC AL2(46739); % 0
DC AL2(49708); % 0
DC AL2(54181); % 0
DC AL2(57662); % 0
DC AL2(61623); % 0
DC AL2(2112); % 0
DC AL2(6601); % 0
DC AL2(11090); % 0
DC AL2(15067); % 0
DC AL2(20068); % 0
DC AL2(24557); % 0
DC AL2(28022); % 0
DC AL2(31999); % 0
DC AL2(38025); % 0
DC AL2(34048); % 0
DC AL2(47003); % 0
DC AL2(42514); % 0
DC AL2(53933); % 0
DC AL2(49956); % 0
DC AL2(61887); % 0
DC AL2(57398); % 0
DC AL2(6337); % 0
DC AL2(2376); % 0
DC AL2(15315); % 0
DC AL2(10842); % 0
DC AL2(24293); % 0
DC AL2(20332); % 0
DC AL2(32247); % 0
DC AL2(27774); % 0
DC AL2(42250); % 0
DC AL2(46211); % 0
DC AL2(34328); % 0
DC AL2(38801); % 0
DC AL2(58158); % 0
DC AL2(62119); % 0
DC AL2(49212); % 0
DC AL2(53685); % 0
DC AL2(10562); % 0
DC AL2(14539); % 0
DC AL2(2640); % 0
DC AL2(7129); % 0
DC AL2(28518); % 0
DC AL2(32495); % 0
DC AL2(19572); % 0
DC AL2(24061); % 0
DC AL2(46475); % 0
DC AL2(41986); % 0
DC AL2(38553); % 0
DC AL2(34576); % 0
DC AL2(62383); % 0
DC AL2(57894); % 0
DC AL2(53437); % 0
DC AL2(49460); % 0
DC AL2(14787); % 0
DC AL2(10314); % 0
DC AL2(6865); % 0
DC AL2(2904); % 0
DC AL2(32743); % 0
DC AL2(28270); % 0
DC AL2(23797); % 0
DC AL2(19836); % 0
DC AL2(50700); % 0
DC AL2(55173); % 0
DC AL2(58654); % 0
DC AL2(62615); % 0
DC AL2(32808); % 0
DC AL2(37281); % 0
DC AL2(41786); % 0
DC AL2(45747); % 0
DC AL2(19012); % 0
DC AL2(23501); % 0
DC AL2(26966); % 0
DC AL2(30943); % 0
DC AL2(3168); % 0
DC AL2(7657); % 0
DC AL2(12146); % 0
DC AL2(16123); % 0
DC AL2(54925); % 0
DC AL2(50948); % 0
DC AL2(62879); % 0
DC AL2(58390); % 0
DC AL2(37033); % 0
DC AL2(33056); % 0
DC AL2(46011); % 0
DC AL2(41522); % 0
DC AL2(23237); % 0
DC AL2(19276); % 0
DC AL2(31191); % 0
DC AL2(26718); % 0
DC AL2(7393); % 0
DC AL2(3432); % 0
DC AL2(16371); % 0
DC AL2(11898); % 0
DC AL2(59150); % 0
DC AL2(63111); % 0
DC AL2(50204); % 0
DC AL2(54677); % 0
DC AL2(41258); % 0
DC AL2(45219); % 0
DC AL2(33336); % 0
DC AL2(37809); % 0
DC AL2(27462); % 0
DC AL2(31439); % 0
DC AL2(18516); % 0
DC AL2(23005); % 0
DC AL2(11618); % 0
DC AL2(15595); % 0
DC AL2(3696); % 0
DC AL2(8185); % 0
DC AL2(63375); % 0
DC AL2(58886); % 0
DC AL2(54429); % 0
DC AL2(50452); % 0
DC AL2(45483); % 0
DC AL2(40994); % 0
DC AL2(37561); % 0
DC AL2(33584); % 0
DC AL2(31687); % 0
DC AL2(27214); % 0
DC AL2(22741); % 0
DC AL2(18780); % 0
DC AL2(15843); % 0
DC AL2(11370); % 0
DC AL2(7921); % 0
DC AL2(3960); % 0
AREAEND;
%%WORKING STORAGE END
SUBTITLE 'KRESET';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INITIALIZATION ROUTINE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
KRESET:
CENTER VRE,HIGHR,ENTRY=NO;
BAL;
XC N,N SET VARIABLES TO ZERO
XC NUM,NUM
XC LSDAT,LSDAT
XC LRDAT,LRDAT
MVI FLAGS,X'00' CLEAR ALL FLAGS
XC SAVPL,SAVPL
XC RSAVPL,RSAVPL
XC NUMTRY,NUMTRY
MVC FILNAM,=18X'20' BLANK OUT FILNAM & NAME
MVC NAME,=18X'20'
XC OLDTRY,OLDTRY
XC SIZE,SIZE
XC TEMP,TEMP
XC STORLOC,STORLOC
MVC DELAY,DDELAY SET DEFAULT DELAY
MVC LRECL(2),DLRECL SET DEFAULTS, JUST IN CASE
MVC BLKSIZE(2),DBLKSIZE SET DEFAULTS, JUST IN CASE
MVC TRACK,DTRACK DEFAULT SPACE OF 5 TRACKS
MVC RFM(2),DRECFM
MVC QUOCHAR(1),DQUOTE
MVC TABCHAR(1),DTABCHAR TAB CHARACTER
MVC RQUO(1),DQUOTE
MVC REOL(1),DEOL
MVC SEOL(1),DEOL
MVC SSOH(1),DSOH
MVC RSOH(1),DSOH
MVC BINQC(1),DQBIN EIGTH BIT QUOTE CHARACTER
MVI STATE,C' '
* MVI STYPE,C' '
MVI RTYPE,C' '
*
ALP; % RETURN TO ALP LAND
MZC TABTABLE,TABTLEN; % ZERO TAB TABLE
LA XRA,TABTABLE; % POINT AT TABLE
LI VR1,10; % TEN ENTRIES IBM STYLE
LI VR0,9; % 9 FIRST ENTRY EACH 8 UNITS LONG
DO BEGIN
STH VR0,0(,XRA); % PUT IN TABLE
AI VR0,8; % NEXT ENTRY
AI XRA,2 % NEXT POINT IN BUFFER
END FOR VR1;
MZC RECTABLE,256; % ZERO RECTABLE
MMVC SENDTBL,SENDTLIT,256; % INITIALIZE BOTH TABLES
MMVC REPTCHAR,DREPT,1; % MOVE IN DEFAULT VALUE FOR REPEAT PREFIX
MZC PREFIXL,2; % NO PREFIX SET
ZF PREFXQUO; % QUOTED PREFIX
SF EDITF; % DEFAULT AS EDIT FILE
MMVC EDTYPE,=F'1',4; % TURN OFF LINE NUMBERS
MMVC HIGHBCC,DBCC,1; % SET BCC CHECK LEVEL
SF TIMERF; % TURN ON TIMER
MMVC DATA,=C'TEXT ',6;
ZF DATAFLAG;
MMVC PHDR,SSOH,1; % INITIALIZE START O HEADER
CALL XANYVOL; % EXTERNAL ROUTINE GIVES THE SYSTEM
% SYMBOL FOR SYSTEM SELECTING THE VOLUMRE
% ON UPLOADED DATA SET (E.G SET VOL TMP - SYSTEM SELECTS
ST VR1,TMPDISKA;
STH VR0,TMPDISKL;
LR XRA,VR0;
MFC VOLUME,L'VOLUME;
EXI XRA,MMVC,VOLUME,0(VR1),*-*,INCR=YES,DECR=YES;
CEXIT VRE,HIGHR;
LTORG;
KWRDSECT: AREA ,0X;
COPY KWR;
AREAEND;
SENDTLIT: AREA F,DSECT=NO;
DC 256AL1(0); % FILL ARRAY WITH ZEROS
ORG SENDTLIT;
DC 32AL1(ASCIIQUO); % CONTROL QUOTE
ORG SENDTLIT+127;
DC AL1(ASCIIQUO); % THE DELETE CHARACTER
ORG SENDTLIT+128; % CONTROL + 8BIT
DC 32AL1(ASCIQUO8); % CONTROL + 8BIT
DC 95AL1(ASCI8BIT);
ORG SENDTLIT+255; % CONTROL + 8BIT
DC AL1(ASCIQUO8); % CONTROL + 8BIT
SENDTLTL: AREAEND;
SUBTITLE 'PROFILES';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE NAME - PROFILES
% FUNCTION - EXECUTE SYSTEM AND USER PROFILES IF ANY VIA LOCATE
% INPUTS NONE
% OUTPUTS EXECTION OF PROFILE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PROFILES:
CENTER VRE,HIGHR,ENTRY=NO;
MFC DSNAME,44;
% NOW CHECK IF THERE IS A USER PROFILE
LH XRA,USERPREL; % LENGTH OF USER PREFIX
L XRB,USERPREA; % USER PREFIX NAME
EXI XRA,MMVC,DSNAME,0(XRB),*-*,INCR=YES,DECR=YES; % USER + "."
LA VR1,DSNAME;
AR VR1,XRA;
MVI 0(VR1),C'.'; % PUT IN DOT AFTER USER CODE
AI VR1,1;
MMVC 0(VR1),USERPROF,USERPROL;
LOCATE DATASET;
IF <RZ VRF> THEN BEGIN % DATASET EXISTS - SO EXECUTE IT VIA TSO
LI VR0,XUSERPRL; % LENGTH OF COMMAND
CCALL TSOCMD,A,VR1=XUSERPRO; % EXECUTE THE PROFILE COMMAND
END;
MFC DSNAME,44;
% FIRST CHECK IF THERE IS A SYSTEM PROFILE
CALL SYSPRODS; % CALL EXTERNAL ROUTINE FOR NAME OF SYSTEM PROFILE
IF <RP VR0> & <CLI VR0,45; CC L> THEN BEGIN % MUST HAVE LENGTH
LR XRA,VR1; % POINTER TO SYSTEM PROFILE
LR XRB,VR0; % LENGTH OF SYSTEM PROFILE
EXI XRB,MMVC,DSNAME,0(XRA),*-*,INCR=YES,DECR=YES;
LOCATE DATASET;
IF <RZ VRF> THEN BEGIN % DATASET EXISTS - SO EXECUTE IT VIA TSO
LR VR0,XRB; % LENGTH OF COMMAND
AI VR0,5; % LENGTH OF DSN + EX + QUOTES AND BLANKS
EXI XRB,MMVC,EXDSN,0(XRA),*-*,INCR=YES,DECR=YES;
LA VR1,EXDSN;
AR VR1,XRB;
MVI 0(VR1),C'''';
CCALL TSOCMD,A,VR1=EXBUFFER; % EXECUTE THE PROFILE COMMAND
END;
MFC DSNAME,44;
END; % OF POSITIVE RETURN ON SYSTEM PROFILE
DATA BEGIN
EXBUFFER:
DC CL3'EX '; % THE EXECUTE COMMAND
DC CL1''''; % QUOTE AROUND SYSTEM PROFILE
EXDSN: DS CL46; % FOR DATA SET NAME
END;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'STCKMOD';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: STCKMOD
% FUNCTION: CALLS THE STACK MACRO TO PUT INPUT ON STACK
% IF ONE EXISTS ON THE COMMAND LINE OF CP
% RETURN : ITEM STACKED ON INPUT STACK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
STCKMOD:
CENTER VRE,HIGHR,ENTRY=NO;
L XRA,CBUFFADD; % ADDRESS
LH XRB,0(XRA); % LOAD LENGTH OF COMMAND STRING
SI XRB,4; % SUB OFF FOUR FOR HEADER
LH XRC,2(XRA); % LOAD OFFSET FOR PARAMETER
SR XRB,XRC; % SEE IF A PARAMETER EXISTS
IF <RP XRB> THEN BEGIN % WE HAVE ONE
AI XRA,4; % POINT TO BEGINING OF COMMAND STRING
AR XRA,XRC; % INDEX TO BEGINNING OF PARAMETER
% NOW XRA-> PARAMETER
% AND XRB= THE LENGTH
LA VR0,16(,XRB); % THE LENGTH
O VR0,=AL1(78,0,0,0); % SUBPOOL 78 WHERE THE STACK WANTS IT
GETMAIN R,LV=(0); % GET THE CORE
LR XRC,VR1; % ADDRESS
MZC 0(XRC),16; % CLEAR LSD
USE XRC AS LSD IN BEGIN
AI VR1,16; % INCREMENT PAST LSD
ST VR1,LSDADATA; ST VR1,LSDANEXT; % PLANT BUFFER ADDRESS
STH XRB,LSDRCLEN; % PLANT RECORD LENGTH
STH XRB,LSDTOTLN; % PLANT TOTAL LENGTH
END;
EXI XRB,MMVC,0(VR1),0(XRA),*-*,INCR=YES,DECR=NO;
L XRA,UPTADD; % UPTADDRESS
L XRB,ECTADD; % ECT ADDRESS
L VRF,STACKADD;
STACK STORAGE=((XRC),SOURCE),ENTRY=(15),MF=(E,IOPLADS),_
PARM=STACKLST,UPT=(XRA),ECT=(XRB),ECB=ECBGETLN;
DATA BEGIN
STACKLST: STACK MF=L;
END; % THAT'S ALL FOLKS
END; % OF SOMETHING TO STACK
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KSET';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MODULE NAME - KSET
%
%
% FUNCTION- MODULE SETS VARIOUS KERMIT OPTIONS
% WHICH ARE DISPLAYED VIA THE SHOW COMMAND
%
%
% INPUTS - THE BUFFER 'INPUT' CONTAINS A COMMAND STRING
%
%
%
%
% OUTPUTS- CORRECTLY SET OPTIONS
%
%
% RETURN
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KSET: ;
CENTER VRE,HIGHR,ENTRY=NO;
LA XRC,*+4095;
USING *+4095-4,XRC;
%USING *+4095,XRC;
L XRD,SETADD;
LA XRE,4095(,XRD);
USING SETLABEL+4095,XRE; % LITERALS ADDRESSIBILITY
USING SETLABEL,XRD; % ADDRESSIBILITY
SCERROR NEW=SETERROR; % ROUTINE FOR SCANNER ERROR
VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN; % INIT VAREA FOR OUTPUT
SETBLCK: DO BEGIN % MAINLY TO FALL OUT
SCAN *; % SCAN FOR SPECIFIC SET COMMAND
SCKW DATA,SETDATA,J; % DATA COMMAND
SCKW BLOCK,SETBLOCK,J; % BLOCK COMMAND
SCKW DEBUG,SETDBUG,J; % DEBUG COMMAND
SCKW (HELP,?),SETHELP; % HELP COMMAND
SCKW BIT8,SETBIT8,J; % 8 BIT QUOTING Y/N COMMAND
SCKW EDIT,SETEDIT,J; % EDIT DATA SET OPTIONS
SCKW (TAB,TABS),SETTAB,J; % TAB OPTIONS
SCKW (SER,SERVER),SETSER,J; % SERVER MODE OPTIONS
SCKW (TIME,TIMER),SETTIME,J; % ENABLE TIMEOUT FEATURE
SCKW LRECL,SETLRECL,P; % LRECL COMMAND
SCKW BLKSIZE,SETBLK,P,LIMIT=AL1(5); % BLKSIZE COMMAND
SCKW SPACE,SETSPACE,P; % SPACE COMMAND
SCKW DELAY,SETDELAY,P; % DELAY COMMAND
SCKW REOL,SETREOL,P,LIMIT=AL1(3); % RECEIVE EOL COMMAND
SCKW SEOL,SETSEOL,P,LIMIT=AL1(3); % SEND EOL COMMAND
SCKW SOH,SETSOH,P,LIMIT=AL1(3); % SOH COMMAND
SCKW (P,PACK,PACKET),SETPACK,P; % RECEIVE PACKET COMMAND
SCKW RECFM,SETRECFM,P,LIMIT=AL1(2); % RECFM COMMAND
SCKW CQUOTE,SETQUOTE,P,LIMIT=AL1(3); % QUOTE COMMAND
SCKW VOLUME,SETVOL,P,LIMIT=AL1(7); % VOL COMMAND
SCKW BQUOTE,SETBINQC,P,LIMIT=AL1(3); % BINARY QUOTE COMMAND
SCKW RQUOTE,SETREPTQ,P,LIMIT=AL1(3); % REPEAT QUOTE COMMAND
SCKW NUMBERED,DONUMBER; % NUMBERING COMMAND
SCKW PREFIX,DOPREFIX; % PREFIX COMMAND
SCKW NOPREFIX,NOPREFIX; % PREFIX COMMAND
SCKW TURNAROUND,DOTURNRN,J;
SCKW ,BADSETKY; % UNKNOWN KEYWORD
SCANEND; % END OF SCANNING
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% NO PARM ERROR HERE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
WRTERM 'Parameter required for the Set command ';
% drop into help message
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET HELP TELLS VARIOUS SET OPTIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETHELP:
WRTERM 'SET command options are ';
WRTERM ' '; % BLANK LINE
WRTERM 'Data set attributes ';
WRTERM 'DATA - Specifies text or binary file processing.';
WRTERM 'EDIT - Selects WYLBUR edit format or'_
' non-edit format for received text';
WRTERM 'data sets.';
WRTERM 'NUMBERED - Controls line numbering in non-edit '_
'format text data sets.';
WRTERM 'TABS - Controls tab processing (tabs to spaces '_
'receiving, vice-versa sending).';
WRTERM 'RECFM - Record format for received data set'_
' (non-edit format only).';
WRTERM 'LRECL - Logical record length for received data set'_
' (non-edit format only).';
WRTERM 'BLKSIZE - Block size for received data set'_
' (non-edit format only).';
WRTERM 'SPACE - Space allocation for received data set in tracks.';
WRTERM 'VOLUME - Disk volume to store received data set.';
WRTERM 'PREFIX - Prefix to be appended to the start of data'_
' set names.';
WRTERM 'NOPREFIX - Cancels a previously set prefix.';
WRTERM ' ';
WRTERM 'Protocol Attributes ';
WRTERM 'DELAY - Timing value for delay before starting send.';
WRTERM 'TIMER - Timeout on received packets.';
WRTERM 'BLOCK - Type of block checking on packets.';
WRTERM 'PACKET - Packet size.';
WRTERM 'CQUOTE - Quote character for control characters.';
WRTERM 'BQUOTE - Quote character for 8th bit quoting.';
WRTERM 'RQUOTE - Quote character for repeat count quoting.';
WRTERM 'SOH - First character of packet.';
WRTERM 'SEOL - Character appended to the end of sent packets.';
WRTERM 'REOL - Character expected at the end of received packets.';
WRTERM 'DEBUG - Sends log of all KERMIT packets '_
'and disk I/O to a data set.';
WRTERM ' ';
WRTERM 'Specific information on each item is '_
'available by "SET item ?".';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET DATA FUNCTION BINARY OR TEXT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETDATA:
SCKW ?,DATAHELP; % USER NEEDS INFO
SCKW (B,BINARY),BINON; % TURN ON INDICATOR
SCKW (TEXT,T),BINOFF; % TURN OFF
SCKW ,DATAERR; % MISSING PARM
BINON:
SF DATAFLAG; % TURN ON BINARY INDICATOR
MMVC DATA,=C'BINARY',6;
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
BINOFF:
ZF DATAFLAG; % TURN OFF BINARY INDICATOR
MMVC DATA,=C'TEXT ',6;
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
DATAHELP:
WRTERM 'Sets TEXT (ASCII-EBCDIC conversion) '_
'or BINARY (no conversion)';
WRTERM 'processing of data.';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
DATAERR:
WRTERM 'Valid options for data are binary or text ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET BLOCK CHECK TYPE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SETBLOCK:
SCKW 1,SETBCC,CODE=AL1(1);
SCKW 2,SETBCC,CODE=AL1(2);
SCKW 3,SETBCC,CODE=AL1(3);
SCKW CRC,SETBCC,CODE=AL1(3);
SCKW (HELP,?),BCCHELP;
SCKW ,BCCSETER;
SETBCC:
STC VRE,HIGHBCC; % STORE OFF THE VALUE
EXIT FROM SETBLCK;
%
BCCHELP:
WRTERM 'Specifies which type of block checking is used.';
BCCSETER :
WRTERM 'Valid options are 1 (1-byte checksum), 2 (2-byte checksum),';
WRTERM '3 (3 byte cyclic redundancy check), or CRC '_
'(synonym for 3).';
EXIT FROM SETBLCK;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET BIT8 FUNCTION ON OR OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETBIT8:
SCKW ?,BIT8HELP; % USER NEEDS INFO
SCKW ON,BITON8; % TURN ON INDICATOR
SCKW OFF,BITOFF8; % TURN OFF
SCKW ,BIT8ERR; % MISSING PARM
BITON8:
SF BIT8FLAG; % TURN ON WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
BITOFF8:
ZF BIT8FLAG; % TURN OFF WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
BIT8HELP:
WRTERM 'BIT8 either on/off';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
BIT8ERR:
WRTERM 'BIT8 turns on/off eighth bit quoting ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET EDIT FUNCTION ON OR OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETEDIT:
SCKW ?,EDITHELP; % USER NEEDS INFO
SCKW ON,EDITON; % TURN ON INDICATOR
SCKW OFF,EDITOFF; % TURN OFF
SCKW ,EDITERR; % MISSING PARM
EDITON:
SF EDITF; % TURN ON WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
EDITOFF:
ZF EDITF; % TURN OFF WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
EDITHELP:
WRTERM 'Controls use of WYLBUR edit format for received data sets.';
WRTERM 'Valid options are ON and OFF (default ON).';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
EDITERR:
WRTERM 'Valid SET EDIT parameters are on, off, or help ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET TIME FUNCTION ON OR OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETTIME:
SCKW ?,TIMEHELP; % USER NEEDS INFO
SCKW ON,TIMEON; % TURN ON INDICATOR
SCKW OFF,TIMEOFF; % TURN OFF
SCKW ,TIMEINT,I,; % GETS ACTUAL VALUE OF TIME FOR TIMER
SCKW ,TIMEERR; % MISSING PARM
TIMEON:
SF TIMERF; % TURN ON WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
TIMEOFF:
ZF TIMERF; % TURN OFF WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
TIMEHELP:
WRTERM _
'Controls timeout processing for received packets. TSO KERMIT ';
WRTERM _
'sends a NAK packet after timeout interval expires. After ';
WRTERM _
'20 retries, TSO KERMIT terminates the file transfer. Valid';
WRTERM _
'are OFF (turns off timeout), ON (turns on timeout), or the number';
WRTERM _
'of seconds to be used for the timeout interval.';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
TIMEINT:
IF <CI VRF,TIMERTOP; CC H> THEN BEGIN
WRTERM 'Too large a value for timer - 3600 seconds max';
END % OF ERROR
ELSE BEGIN
MI VRF,100; % STIMER MACRO USES 100'S OF SECONDS
ST VRF,RTIMEOUT;
SF TIMERF;
END;
EXIT FROM SETBLCK;
TIMEERR:
WRTERM 'Valid SET TIME parameters are on, off, or help ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET TAB FUNCTION ON OR OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETTAB:
SCKW ?,TABHELP; % USER NEEDS INFO
SCKW ON,TABON; % TURN ON INDICATOR
SCKW OFF,TABOFF; % TURN OFF
SCKW ,TABSCN,B; % CALL SCAN TAB ROUTINE
TABON:
FREEMAIN RC,SP=18; % FREE TAB BUFFER
SF TABF; % TURN ON WORD INDICATOR
LA XRA,TABTABLE; % STANDARD TABLE
ST XRA,TABTBLAD; % STORE IN ADDRESS THAT TAB ROUTINES USE
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
TABOFF:
FREEMAIN RC,SP=18; % FREE TAB BUFFER
ZF TABF; % TURN OFF WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
TABHELP:
WRTERM _
'Controls TAB processing on upload or download of text files.'_
' OFF disables';
WRTERM _
'TAB processing. ON assumes tabs are set every 8 positions on the ';
WRTERM _
'microcomputer and changes tabs to blanks in received data sets and';
WRTERM _
'blanks to tabs in transmitted data sets. Tab positions may also ';
WRTERM _
'be specified as "column", "column+interval*count" '_
'to set a tab at';
WRTERM '"column" and every "interval" columns for "count" times,';
WRTERM '"and/or column+interval/max"'_
' to set a tab "interval" columns through ';
WRTERM 'column "max".';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
TABSCN:
CCALL SCANTABS,A;
IF <RNZ VRF> THEN % ISSUE MESSAGE ON ERROR
WRTERM 'Invalid SET TAB parameters. Type SET TAB ? for information.'
ELSE SF TABF; % INDICATE TABBING
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET SERVER FUNCTION ON OR OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETSER:
SCKW ?,SERHELP; % USER NEEDS INFO
SCKW ON,SERON; % TURN ON INDICATOR
SCKW OFF,SEROFF; % TURN OFF
SCKW ,SERERR; % MISSING PARM
SERON:
SF SERVERF; % TURN ON WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
SEROFF:
ZF SERVERF; % TURN OFF WORD INDICATOR
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
SERHELP:
WRTERM 'The SERVER command enables SERVER processing '_
'TSO KERMIT becomes a slave to micro KERMIT . ';
WRTERM 'No set commands available while in Server mode ';
WRTERM 'the pc KERMIT issuses a logoff to the Server ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
SERERR:
WRTERM 'Valid SET SERVER parameters are on, off, or help ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET DEBUG FUNCTION ON OR OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETDBUG:
SCKW ?,DBUGHELP; % USER NEEDS INFO
SCKW ON,DBUGON; % TURN ON INDICATOR
SCKW OFF,DBUGOFF; % TURN OFF
SCKW ,DBUGERR; % MISSING PARM
DBUGON:
SF DBUGFLAG; % TURN ON WORD INDICATOR
% OPEN FILE IF CLOSED
IF ^<OPENP DEBUG> THEN BEGIN % FILE OPEN
OPEN (DEBUG,(OUTPUT));
IF ^<OPENP DEBUG> THEN BEGIN % FILE OPEN
WRTERM 'Unable to open DEBUG - DEBUG disabled';
ZF DBUGFLAG; % TURN OFF WORD INDICATOR
END; % OF ERROR OPEN
END; % OF OPEN BLOCK
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
DBUGOFF:
ZF DBUGFLAG; % TURN OFF WORD INDICATOR
% CLOSE FILE IF OPEN
IF <OPENP DEBUG> THEN CLOSE DEBUG; % FILE CLOSE
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
DBUGHELP:
WRTERM 'SET DEBUG ON dumps all received and sent packets';
% 'all data set';
WRTERM 'plus all data set I/O to a VB data set.';
WRTERM 'The user must allocate the DD name DEBUG '_
'to a sequential data set.';
WRTERM 'SET DEBUG OFF (default) closes debug data set (if open) ';
WRTERM 'and turns off debugging information.';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
DBUGERR:
WRTERM 'Only valid debug options are on/off ';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET VOLUME SERIAL NUMBER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETVOL:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
VOLHELP:
WRTERM 'Specifies which disk volume will be used for the'_
' received data set.';
WRTERM 'VOLUME requires a 6 character volume serial number (e.g.'_
' FILE24).';
%WRTERM 'TMP means that any TMP volume may be used.';
L XRA,TMPDISKA;
LH XRB,TMPDISKL;
LA VR1,WRKBUFF;
EXI XRB,MMVC,WRKBUFF,0(XRA),*-*,INCR=YES,DECR=YES;
AR VR1,XRB;
MMVC 0(VR1),=C' means that any ',16;
AI VR1,16;
EXI XRB,MMVC,0(VR1),0(XRA),*-*,INCR=YES,DECR=YES;
AR VR1,XRB;
MMVC 0(VR1),=C' volume will be used.',21;
AI VR1,21;
LR VR0,VR1;
LA VR1,WRKBUFF;
SR VR0,VR1;
TPUT (VR1),(VR0);
END % OF HELP
ELSE BEGIN
IF ^<CI VR0,6> THEN BEGIN % MUST HAVE 6 CHARACTER VOLUME
L XRA,TMPDISKA; % ADDRESS OF DEFAULT DISK
LH XRB,TMPDISKL;
IF <EXI XRB,MCLC,0(VR1),0(XRA),*-*,INCR=YES,DECR=YES> THEN BEGIN
MFC VOLUME,L'VOLUME;
EXI XRB,MMVC,VOLUME,0(XRA),*-*,INCR=YES,DECR=YES;
END
ELSE BEGIN % ERROR
VOLERR:
WRTERM 'VOLUME must have 6 character length';
END; % ERROR
END
ELSE BEGIN % A GOOD 6 SERIAL
MMVC VOLUME,0(VR1),6; % CHANGE VOLUME
MVI VOLUME+6,C' '; % BLANK LAST
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET RECFM V OR F
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETRECFM:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
RECFMHLP:
WRTERM 'Record format for received non-edit format data set.';
WRTERM 'Valid Record formats are F, FB, V, VB, VBS or U (default VB).';
%
END % OF HELP
ELSE BEGIN
LR XRA,VR0; % GET LENGTH
IF <CLI 0(VR1),C'F'> | % MUST HAVE F CHARACTER RECFM OR
<CLI 0(VR1),C'U'> | % MUST HAVE U CHARACTER RECFM
<CLI 0(VR1),C'V'> THEN BEGIN % MUST HAVE V CHARACTER RECFM
IF <CI VR0,1> THEN MVI RFM+1,C' ' % BLANK IT OUT
ELSE <GOTO RECFMERR IF <CLI 1(VR1),C'B'; CC NE>>; % JUMP OUT
EXI XRA,MMVC,RFM,0(VR1),0,DECR=YES; % CHANGE RECFM
END
ELSE BEGIN % RECFM ERROR
RECFMERR:
WRTERM 'Valid Record formats are F, FB, V, VB ,VBS or U (default VB)';
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET QUOTE CHARACTER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETQUOTE:
SCINIT (VR1),(VR0);
SCAN *;
SCKW (HELP,?),CQUOTHLP;
SCKW ,CQUOTNUM,PI,LIMIT=AL1(127);
SCKW ,CQUOTCHK,P,LIMIT=AL1(1);
SCKW ,CQUOTBAD;
SCANEND;
EXIT FROM SETBLCK;
CQUOTHLP:
WRTERM 'CQUOTE character (default #) is used for prefixing'_
' characters with a value lower ';
WRTERM 'than 32 decimal in ASCII. Value must be between 33-62 '_
'or 96-126 decimal,';
WRTERM 'indicating the ASCII code for the character.'_
' The actual character may';
WRTERM 'also be specified.';
%
EXIT FROM SETBLCK;
CQUOTCHK:
L XRA,ETOAVCON; % ADDRESS OF TABLE
MTR 0(VR1),0(XRA),1; % GET ASCII CHARACTER
LOADB VRF,0(VR1); % LOAD IT
% NOW DROP INTO CHECK
CQUOTNUM: % NUMBER IN VRF
CCALL CHKCNTL,A,VR0=1;
IF <RNZ VRF> THEN
BEGIN % UNVALID VALUE
CQUOTBAD:
WRTERM 'Invalid value - must be between 33-62 - ASCII '_
'Or 96-126 ASCII ';
END; % OF ERROR VALUE
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET BINARY QUOTE CHARACTER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETBINQC:
SCINIT (VR1),(VR0);
SCAN *;
SCKW (HELP,?),BQUOTHLP;
SCKW ,BQUOTNUM,PI,LIMIT=AL1(127);
SCKW ,BQUOTCHK,P,LIMIT=AL1(1);
SCKW ,BQUOTBAD;
SCANEND;
EXIT FROM SETBLCK;
BQUOTHLP:
TPUT =C'8th bit quote character (default &&) is used for ',48;
WRTERM 'prefixing characters that have their 8th bit on.';
WRTERM 'Value must be between 33-62 '_
'or 96-126 decimal,';
WRTERM 'indicating the ASCII code for the character.';
WRTERM 'The actual character may also be specified.';
%
EXIT FROM SETBLCK;
BQUOTCHK:
L XRA,ETOAVCON; % ADDRESS OF TABLE
MTR 0(VR1),0(XRA),1; % GET ASCII CHARACTER
LOADB VRF,0(VR1); % LOAD IT
BQUOTNUM: % NUMBER IN VRF
CCALL CHKCNTL,A,VR0=2;
IF <RNZ VRF> THEN BEGIN % UNVALID VALUE
BQUOTBAD:
WRTERM 'Invalid value - must be between 33-62 - ASCII ';
WRTERM 'Or 96-126 ASCII ';
END; % OF ERROR VALUE
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET REPEAT QUOTE CHARACTER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETREPTQ:
SCINIT (VR1),(VR0);
SCAN *;
SCKW (HELP,?),RQUOTHLP;
SCKW ,RQUOTNUM,PI,LIMIT=AL1(127);
SCKW ,RQUOTCHK,P,LIMIT=AL1(1);
SCKW ,RQUOTBAD;
SCANEND;
EXIT FROM SETBLCK;
RQUOTHLP:
WRTERM 'Repeat quote character (default ~) is used for ';
WRTERM 'prefixing repeated characters.';
WRTERM 'Value must be between 33-62 '_
'or 96-126 decimal,';
WRTERM 'indicating the ASCII code for the character.';
WRTERM 'The actual character may also be specified.';
EXIT FROM SETBLCK;
RQUOTCHK:
L XRA,ETOAVCON; % ADDRESS OF TABLE
MTR 0(VR1),0(XRA),1; % GET ASCII CHARACTER
LOADB VRF,0(VR1); % LOAD IT
% NOW DROP INTO CHECK
RQUOTNUM: % NUMBER IN VRF
CCALL CHKCNTL,A,VR0=3;
IF <RNZ VRF> THEN BEGIN
RQUOTBAD:
WRTERM 'Invalid value - must be between 33-62 - ASCII ';
WRTERM 'Or 96-126 ASCII ';
END; % OF ERROR VALUE
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET BLOCKING
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETBLK:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
BLKHELP:
WRTERM 'Block size for received non-edit format data set '_
'(default 6356, max 32760).';
%
END % OF HELP
ELSE BEGIN
CVDTB (VR1),(VR0); % CONVERT THE EBCDIC TO BINARY
IF <RMZ VRF> | <CI VRF,32767; CC NL> THEN BEGIN % 32767 HIGHEST VALUE
BLKERR:
WRTERM 'BLOCKING HIGHEST VALUE = 32767';
END
ELSE BEGIN % A GOOD 1 BLK
STH VRF,BLKSIZE; % STORE IF OFFF
END; % OF SELECT BEGIN
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET LRECL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETLRECL:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
LRECLHLP:
WRTERM 'Logical record length for received non-edit format data set';
WRTERM '(default 504, max 32760).';
%
END % OF HELP
ELSE BEGIN
CVDTB (VR1),(VR0); % CONVERT THE EBCDIC TO BINARY
IF <RMZ VRF> | <CI VRF,32761; CC NL> THEN BEGIN % 32760 HIGHEST VALUE
LRECLERR:
WRTERM 'LRECL HIGHEST VALUE = 32760-CAN`T BE 0 OR MINUS';
END
ELSE BEGIN % A GOOD LRECL
STH VRF,LRECL; % STORE IF OFFF
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET DELAY BEFORE SEND INIT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETDELAY:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
DELAYHLP:
WRTERM 'Specifies number of seconds (default 20)'_
' that TSO KERMIT waits before the ';
WRTERM 'first packet is sent by the SEND command.';
%
END % OF HELP
ELSE BEGIN
CVDTB (VR1),(VR0); % CONVERT THE EBCDIC TO BINARY
IF <RMZ VRF> | <CI VRF,32767; CC NL> THEN BEGIN % 32767 HIGHEST VALUE
DELAYERR:
WRTERM 'DELAY HIGHEST VALUE = 32767-CAN`T BE 0 OR MINUS';
END
ELSE BEGIN % A GOOD DELAY
MI VRF,100; % PUT IN 100TH OF SECONDS
ST VRF,DELAY; % STORE IF OFFF
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET SOH START-OF-HEADER CHARACTER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETSOH:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
SOHHELP:
WRTERM 'Sets the Start-of-header character sent at the start of'_
' each transmitted packet ';
WRTERM 'and expected at the start of each received packet.';
WRTERM 'May be specified as decimal value of ASCII '_
'code (0-31), ASCII control character ';
WRTERM 'name (e.g., SOH), or in control key notation (e.g., ^A).';
%
END % OF HELP
ELSE BEGIN
%CVDTB (VR1),(VR0); % CONVERT THE EBCDIC TO BINARY
CCALL SETCNTLS,A;
IF <RM VRF> | <CI VRF,32; CC NL> THEN BEGIN % 31 HIGHEST VALUE
SOHERR:
WRTERM 'Valid Values 0-31 decimal';
END
ELSE BEGIN % A GOOD 1 SOH
STC VRF,SSOH; % STORE IF OFFF
STC VRF,RSOH; % RECEIVE SOH
STC VRF,PHDR; % STORE OFF IN SEND PACKET
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET EOL END-OF-LINE CHARACTER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETSEOL:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
WRTERM 'The End-of-line control character '_
'sent at the end of each transmitted packet.';
WRTERM 'May be specified as decimal value of ASCII '_
'code (0-31), ASCII control character ';
WRTERM 'name (e.g., CR), or in control key notation (e.g., ^M).';
%
END % OF HELP
ELSE BEGIN
CCALL SETCNTLS,A;
IF <RM VRF> | <CI VRF,32; CC NL> THEN BEGIN % 31 HIGHEST VALUE
EOLERR:
WRTERM 'Valid Values 0-31 decimal';
END
ELSE BEGIN % A GOOD 1 EOL
STC VRF,SEOL; % STORE IF OFFF
END; % OF GOOD
END; % OF NON HELP
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SETREOL:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
WRTERM 'The End-of-line control character '_
'expected at the end of each received packet.';
WRTERM 'May be specified as decimal value of ASCII '_
'code (0-31), ASCII control character ';
WRTERM 'name (e.g., CR), or in control key notation (e.g., ^M).';
%
END % OF HELP
ELSE BEGIN
CCALL SETCNTLS,A;
IF <RM VRF> | <CI VRF,32; CC NL> THEN BEGIN % 31 HIGHEST VALUE
%EOLERR:
WRTERM 'Valid Values 0-31 decimal';
END
ELSE BEGIN % A GOOD 1 EOL
STC VRF,REOL; % RECEIVE EOL
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET RECEIVE PACKET LENGTH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETPACK:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
PACKHELP:
WRTERM 'Sets the maximum packet length'_
'. Valid Values are 26-94 decimal.';
%
END % OF HELP
ELSE BEGIN
CVDTB (VR1),(VR0); % CONVERT THE EBCDIC TO BINARY
IF <CI VRF,26; CC NL> & <CI VRF,94; CC NH> THEN BEGIN % 94 HIGHEST VALU
ST VRF,RPSIZ; % STORE IF OFFF
END
ELSE BEGIN % A ERROR PACKET SIZE
PACKERR:
WRTERM 'Valid Values 26-94 decimal';
END; % OF GOOD
END; % OF NON HELP
%
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET SPACE -TRACK ALLOCATIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETSPACE:
IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
SPACEHLP:
WRTERM 'Space allocation for received data sets'_
' in tracks (default 5, max 32767).';
%
END % OF HELP
ELSE BEGIN
CVDTB (VR1),(VR0); % CONVERT THE EBCDIC TO BINARY
IF <RMZ VRF> | <CI VRF,32767; CC NL> THEN BEGIN % 32767 HIGHEST VALUE
SPACEERR:
WRTERM 'HIGHEST TRACK VALUE = 32767';
END
ELSE BEGIN % A GOOD 1 SPACE
ST VRF,TRACK; % STORE IF OFFF
END; % OF GOOD
END; % OF NON HELP
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET NUMBERS - COLUMN POSITIONS WYL/TSO
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DONUMBER: % COL NUMBERS
CCALL SCANNUMS,A; % SET UP NUMBERING
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET PREFIX - PREFIX USED FOR DATA SET NAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOPREFIX:
SCTELL; % GET REMAINDER OF STRING
CCALL SETPREFX,A;
EXIT FROM SETBLCK; % BLOW THIS POP STAND
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SET NOPREFIX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NOPREFIX: % DISABLE PREFIX
SCTELL;
IF <RP VR0> THEN BEGIN
SCAN *;
SCKW (HELP,?),NOPREFHP;
SCANEND; % OTHER PARAMETERS
WRTERM 'NOPREFIX has no parameters execept HELP or ?';
EXIT FROM SETBLCK;
NOPREFHP: % HELP EM OUT
WRTERM 'NOPREFIX cancels prefixing a data set name on send or'_
' receive.';
EXIT FROM SETBLCK;
END; % OF MORE TO SCAN
MZC PREFIXL,2; % EASY AY
ZF PREFPDSF;
ZF PREFXQUO;
EXIT FROM SETBLCK; % BLOW THIS POP STAND
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INVALID SET COMMAND
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
BADSETKY:
WRTERM 'Invalid Set Command '_
'Type in "SET HELP" if you need assistance.';
EXIT FROM SETBLCK; % DROP OUT OF SET BLOCK
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TURNAROUND TIME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DOTURNRN:
SCKW SON,STRNDON;
SCKW SOFF,STRNDOFF;
SCKW ROFF,RTRNDOFF;
SCKW RON,RTRNDON;
STRNDON: SF STURNRND;
EXIT FROM SETBLCK;
STRNDOFF: ZF STURNRND;
EXIT FROM SETBLCK;
RTRNDON: SF RTURNRND;
EXIT FROM SETBLCK;
RTRNDOFF: ZF RTURNRND;
EXIT FROM SETBLCK;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SCAN ERROR ROUTINE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
SETERROR: % SCAN ERROR ROUTINE
SELECT FIRST;
<CI VRF,SCTCUE>: <VSEG KERMVA,' Missing parameter for command Set '>;
<CI VRF,SCTCLXM>:
<SCLAST; VSEG KERMVA,' Parameter too long for command Set '>;
ENDSEL
ELSE BEGIN
VSEG KERMVA,'Illegal value for SET command';
END;
SCLAST; % GET LAST TOKEN SCANNNED
VSEG KERMVA,(VR1),(VR0); % PLACE IN BUFFER\
VOUT KERMVA; % PRINT IT
SETLABEL: DS 0H; % USING LABEL
END; % OF SET BLOCK
CEXIT VRE,HIGHR;
LTORG;
EXORG;
DROP XRD; % FREE LITERAL REG
DROP XRE; % FREE LITERAL REG
DROP XRC; % FREE ADDRESSIBILTY REG
TIMERTOP: EQU 3600; % TOP LIMIT FOR TIMER
SUBTITLE 'SETPREFX';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
% MOD: SETPREFX
% FUNCTION: SET PREFIX TO DATA SET NAME FOR UPLOAD
% OR DOWNLOAD
% INPUT: VR1-> STRING
% VR0= LENGTH OF STRING
% OUTPUT: VARIABLE PREFIX FILLED AND FLAGS SET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SETPREFX:
CENTER VRE,HIGHR,ENTRY=NO;
ZF PREFXQUO;
ZF PREFPDSF;
MZC PREFIXL,2;
MZC PREFMEML,2; % ZERO OUT LENGTHS
SCINIT (VR1),(VR0);
SCERROR NEW=SCPREERR;
SCANPREF: DO BEGIN SCAN *;
SCKW ?,PREFHELP; % INFORMATION ON PREFIX
SCKW ,QPREFIX,QS,LIMIT=AL1(54); % IF QUOTED DATA SET NAME
SCKW ,UNQPFIX,LIMIT=AL1(44); % REGULAR DSN
SCKW ,SCPREERR,CODE=AL1(8); % TOO LONG PREFIX
UNQPFIX:
% MTRT TEST FOR ILLEGAL CHARACTERS IN DATA SET NAME
LR XRB,VR0; % LENGTH
EXI XRB,MMVC,PREFIX,0(VR1),*-*,INCR=YES,DECR=YES; % SAVE DATA SET NAME)
STH XRB,PREFIXL; % STORE OFF LENGTH
BEGIN SCAN *;
SCKW ,PREMEM,PS; % SEE IF MEMBER EXISTS FOR PDS
SCKW ,*,B; % ALL DONE BABY
PREFHELP:
WRTERM _
'PREFIX sets a data set name prefix for SEND and RECEIVE.';
WRTERM _
'The parameter is the prefix. No prefix is the default.';
WRTERM _
'The prefix may also indicate a PDS. SET PRE FILE() causes SEND';
WRTERM 'and RECEIVE data set to use the PDS FILE.';
WRTERM 'NOPREFIX cancels prefixing a data set name on send or'_
' receive.';
EXIT; % DROP OUT OF BLOCK
PREMEM:
DEBLANK VR1,VR0;
%MTRT TEST FOR VALID DSN AGAIN
IF <RZ VR0> THEN SF PREFPDSF % HAVE A PDS
ELSE BEGIN
SCPUSH;
SCINIT (VR1),(VR0);
SCAN;
LR XRA,VR0; % LENGTH FOR EXECUTE
IF <CI VR0,8; CC H> THEN BEGIN % MEMBER NAME TOO LONG
WRTERM 'Member name excedes 8 characters';
MZC PREFIXL,2; % ERROR CITY
EXIT; % SPLIT THE BLOCK
END; % OF ERROR BLOCK
EXI XRA,MMVC,PREFMEM,0(VR1),*-*,INCR=YES,DECR=YES;
STH XRA,PREFMEML; % LENGTH OF PREFIX MEMBER
SCDONE; % ERROR IF MORE JUNK ON LINE
SF PREFPDSF; % INDICATE WE HAVE A PDS PREFIX
SCPOP;
END; % OF ZERO LENGTH ELSE
SCANEND; END;
EXIT;
QPREFIX:
SCPUSH;
SCINIT (VR1),(VR0);
% SAME THING AS FOR UNQUOTED NAME
SF PREFXQUO; % INDICATE A QUOTED PREFIX
GOTO SCANPREF; % A BIT KLUDGEY FOR NOW
SCDONE;
SCPOP;
EXIT;
SCANEND;
% DROPS THRU HERE
WRTERM 'PREFIX requires a parameter for the prefix of data set';
WRTERM 'names. Enter "SET PREFIX ?" for a more information.';
END;
DATA BEGIN % NOTHING SPECIFIED
SCPREERR: % ERROR ROUTINE
IF <CI VRE,8> THEN LR VRF,VRE; % LENGTH ERROR
SELECT FIRST;
<CI VRF,SCTCUBQ>: WRTERM 'Unbalanced Quotes on Prefix';
<CI VRF,SCTCUBP>: WRTERM 'Unbalanced Parentheses on Prefix';
<CI VRF,SCTCIXM>: WRTERM 'Exceeds the limits of possible prefix';
ENDSEL
ELSE WRTERM 'Error in scan of Prefix';
END; % OF THEN
STPREXIT: CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SCANNUMS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: SCANNUMS
% FUNCTION: SETS UP NUMBER COMMAND
%
SCANNUMS:
CENTER VRE,HIGHR,ENTRY=NO;
SCERROR NEW=BADNUM;
NUMBLCK: DO BEGIN % A BLOCK TO FALL OUT OF
SCAN *;
SCKW ,NUMSOME;
SCANEND;
WRTERM 'NUMBER command requires parameter ';
WRTERM 'enter SET NUMBERED HELP for more information ';
EXIT FROM NUMBLCK;
NUMSOME: % WE HAVE SOMETHING HERE
SCBACK; % RESET POINTERS
SCPUSH; % STORE OFF SCANNER POINTERS
CALL EDSET,(EDCNTRL,EDRETURN,FOUR,ONE,TEMP,EDLEN); % INSERT
MVI EDTYPE,X'FF'; % BLAST NUMBER BIT
SCNUMBLK: DO BEGIN
SCAN *;
SCKW ,DOCOL1,PI; % LOOK FOR COLUMN NUMBER
SCKW OFF,OFFCOLS; % NO NUMBERING
SCKW (HELP,?),NUMHELP; % HELP COMMAND
SCKW (ON,WYLBUR),DOWYL; % WYLBUR
SCKW TSO,TSONUM; % TSO NUMBERING
SCKW OVERLAY,NUMOVER; % OVERLAY NUMBERS OPTION
SCKW INSERT,NUMINSER; % NUMBERING INSERT
SCKW MERGE,NUMMERGE; % MERGE NUMBERS
SCKW ,BADNUM; % UNKNOWN COMMAND
SCANEND;
EXIT FROM NUMBLCK;
BADNUM:
WRTERM 'Illegal Parameter for the SET NUMBERED command ';
MMVC EDTYPE,=F'2',4; % RESTORE DEFAULT
EXIT FROM NUMBLCK;
NUMHELP:
MVI EDTYPE,0; % ZERO BYTE
WRTERM 'Controls line numbering in non-edit format text data sets.';
WRTERM 'Valid Options are: ';
WRTERM ' OFF indicates unnumbered ';
WRTERM ' ON or WYLBUR indicates a data set with '_
'WYLBUR line numbers in default columns';
WRTERM ' WYLBUR m/n indicates '_
'line numbers in columns m through n';
WRTERM ' TSO indicates '_
'TSO line numbers in default columns';
WRTERM ' TSO m/n indicates TSO '_
'line numbers in columns m through n';
WRTERM _
'Default columns for line numbers are the last 8 for data sets';
WRTERM 'with fixed length records, and the firest 8 for data sets';
WRTERM 'with variable length records.';
EXIT FROM NUMBLCK;
DOCOL1:
ST VRF,EDCOL1; % STORE OFF FIRST COLUMN
SCAN *; % LOOK FOR ENDING COLUMN POSITION
SCKW ,DOCOL2,PI; % NEED NEXT COLUMN
SCKW ,COLERR;
SCANEND;
WRTERM 'required second number column omitted ';
EXIT FROM NUMBLCK;
COLERR:
WRTERM 'the second column number must be a non zero integer';
EXIT FROM NUMBLCK;
DOCOL2:
ST VRF,EDCOL2; % STORE OFF SECOND COLUMN
SELECT FIRST;
<MCLC EDTYPE,=F'2',4>: MVI EDTYPE+3,X'3';
<MCLC EDTYPE,=F'4',4>: MVI EDTYPE+3,X'5';
ENDSEL;
DOWYL: % SET UP WYLBUR NUMBERING
IF <CLI EDTYPE,X'FF'> THEN MMVC EDTYPE,=F'2',4 % WYLBUR DEFAULTS
ELSE MMVC EDTYPE,=F'3',4; % WE HAVE COLUMN POSTIONS
NEXT OF SCNUMBLK; % SCAN SOMEMORE
TSONUM: % SET UP TSO NUMBERING
IF <CLI EDTYPE,X'FF'> THEN MMVC EDTYPE,=F'4',4 % TSO DEFAULTS
ELSE MMVC EDTYPE,=F'5',4; % WE HAVE COLUMN POSTIONS
NEXT OF SCNUMBLK; % SCAN SOMEMORE
NUMOVER: % OVERLAY NUMBERING
CALL EDSET,(EDCNTRL,EDRETURN,FOUR,TWO,TEMP,EDLEN); % OVERLAY
NEXT OF SCNUMBLK; % SCAN SOMEMORE
NUMINSER: %INSERT NUMBERING
CALL EDSET,(EDCNTRL,EDRETURN,FOUR,ONE,TEMP,EDLEN); % INSERT
NEXT OF SCNUMBLK; % SCAN SOMEMORE
NUMMERGE: % MERGE NUMBERS
CALL EDSET,(EDCNTRL,EDRETURN,FOUR,THREE,TEMP,EDLEN); % MERGE
NEXT OF SCNUMBLK; % SCAN SOMEMORE
OFFCOLS: % TURN OFF NUMBERING
MMVC EDTYPE,=F'1',4; % TURN OFF LINE NUMBERS
EXIT FROM NUMBLCK;
END; % OF SCAN BLOCK
END; % OF NUMBLCK
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SCANTABS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SCANTABS
% FUNCTION : Scans a parameter string for tab values
% get memory for table,
% INPUT: none - scanner already called just scan away
%
%
% OUTPUT : VRF=0 good entries in table (TABTBLAD) VRF=4 ERROR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SCANTABS:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
SCANTBLK: DO BEGIN % MAIN BLOCK TO FALL OUT OF
SCTYPE NEW=0;
SCERROR NEW=BADTABS;
GETMAIN RC,LV=256,SP=18; % GET POOL FOR BUFFER
IF <CI VRF,4> THEN BEGIN
WRTERM 'Not enough memory for tab routine';
EXIT FROM SCANTBLK;
END;
MZC 0(VR1),256; % ZERO OUT TAB BUFFER
LR XRA,VR1; % POINT TO ADDRESS
ST VR1,TEMP; % STORE ADDRESS OF STORAGE
LI XRB,NUMTABS; % SET FIELD SIZE
LR XRC,XRA;
ZR XRE; % INDENT
ZR XRD; % LENGTH
TTABSCAN: DO BEGIN SCAN *;
SCKW ,TTABSTAB,(PI),LIMIT=AL1(255);
SCKW INDENT,TTABSIND,(P,I),LIMIT=AL2(32767);
SCKW LENGTH,TTABSLEN,(P,PI),LIMIT=AL2(32767);
SCKW (TAB,TABS),0; % CONTINUE SCAN
SCKW ,BADTABS;
% INDENT
TTABSIND:
LR XRE,VRF;
SCRTN;
% LENGTH
TTABSLEN:
LR XRD,VRF;
SCRTN;
% TAB POSITION
TTABSTAB:
CBAL RTNR,TTABPUT; % STORE TAB POSITION
BEGIN SCAN *;
SCKW '+',TTABPLUS,(P,PI),LIMIT=AL1(255);
SCKW ,*,B;
TTABPLUS:
ST VRF,TABWRKA+4; % SAVE INCREMENT
BEGIN SCAN *;
SCKW '/',TTABSLSH,(P,PI),LIMIT=AL1(255);
SCKW '*',TTABSTAR,(P,PI),LIMIT=AL1(255);
SCKW ,*;
SCANEND; END;
IF <RP VR0> THEN BEGIN
VSEG KERMVA,(VR1),(VR0);
VSEG KERMVA,': ';
END;
WRTERM '"/" OR "*" REQUIRED WITH "+"';
LI VRF,4; EXIT FROM SCANTBLK;
TTABSLSH:
LR VRE,VRF; % SAVE LIMIT
LR VR1,XRC; SI VR1,2; LH VRF,0(VR1); % LAST TAB JDW
IF <CR VRF,VRE; CC NL> THEN BEGIN
WRTERM 'LIMIT LESS THAN STARTING TAB POSITION';
LI VRF,4; EXIT FROM SCANTBLK;
END;
FOREVER DO BEGIN
A VRF,TABWRKA+4; % ADD INCREMENT
NEXT OF TTABSCAN IF <CR VRF,VRE; CC H>;
CBAL RTNR,TTABPUT; % STORE TAB
END;
TTABSTAR:
LR VRE,VRF; % SAVE LIMIT
LR VR1,XRC; SI VR1,2; LH VRF,0(VR1); % LAST TAB JDW
FOR VRE DO BEGIN
A VRF,TABWRKA+4; % ADD INCREMENT
CBAL RTNR,TTABPUT; % STORE TAB
END;
SCANEND; END;
NEXT OF TTABSCAN;
TTABPUT:
IF <CI VRF,255; CC H> THEN BEGIN % TAB TOO LARGE
WRTERM 'TAB POSITION GREATER THAN 255';
LI VRF,4; EXIT FROM SCANTBLK;
END;
SI XRB,1; % DECR COUNT
IF <RM XRB> THEN BEGIN
WRTERM 'MORE THAN NUMTABS TABS SPECIFIED';
LI VRF,4; EXIT FROM SCANTBLK;
END;
STH VRF,0(,XRC); % PUT TAB IN AREA JDW
AI XRC,2; % JDW
RGOTO RTNR;
SCANEND; END;
IF ^<MCLC 0(XRA),=H'0',2> THEN BEGIN % TABS WERE SPECIFIED
LI VR0,NUMTABS;
DO BEGIN % SORT INTO ASCENDING ORDER
ZR XRB; % SET SWAP SWITCH OFF
LR XRC,VR0; SI XRC,1; % SET LIMIT
LR XRD,XRA; % POINT AT TABS
FOR XRC DO BEGIN
EXIT IF <MCLC 2(XRD),=H'0',2>; % NO MORE TABS
LH VRF,0(,XRD); % PICK UP TAB
IF <CH VRF,2(XRD); CC H> THEN BEGIN % OUT OF ORDER
LA XRB,2(,XRD); SR XRB,XRA; % SET SWAP SWITCH
MMVC 0(XRD),2(XRD),2; STH VRF,2(,XRD); % SWAP
END
ELSE IF <CC E> THEN BEGIN
WRTERM 'TWO TABS SPECIFIED AT SAME COLUMN';
LI VRF,4; EXIT FROM SCANTBLK;
END;
AI XRD,2;
END;
LTR VR0,XRB; % NEW LIMIT
NEXT IF <CC P>;
END;
% ADD IN INDENT, CHECK MARGIN
LR XRB,XRA;
LI XRC,NUMTABS;
DO BEGIN
LH VR0,0(XRB); % NEXT TAB JDW
EXIT IF <RZ VR0>; % NO MORE
AR VR0,XRE; % ADD INDENT
IF <CI VR0,255; CC H> THEN BEGIN
WRTERM 'TAB PLUS INDENT GREATER THAN 255';
LI VRF,4; EXIT FROM SCANTBLK;
END;
STH VR0,0(,XRB);
AI XRB,2;
END FOR XRC;
END
ELSE BEGIN % NO TABS SPECIFIED
WRTERM 'No tabs were specified';
LI VRF,4; EXIT FROM SCANTBLK;
END;
MMVC TABTBLAD,TEMP,4; % SUCCESSFUL RETURN UPDATE TAB TABLE POINTER
ZR VRF;
END; % OF SCANTBLK
SCTYPE NEW=1;
DATA BEGIN
BADTABS: LI VRF,4;
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
NUMTABS: EQU 125; % ALLOW THIS MANY TABS
SUBTITLE 'KSEND';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MODULE NAME - KSEND
%
%
% FUNCTION- DRIVER FOR SEND COMMAND DYNAL, OPEN,
% FORMATS PACKETS, FILE HEADER, EOF ETC
%
%
% INPUTS -
%
%
%
%
% OUTPUTS-
%
%
% RETURN
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KSEND: ;
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LA XRC,SNDPKT;
USE XRC AS PACKET IN BEGIN % DSECT FOR INIT
LA XRD,DATABUFF;
USE XRD AS SENDIDST IN BEGIN
SENDBLCK: DO BEGIN % GLOBAL SEND BLOCK
MZC STATLEN,2; % ZERO OUT STATUS LENGTH
ZF WARNINGF;
SCTYPE NEW=1; % SCAN ACROSS * IN CASE WILD CARD SEND
MVI STATE,SEND; % SEND BLOCK STATE
BCCTYPE 1; % 1 BCC BYTE AT END
SCERROR NEW=SENDERR; % SCAN OFF DSN
SCAN *;
SCKW ?,SENDHELP; % INFO
SCKW ,SEND1ST,B,LIMIT=AL1(44); % DSN
SCANEND;
% IF HERE NO DSNAME
WRTERM 'SEND Command requires a dsname ';
EXIT FROM SENDBLCK; % LEAVE SEND
SENDHELP:
WRTERM _
'SEND sends a data set (file) to the microcomputer. A corresponding';
WRTERM 'RECEIVE command must be issued to the microcomputer KERMIT'_
' after the SEND to';
WRTERM 'TSO KERMIT. The parameter is the data set name '_
'for the data set to be';
WRTERM 'transmitted. The data set must be cataloged.';
EXIT FROM SENDBLCK; % LEAVE SEND
SENDERR:
SELECT FIRST;
<CI VRF,SCTCLXM>: ERRORCON 'Data Set Name maximum 44 letters ';
<CI VRF,SCTCUBQ>: ERRORCON 'Unbalanced quotes in Data Set Name';
ENDSEL
ELSE <ERRORCON 'Error in data set name'>;
CCALL ERRPACK,A;
IF <TF SERVERF> THEN BEGIN
CCALL SABORT,A,VR0=LH:RPSEQ;
END
ELSE TPUT (VR1),(VR0);
EXIT FROM SENDBLCK; % ERROR EXIT
SEND1ST: % THE BEEF
SCTELL; % HOW MUCH IS LEFT ?
DEBLANK VR1,VR0,XRA,TYPE=BOTH; % STRIP OFF BLANKS
% STORE OFF POINTERS IN CASE MORE FILES
ST VR1,DSNADD; % ADDRESS OF DSNAME
STH VR0,DSNLEN; % LENGTH OF SCANNED NAME
CCALL SCANDSN,A; % ROUTINE SETS UP DSNAME
CASE VRF MIN 0 MAX 20 CHECK;
0: BEGIN % A GOOD RETURN;
END;
4: BEGIN % GOOD RETURN PLUS PDS
% SF PDS;
END;
8: BEGIN % WILD CARD
END;
12: BEGIN % NO LENGTH
ERRORCON 'No length on data set name';
CCALL ERRPACK,A;
MVI STATE,SESTATE;
IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
ELSE BEGIN
CCALL SABORT,A,VR0=LH:RPSEQ; % ABORT
END;
END;
16: BEGIN % ILLEGAL NAME
ERRORCON 'Non standard data set name';
CCALL ERRPACK,A;
MVI STATE,SESTATE;
IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
ELSE BEGIN
CCALL SABORT,A,VR0=LH:RPSEQ; % ABORT
END;
EXIT FROM SENDBLCK;
END;
20: BEGIN % NO MATCHING ENTRIES FROM WILD CARD
ERRORCON 'No matches in catalog for wildcard';
CCALL ERRPACK,A;
MVI STATE,SESTATE;
IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
ELSE BEGIN
CCALL SABORT,A,VR0=LH:RPSEQ; % ABORT
END;
EXIT FROM SENDBLCK;
END;
ENDCASE ELSE
BEGIN % ILLEGAL RETURN
ERRORCON 'Illegal data set name. Extra data on line.';
CCALL ERRPACK,A;
MVI STATE,SESTATE;
IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
ELSE BEGIN
CCALL SABORT,A,VR0=LH:RPSEQ; % ABORT
END;
EXIT FROM SENDBLCK;
END;
CCALL OPENSDSN,A; % Open next sendfile
IF ^<TF SENDDSNF> THEN BEGIN
IF <TF SERVERF> THEN BEGIN
CCALL SABORT,A,VR0=LH:RPSEQ; % ABORT
END
ELSE <LH VR0,STATLEN; TPUT STATBUFF,(VR0)>; % OUTPYUT TO SCREEN
EXIT FROM SENDBLCK;
END; % OF OPEN ERROR
IF <TF TABF> THEN BEGIN
GETMAIN RC,LV=66000,SP=8; % GET POOL FOR BUFFER
IF <CI VRF,4> THEN BEGIN
WRTERM 'GET MAIN TAB ERROR ON SEND';
END;
MMVC TABCNT,=H'0',2; % INITIALIZE TAB COUNTER
ST VR1,TABADDR; % TAB ADDRESS
END; % OF TABBING
IF ^<TF SERVERF> THEN BEGIN % TIMER ONLY IF NO SERVER MODE
VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;
VSEG KERMVA,' Waiting '; % build message
L VR1,DELAY; % SET UP DELAY FOR STIMER
ZR VR0;
DI VR0,100;
LR XRA,VR1;
CVBTD TEMP,0,(XRA); % CONVERT TO PRINT
VSEG KERMVA,(VR1),(VR0);
VSEG KERMVA,' seconds before sending. ';
VOUT KERMVA; % OUT PUT MESSAGE
STIMER WAIT,BINTVL=DELAY; % SET TIMER
END; % OF NON SERVER TIMER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% CALL THE SEND SWITCH TABLE DRIVER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CCALL SENDSW,A;
%L VR1,RPSIZ; % PACKET SIZE
%SI VR1,2; % SUBTRACT HEADER
%SH VR1,BCCLEN; % % SUB OFF BCC LENGH THEN
%STH VR1,MAXPUT; % MAX DATA SIZE FOR PUT
END; % OF SENDBLCK
IF <TF TABF> THEN FREEMAIN RC,SP=8; % FREE THE BUFFER
SCTYPE NEW=1; % RETURN SCANNER TO NORMAL MODE
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
END; % OF DSECT
END; % OF DSECT SENDINIT
SUBTITLE 'SENDSW';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SENDSW
% FUNCTION : THIS ROUTINE DRIVES THE SEND MODULES,
% EACH ROUTINE CHANGES THE STATE
% INPUT:
%
%
% OUTPUT :
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SENDSW:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
%MVI HIGHBCC,3; % INDICATE BLOCK CHECK TYPE
ZEROSEQ; % ZERO SEQUENCE NUMBER
ZERORTRY; % ZERO RETRY
MVI STATE,SISTATE; % SEND INIT STATE
SSWTBLCK: DO BEGIN % LOOP TILL EXIT
SELECT FIRST;
<TF STOPF>: <CCALL STOPPROC,A; EXIT FROM SSWTBLCK>; % USER STOP
<CLI STATE,SISTATE>: CCALL SINIT,A;
<CLI STATE,SFSTATE>: CCALL SFILE,A; % FILE HEADER PACKET
<CLI STATE,SDSTATE>: CCALL SDATA,A; % SEND DATA PACKETS
<CLI STATE,SZSTATE>: CCALL SEOF,A; % SEND EOF
<CLI STATE,SBSTATE>: CCALL SEOT,A; % END OF TRANSMISSION
<CLI STATE,SESTATE>: BEGIN % ABORT
CCALL SABORT,A,VR0=LH:SEQNUM; EXIT FROM SSWTBLCK; % ABORT
END;
<CLI STATE,RESTATE>: <CCALL RABORT,A; EXIT FROM SSWTBLCK>; % ABORT
<CLI STATE,CSTATE>: EXIT FROM SSWTBLCK; % COMPLETE STATE SPLIT
ENDSEL;
END FOREVER;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SINIT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SINIT
% FUNCTION : Sends the SEND INIT packet and receives
% the rinit packet , each sets the options
% INPUT: none
%
%
% OUTPUT : state = either 'F' file header || 'S' TRY AGAIN
% plus options are set (i.e quotes,repeat, etc)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SINIT:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
ZF ACKX;
ZF ACKZ;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE SINITBLK: DO BEGIN % Send end of transmisision block
MMVC TRFBCC,HIGHBCC,1;
LI VR0,SENDINIL;
CCALL SPAR,A,VR1=PDATA; % CALL ROUTINE THAT BUILDS PACK
SPSPACK AS,SEQNUM,PUTLEN,VR0; % S PACKET,SEND PARAMETERS FOR SPACK
TCLEARQ INPUT; % CLEAR INPUT BUFFER
CCALL SPACK,A;
CCALL RPACK,A;
EXIT IF <RNZ VRF> | <TF STOPF>; % Leave if Timeout or Bad BCC
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
NCASE: BEGIN % Got a nack
LH XRA,RPSEQ; % Load received sequence number
IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1; % see if nack for pack+1
STH XRA,RPSEQ; % STORE IN CASE NACK FOR SEQ+1
IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>; % Ok yack case next
END; % of nack
YCASE: BEGIN % ACK
EXIT IF ^<MCLC SEQNUM,RPSEQ,2>; % Wrong packet number
ZERORTRY; % % Zero retry counter
BUMPSEQ VR0; % Increment packet counter
LH VR0,RECLEN; % Length of data
CCALL RPAR,A,VR1=RDATA; % %%FIXME
SELECT FIRST;
<CLI TRFBCC,1>: BCCTYPE 1;
<CLI TRFBCC,2>: BCCTYPE 2;
<CLI TRFBCC,3>: BCCTYPE 3;
ENDSEL;
MZC PUTLEN,2;
MVI STATE,SFSTATE; % SEND FILE HEADER STATE
END; % OF ACK
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
END;
ENDCASE
ELSE BEGIN
ERRORCON 'Illegal packet type received ';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % ABORT
END;
END; % OK RETRY
END; % of SINITBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SPAR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SPAR
% FUNCTION : Builds the send init packet
%
% INPUT: none
%
%
% OUTPUT : formatted data area of send init packet
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SPAR:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
L VR1,NOQUADD; % LOAD ADDRESS OF CHARACTERS NOT QUOTED
XC 0(255,VR1),0(VR1); % CLEAR BUFFER
LA XRC,SNDPKT;
USE XRC AS PACKET IN BEGIN % DSECT FOR INIT
%%LOAD XRD FROM VR1 - AS DESECT POINTER
LA XRD,DATABUFF;
USE XRD AS SENDIDST IN BEGIN
SINITLAB:
SENDIBLK: DO BEGIN % A BLOCK TO FALL OUT OFF
%LI VR1,SENDINIL; % SEND INIT DSECT LENGTH %%FIX MAKE VR0
STH VR0,PUTLEN; % LENGTH FOR PUT
MMVC RCRCREAL,BCCLEN,2; % STORE OF BCC
BCCTYPE 1;
L VR1,RPSIZ; % PACKET SIZE
CHAR VR1; % CHARACTER FUNCTION
STC VR1,MAXL;
L VR1,TIMEOUT; % NUMBER OF SECONDS FOR KERM TO TIMEOUT
CHAR VR1; % CHARACTER FUNCTION
STC VR1,TIME;
MVI NPAD,X'20'; % MOVE " " FOR NPAD
MVI PADC,X'40'; % MOVE " " FOR PADC
ZR VR1; IC VR1,REOL; % EOL CHARACTER
CHAR VR1; % PRINTABLE FUNCTION
STC VR1,EOLCHAR;
MMVC QCTL,QUOCHAR; % MOVE QUOTE CHARACTER
MMVC QBIN,BINQC;
SELECT FIRST;
<CLI TRFBCC,1>: MMVC CHKT,ASCIIONE,1; % BCC LEVEL 1 CHECK
<CLI TRFBCC,2>: MMVC CHKT,ASCII2,1; % BCC LEVEL 2 CHECK
<CLI TRFBCC,3>: MMVC CHKT,ASCII3,1; % BCC LEVEL 3 CHECK
ENDSEL;
%%REPT REPEAT CHARACTER
MMVC REPT,REPTCHAR,1; % PUT IN REPEAT FUNCTION
%%CAPA BIT MAP OF CAPABILITIES
ZR VR1;
IC VR1,DCAPA1; % CAPABILITIES BYTE
CHAR VR1; % ASCII SPACE
STC VR1,CAPA1; % NO CAPA FUNCTION NOW
END; % OF DSECT
END; % OF DSECT
END; % OF DSECT
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'RPAR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : RPAR
% FUNCTION : Takes the received init packet and set options
% to what we accept (e.g. 8th bit , repeat quoting,etc)
% INPUT: none
%
%
% OUTPUT : correctly set options
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RPAR:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LA XRA,RDATA;
USE XRA AS RECINIT IN BEGIN
LI XRB,SENDINIL; % LENGTH OF OUR SEND INIT
SR XRB,VR0; % LENGTH OF DATA SENT
IF <RP XRB> THEN BEGIN
SELECT;
<CI XRB,4; CC NL>: MVI RQBIN,AN; % NO BINARY QUOTING
<CI XRB,2; CC NL>: MMVC RCHKT,ASCIIONE,1; % LEVEL ONE CHECK
<CI XRB,3; CC NL>: MVI RREPT,C' '; % NO REPT
<CI XRB,1; CC NL>: MVI RCAPA1,C' ';
ENDSEL;
END;
SELECT FIRST;
<MCLC RCHKT,ASCIIONE,1>: BEGIN
MVI TRFBCC,1; % 1 BCC BYTE AT END
END;
<MCLC RCHKT,ASCII2,1>: BEGIN
IF <CLI HIGHBCC,2; CC L> THEN BEGIN
MMVC RCHKT,ASCIIONE,1;
NEXT;
END;
MVI TRFBCC,2; % 2 BCC BYTE AT END
END;
<MCLC RCHKT,ASCII3,1>: BEGIN
IF <CLI HIGHBCC,3; CC L> THEN BEGIN
MMVC RCHKT,ASCII2,1;
NEXT;
END;
MVI TRFBCC,3; % 3 BCC BYTE AT END
END;
ENDSEL;
ZR VR0; IC VR0,RMAXL; % LOAD IN LENGTH
UNCHAR VR0; % CHANGE IT TO AN INTEGER
SI VR0,2; % SEQ & TYPE BYTES
ZR VR1; IC VR1,TRFBCC; % GET BCC LENGTH OF PROPOSED TRANSFER
SR VR0,VR1;
STH VR0,MAXPUT; % STORE IT OFF
IF <CLI STATE,RISTATE> THEN LA VR1,RECTABLE
ELSE LA VR1,SENDTBL; % POINTER TO TRANSLATE TABLE
IF <MCLC RREPT,REPTCHAR> THEN BEGIN % WE HAVE REPT PREFIXING
SF REPTF; % TURN ON INDICATOR
ZR VR0; IC VR0,REPTCHAR; % LOAD LITERAL FOR CASE STATEMENT
AR VR1,VR0; % POINT TO PLACE IN TABLE
% LI VR0,ASCIIQUO; % LOAD HASH % REMOVE ME IF IT WORKS
IF <CLI STATE,RISTATE> THEN LI VR0,CASEREPT % REPEAT QUOTING
ELSE BEGIN
LI VR0,NOQUOQUO; % LOAD HASH DON'T QUOTE REPT CHAR
STC VR0,0(VR1); % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER COMPLEMENT
LI VR0,NOQUOQU8;
END;
STC VR0,0(VR1);
END
ELSE BEGIN
ZF REPTF; % NO REPEAT COUNTING POSSIBLE
ZR VR0; IC VR0,REPTCHAR; % LOAD LITERAL FOR CASE STATEMENT
AR VR1,VR0; % POINT TO PLACE IN TABLE
MVI 0(VR1),0; % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER
MVI 0(VR1),ASCI8BIT;
END; % OF NO REPT CHARACTER
IF <CLI STATE,RISTATE> THEN LA VR1,RECTABLE
ELSE LA VR1,SENDTBL; % POINTER TO TRANSLATE TABLE
IF <MCLC RQCTL,QUOCHAR,1> THEN BEGIN % QUOTE CHARACTER PREFIXING
ZR VR0; IC VR0,QUOCHAR; % LOAD LITERAL FOR CASE STATEMENT
AR VR1,VR0; % POINT TO PLACE IN TABLE
% LI VR0,ASCIIQUO; % LOAD HASH % REMOVE ME IF IT WORKS
LI VR0,NOQUOQUO; % LOAD HASH DON'T QUOTE REPT CHAR
IF <CLI STATE,RISTATE> THEN LI VR0,CASEQUO
ELSE BEGIN
STC VR0,0(VR1); % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER COMPLEMENT
LI VR0,NOQUOQU8;
END;
STC VR0,0(VR1);
END
ELSE BEGIN
ZR VR0; IC VR0,QUOCHAR; % LOAD LITERAL FOR CASE STATEMENT
AR VR1,VR0; % POINT TO PLACE IN TABLE
MVI 0(VR1),0; % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER
MVI 0(VR1),ASCI8BIT;
%%% RESTORE HIGH ORDER QUOTE
END; % OF QUOTE CHARACTER
IF <CLI STATE,RISTATE> THEN LA VR1,RECTABLE
ELSE LA VR1,SENDTBL; % POINTER TO TRANSLATE TABLE
IF <CLI RQBIN,AY> | %ASCII Y
<MCLC RQBIN,BINQC,1> THEN BEGIN % WE HAVE 8BIT PREFIXING
ZR VR0; IC VR0,BINQC; % LOAD LITERAL FOR CASE STATEMENT
AR VR1,VR0; % POINT TO PLACE IN TABLE
% LI VR0,ASCIIQUO; % LOAD HASH % REMOVE ME IF IT WORKS
IF <CLI STATE,RISTATE> THEN LI VR0,CASE8BIT
ELSE BEGIN
LI VR0,NOQUOQUO; % LOAD HASH DON'T QUOTE REPT CHAR
STC VR0,0(VR1); % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER COMPLEMENT
LI VR0,NOQUOQU8;
END;
STC VR0,0(VR1);
END
ELSE BEGIN
IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
ERRORCON 'Your PC Kermit does not support 8 bit quote'_
' binary transfer impossible';
CCALL ERRPACK,A;
MVI STATE,SESTATE; % ABORT STATE
END;
ZR VR0; IC VR0,BINQC; % LOAD LITERAL FOR CASE STATEMENT
AR VR1,VR0; % POINT TO PLACE IN TABLE
MVI 0(VR1),0; % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER
MVI 0(VR1),ASCI8BIT;
END; % OF NO REPT CHARACTER
END; % OF DSECT
ZR VRF; % SET RETURN CODE
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SFILE';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SFILE
% FUNCTION : Sends the File Header packet
% changes states on ack or nack
% INPUT: none
%
%
% OUTPUT : state = either 'D' send data || 'F' same || 'E' error
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SFILE:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE FDSNBLCK: DO BEGIN % Send end of file block
CCALL KFILENAM,A,VR1=DSNAME,VR0=LH:DSNLEN,VRF=DSNAMEX; % LEGAL DSN
LH VR0,PUTLEN;
MZC PUTLEN,2;
LA VR1,PDATA; ST VR1,PUTADD; MZC PUTLEN; % INIT FOR NEXT ROUTINE
CCALL SENDDATA,A,VR1=DSNAMEX;
SPSPACK AF,SEQNUM,PUTLEN,VR0; % FILE PACKET SPACK
CCALL SPACK,A;
CCALL RPACK,A;
EXIT IF <RNZ VRF> | <TF STOPF>; % Leave if Timeout or Bad BCC
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
NCASE: BEGIN % Got a nack
LH XRA,RPSEQ; % Load received sequence number
IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1; % see if nack for pack+1
STH XRA,RPSEQ; % STORE IN CASE NACK FOR SEQ+1
IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>; % Ok yack case next
END; % of nack
YCASE: BEGIN % ACK
EXIT IF ^<MCLC SEQNUM,RPSEQ,2>; % Wrong packet number
ZERORTRY; % % Zero retry counter
BUMPSEQ VR0; % Increment packet counter
MZC PUTLEN,2; % ZERO OUT PUT LENGTH
LA XRA,PDATA;
ST XRA,PUTADD; % RESTORE PUT POINTER
MZC OTHERLEN,2; % ZERO EOR
MZC EDLENACT,4; % ZERO LENGTH OF RECEIVED DATA
CCALL FILLDPCK,A;
IF <RZ VRF> THEN BEGIN
IF <CLI STATE,SFSTATE> THEN MVI STATE,SDSTATE; % ELSE OTHER STATE
END
ELSE MVI STATE,SZSTATE; % SEND DATA STATE
END; % OF ACK
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
END;
ENDCASE
ELSE BEGIN
ERRORCON 'Illegal packet type received ';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % ABORT
END;
END; % OK RETRY
END; % of FDSNBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KFILENAM';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : KFILENAM
% FUNCTION : Formats data set name for the kermit standard
% for the F packet on a send (download)
% INPUT: none
%
%
% OUTPUT : updata packet pointer and length
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KFILENAM:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRC,VRF; % PLACE TO STORE FILENAME
LH VRF,DSNLEN; % LENGTH OF DSNAME
LA VR0,DOT; % LOOK FOR 1ST DOT IN DATA SET NAME
LA VR1,DSNAME;
LH XRA,DSNLEN; % LENGTH
AR VR1,VRF; % POINT TO LAST
LCR VRF,VRF; % COUNT BACKWARDS FOR THE FIRST DOT
LI XRB,2;
FOR XRB DO BEGIN % LOOP UNTIL LAST DOT
CCALL FINDCHAR,A;
%% IF ZERO EXIT
IF <RP VRF> THEN BEGIN
SR XRA,VRF; % MINUS BEGINNING NAME
SR VR1,VRF; % POINT 1 AFTER DOT
LR VRF,XRA; % RESTORE LENGTH FOR NEXT LOOK
LCR VRF,VRF; % INDICATE COUNT BACKWARDS
END; % OF ANOTHER DOT
END; % NO MORE DOTS
AI XRA,2; % LENGTH PLUS DOT
LH XRB,DSNLEN; % LENGTH
LA VR1,DSNAME;
AR VR1,XRA; % PONIT AFTER DOT
SR XRB,XRA; % GET LENGTH
L XRA,ETOAVCON;
IF <CI XRB,12; CC H> THEN LI XRB,12; % MAXIMUM LENGTH OF DSNAME
EXI XRB,MMVC,0(XRC),0(VR1),0,INCR=YES,DECR=YES;
EXI XRB,MTR,0(XRC),0(XRA),*-*,DECR=YES,INCR=YES; % TRANSLATE ETOA
STH XRB,PUTLEN; % LENGTH OF DATA
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SDATA';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SDATA
% FUNCTION : Sends data packet calls filldpck build packets
%
% INPUT: none
%
%
% OUTPUT : state = either 'D' more data || 'Z' EOF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SDATA:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE DO BEGIN % Send data block
SPSPACK AD,SEQNUM,PUTLEN,VR0; % D PACKET,SEND PARAMETERS FOR SPACK
CCALL SPACK,A;
CCALL RPACK,A;
EXIT IF <RNZ VRF> | <TF STOPF>; % Leave if Timeout or Bad BCC
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
NCASE: BEGIN % Got a nack
LH XRA,RPSEQ; % Load received sequence number
IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1; % see if nack for pack+1
STH XRA,RPSEQ; % STORE IN CASE NACK FOR SEQ+1
IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>; % Ok yack case next
END; % of nack
YCASE: BEGIN % ACK
EXIT IF ^<MCLC SEQNUM,RPSEQ,2>; % Wrong packet number
ZERORTRY; % % Zero retry counter
BUMPSEQ VR0; % Increment packet counter
MZC PUTLEN,2; % ZERO OUT PUT LENGTH
LA XRA,PDATA;
ST XRA,PUTADD; % RESTORE PUT POINTER
IF <MCLC RECLEN,=H'1',2> THEN BEGIN
IF <CLI RDATA,AX> | <CLI RDATA,AZ> THEN BEGIN
IF <CLI RDATA,AX> THEN SF ACKX;
IF <CLI RDATA,AZ> THEN SF ACKZ;
MVI STATE,SZSTATE;
EXIT;
END;
END;
CCALL FILLDPCK,A;
IF <RZ VRF> THEN MVI STATE,SDSTATE % More data
ELSE MVI STATE,SZSTATE; % End of file
END; % OF ACK
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
END;
ENDCASE
ELSE BEGIN
ERRORCON 'Illegal packet type received ';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % ABORT
END;
END; % OK RETRY
END; % of SDATABLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'FILLDPCK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : FILLDPCK
% FUNCTION : FILLS A SEND PACKET WITH DATA FROM KERIN
% CALLS KGETREC & PUT BUFF WHEN NEEDED SEND FUNCTIONS
% INPUT: NONE
%
%
% OUTPUT : VRF=0 SUCCESSFUL, VRF=KERIN EOF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FILLDPCK:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
ZR VRF;
FDPBLCK: FOREVER DO BEGIN % LOOP UNTIL PACKET FULL OR EOF
IF ^<MCLC OTHERLEN,ZERO,2> THEN BEGIN % WE HAVE TO PUT CRLF
CCALL PUTBUFF,A,VR1=LFCR,VR0=LFCRLEN; % PUT IT IN
MZC OTHERLEN,2; % ZERO OUT
END; % OF OTHER LENGTH
IF <MCLC EDLENACT,ZERO,4> THEN BEGIN
IF <TF KINEOF> THEN BEGIN % EOF ALREADY OCCURED
IF ^<MCLC PUTLEN,ZERO,2> THEN ZR VRF % EOF BUT STUFF TO PUT
ELSE LI VRF,KERINEOF;
EXIT FROM FDPBLCK;
END;
CCALL GETAREC,A; % READS A RECORD
IF <RNZ VRF> THEN BEGIN % EOF OR ERROR
IF <CI VRF,KERINEOF> THEN BEGIN % ALL DONE
SF KINEOF; % INDICATE EOF
IF ^<MCLC PUTLEN,ZERO,2> THEN ZR VRF; % EOF BUT STUFF STILL TO PUT
END % OF EOF RETURN
ELSE MVI STATE,SESTATE; % OTHER ERROR ABORT
EXIT FROM FDPBLCK;
END;
END; % READ A RECORD
IF <TF TABF> THEN BEGIN % IF TABBING PUT IN
CCALL PUTTABS,A; % IF TABBING PUT IN
END; % OF TABBING
% EOF FOR TEXT FILES
L VR0,EDLENACT; % LENGTH
L VR1,EDPNTR; % POINT TO PLACE IN RECORD TO PUT
ZR VRF;
IF ^<MCLC EDLENACT,ZERO,4> THEN CCALL SENDDATA,A;
IF <RZ VRF> THEN BEGIN
MZC EDLENACT,4; % ZERO OUT COUNTER
IF <MCLC DATA,=C'TEXT',4> THEN BEGIN % PUT EOF
EXIT FROM FDPBLCK IF <TF KINEOF>; % CRLF ALREADY IN BUFFER
IF <MCLC OTHERLEN,ZERO,2> THEN BEGIN % WE NEED EOF
MMVC OTHERLEN,=H'2',2;
CCALL CHECKLEN,A,VR0=4; % SEE IF BUFFFER BIG ENOUGH
IF <RNZ VRF> THEN <ZR VRF; EXIT FROM FDPBLCK>;
END ELSE MZC OTHERLEN,2; % JUST DID CRLF
END; % OF TEXT
END % OF ALL DATA PUT
ELSE BEGIN % UPDATE POINTERS
L XRA,EDPNTR; % POINTER TO DATA
L XRB,EDLENACT; % LENGTH OF DATA
AR XRA,XRB; % POINT TO LAST CHARACTER PLUS ONE
SR XRA,VRF; % POINT TO REMAINING CHARACTERS
ST XRA,EDPNTR;
ST VRF,EDLENACT; % UPDATA LENGTH AND POINTERS
ZR VRF; % INDICATE OK
EXIT FROM FDPBLCK;
END;
END; % OF FDPBLCK
IF ^<CI VRF,KERINEOF> THEN ZR VRF; % NON EOF
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
KERINEOF: EQU 4;
SUBTITLE 'GETAREC';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : GETAREC
% FUNCTION : READS A RECORD FROM DATA SET KERIN FOR
% DOWNLOADING USING EDIT ROUTINE
% INPUT: NONE
%
% OUTPUT: VRF=0 GOOD RECORD VRF=KERINEOF - END OF FILE
% VRF=READERR - SOME OTHER FATAL ERROR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
GETAREC:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
CALL EDGETL,(EDCNTRL,EDRETURN,EDLINENO,EDPNTR,EDLENACT);
IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN % FILE READ FAIL
IF <MCLC EDRETURN,ONE> THEN LI VRF,KERINEOF % END OF FILE
ELSE BEGIN % FILE READ ERRORS
CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
L VR0,EDLENACT;
IF <CI VR0,90; CC H> THEN LI VR0,90; % SET UP LENGTH
CCALL ERRPACK,A,VR1=EDLINE;
LI VRF,KERINERR; % ERROR
MVI STATE,SESTATE; % ABORT IT
END;
END % OF ERROR IN READING
ELSE BEGIN % OK READ - TRANSLATE TO ASCII FOR KERIN STANDARDS
L VR0,EDLENACT; % LENGTH OF DATA
LR XRB,VR0; % FOR EXECUTE
IF <RP XRB> THEN BEGIN
L XRE,EDPNTR; % SET UP POINTER TO GET BUF
IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
LR XRA,XRB;
L XRC,ETOAVCON;
DO BEGIN % LOOP UNTIL NO MORE
IF <CI XRA,255; CC H> THEN <LI XRB,255; SI XRA,255>
ELSE <LR XRB,XRA; ZR XRA>;
CCALL CHKETOA,A,VR1=(XRE),VR0=(XRB); % SEE IF UNTRANSLATABLE CHARS
EXI XRB,TR,0(*-*,XRE),0(XRC),DECR=YES,INCR=YES;
AI XRE,255;
END UNTIL <RZ XRA>; % LOOP ALONG
END; % TEXT
END; % A POSITIVE AMOUNT OF DATA
ZR VRF; % INDICATE A GOOD READ
END; % OF GOOD READ
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
KERINERR: EQU 8; % READ ERROR
SUBTITLE 'SEOF';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SEOF
% FUNCTION : Sends the end-of-file packet
% changes states on ack or nack
% INPUT: none
%
%
% OUTPUT : state = either 'z' eof || 'f' new file || 'B' EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SEOF:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE SEOFBLCK: DO BEGIN % Send end of file block
SPSPACK AZ,SEQNUM,ZERO,VR0; % Z PACKET,SEND PARAMETERS FOR SPACK
SELECT FIRST;
<TF ACKX>: <LA XRA,PDATA; MVI 0(XRA),AD; MMVC PUTLEN,=H'1',2; ZF ACKX>;
<TF ACKZ>: <LA XRA,PDATA; MVI 0(XRA),AD; MMVC PUTLEN,=H'1',2>;
ENDSEL;
CCALL SPACK,A;
CCALL RPACK,A;
EXIT IF <RNZ VRF> | <TF STOPF>; % Leave if Timeout or Bad BCC
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
NCASE: BEGIN % Got a nack
LH XRA,RPSEQ; % Load received sequence number
IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1; % see if nack for pack+1
STH XRA,RPSEQ; % STORE IN CASE NACK FOR SEQ+1
IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>; % Ok yack case next
END; % of nack
YCASE: BEGIN % ACK
EXIT IF ^<MCLC SEQNUM,RPSEQ,2>; % Wrong packet number
ZERORTRY; % % Zero retry counter
BUMPSEQ VR0; % Increment packet counter
CCALL CLOSESDS,A; % Close input file
IF <TF ASTERISK> & ^<TF ACKZ> THEN BEGIN % Wild card or multiple send
CCALL NEXTFILE,A;
IF ^<CI VRF,ENDCAT> THEN BEGIN
CCALL OPENSDSN,A; % Open next sendfile
IF ^<TF SENDDSNF> THEN BEGIN
ERRORCON 'Can not next file for down load';
CCALL ERRPACK,A;
END % OF OPEN ERROR
ELSE <MVI STATE,SFSTATE; EXIT>; % SUCCESSFUL FILE OPEN
END;
END; % of wildcard
MVI STATE,SBSTATE;
END; % OF ACK
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
END;
ENDCASE
ELSE BEGIN
ERRORCON 'Illegal packet type received ';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % ABORT
END;
END; % OK RETRY
END; % of SEOFBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SEOT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SEOT
% FUNCTION : Sends the end-of-transmission packet
% changes states on ack or nack
% INPUT: none
%
%
% OUTPUT : state = either 'C' complete || 'B' EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SEOT:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE SEOTBLCK: DO BEGIN % Send end of transmisision block
SPSPACK AB,SEQNUM,ZERO,VR0; % B PACKET,SEND PARAMETERS FOR SPACK
SELECT FIRST;
<TF WARNINGF>: <L XRA,RECPNTR; MVI 0(XRA),AX; MMVC PUTLEN,=H'1',2>;
ENDSEL;
CCALL SPACK,A;
CCALL RPACK,A;
EXIT IF <RNZ VRF> | <TF STOPF>; % Leave if Timeout or Bad BCC
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
NCASE: BEGIN % Got a nack
LH XRA,RPSEQ; % Load received sequence number
IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1; % see if nack for pack+1
STH XRA,RPSEQ; % STORE IN CASE NACK FOR SEQ+1
IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>; % Ok yack case next
END; % of nack
YCASE: BEGIN % ACK
EXIT IF ^<MCLC SEQNUM,RPSEQ,2>; % Wrong packet number
ZERORTRY; % % Zero retry counter
BUMPSEQ VR0; % Increment packet counter
MVI STATE,CSTATE; % COMLETE STATE
END; % OF ACK
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
END;
ENDCASE
ELSE BEGIN
ERRORCON 'Illegal packet type received ';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % SEND ABORT STATE
END;
END; % OK RETRY
END; % of SEOTBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
ASCIIREG: EQU 0; % EQUATES FOR TABLE
ASCIIQUO: EQU 4; % QUOTE CHARACTER
ASCIQUO8: EQU 8; % " + BIT 8 ON
ASCI8BIT: EQU 12; % BIT 8 ON
REPTQUO: EQU 16; % REPTCHARACTER
NOQUOQUO: EQU 20;
NOQUOQU8: EQU 24;
% ASCII OFFSETS INTO TABLE
YOFF: EQU X'59';
NOFF: EQU X'4E';
FOFF: EQU X'46';
DOFF: EQU X'44';
ZOFF: EQU X'5A';
COFF: EQU X'43';
BOFF: EQU X'42';
EOFF: EQU X'45';
AOFF: EQU X'41';
R2OFF: EQU X'52'; % ASCII I SERVER GET COMM
IOFF: EQU X'49'; % ASCII I SERVER GET COMM
GOFF: EQU X'47'; %ASCII G;
ROFF: EQU SCOMLIT;
% ASCII COMMAND LITERALS
YCOMLIT: EQU X'59';
NCOMLIT: EQU X'4E';
FCOMLIT: EQU X'46';
DCOMLIT: EQU X'44';
ZCOMLIT: EQU X'5A';
CCOMLIT: EQU X'43';
BCOMLIT: EQU X'42';
ECOMLIT: EQU X'45';
ACOMLIT: EQU X'45';
%ACOMLIT: EQU X'41';
SCOMLIT: EQU X'53';
% EQUATES FOR A CASE STATEMENT INDEAL1 FOR PACKET TYPE
YCASE: EQU 8; % ACK T PACKET
NCASE: EQU 4; % NACK PACKET
ECASE: EQU 12; % ERROR PACKET
FCASE: EQU 32; % FILE INIT PACKET
DCASE: EQU 16; % DATA PACKET
ZCASE: EQU 20; % EOF PACKET
CCASE: EQU 24; % COMPLETEPACKET
BCASE: EQU 28; % EOT PACKET
ACASE: EQU 36; % ABORT PACKET
SCASE: EQU 40; % SENDINIT PACKET
R2CASE: EQU 44; % SERVER GET PACKET
GCASE: EQU 48; % SERVER GENERIC COMMMAND PACKET
ICASE: EQU 52; % SERVER I PACKET
% VARIOUS KERMIT SEND STATES
SFSTATE: EQU 12; % SEND FILE INIT PACKET
SDSTATE: EQU 16; % SEND % DATA PACKET
SZSTATE: EQU 20; % SEND EOF PACKET
CSTATE: EQU 24; % COMPLETEPACKET
SBSTATE: EQU 28; % SEND EOT PACKET
ASTATE: EQU 36; % ABORT PACKET
SESTATE: EQU 36; % SEND ABORT PACKET
RESTATE: EQU 44; % RECEIVED ABORT PACKET
SISTATE: EQU 40; % SENDINIT PACKET
% VARIOUS KERMIT RECEIVE STATES
RFSTATE: EQU 12; % RECEIVE FILE HEADER PACKET
RDSTATE: EQU 16; % RECEIVE % DATA PACKET
RZSTATE: EQU 20; % RECEIVE EOF PACKET
RBSTATE: EQU 28; % RECEIVE EOT PACKET
RISTATE: EQU 56; % RECEIVE INIT PACKET
RSTATE: EQU 40; % RECEIVE PACKET
R2STATE: EQU 44; % GET PACKET FOR SERVER MODE
GSTATE: EQU 48; % GENERIC SERVER COMMANDS
ISTATE: EQU 52; % I PACKET
SEND: EQU 60; % IN SEND COMMAND MODE
RECEIVE: EQU 64; % IN RECEIVE COMMAND MODE
SUBTITLE 'SENDDATA';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD NAME : SENDDATA
% FUNCTION: BREAK RECORDS INTO PACKET - CALLED BY KSEND
% INPUT : VR1-> DATA STRING
% VR0=LENGTH OF STRING TO SEND IN PACKETS
% OUTPUT: A PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SENDDATA:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRB,VR0; % LENGTH OF DATA
LR XRE,VR1; % POINTER TO BEGINNING OF THE STRING
SDATABLK: UNTIL <RNP XRB> DO BEGIN
IF <TF REPTF> THEN BEGIN
LR VR1,XRE;
ZR XRA; % FOR TRT TEST
CCALL CNTXCHAR,A,VR0=(VR1),VRF=(XRB); % CHECK FOR MATCHES
MTRT 0(VR1),REPTABLE,1;
IF <CR XRA,VRF; CC L> THEN BEGIN % IF ENUFF WORTH QUOTING BEGIN
IF <CI VRF,94; CC H> THEN LI VRF,94; % NINE FOUR HIGHEST KERMIT NUMBER
ZR XRA;
MTRT 0(VR1),SENDTBL,1; % WHAT TYPE OF CHARACTER
CASE XRA MAX 24 MIN 0 CHECK; % CHECK IF BUFFER LARGE ENOUGH
0: LI VR0,3;
4,20,ASCI8BIT: LI VR0,4;
ASCIQUO8,24: LI VR0,5;
ENDCASE;
LR XRC,VRF; % SAVE LENGTH OF MATCHES IN CASE NEEDED
CCALL CHECKLEN,A;
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LR VRF,XRC; % RESTORE LENGTH OF CHARACTERS TO QUOTE
MMVC 0(VR1),REPTCHAR,1;
CHAR VRF; % MAKE IT A KERMIT INTEGER
STC VRF,1(VR1); % PUT IN THE COUNT
UNCHAR VRF;
CCALL PUTBUFF,A,VR0=2; % PUT THE TWO IN
SI VRF,1; % DECREMENT COUNT % BIT KLUDGE
SR XRB,VRF;
AR XRE,VRF; % MOVE POINTER;
END;
END; % OF REPEAT
ZR XRA;
MTRT 0(XRE),SENDTBL,1; % SCAN FOR CERTAIN CHARACTER
CASE XRA MAX 24 MIN 0 CHECK;
0: BEGIN % MOVE EM ALL
CCALL CHECKLEN,A,VR0=1; % SET ANY ROOM LEFT
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
END; % OF ALL MOVE
ASCIIQUO: BEGIN
LI VR0,2;
CCALL CHECKLEN,A;
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LI VR0,1; % ONE CHARACTER PUT
CCALL PUTBUFF,A,VR1=QUOCHAR; % PUT IN THE CONTROL QUOTE CHARACTER
CNTLLOC 0(XRE); % MACRO FOR CONTROL CHARACTERS
END;
ASCIQUO8: BEGIN
LI VR0,3; % THREE CHARACTERS NON SPLIT
CCALL CHECKLEN,A;
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LI VR0,1; % ONE CHARACTER PUT
CCALL PUTBUFF,A,VR1=BINQC; % PUT IN THE BINARY QUOTE CHARACTER
CCALL PUTBUFF,A,VR1=QUOCHAR; % PUT IN THE CONTROL QUOTE CHARACTER
CNTLLOC 0(XRE); % MACRO FOR CONTROL CHARACTERS
ZAP8BIT 0(XRE); % MACRO FOR ZERO HIGH ORDER
END; % 2 QUOTE BITS
ASCI8BIT: BEGIN % HIGH ORDER BIT ON
LI VR0,2;
CCALL CHECKLEN,A;
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LI VR0,1; % ONE CHARACTER PUT
CCALL PUTBUFF,A,VR1=BINQC; % PUT IN THE BINARY QUOTE CHARACTER
ZAP8BIT 0(XRE); % KILL HIGH ORDER BIT
END;
REPTQUO: BEGIN
WRTERM 'REPT CASE DONT BELONG LUCY';
ZR XRA; % FOR CASE
% REGISTER 1 POINTS TO REPT CHAR
LA XRD,2(,VR1); % POINT TO CHARACTER
MTRT 0(XRD),SENDTBL,1; % TEST ONE CHARACTER
CASE XRA MAX 24 MIN 0 CHECK;
0: BEGIN % NO OTHER QUOTING NECESSARY
LI VR0,3;
END; % OF NO OTHER QUOTE NECESSARY
4,16 : BEGIN % NEED ONE
LI VR0,4;
CNTLLOC 0(XRD); % MACRO FOR CONTROL CHARACTERS
END; % END OF QUOTE CASE
8: BEGIN % NEED ONE ASCII + HIGH ORDER BIT ON
LI VR0,5;
CNTLLOC 0(XRD); % MACRO FOR CONTROL CHARACTERS
ZAP8BIT 0(XRD); % MACRO FOR ZERO HIGH ORDER
END; % END OF HIGH BIT& QUOTE CASE
12 : BEGIN % NEED ONE
LI VR0,4;
ZAP8BIT 0(XRD); % MACRO FOR ZERO HIGH ORDER
END; % END OF QUOTE CASE
20: BEGIN % A QUOTE CHARACTER THAT NOTHING SHOULD BE DONE TO
LI VR0,4;
LI XRA,ASCIIQUO; % SINGLE QUOTE IT
END;
24: BEGIN % SAME AS ABOVE BUT IT'S HIGH ORDER COUNTER PART
LI VR0,5;
ZAP8BIT 0(XRD); % ZAP HIGH ORDER
LI XRA,ASCIQUO8; % FAKE OUT NEXT SECTION
END;
ENDCASE;
CCALL CHECKLEN,A; % MUST ALL BE ONE UNIT
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LR VR1,XRD;
SI VR1,2; % BACK UP
LI VR0,2; % PUT IN REPEAT AND COUNT
CCALL PUTBUFF,A; % DO IT
LI VR0,1;
CASE XRA MAX REPTQUO MIN 0 CHECK;
0: ; % DO NOTHING FALL OUT
ASCIIQUO: BEGIN
CCALL PUTBUFF,A,VR1=QUOCHAR;
END;
ASCIQUO8: BEGIN
CCALL PUTBUFF,A,VR1=BINQC; % THE BINARY QUOTE CHARACTER
CCALL PUTBUFF,A,VR1=QUOCHAR;
END;
ASCI8BIT: BEGIN
CCALL PUTBUFF,A,VR1=BINQC; % THE BINARY QUOTE CHARACTER
% THE HIGH ORDER BIT IS ON
END;
REPTQUO: ; % JUST DROP THROUGH
ENDCASE;
%
LR VR1,XRD; % POINT TO THE CHARACTER
CCALL PUTBUFF,A; % PUT IT IN THE OUTPUT BUFFER
SI VR1,1; % BACK UP TO LENGTH
ZR XRD; IC XRD,0(VR1);
UNCHAR XRD; % MAKE IT AN INTEGER
AR XRE,XRD; % INCREMENT COUNTER
SR XRB,XRD; % DECRENT LENGTH
END; % OF REPT CASE
20: BEGIN % A QUOTE CHARACTER
LI VR0,2;
CCALL CHECKLEN,A;
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LI VR0,1;
CCALL PUTBUFF,A,VR1=QUOCHAR;
END;
24: BEGIN % A HIGH ORDER QUOTE CHARACTER
LI VR0,3;
CCALL CHECKLEN,A;
EXIT FROM SDATABLK IF <RNZ VRF>; % NO MORE ROOM IN PACKET
LI VR0,1;
CCALL PUTBUFF,A,VR1=BINQC;
CCALL PUTBUFF,A,VR1=QUOCHAR;
ZAP8BIT 0(XRE);
END;
ENDCASE;
CCALL PUTBUFF,A,VR1=(XRE),VR0=1; % PUT IT IN THE BUFFER
AI XRE,1; % POINT TO NEXT CHARACTER
SI XRB,1; % DECREMENT THE LENGTH REGISTER
END;
LR VRF,XRB; % REMAINING CHARACTERS
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'PUTTABS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : PUTTABS
% FUNCTION : PUTS TABS INTO RECORD
% CALLED BY FILLDPCK;
% INPUT: NONE
% OUTPUT : THE RECORD BUFFER WITH TAB CHARACTERS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
PUTTABS:
CENTER VRE,HIGHR,ENTRY=NO;
MZC TABCNT,2; % ZERO TAB COUNTER
ZF TABFOUND; % ZERO FLAG
ZR XRD; % ACCUMULATOR
L VR0,EDPNTR; % ADDRESS OF POINTER
L XRE,EDLENACT; % LENGTH OF DATA RECEIVED
L XRA,TABTBLAD; % POINTER TO ARRAY OF TABS
MMVC LASTTAB,=H'1'; % INTIALIZE LAST TAB
ST VR0,LASTADDR; % LAST ADDRESS OF MOVE
TABBLCK: UNTIL <MCLC 0(XRA),=H'0',2> % UNTIL NO MORE TABS
DO BEGIN
%
L VR1,EDPNTR; % POINTER TO RECORD BUFFER
LH XRB,0(,XRA); % LOAD TAB CHARACTER
SI XRB,1; % ONE LESS FOR COMPARE
EXIT FROM TABBLCK IF <C XRB,EDLENACT; CC H>; % EXIT IF TOO LONG
AI XRB,1; % RESTORE TAB CHARACTER
AR VR1,XRB; % POINT AT TAB PLACE
SI VR1,2; % BACK UP IN STRING AT LEAST TWO CHARACTS FOR WORTH WHILE
LR VRF,XRB; % SET UP LENGTH TO SCAN
SH VRF,LASTTAB; % "
STH XRB,LASTTAB; % PUT
LR XRB,VRF; % LENGTH OF STRING
LCR VRF,VRF; % LOAD COMP TO MAKE ROUTINE COUNT BACKWARD
CCALL CNTXCHAR,A,VR0=ASCBLANK;
IF <CI VRF,2; CC NL> THEN BEGIN % FOUND TWO BLANKS
SF TABFOUND;
LR XRE,VRF; % STORE OFF NUMBER OF BLANKS
SR XRB,VRF; % UNTABBED ONES
L VR0,LASTADDR; % LAST ADDRESS IN NON TAB BUFFER
L VR1,TABADDR; % ADDRESS OF TAB BUFFER
AH VR1,TABCNT; % NEXT PLACE TO BE
L VRF,EDPNTR;
AH VRF,0(XRA); % POINT TO END OF CHAIN
SI VRF,1; % KNOCK OFF ONE REGARDLESS
SR VRF,XRE; % SUB OFF NUMBER OF BLANKS
S VRF,LASTADDR; % SUB OFF FOR TOTAL TO MOVE
CCALL MVCXCHAR,A; % MOVE UNTABBED ONES
AR VR1,VRF; % POINT TO NEXT ENTRY
MMVC 0(VR1),TABCHAR,1; % PUT IN TAB CHARACTER
AH VRF,TABCNT;
AI VRF,1; % ONE FOR THE TAB CHARACTER COMING UP
STH VRF,TABCNT; % INCREMENT TAB COUNTER
L VR0,EDPNTR;
AH VR0,0(XRA); % ADD TAB
SI VR0,1; % FOR CORRECT ADDRESS
ST VR0,LASTADDR; % PLACE TO MOVE FROM
END; % OF BLANKS
AI XRA,2; % MOVE POINTER TO NEXT IN TAB TABLE
END; % OF TABBLCK
IF <TF TABFOUND> THEN BEGIN
L VRF,EDLENACT;
L VR0,LASTADDR;
S VR0,EDPNTR; % NUMBER ALREADY IN BUFFER
SR VRF,VR0; % REMAINDER TO PUT
IF <RP VRF> THEN BEGIN % A POSITIVE REMAINDER
L VR1,TABADDR; % TAB BUFFER
AH VR1,TABCNT; % COUNT IN BUFFER
L VR0,LASTADDR; % FROM ADDRESS
CCALL MVCXCHAR,A; % MOVE THE CHARACTERS LEFT
END; % OF POSITIVE NUMBER
AH VRF,TABCNT;
ST VRF,EDLENACT;
MMVC EDPNTR,TABADDR,4; % REINIT ADDRESS
END; % OF FOUND A TAB
TABEXIT: CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'REPTCNT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : REPTCNT
% FUNCTION: SCANS BUFFER FOR LIKE CHARACTERS PUT IN REPTCHAR
% PLUS LENGTH, PLUS CHAR
% ON RETURN R15 - EQUALS LENGTH OF STRING
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REPTCNT: ;
CENTER VRE,HIGHR,ENTRY=NO;
LR XRB,VR0; % LENGTH OF STRING
REPTBLCK: DO BEGIN % BLOCK TO DROP OUT OF
WHILE <CI XRB,2; CC NL> DO BEGIN % LOOP LOOKS THROUGH STRING
DO BEGIN
EXIT FROM REPTBLCK IF <CI XRB,2; CC L>;
ZR XRA; % ZERO CASE STATEMENT
LR VR0,VR1; % POINT TO SAME PLACE FOR CHECK
% CASE TO PUT IN REPEAT CHARACTER
MTRT 0(VR1),REPTABLE,1; % NUMBER NEEDED FOR WORTHWHILE QUOTING
LR VRF,XRB; % LOAD UP NUMBER OF CHARACTERS
CCALL CNTXCHAR,A; % COUNT NUMBER OF MATCHES
LR XRC,VR1; % POINTER
AR XRC,VRF; % POINTER TO NEXT POSITION
AI VR1,1; % INCREMENT POINTER
SI XRB,1; % SUBTRACT COUNTER
END UNTIL <CR VRF,XRA; CC NL>; % LOOP TILL WE FIND OK ONE
SI VR1,1; % POINT BACK
SR XRB,VRF; % SUBTRACT THE NUMBER EFFECTED
AI XRB,1; % ADD IN ONE THAT WE SUBBED OFF ABOVE
LR XRA,VRF; % GET LENGTH
DO BEGIN % % 94 MAXIMUM NUMBER OF CHARACTERS
IF <CI XRA,94; CC H> THEN BEGIN % TOO LARGE
LI VRF,94; % MAX VALUE ACCORDING TO KERMIT STANDARDS
SI XRA,94;
END % OF>94
ELSE BEGIN
LR VRF,XRA; % LENGTH
ZR XRA; % INDICATE NO MORE
END;
MMVC 0(VR1),REPTCHAR,1;
CHAR VRF; % MAKE THE INTEGER A CHARACTER
STC VRF,1(VR1); % STORE OFF LENGTH
% THE CHARACTER IS ALREADY IN STRING SO WE JUST LEAVE IT
%
UNCHAR VRF; % MAKE INTEGER AGAIN
AR VR1,VRF; % INCREMENT POINTER TO NEXT REPT PLACE
END UNTIL <RNP XRA>; % LOOP THRU WHILE> 94
LR VR1,XRC; % RESTORE POINTER
END; % OF WHILE
END; % OF REPTBLCK
REPTEXIT: CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SCANDSN';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: SCANDSN
% FUNCTION: SCANS A STRING TO SET UP DATA SET NAME
% INPUT: VR1-> POINTER TO STRING
% VR0 = LENGTH OF STRING
% OUTPUT: DSNAME VARIABLE FILLED IN
% MEMBER NAME FILLED (IF PDS)
% RETURN: VRF=0 - GOOD RETURN WITH DSNAME FILLED IN
% 4 - " " " " & MEMBER " " + PDS
% 8 " " + A WILD CARD -"*"
% 12 - VR0=0 ON ENTRY
% 16 - ERROR ON DS NAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SCANDSN:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
SCERROR NEW=SCDSNERR;
ZF PDSF; % ASSUME NOT A PDS
ZR VRF;
MFC DSNAME,44;
DEBLANK VR1,VR0,XRA,ZERO=NO; % DEBLANK STRING
MFC DSMEMBER,8; % ZERO MEMBER NAME
IF ^<<CLI STATE,SEND> | <CLI STATE,RECEIVE>> | %NOTHING
<TF SERVERF> % ALWAYS PASS THROUGH FOR SERVER
THEN BEGIN
%%% CHECK NOW FOR REPEAT AND STRANGE CHARACTERS
MMVC MAXWRITE,=X'7FFF',2; % MAXVALUE
MZC BUFCNT,2; % ZERO OUT BUFFER COUNTER
MMVC ADDBUF,BUFADCON,4; % ADDRESS OF BUFFER
MMVC TEMP,DATA,7;
MMVC DATA,=C'BINARY',7;
LR XRA,VR0;
L XRC,ETOAVCON;
EXI XRA,MTR,0(VR1),0(XRC),*-*,INCR=YES,DECR=YES;
CCALL KGETBUFF,A;
MMVC DATA,TEMP,7;
LH VR0,BUFCNT; % NUMBER OF CHARACTERS
L VR1,ADDBUF; % ADDRESS OF BEGINNING OF STRING
L XRC,ATOEVCON;
LR XRA,VR0;
EXI XRA,MTR,0(VR1),0(XRC),*-*,INCR=YES,DECR=YES;
% ST VR1,DSNADD ;
% STH VR0,DSNLEN ;
END;
SCANDSBK: DO BEGIN % BLOCK TO FALL OUT OF IF NECESSARY
STH VR0,TEMP; % STORE OFF LENGTH
LR XRA,VR0; % LENGTH IN REGISTER
LR XRB,VR1; % POINTER TO STRING
CCALL SCANASRK,A; % ROUTINE LOOKS FOR ASTERISK
IF <TF ASTERISK> THEN BEGIN
IF <<CLI STATE,RFSTATE> | <CLI STATE,RECEIVE>> %NO WILDCARD RECEIVE
THEN BEGIN
LI VRF,8; % WILDCARD
EXIT FROM SCANDSBK;
END;
CCALL CATLOOK,A; % LOOK INTO CATALOG
IF <RZ VRF> THEN CCALL NEXTFILE,A; % SEE IF ENTRY EXISTS IN CATALOG
EXIT FROM SCANDSBK;
END; % OF * BLOCK
LA XRC,DSNAME;
IF ^<TF PREFXQUO> THEN BEGIN
L XRB,USERPREA; % POINTER TO USER PREFIX
LH XRA,USERPREL; % LENGTH OF PREFIX
EXI XRA,MMVC,0(XRC),0(XRB),*-*,INCR=YES,DECR=YES; AR XRC,XRA;
MVI 0(XRC),C'.'; % PUT IN THE DOT
AI XRC,1; % MOVE POINTER TO DATA SET NAME
END;
IF <MCLC PREFIXL,=H'0',2; CC H> THEN BEGIN
LH XRB,PREFIXL;
EXI XRB,MMVC,0(XRC),PREFIX,*-*,INCR=YES,DECR=YES;
AR XRC,XRB;
END;
SCINIT (VR1),(VR0);
SCANDSN1: DO BEGIN SCAN *;
SCKW ,QDSN,QS; % IF QUOTED DATA SET NAME
SCKW ,UNQDSN; % REGULAR DSN
UNQDSN:
% MTRT TEST FOR ILLEGAL CHARACTERS IN DATA SET NAME
IF <TF PREFPDSF> THEN BEGIN
SCBACK;
GOTO UNQMEM; % A PDS PREFIX FILL IN THE MEMBER
END; % OF PREFIX PDS
LR XRB,VR0; % LENGTH
EXI XRB,MMVC,0(XRC),0(VR1),*-*,INCR=YES,DECR=YES; % SAVE DATA SET NAME)
BEGIN SCAN *;
SCKW ,UNQMEM,PS; % SEE IF MEMBER EXISTS FOR PDS
SCKW ,*,B; % ALL DONE BABY
UNQMEM:
DEBLANK VR1,VR0;
%MTRT TEST FOR VALID DSN AGAIN
SCPUSH;
SCINIT (VR1),(VR0);
SCAN;
IF <CI VR0,8; CC H> THEN LI VR0,8;
LR XRA,VR0; % LENGTH FOR EXECUTE
IF <RZ XRA> THEN BEGIN % NOTHING FOR MEMBER
IF ^<TF SERVERF> THEN WRTERM 'Member name excedes 8 characters'
ELSE BEGIN
ERRORCON 'No member name specified';
CCALL ERRPACK,A;
MVI STATE,ASTATE;
END; % OF NON SERVER
LI VRF,BADDSN; % ERROR ON NAME
EXIT; % SPLIT THE BLOCK
END; % OF ERROR BLOCK
EXI XRA,MMVC,DSMEMBER,0(VR1),*-*,INCR=YES,DECR=YES;
LA VR0,DOT; % LOOK FOR DOTS
LI VRF,8; % MEMBER NAME LENGTH
CCALL FINDCHAR,A,VR1=DSMEMBER;
IF <RNZ VRF> THEN BEGIN
SI VRF,1; AR VR1,VRF; SI VRF,8; LCR VRF,VRF;
LA VR0,BLANKS; % MOVE IN BLANKS
CCALL MVCXCHAR,A;
END; % OF FIXING MEMBER NAME
SCDONE; % ERROR IF MORE JUNK ON LINE
SF PDSF; % INDICATE WE HAVE A PDS
SCPOP;
SCANEND; END;
EXIT;
QDSN:
SCPUSH;
SCINIT (VR1),(VR0);
% SAME THING AS FOR UNQUOTED NAME
MFC DSNAME,44; % BLANK IT
MFC DSMEMBER,8;
LA XRC,DSNAME; % FOR THE PUT
% GOTO SCANDSN1; % A BIT KLUDGEY FOR NOW
SCAN;
% MTRT TEST FOR ILLEGAL CHARACTERS IN DATA SET NAME
LR XRB,VR0; % LENGTH
EXI XRB,MMVC,0(XRC),0(VR1),*-*,INCR=YES,DECR=YES; % SAVE DATA SET NAME)
SCAN *;
SCKW ,UNQMEM,PS; % SEE IF MEMBER EXISTS FOR PDS
SCKW ,*,B; % ALL DONE BABY
SCDONE;
SCPOP;
EXIT;
SCANEND;
SCANEND; END;
DATA BEGIN % NOTHING SPECIFIED
IF ^<TF SERVERF> THEN WRTERM 'nothing specified for data set name'
ELSE BEGIN
ERRORCON 'Nothing specified for data set name to send';
CCALL ERRPACK,A;
MVI STATE,ASTATE;
END;
END; % OF THEN
END; % OF SCANDSBK GLOBAL BLOCK
IF <RZ VRF> THEN BEGIN
ST VRF,TEMP; % STORE RETURN CODE
LA VR1,DSNAME; % NOW WE FIND LENGTH OF DATA SET
AI VR1,43; % POINT TO END
LI VRF,44; % NUMBER OF CHARACTERS IN DATA SET NAME
LCR VRF,VRF; % INDICATE COUNT BACKWARDS
LA VR0,BLANKS; % LOOK FOR NON BLANKS
CCALL CNTXCHAR,A;
LI VR1,44;
SR VR1,VRF; % LENGTH OF DATA SET NAME
STH VR1,DSNLEN; % STORE OFF LENGTH FIELD
CCALL VALIDDSN,A,VR1=DSNAME,VR0=LH:DSNLEN,VRF=DSMEMBER;
% L VRF,TEMP; % RESTORE COMP CODE
END;
DATA BEGIN
SCDSNERR: LI VRF,BADDSN;
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
SCDSNEND: CEXIT VRE,HIGHR;
LTORG;
EXORG;
BADDSN: EQU 16;
PDSDSN: EQU 8;
CATFILE: EQU 4; % FILE RETURN FROM CATALOG
GOODDSN: EQU 0;
SUBTITLE 'VALIDDSN';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : VALIDDSN
% FUNCTION : CHECKS A STRING FOR A VALID 370/VS DSNAME
%
% INPUT: VR0-> LENGTH OF DSNAME
% VR1-> POINTER TO DATASET NAME
% VRF = POINTER TO MEMBER NAME IF PDS
% OUTPUT : REG VRF =0 GOOD DSNAME ELSE BAD DATA SET NAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
VALIDDSN:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRB,VR1; % POINTER TO DSNAME
LR XRC,VR0; % LENGTH
LR XRE,VRF; % MEMBER POINTER
ZR XRA; % BLAST REG2 FOR TRT
LI VRF,BADDSN; % ASSUME BAD
DOSYNTAX: DO BEGIN % BLOCK OF ROUTINE
IF <TF PDSF> THEN BEGIN
EXIT FROM DOSYNTAX IF <MTRT 0(XRE),MEMTABLE,8; CC NZ>;
EXIT FROM DOSYNTAX IF
<<CLI 0(XRE),C'A'; CC L> | <CLI 0(XRE),C'Z'; CC H>>
& ^<CLI 0(XRE),C'#'> & ^<CLI 0(XRE),C'@'> & ^<CLI 0(XRE),C'$'>;
END; % OF PDS
EXI XRC,MTRT,0(XRB),DSNTABLE,*-*,INCR=YES,DECR=YES; % CHECK BAD CHAR
EXIT FROM DOSYNTAX IF <RNZ XRA>;
FOREVER DO BEGIN % CHECK THE REST
EXIT FROM DOSYNTAX IF
<<CLI 0(XRB),C'A'; CC L> | <CLI 0(XRB),C'Z'; CC H>>
& ^<CLI 0(XRB),C'#'> & ^<CLI 0(XRB),C'@'> & ^<CLI 0(XRB),C'$'>;
LR VR1,XRC; % SAVE COUNT
DO BEGIN
EXIT IF <CLI 0(XRB),C'.'>;
AI XRB,1;
END FOR XRC;
EXIT FROM DOSYNTAX IF <SR VR1,XRC; CI VR1,8; CC H>; % ONLY 8 BETWEEN
EXIT IF <RNP XRC>; % NO MO
AI XRB,1;
SI XRC,1; % SKIP OVER .
EXIT FROM DOSYNTAX IF <RNP XRC>;
END; % OF FOREVER
ZR VRF; % INDICATE GOOD RETURN CODE
END; % OF MAIN BLOCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
% TABLES FOR LEGAL DATA SET NAME
DSNTABLE: DC 256AL1(BADDSN); BEGIN
ORG DSNTABLE+C'A'; DC 9X'00'; % A-I
ORG DSNTABLE+C'J'; DC 9X'00'; % J-R
ORG DSNTABLE+C'S'; DC 8X'00'; % S-Z
ORG DSNTABLE+C'@'; DC X'00'; % NATIONAL @
ORG DSNTABLE+C'#'; DC X'00'; % NATIONAL #
ORG DSNTABLE+C'$'; DC X'00'; % NATIONAL $
ORG DSNTABLE+C'.'; DC X'00'; % NATIONAL .
ORG DSNTABLE+C'-'; DC X'00'; % NATIONAL -
ORG DSNTABLE+C'0'; DC 10X'00'; % 0-9
ORG DSNTABLE+X'C0'; DC X'00'; % PLUS ZERO
ORG;
END;
% TABLES FOR LEGAL DATA SET MEMBER NAME
MEMTABLE: DC 256AL1(BADDSN); BEGIN
ORG MEMTABLE+C'A'; DC 9X'00'; % A-I
ORG MEMTABLE+C'J'; DC 9X'00'; % J-R
ORG MEMTABLE+C'S'; DC 8X'00'; % S-Z
ORG MEMTABLE+C'@'; DC X'00'; % NATIONAL @
ORG MEMTABLE+C' '; DC X'00'; % A BLANK AT THE END
ORG MEMTABLE+C'#'; DC X'00'; % NATIONAL #
ORG MEMTABLE+C'$'; DC X'00'; % NATIONAL $
ORG MEMTABLE+C'0'; DC 10X'00'; % 0-9
ORG;
END;
SUBTITLE 'SCANASRK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE: SCANASRK
% FUNCTION : SEARCHES SEND DATASET NAME FOR * FOR WILDCARD SEND
% INPUT : VR1->STRING
% VR0=LENGTH OF NAME
% OUTPUT: FILLED IN SUFFIX OR/AND PREFIX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SCANASRK:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
ASKBLCK:DO BEGIN % BLOCK TO FALL OUT OF
MZC DSNPFL,2; % ZERO LENGTH OF PREFIX
MZC DSNSFL,2; % " " " SUFFIX
MFC LASTDSN,44; % ZERO OUT OLD
ZF FULLQDSN ; %
IF <TF PREFXQUO> THEN <MMVC LASTDSN,PREFIX,8> % QUOTED PREFIX
ELSE BEGIN % MOVE IN ACCOUNT INITIALS
LA XRC,LASTDSN; % POINT AT DATA SET NAME
L XRB,USERPREA; % POINTER TO USER PREFIX
LH XRA,USERPREL; % LENGTH OF PREFIX
EXI XRA,MMVC,0(XRC),0(XRB),*-*,INCR=YES,DECR=YES; AR XRC,XRA;
MVI 0(XRC),C'.'; % PUT IN THE DOT
END;
ZR VRF; % ZERO RETURN CODE
% DEBLANK (VR1),(VR0)
IF <CI VR0,1> & <CLI 0(VR1),C'*'> THEN SF ASTERISK % SEND ALL
ELSE BEGIN % NOT A TOTAL SCAN
LR XRE,VR1; % LOAD ADDRESS POINTER
LR XRB,VR0; % LOAD FOR EXECUTE
ZR XRA; % ZERO FOR CASE
EXI XRB,MTRT,0(XRE),ASTRKTBL,*-*,INCR=YES,DECR=YES;
CASE XRA MAX 4 MIN 0 CHECK;
0: <ZF ASTERISK>; % END OF IT NOT A WILDCARD (IE NO *) JUST FALL OUT
4: BEGIN % WE HAVE AN ASTERISK
SF ASTERISK; % TURN ON ASTERISK INDICATOR
LR XRC,VR1 ; % STORE LOCATION OF ASTERISK
% CHECK FOR FULLY QUOTED DATA SET NAME WITH ASTERISK
SCPUSH ;
SCINIT (XRE),(XRB) ;
SCAN * ;
SCKW ,FQDSN,QS ;
SCKW ,*,B ;
FQDSN:
SF FULLQDSN ; % FULLY QUOTED DATA SET NAME
% SINCE FULLY QUALIFIED RELOAD
LR XRE,VR1; % LOAD ADDRESS POINTER
LR XRB,VR0; % LOAD FOR EXECUTE
ZR XRA; % ZERO FOR CASE
EXI XRB,MTRT,0(XRE),ASTRKTBL,*-*,INCR=YES,DECR=YES;
LR XRA,VR1 ;
SR XRA,XRE ; % NUMBER OF SCANNED CHARACTERS
IF ^<CLI 7(XRE),C'.'> | % BETTER BE A DOT
<CI XRA,8;CC L> THEN BEGIN % TOO FEW CHARACTERS
% FOR FULL QUALIFIED DSN
ERRORCON 'Illegal fully quoted data set name with wildcard';
CCALL ERRPACK,A ;
IF <TF SERVERF> THEN CCALL SABORT,A,VR0=LH:RPSEQ
ELSE TPUT (VR1),(VR0) ; %
LI VRF,24 ;
EXIT FROM ASKBLCK ;
END
ELSE BEGIN
MFC LASTDSN,44 ;
MMVC LASTDSN,0(XRE),8 ; % THIS SETS UP THE CATALOG NAME
END ;
SCANEND ; %
SCPOP ;
IF ^<TF FULLQDSN> THEN LR VR1,XRC ; % RESTORE ASTERISK POINTER
LR VR0,VR1;
SR VR0,XRE; % TOTAL CHARACTERS SCANED
IF <RP VR0> THEN BEGIN % STORE OFF BEGINNINGS
STH VR0,DSNPFL; % PREFIX LENGTH;
LR XRA,VR0; % FOR EXECUTE
EXI XRA,MMVC,DSNPFIX,0(XRE),*-*,INCR=YES,DECR=YES; % MOVE IT
END; % OF PREFIX
SR XRB,VR0; % SUBTRACT TO SEE IF REMAINDER
SI XRB,1; % SUBTRACT ONE FOR ASTERISK ITSELF
IF <RP XRB> THEN BEGIN % STORE OFF LAST
STH XRB,DSNSFL; % SUFFIX LENGTH
EXI XRB,MMVC,DSNSFIX,1(VR1),*-*,INCR=YES,DECR=YES;
END; % OF SUFFIX
END; % OF ASTERISK FOUND
ENDCASE ELSE WRTERM 'ERROR IN CASE OF ASTERISK';
END; % OF ELSE NON TOTAL * SEND
END ; % OF ASKBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'NEXTFILE';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%MODULE : NEXTFILE
%FUNCTION: CALLS TSO CATALOG TO FIND THE NEXT ENTRY AFTER
% DSNAME, CHECKS AGAINST PREFIX AND SUFFIX CRITERIA
% AND RETURNS MATCH IF EXISTS IN DSNAME ELSE BLOCKS
% IT OUT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NEXTFILE:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
% IF DSNPFL = 45 THEN WE SEND ALL IN CATALOG
%
L XRC,CATDSPTR; % POINTER TO PLACE IN CATALOG
USE XRC AS CATDSET IN BEGIN % DATASET DSECT
DO BEGIN % LOOP THROUGH CATALOG
SELECT FIRST;
<CLI TYPEBYTE,C'A'>: CATBLCK1: DO BEGIN % FOUND SOMETHING
% MMVC LASTDSN,RETURNDS,44; % MOVE OVER DSNAME
LH XRA,MATCHDSL; % LOAD PREFIX LENGTH
IF <RP XRA> THEN BEGIN
EXI XRA,MCLC,CATDNAME,MATCHDSN,*-*,DECR=YES,INCR=YES;
IF <CC => THEN BEGIN % FOUND A MATCH FOR DATASET NAME
IF <MCLC DSNSFL,=H'0',2; CC H> THEN BEGIN % CHECK SUFFIX
LA VR0,BLANKS; % POINT TO BLANKS
LI VRF,44; % LENGTH OF DSNAME
CCALL FINDCHAR,A,VR1=CATDNAME; % FIND FIRST BLANK
IF <RZ VRF> THEN LI VRF,44 ELSE SI VRF,1; % LENGTH OF DSN
SH VRF,DSNSFL;
AR VR1,VRF; % POINTER TO SUFFIX BEGINNING
LH VRF,DSNSFL;
EXI VRF,MCLC,0(VR1),DSNSFIX,*-*,INCR=YES,DECR=YES;
IF ^<CC => THEN BEGIN
LI VRF,NOFILE;
EXIT FROM CATBLCK1;
END;
END; % OF SUFFIX
MMVC DSNAME,CATDNAME,44;
LI VRF,FILEMTCH;
LI XRB,44; % INDEX FOR DSNAME
LA VR1,DSNAME;
AI VR1,43; % POINT TO LAST CHARACTER IN DSNAME
UNTIL <CLI 0(VR1),C' '; CC NE> | <RZ XRB> DO BEGIN
SI XRB,1; % DECREMENT COUNTER
SI VR1,1;
END;
IF <CLI 0(VR1),C'.'> THEN <MVI 0(VR1),C' '; SI XRB,1>; % NO DOTS LAST
STH XRB,DSNLEN; % STORE LENGTH OF DSNAME
END
ELSE LI VRF,NOFILE; % NO MATCH KEEP SCANNING
END;
END; % OF FOUND SOMETHING
%%%% INVERT DSNAME & PREFIX SCAN BACKWARDS
<CLI TYPEBYTE,X'FF'>: BEGIN % END OF CHAIN
LI VRF,ENDCAT; % END OF CATALOG NO MORE MATCHES
END; % OF 4 CASE
ENDSEL ELSE WRTERM 'WRONG BYTE TYPE IN CAT';
AI XRC,45; % INDEX TO NEXT POINT IN CATALOG
END UNTIL <CI VRF,FILEMTCH> | <CI VRF,ENDCAT>;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
ST XRC,CATDSPTR; % STORE OFF POINTER FOR NEXT TIME
CEXIT VRE,HIGHR;
LTORG;
EXORG;
END; % OF DSECT FOR DSNAME
FILEMTCH: EQU 0;
NOFILE: EQU 4; % NO FILE FOUND
ENDCAT: EQU 20;
SUBTITLE 'BLDMATCH';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE: BLDMATCH
% FUNCTION: BUILDS A DATASET NAME FOR THE COMPARE FROM CATALOG
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
BLDMATCH:
CENTER VRE,HIGHR,ENTRY=NO;
MFC MATCHDSN,44; % ZERO OUT
ZR XRA; % LENGTH COUNTER
LA XRB,MATCHDSN; % POINTER
IF ^<TF FULLQDSN> THEN BEGIN % FULLY QUALIFIED WILD CARD
IF ^<TF PREFXQUO> THEN BEGIN
L XRC,USERPREA; % POINTER TO USER PREFIX
LH XRA,USERPREL; % LENGTH OF PREFIX
EXI XRA,MMVC,0(XRB),0(XRC),*-*,INCR=YES,DECR=YES;
AR XRB,XRA; % % INCREMENT POINTER
MVI 0(XRB),C'.'; % PUT IN THE DOT
AI XRB,1; AI XRA,1; % INCRMENT POINT AND COUNTERS
END;
IF <MCLC PREFIXL,=H'0',2; CC H> THEN BEGIN
LH XRC,PREFIXL;
AR XRA,XRC; % LENGTH
EXI XRC,MMVC,0(XRB),PREFIX,*-*,INCR=YES,DECR=YES;
AR XRB,XRC; % MOVE POINTER
END;
END ; % OF NOT FULLY QUALIFIED
IF <MCLC DSNPFL,=H'0',2; CC H> THEN BEGIN
LH XRC,DSNPFL;
AR XRA,XRC; % LENGTH
EXI XRC,MMVC,0(XRB),DSNPFIX,*-*,INCR=YES,DECR=YES;
AR XRB,XRC; % MOVE POINTER
END;
STH XRA,MATCHDSL;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CNTXCHAR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : CNTXCHAR
% FUNCTION : COMPARES A STRING TO A CHARACTER FOR A LENGTH
% AND RETURNS IN REG 15 THE NUMBER OF MATCHES
% INPUT: VR0-> THE CHARACTER TO CHECK
% VR1-> THE STRING TO CHECK AGAINST
% VRF = LENGTH OF VR1 STRING
% OUTPUT : REG VRF CONTAINS THE NUMBER OF CHARACTERS THAT MATCH
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CNTXCHAR:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRB,VR0; % LOAD ADDRESS OF CHARACTER TO CHECK AGAINST
LR XRA,VRF; % LOAD COUNTER
LTR XRA,XRA;
IF <CC M> THEN <ZF FORWARDF; LCR XRA,XRA> ELSE SF FORWARDF;
% OR BACKWARD IF HIGH ORGER
ZR VRF; % ZERO COUNTER
FOR XRA DO
BEGIN
EXIT IF ^<MCLC 0(VR1),0(XRB),1>; % LEAVE LOOP ON NOT EQUAL
AI VRF,1; % BUMP ACCUMULATOR
IF <TF FORWARDF> THEN AI VR1,1 % INCREMENT POINTER
ELSE SI VR1,1; % BACK UP IF NEGATIVE COUNT
END; % OF FOR LOOP
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'FINDCHAR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : FINDCHAR
% FUNCTION : FINDS A CHARACTER IN A STRING FOR A LENGTH
% AND RETURNS IN REG 15 THE RELATIVE POSITION
% INPUT: VR0-> THE CHARACTER TO FIND
% VR1-> THE STRING TO CHECK AGAINST
% VRF = LENGTH OF VR1 STRING
% OUTPUT : REG VRF CONTAINS THE RELATIVE POSITION CHARACTERS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FINDCHAR:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRB,VR0; % LOAD ADDRESS OF CHARACTER TO CHECK AGAINST
LR XRA,VRF; % LOAD COUNTER
LTR XRA,XRA;
IF <CC M> THEN <ZF FORWARDF; LCR XRA,XRA> ELSE SF FORWARDF;
% OR BACKWARD IF HIGH ORGER
LR XRC,XRA; % SAVE COUNT
AI XRC,1; % ONE MORE
LI VRF,1; % ZERO COUNTER
FOR XRA DO
BEGIN
EXIT IF <MCLC 0(VR1),0(XRB),1>; % LEAVE LOOP ON EQUAL
AI VRF,1; % BUMP ACCUMULATOR
IF <TF FORWARDF> THEN AI VR1,1 % INCREMENT POINTER
ELSE SI VR1,1; % BACK UP IF NEGATIVE COUNT
END; % OF FOR LOOP
IF <CR XRC,VRF> THEN <ZR VRF>; % ZERO IF NOTHING FOUND
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'MFCXCHAR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : MFCXCHAR
% FUNCTION : FILLS A STRING WITH A CHARACTER FOR A LENGTH
% INPUT: VR0-> THE FILL CHARACTER
% VR1-> THE BUFFER TO FILL
% VRF = LENGTH OF VR1 STRING
% OUTPUT : THE STRING HAS CHARACTER FILLED
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MFCXCHAR:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRB,VR0; % ADDRESS POINTER
LR XRA,VRF; % ACCUMLATOR IF > 255
DO BEGIN % LOOP IF > 255
IF <CI XRA,255; CC H> THEN <ZR VRF; LI VRF,255; SI XRA,255>
ELSE ZR XRA;
IF <RP VRF> THEN BEGIN
MMVC 0(VR1),0(XRB),1; % MOVE FIRST CHARACTER
SI VRF,1; % DECREMENT ACCUMULATOR
IF <RP VRF> THEN EXI VRF,MMVC,1(VR1),0(VR1),*-*,DECR=YES; % MOVE EM
END; % OF POSITIVE LOOP
END UNTIL <RZ XRA>; % UNTIL ALL DONE
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'MVCXCHAR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : MVCXCHAR
% FUNCTION : MOVES VR0-> TO VR1->FOR A LENGTH
% INPUT: VR0-> THE FROM ADDRESS
% VR1-> THE BUFFER TO PUT
% VRF = LENGTH OF VR1 STRING
% OUTPUT : THE STRING HAS CHARACTER FILLED
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MVCXCHAR:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRA,VRF; % ACCUMLATOR IF > 255
LR XRB,VR0; % ADDRESS OF FROM
DO BEGIN % LOOP IF > 255
IF <CI XRA,255; CC H> THEN <ZR VRF; LI VRF,255; SI XRA,255>
ELSE <LR VRF,XRA; ZR XRA>;
IF <RP VRF> THEN BEGIN
EXI VRF,MMVC,0(VR1),0(XRB),*-*,DECR=YES; % MOVE EM
AI XRB,255; % MOVE ADDRESSES
AI VR1,255;
END; % OF POSITIVE LOOP
END UNTIL <RZ XRA>; % UNTIL ALL DONE
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CATLOOK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%MODULE : CATLOOK
%FUNCTION: CALLS TSO CATALOG TO FIND THE ENTRY LASTDSN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CATLOOK:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
%
LA VR1,CIRPARM; % ADDRESS OF PARAMETER BLOCK
DO BEGIN % SEARCH THROUGH CATALOG FOR A MATCH UNTIL EOF
DS 0H;
LINK EP=IKJEHCIR; % ,LSEARCH=NO; % CALL CATALOG ROUTINE
LOOKCASE: CASE VRF MAX 12 MIN 0;
0: BEGIN % FOUND SOMETHING
% MMVC LASTDSN,RETURNDS,44; % MOVE OVER DSNAME
L XRA,CIRWA; % LOAD ADDRESS OF RETURNED CATALOG BUFFER
MMVC 2(XRA),=H'0',2; % ZERO OUT LENGTH IN CAT BUFFER
AI XRA,4; % INCREMENT PAST COUNT BYTES
ST XRA,CATDSPTR; % STORE OFF POINTER TO BUFFER
CCALL BLDMATCH,A; % BUILD PREFIX FOR DSNAME
END; % OF FOUND SOMETHING
%%%% INVERT DSNAME & PREFIX SCAN BACKWARDS
4: BEGIN % LOCATE FAIL
IF <CLI CIRLOCRC,X'08'> THEN BEGIN % END OF CHAIN
LI VRF,NOFILE; % END OF CATALOG NO MORE MATCHES
END;
IF <CLI CIRLOCRC,X'08'> THEN BEGIN % END OF CHAIN
END;
END; % OF 4 CASE
12: BEGIN
WRTERM ' VOL BY LOCATE ERROR';
END;
ENDCASE;
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CHECKLEN';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE NAME -CHECKLEN
%
% FUNCTION - USED BY KSEND, QUOTED PACKETS CAN'T BE SPLIT
% VR0 - NUMBER OF CHARACTER TO PUT -
% VRF=0 ON RETURN RETURN IF BUFF
% LARGE ENOUGH, ELSE VRF =4
%
CHECKLEN:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LH XRA,MAXPUT; % MAX LENGTH OF BUFFER
SH XRA,PUTLEN; % GET REMAINDER
IF <CR XRA,VR0; CC L> THEN LI VRF,4 % TOO SMALL TO FIT
ELSE ZR VRF; % ENOUGH ROOM GO AHEAD AND PUT IT
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SERVER';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SERVER
% FUNCTION : SERVER SLAVE MODE ENABLED RECEIVES COMMANDS
% INPUT: NONE - WAITS ON PACKETS
%
%
% OUTPUT : NONE - PERFORMS FUNCTIONS TILL L PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SERVER:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
USE XRC AS PACKET IN BEGIN % ADRESSABLE DSECT
ZF LOGOUT ;
LA XRC,RECPKT; % RECEIVE PACKET ADDRESS
WRTERM ' Now entering SERVER mode - type FINISH or LOGOUT on micro'_
' to halt SERVER';
SERVBLCK: WHILE <TF SERVERF> DO BEGIN % SERVER BLOCK
% CALL TIMER SO SERVER CAN TIME OUT USER AFTER SERVWAIT TIME
TIME BIN ; % GET TIME IN BINARY
A VR0,SERVWAIT ; % BUMP CURRENT TIME BY TIME TO WAIT
ST VR0,SERVTIME ; % STORE IT OFF
ZF STOPF; % ZERO STOP FLAG
BCCTYPE 1; % 1 BCC BYTE AT END
L XRA,RTIMEOUT; % SAVE TIMEOUT
MMVC RTIMEOUT,SERVTOUT,4; % SERVER TIME OUT
DO BEGIN % UNTIL WE GET SOMETHING
CCALL RPACK,A; % GET THE PACKET
EXIT FROM SERVBLCK IF ^<TF SERVERF>;
NEXT OF SERVBLCK IF <TF STOPF>;
IF <RNZ VRF> THEN BEGIN % RESPOND TO PACKET
MZC OLDSEQ,2; % ZERO OUT SEQUENCE NUMBER
MMVC OLDBCC,BCCLEN,2; % STORE OFF OLD BCC
MVI BCCLEN+1,1; % TYPE 1 BCC FOR SERVER TIMEOUT
SERVNACK XRB; % RESPOND TO PACKET
MMVC BCCLEN,OLDBCC,2; % RESTORE BCC
LR XRB,VRF ; % STORE OLD VALUE
% CHECK TIMER FOR EXTENDED TIME OUT
TIME BIN ;
LR VRF,XRB ; % RESTORE RPACK VALUE
IF <C VR0,SERVTIME ; CC H> THEN BEGIN
SF LOGOUT ; % INDICATE TO LOGUSER OFF
MMVC TEMP,=C'LOGOFF ',7 ; %
CCALL TSOCMD,A,VR1=TEMP,VR0=7 ; % STACK LOGOFF COMMAND
ZF SERVERF ;
WRTERM 'The SERVER has exceeded its timeout and is logged off';
EXIT FROM SERVBLCK ;
END ;
END; % OF NACK TIMEOUT
END UNTIL <RZ VRF>; % LOOP TILL WE GET A GOOD INPUT
ST XRA,RTIMEOUT; % REPLACE THE READ TIME OUT
ZR XRA; % ZERO REG FOR CASE STATEMEN5T
MTRT RTYPE,SERVCOMM,1; % SERVER COMMAND TYPE
CASE XRA MAX ISTATE MIN 0 CHECK;
0 THRU ACASE: BEGIN % THE REST
MVI STATE,ASTATE; % ABORT
ERRORCON 'Illegal Packet type for SERVER ';
CCALL ERRPACK,A; % SET UP FOR ERROR PROCESSING
END; % REST CASE
RSTATE: BEGIN % WE RECEIVED AN SEND INIT PACKET
CCALL KRECEIVE,A,; % CALL RECEIVE ROUTINE;
END; % RSTATE CASE
R2STATE: BEGIN % WE RECEIVED A GET PACKT
IC XRA,RLEN; % LENGTH OF PACKET-2
UNCHAR XRA; % MAKE INTEGER
SH XRA,BCCLEN; % TAKE OFF BCCLENGTH
SI XRA,2; % SUB OFF TYPE & SEQ BYTE
L XRB,ATOEVCON;
EXI XRA,TR,RDATA(*-*),0(XRB),DECR=YES,INCR=YES;
EXI XRA,TR,RDATA(*-*),UPPER,DECR=YES,INCR=YES; % UPPER
% HENCE LEFT WITH DSN LENGTH
EXI XRA,MMVC,DSNAMEX,RDATA,0,DECR=YES,INCR=YES; % MOVE THE NAME
LR VR0,XRA; % LOAD LENGTH OF DSNAME
SCINIT DSNAMEX,(XRA);
SCTYPE NEW=1;
CCALL KSEND,A,VR1=DSNAMEX; % SET UP
END; % GETCASE
GSTATE: BEGIN % A SERVER GENERIC COMMAND
SELECT FIRST;
<CLI RDATA,X'4C'>: BEGIN % LOGOFF COMMAND
MMVC TEMP,=C'LOGOFF ',7;
LI VR0,7;
CCALL TSOCMD,A,VR1=TEMP; % LOGOUT
SF LOGOUT ;
ZF SERVERF; % GOOD BYE KERMIE
ACKIT VR0;
END; % OF LOGOFF
<CLI RDATA,X'46'>: BEGIN % FINISH SERVER COMMAND
ZF SERVERF; % FINISH SERVER COMMAND
ACKIT VR0;
END;
ENDSEL
ELSE BEGIN
ERRORCON 'Unimplemented SERVER Commmand';
CCALL ERRPACK,A; % SET UP FOR ERROR PROCESSING
MVI STATE,SESTATE; % ABORT
CCALL SABORT,A,VR0=LH:RPSEQ; % SEND ABOR
END; % OF SELECT
END; % OF CASE
ISTATE: BEGIN % WE RECEIVED AN I PACKET
MVI RTYPE,ROFF; % SEND INIT PACKET FOR SUB
BCCTYPE 1; % BLOCK CHECK TYPE
ZEROSEQ; % ZERO SEQUENCE NUMBER
ZERORTRY; % ZERO RETRY
MVI STATE,RISTATE; % SEND INIT STATE
%UNTIL <CLI STATE,RFSTATE> | <MCLC RETRY,NUMTRY; CC L> |
%<CLI STATE,SESTATE> | <CLI STATE,RESTATE>
CCALL RINIT,A; % CALL RECEIVE INIT
IF <CLI STATE,SESTATE> THEN CCALL SABORT,A,VR0=LH:RPSEQ; % SEND ABOR
END; % ISTATE CASE
ENDCASE
ELSE BEGIN
ERRORCON 'Unknown Server packet type';
CCALL ERRPACK,A; % SET UP FOR ERROR PROCESSING
MVI STATE,ASTATE; % ABORT
MMVC PHDR,RSOH,1; % SOH
MMVC PNUM,RSEQ,1;
END; % OF ERROR CASE
END; % OF SERVER BLOCK LOOP FOREVER UNTIL END PACKET
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
END; % OF ADDRESSIBILITY DSECT
% CHECH WHETHER LOGOFF
IF ^<TF LOGOUT> THEN BEGIN
LI VR0,100; % 1 SECOND FOR TIMER
ST VR0,TEMP;
STIMER WAIT,BINTVL=TEMP; % WAIT FOR ONE SECOND IN ORDER NOT TO LOSE
% THE PROMPT
END ;
CEXIT VRE,HIGHR; % OUT OF SERVER
LTORG;
EXORG;
SUBTITLE 'KSHOW';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MODULE NAME - KSHOW
%
%
% FUNCTION- LISTS THE CURRENT ENVIORNMENT OF THE SET COMMAND
%
%
%
% INPUTS - NONE EXCEPT POSSIBLE '?' / OR HELP
%
%
%
%
% OUTPUTS- SCREEN OUTPUT OF CURRENT OPTIONS
%
%
% RETURN
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KSHOW: ;
CENTER VRE,HIGHR,ENTRY=NO;
SHOWBLCK: DO BEGIN % BLOCK TO FALL THRU
SCERROR NEW=SHOWSCAN; % SET UP FOR SCDONE IF MORE TOKENS
SCAN *;
SCKW (STATUS,STA),SHOWBEG; % UP TOP IF STATUS REQUEST
SCKW (?,HELP),SHOWHELP;
SCKW ,SHOWSCAN; % NO OTHER PARMS
SCANEND; % ERROR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SHOWBEG: % LABEL FOR END
%%%%% HEADER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN; % INIT VAREA FOR OUTPUT
WRTERM ' '; % BLANK LINE
VSEG KERMVA,'Data Set Attributes '; % column 1 title
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'Protocol Attributes'; % column 2 title
VOUT KERMVA; % OUTPUT IT
%WRTERM ' '; % A BLANK LINE
MMVC CRTLINE#,=H'1',2; % INITIAL CRT LINE TO FIRST
DO BEGIN % UNTIL CRTLINE# = TOTALCRT
SELECT;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,2>: BEGIN % EDIT
IF <TF EDITF> THEN VSEG KERMVA,'EDIT (WYLBUR edit format data set): on'
ELSE VSEG KERMVA,'EDIT (Non Edit format data set): off';
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,4>: BEGIN % TABS
VSEG KERMVA,'TABS: ';
IF <TF TABF> THEN VSEG KERMVA,'on' ELSE VSEG KERMVA,'off';
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,3>: BEGIN % Number function
VSEG KERMVA,'NUMBERED ';
VSEG KERMVA,'(line nos.): ';
SELECT FIRST;
<MCLC EDTYPE,=F'1',4>: BEGIN
VSEG KERMVA,'off';
END;
<MCLC EDTYPE,=F'2',4>: VSEG KERMVA,'WYLBUR';
<MCLC EDTYPE,=F'3',4>: VSEG KERMVA,'(numbered in cols): WYLBUR XX/YYY';
<MCLC EDTYPE,=F'4',4>: VSEG KERMVA,'(TSO default numbers): TSO';
<MCLC EDTYPE,=F'5',4>: VSEG KERMVA,'(numbered in cols): TSO COL/COL';
ENDSEL;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,1>: BEGIN % DATA
% DATA TEXT OR BINARY
VSEG KERMVA,'DATA: ';
IF <MCLC DATA,=C'TEXT',4> THEN VSEG KERMVA,'Text'
ELSE VSEG KERMVA,'Binary';
END; % OF SELECT BEGIN
<CLI CRTLINE#+1,5>: BEGIN % RECFM
VSEG KERMVA,'RECFM (Record format): ';
IF <CLI RFM,C'U'> THEN
VSEG KERMVA,RFM,1 % MOVE IN REC FORMAT
ELSE VSEG KERMVA,RFM,2; % MOVE IN REC FORMAT
END; % OF SELECT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,6>: BEGIN % LRECL
VSEG KERMVA,'LRECL (Logical record length): ';
CVBTD TEMP,0,LH:LRECL; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % LREC IN TO BUFFER
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,7>: BEGIN % BLKSIZE
VSEG KERMVA,'BLKSIZE (Block size): ';
CVBTD TEMP,0,LH:BLKSIZE; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % BLKSIZE IN TO BUFFER
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,8>: BEGIN % SPACE
VSEG KERMVA,'SPACE (Space allocation): ';
CVBTD TEMP,0,L:TRACK; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % TRACK IN TO BUFFER
VSEG KERMVA,' tracks ';
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,9>: BEGIN % VOLUME
VSEG KERMVA,'VOLUME: '; % DEFAULT DISK IF ANY
VSEG KERMVA,VOLUME,7; % DISK DRIVE
END; % OF SELECT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,10>: BEGIN % PREFIX
VSEG KERMVA,'PREFIX: ';
LH VR0,PREFIXL; % CONVERT BINARY TO DEC
IF <RZ VR0> THEN VSEG KERMVA,'No prefix' ELSE BEGIN
IF <TF PREFXQUO> THEN BEGIN
ST VR0,TEMP; % STORE OFF NUMBER OF CHARACTERS
VSEG KERMVA,'"';
L VR0,TEMP; % RESTORE LENGTH
END; % OF QUOTED PREFIX
VSEG KERMVA,PREFIX,(VR0); % PREFIX IN TO BUFFER
IF <TF PREFXQUO> THEN VSEG KERMVA,'"';
END;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,5>: BEGIN % QUOTE
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'CQUOTE (Control quote character): ';
MVC TEMP(1),QUOCHAR; % MOVE TO WORK AREA
L XRA,ATOEVCON; TR TEMP(1),0(XRA); % PUT IN EBCDIC
VSEG KERMVA,TEMP,1;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,8>: BEGIN % SOH
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'SOH (Start of Header): ';
CVBTD TEMP,0,LOADB:SSOH; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % SOH CHAR IN TO BUFFER
CCALL SHOWASCI,A,VR1=SSOH;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,9>: BEGIN % SEOL
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'SEOL (Send End-of-line): ';
CVBTD TEMP,0,LOADB:SEOL; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % EOL CHAR IN TO BUFFER
CCALL SHOWASCI,A,VR1=SEOL;
END; % OF SELECT BEGIN
<CLI CRTLINE#+1,10>: BEGIN % REOL
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'REOL (Receive End-of-line): ';
CVBTD TEMP,0,LOADB:REOL; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % EOL CHAR IN TO BUFFER
CCALL SHOWASCI,A,VR1=REOL;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,6>: BEGIN % BINARY QUOTE
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'BQUOTE (Binary quote character): ';
MVC TEMP(1),BINQC; % MOVE TO WORK AREA
L XRA,ATOEVCON; TR TEMP(1),0(XRA); % PUT IN EBCDIC
VSEG KERMVA,TEMP,1;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,7>: BEGIN % REPEAT QUOTE
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'RQUOTE (Repeat quote character): ';
MVC TEMP(1),REPTCHAR; % MOVE TO WORK AREA
L XRA,ATOEVCON; TR TEMP(1),0(XRA); % PUT IN EBCDIC
VSEG KERMVA,TEMP,1;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,4>: BEGIN % PACKET SIZE
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'PACKET (Receive packet size): ';
CVBTD TEMP,0,L:RPSIZ; % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % RECEIVE SIZE INTO BUFFER
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,1>: BEGIN % DELAY
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'DELAY (after SEND): ';
L VR1,DELAY; % DELAY TIME
ZR VR0;
D VR0,=F'100';
LR VRF,VR1; % SET UP FOR MACRO
CVBTD TEMP,0,(VRF); % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % DELAY TIME INTO BUFFER
VSEG KERMVA,' seconds ';
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,11>: BEGIN % DEBUG
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'DEBUG: ';
IF <TF DBUGFLAG> THEN VSEG KERMVA,'on' ELSE VSEG KERMVA,'off';
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,2>: BEGIN % TIMER
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'TIMER (Timeout interval): ';
IF ^<TF TIMERF> THEN VSEG KERMVA,'off' ELSE BEGIN
VSEG KERMVA,'on (';
L VR1,RTIMEOUT; % TIMEOUT TIME TIME
ZR VR0;
D VR0,=F'100';
LR VRF,VR1; % SET UP FOR MACRO
CVBTD TEMP,0,(VRF); % CONVERT BINARY TO DEC
VSEG KERMVA,(VR1),(VR0); % DELAY TIME INTO BUFFER
VSEG KERMVA,' seconds)';
END; % OF TIMER FLAG
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
<CLI CRTLINE#+1,3>: BEGIN % BLOCK CHECK TYPE
CCALL ALIGN,A; % ADJUSTS THE COLUMNS TO 40
VSEG KERMVA,'BLOCK (Block check type): ';
SELECT FIRST;
<CLI HIGHBCC,1>: VSEG KERMVA,'1';
<CLI HIGHBCC,2>: VSEG KERMVA,'2';
<CLI HIGHBCC,3>: VSEG KERMVA,'3 (CRC)';
ENDSEL;
END; % OF SELECT BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ENDSEL;
LH XRA,CRTLINE#;
AI XRA,1;
STH XRA,CRTLINE#; % BUMP IT
VOUT KERMVA; % OUTPUT IT
END UNTIL <MCLC CRTLINE#,MAXCRC#,2; CC H>; % END OF MAIN LOOP
EXIT FROM SHOWBLCK;
SHOWSCAN: DO BEGIN % IF REMAINING TOKENS ERROR OR HELP
WRTERM 'Valid options are SHOW STATUS or HELP';
EXIT FROM SHOWBLCK; % FALL OUT
SHOWHELP:
WRTERM 'The SHOW command lists the current option settings.';
WRTERM 'The options may be changed with the SET command.';
END; % OF SCDONE
END; % OF SHOWBLCK
%VSEG KERMVA,')';
%WRTERM ' '; % BLANK
CEXIT VRE,HIGHR;
SAVESHOW: DC 18F'0'; % SAVE AREA
%TEMP: DC CL15; % A WORK BUFFER ALREADY DEFINED
OUTLEN: EQU 80; % OUTPUT LINE LENGTH
LTORG;
EXORG;
SUBTITLE 'SHOWASCI';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE SHOWASCI
% FUNCTION - VSEGS THE ASCII AKCRONYM FOR ITS BINARY CONTER PART
% INPUT - VR1 -> 1 BYTE HEX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SHOWASCI: CENTER VRE,HIGHR,ENTRY=NO;
LR XRB,VR1;
ZR XRA;
IC XRA,0(VR1); % LOAD THE CHARACTER
VSEG KERMVA,' (';
LA VR1,ASCILITS; % POINT TO BEGINNING OF TABLE
MH XRA,=H'3'; % INDEX INTO TABLE
AR VR1,XRA; % "
IF <CLI 2(VR1),C' '> THEN VSEG KERMVA,(VR1),2 % PUT INTO VSEG
ELSE VSEG KERMVA,(VR1),3; % PUT INTO VSEG
VSEG KERMVA,',';
LR VR1,XRB; % RESTORE POINTER TO BYTE FOR NEXT SUB
CCALL SHOWCNTL,A; % PUTS VALUE IN CONTROL NOTATION (EG ^A=X'01')
VSEG KERMVA,')';
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'SHOWCNTL';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE SHOWCNTL
% FUNCTION - VSEGS THE ASCII CONTROL FOR ITS BINARY CONTER PART
% INPUT - VR1 -> 1 BYTE HEX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SHOWCNTL: CENTER VRE,HIGHR,ENTRY=NO;
ZR XRA;
IC XRA,0(VR1); % LOAD THE CHARACTER
%VSEG KERMVA,' (';
LA VR1,ASCCNTLC; % POINT TO BEGINNING OF TABLE
MH XRA,=H'2'; % INDEX INTO TABLE
AR VR1,XRA; % "
VSEG KERMVA,(VR1),2; % PUT INTO VSEG
%ELSE VSEG KERMVA,(VR1),3; % PUT INTO VSEG
%VSEG KERMVA,')';
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'KERMVOUT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OUT PUT ROUTINE FOR VSEG
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KERMVOUT: CENTER VRE,HIGHR,ENTRY=NO;
TPUT (VR1),(VR0),R; % OUTPUT IT
CEXIT VRE,HIGHR;
SUBTITLE 'ADSTATUS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: ADSTATUS
% FUNCTION : LINKS AN ENTRY INTO STATUS MESSAGE CHAIN
% INPUT : VR1-> BUFFER
% VR0= L'BUFFER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ADSTATUS:
CENTER VRE,HIGHR,ENTRY=NO;
LR XRA,VR0;
EXI XRA,MMVC,STATBUFF,0(VR1),*-*,INCR=YES,DECR=YES;
STH VR0,STATLEN;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'GETTABS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE- GETTABS
% FUNCTION - COUNT THE NUMBER OF SPACES TO NEXT TAB PLACE
% INPUTS - NONE
% OUTPUT - VRF= NUMBER OF SPACES/BLANKS TO PUT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
GETTABS:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
ZR VRF; % ZERO RETURN
LH XRA,BUFCNT; % NUMBER OF CHARACTERS ALREADY IN OUT BUFFER
L VR1,TABTBLAD; % TABLE OF TAB CHARACTERS
GETTABLK: UNTIL <MCLC 0(VR1),ZERO,2>
DO BEGIN % TAB BLOCK
IF <CH XRA,0(,VR1); CC L> THEN BEGIN % COUNT LESS THAN TAB
LH VRF,0(,VR1); % LOAD THE TAB POINTER FROM CHAIN
SR VRF,XRA; % SUBTRACT BUFCNT
SI VRF,1; % ONE EXTRA FOR GOOD MEASURE
EXIT FROM GETTABLK IF <RP VRF>; % LEAVE IF POSITIVE
END; % OF FOUND THE TAB ENTRY
AI VR1,2; % INCREMENT POINTER TO NEXT TAB ITEM
END; % OUT OF TABTABLE
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'ALIGN ';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ALIGNS TO 40 COLUMNS THE BUFFER IN VSEG IN SET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ALIGN: CENTER VRE,HIGHR,ENTRY=NO;
VTELL KERMVA; % VR1 => KERMVA VR0=LENGTH
ZR XRA;
LI XRA,40;
SR XRA,VR0;
IF <RP XRA> THEN BEGIN
VSEG KERMVA,BLANKS,LA:0(,XRA); % PUT BLANKS IN
END;
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'TSOCMD';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD NAME - TSOCMD
%
% FUNCTION - USE TSO SERVICE COMMAND TO PASS A TSO
% STRING TO TSO
%
% INPUTS - VR1 = ADDRESS OF STRING
% VR0 = LENGTH OF STRING
% RETURN - VR15 = 0 IF OK ELSE ADDRESS OF PARM4
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TSOCMD:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LR XRA,VR0; % LOAD REG FOR EXECUTE MOVE
ST VR0,PARM3; % STORE OFF LENGTH FIELD
EXI XRA,MMVC,PARM2,0(VR1),*-*,DECR=YES,INCR=YES;
% THIS STATEMENT MOVES DATA TO PARM FIELD
BAL;
L 15,TSOADD LOAD ROUTINE ADDRESS
CALL (15),(PARM1,PARM2,PARM3,PARM4,PARM5,PARM6),VL
ALP;
IF <RZ VRF> THEN BEGIN
LA VRF,PARM4;
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KRPACK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: RPACK
% FUNCTION : GETS A PACKET OF DATA FROM REMOTE KERMIT
% VIA ROUTINE KERMTGET - TIMEOUT ROUTINE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RPACK: % RECEIVE PACKET FROM MICRO
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LA XRC,RECPKT;
USE XRC AS PACKET IN BEGIN % ADDRESSIBLE DSECT
RPACKBLK: DO BEGIN
ZR VRF; % GOOD RETURN CODE
IF <TF TESTF> THEN BEGIN % READ FROM FILE
GET TESTFILE;
ST VR1,TGETBUFA; % STORE OFF ADDRESS
MZC TGETLEN,4; % KLUDGE TO THE MOON
MMVC TGETLEN+2,0(VR1),2; % KLUDGE TO THE MOON
%MTR 0(VR1),ETOA,130; % KLUDGE CITY FOR READING TEST FILES
ZR VRF;
GOTO JUMPOVER;
END;
IF <TF TIMERF> | <TF SERVERF> THEN BEGIN % ALWAYS NEED TIMER SERVER
% SET TIMER
STIMER REAL,TIMEEXIT,BINTVL=RTIMEOUT;
END;
IF <TF RTURNRND> THEN STIMER WAIT,BINTVL=RTURNTIM; % TURNAROUND
POST ECBREAD,ECBTREAD; % TELL ASYNC SUB TO GO FOR IT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TESTECB: WAIT ECB=ECBTGET;
MVI ECBTGET,0; % ZERO HIGH ORDER
IF <CLI ECBTGET+3,ECBTREAD> THEN BEGIN % TGET READ POSTED
IF <TF TIMERF> THEN TTIMER CANCEL;
ZR VRF; % ZERO RETURN REGISTER
END
ELSE BEGIN
IF <CLI ECBTGET+3,ECBTIMER> THEN BEGIN % TIMER-ECB POSTED
DETACH TASKADD; % BLOW OFF TASK
MZC ECBREAD,4; % ZERO OUT READ ECB
L XRB,TGETADD; % ADDRESS OF TGET MODULE
IDENTIFY EP=KERMTGET,ENTRY=(XRB);
IF <RNZ VRF> THEN BEGIN % ERROR IN IDENTIFY
IF ^<CI VRF,4> THEN BEGIN
TPUT =C'ERROR IN IDENTIFY',17;
DC F'0'; % BLOWUP
END;
END;
DELETE EP=KERMTGET ;
% THEN REATTACH
ATTACH EP=KERMTGET,PARAM=((XRF));
IF <RNZ VRF> THEN BEGIN
END;
ST VR1,TASKADD; % STORE OFF ADDRESS FOR DETACH
LI VRF,TIMERROR; % TIME OUT LITERAL FOR RETURN CODE
EXIT FROM RPACKBLK; % GET OUT
END
ELSE BEGIN
ERRORCON 'UNKNOWN POST VALUE ECB';
CCALL ERRPACK,A; % PUT IN ERROR BUFFER
MVI TYPE,ACOMLIT; % ABORT LITERAL
EXIT FROM RPACKBLK;
END;
END;
JUMPOVER: ; % LABEL TO SKIP TO
L XRA,TGETBUFA;
IF <<MCLC 0(XRA),=C'stop',4> |
<MCLC 0(XRA),=C'STOP',4>> THEN BEGIN % GET OUT user wants to stop
KLUDGCIT: IF <TF TIMERF> THEN TTIMER CANCEL;
SF STOPF; % STOP
ERRORCON 'User entered STOP. Transfer aborted.';
CCALL ERRPACK,A;
LI VRF,STOPFLAG; % FOR RETURN CODE
EXIT FROM RPACKBLK;
END;
IF <TF SERVERF> THEN BEGIN
% VIOLATE KERMIT HEURISTICS HERE BECAUSE THEY SAY TO
IF <<MCLC 0(XRA),=C'finish',6> | % GET OUT IF SERVER
<MCLC 0(XRA),=C'FINISH',6>> THEN BEGIN % GET OUT IF SERVER
ZF SERVERF; % TURN OFF SERVER
ZR VRF; % FOR RETURN CODE
EXIT FROM RPACKBLK; % GET OUT IF SERVER
END;
END; % OF SERVER FUNCTIONS
IF <MCLC 0(XRA),=C'ABORT',5> THEN DC XL4'00000000';
L VR1,TGETLEN; % LENGTH OF STUFF GOTTEN
IF <RNP VR1> THEN BEGIN
LI VRF,TGETERR; % ERROR FROM TGET
EXIT FROM RPACKBLK;
END; % OF TGET ERROR
FOR VR1 DO BEGIN % LOOP THROUGH LENGTH LOOKING FOR SOH
EXIT IF <MCLC (XRA),RSOH,1>; % FOUND SOH
AI XRA,1; % INCREMENT POINTER
IF <CI VR1,1> THEN BEGIN
ERRORCON 'No SOH on packet';
LI VRF,NOSOH;
EXIT FROM RPACKBLK;
END;
END; % OF FOR LOOP
MMVC RECPKT,0(XRA),130; % MOVE TO RECPACKET
IF <RNZ VRF> THEN BEGIN
ERRORCON 'Error in Tget from Micro ';
CCALL ERRPACK,A; % PUT IN ERROR BUFFER
MVI TYPE,ACOMLIT; % ABORT LITERAL
EXIT FROM RPACKBLK;
END; % OF ERROR OF TPUT
L XRB,ETOAVCON; MTR LEN,0(XRB),1; % TRANSLATE TO ASCII
ZR XRB;
IC XRB,LEN; % GET LENGTH OF PACKET
UNCHAR XRB; % MAKE PRINTABLE
L VR1,ATOEVCON; MTR LEN,0(VR1),1; % TRANSLATE TO ASCII
LH XRA,BCCLEN;
AI XRA,2; % MINIMAL PACKET SIZE
IF <CR XRB,XRA; CC L> | % ERROR PACKET TOO SMALL
<C XRB,MAXPACK; CC H> THEN BEGIN % TOO LARGE
L VRF,LENERROR;
EXIT FROM RPACKBLK;
END; % OF LENGTH ERROR ON RECEIVE
IF <OPENP DEBUG> THEN BEGIN % DEBUGGING ON
MZC WRKBUFF,4; % BLAST 1ST 4 BYTES
MVI WRKBUFF+1,19;
MMVC WRKBUFF+4,=C'TGET REC PACKET',15;
PUT DEBUG,WRKBUFF;
AI XRB,2; % BUMP LENGTH COUNTER TO INCLUDE HEADER
EXI XRB,MVC,WRKBUFF+4(*-*),PACKET,DECR=YES,INCR=YES;
AI XRB,4; % FOR HEADER
STH XRB,WRKBUFF;
SI XRB,6; % ADJUST LENGTH BACK TO ORIGINAL
PUT DEBUG,WRKBUFF; % OUTPUT AGAIN
END; % OF DEBUG BLOCK
AI XRB,2; % BUMP LENGTH COUNTER
L VR1,ETOAVCON;
EXI XRB,TR,PACKET(*-*),0(VR1),DECR=YES,INCR=YES; % CHANGE TO ASCII
SI XRB,1; % RESTORE COUNTER
% SUBTRACT 1,2, OR 3 DUE TO BCC TYPE
SH XRB,BCCLEN;
LR VR0,XRB; % GET LENGTH FIELD
CCALL BCCCALC,A,VR1=LEN; % BCC COMPUTATION SUB
EXIT FROM RPACKBLK IF <C VRF,=X'FFFFFFFF'>; % SOMETHING FUNNY
ZR VRF; % OK RETURN WE HOPE
LA XRE,PACKET+1(XRB); % CHECK THIS LATER
LH VR1,BCCLEN;
SI VR1,1; % DECRMENT FOR EXECUTE\
% %CHAR VRF; % ASCII PRINTABLE
IF ^<EX VR1,CLMCOMP> THEN BEGIN
% ERROR IN BCC CHECK
% WRTERM ' BCC ERRROR CHECK IN RPACK ';
LI VRF,BCCERROR;
EXIT FROM RPACKBLK;
END; % OF BCC ERROR
CCALL UNPACK,A,VR1=PACKET;
END; % OF RPACKBLK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
CLMCOMP: MCLC 0(XRE),BCC,*-*;
END; % OF DSECT PACKET
TIMERROR: EQU 4; % EQUATE FOR TIME OUT RETURN
BCCERROR: EQU 8; % INCORRECT BCC
NOSOH: EQU 12;
STOPFLAG: EQU 16; % INDICATE A STOP
TGETERR: EQU 20; % ERROR FROM TGET ROUTINE
DS 0F;
SUBTITLE 'UNPACK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : UNPACK
% FUNCTION : TAKE A RECEIVE PACKET AND DECODES THE
% PACKET LENGTH, SEQ NUMBER, AND DOES
% INPUT: VR1-> SOH OF PACKET
%
%
% OUTPUT : SEQ MVC TO RSEQ,L'RDATA STH IN RECLEN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
UNPACK:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
USE XRA AS PACKET IN BEGIN
LR XRA,VR1; % POINT TO PACKET
ZR XRB;
IC XRB,SEQ; % GET RECEIVE SEQ
UNCHAR XRB; % MAKE IT AN INTEGER;
STH XRB,RPSEQ; % STORE OFF RECEIVED SEQ NUMBER
ZR XRB;
IC XRB,LEN; % GET LENGTH TO CALCULATE DATA
UNCHAR XRB; SI XRB,2; % SUB SEQ AND TYPE BYTES
SH XRB,BCCLEN; % SUB OFF BLOCK CHECK LENGTH
STH XRB,RECLEN;
LA XRB,DATABUFF;
ST XRB,RECPNTR; % POINTER TO RECEIVED DATA
END; % OF DSECT
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'TIMEEXIT';
TIMEEXIT:
BALR BASER,0;
USING *,BASER; % ADDRESSIBLITY
L XRF,PARMACON;
POST ECBTGET,ECBTIMER; % POST TIMER ECB
RGOTO 14; % RETURN TO OS
PARMACON: DC A(PARMS); % WORKING STORAGE
SUBTITLE 'PUT BUFFER ';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% THIS ROUTINE PLACES INFO INTO OUTPUT BUFFER
% CALLED BY KSEND
% VR1-> GET BUFFER
% VR0 = LENGTH OF GET BUFFER
% ROUTINE PUTS ALL INTO BUFFER AND CALLS SPACK
% WHEN NECESSARY
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PUTBUFF:
CENTER VRE,HIGHR,ENTRY=NO;
ST VR1,GETADD; % ADDRESS OF GET
STH VR0,GETLEN; % LENGTH OF GETS
PUTBLCK:
L VR1,GETADD;
L XRB,PUTADD;
LH XRA,MAXPUT; % GET DIFFERENCE
SH XRA,PUTLEN; % NUMBER OF CHARACTERS IN PUT BUFF
LH XRD,GETLEN; % LENGTH OF IN PUT
EXI XRD,MVC,0(*-*,XRB),0(VR1),DECR=YES,INCR=YES;
AR XRB,XRD; % UPDATE PUT ADDRESS
ST XRB,PUTADD; % STORE OFF NEW OUT ADDRESS
LH XRA,PUTLEN;
AR XRA,XRD; % UPDATE LENGTH
STH XRA,PUTLEN;
ZR VR0; % NO MORE CHARACTERS TO PUT DROP OUT
MZC GETLEN,2; % ZERO GET LENGTH
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KRECEIVE';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MODULE NAME - KRECEIVE
%
%
% FUNCTION- DRIVER FOR REC COMMAND DYNAL, OPEN,
% FORMATS PACKETS, FILE HEADER, EOF ETC
%
%
% INPUTS -
%
%
%
%
% OUTPUTS-
%
%
% RETURN
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KRECEIVE: ;
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LA XRC,SNDPKT;
USE XRC AS PACKET IN BEGIN % DSECT FOR INIT
LA XRD,DATABUFF;
USE XRD AS SENDIDST IN BEGIN
RECBLCK: DO BEGIN % GLOBAL REC BLOCK
MVI STATE,RECEIVE;
MZC STATLEN,2; % ZERO OUT STATUS LENGTH
ZF WARNINGF; % NO WARNINGS YET
MFC DSNAME,44; % CLEAR OUT DATA SET NAME
BCCTYPE 1; % 1 BCC BYTE AT END
IF <TF SERVERF> THEN <MZC DSNLEN,2; GOTO RGETINIT>; % SERVER STUFF
SCERROR NEW=RECERR; % SCAN OFF DSN
SCAN *;
SCKW ?,RECHELP; % INFO
SCKW ,REC1ST,B,LIMIT=AL1(44); % DSN
SCANEND;
% IF HERE NO DSNAME
MZC DSNLEN,2; % ZERO DATA SET NAME
GOTO RGETINIT; % A GOTO I ADMIT
EXIT FROM RECBLCK; % LEAVE REC
RECHELP:
WRTERM 'RECEIVE receives a data set (file) from the microcomputer.';
WRTERM 'A corresponding SEND command must '_
'be issued to the microcomputer';
WRTERM 'KERMIT after the RECEIVE is issued to TSO KERMIT.';
WRTERM 'The parameter is the data set name '_
'to be used for the received data set.';
WRTERM 'If the parameter is omitted, the file name from the sender '_
'is used as';
WRTERM 'the data set name.';
EXIT FROM RECBLCK; % LEAVE REC
RECERR:
SELECT FIRST;
<CI VRF,SCTCLXM>: WRTERM 'Data Set Name maximum 44 letters ';
ENDSEL
ELSE <WRTERM 'ERROR IN SCANNER IN REC MOD '>;
EXIT FROM RECBLCK; % ERROR EXIT
REC1ST: % THE BEEF
% STORE OFF POINTERS IN CASE MORE FILES
% SCBACK; % BACK UP IN CASE A PDS MEMBER EXISTS
SCTELL;
DEBLANK VR1,VR0,XRA,TYPE=BOTH; % STRIP OFF BLANKS
ST VR1,DSNADD; % ADDRESS OF DSNAME
STH VR0,DSNLEN; % LENGTH OF SCANNED NAME
LR XRA,VR0; % FOR EXECUTE
CCALL CHKRDSN,A; % ROUTINE CHECKS WHEATHER VALID DSN FOR RECEIVE
IF <RZ VRF> THEN CCALL OPENRDSN,A; % OPEN THE FILE
IF <RZ VRF> THEN BEGIN % GOOD DATA SET
RGETINIT: % GET INIT PACKET
IF ^<TF SERVERF> THEN WRTERM 'Ready to receive files';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
% CALL REC FILE SWITCH TABLE DRIVER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CCALL RECSW,A;
END
ELSE BEGIN % COULDN'T OPENDSN
IF <TF SERVERF> THEN BEGIN
CCALL SABORT,A,LH:VR0=RPSEQ;
END
ELSE <LH VR0,STATLEN; TPUT STATBUFF,(VR0)>;
END;
END; % OF RECBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
END; % OF DSECT
END; % OF DSECT RECINIT
SUBTITLE 'RECUNALLOCATE ';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
% MOD: RECUNAL
% FUN: UNALLOCATES DSNAME FOR RECEIVE MOD
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RECUNAL:
CENTER VRE,HIGHR,ENTRY=NO;
LA XRB,DSNAME; % GET ADDRESS OF DSNAME
DALLIST BEGIN,MF=(E,UALLOCD2),INIT=NO; BEGIN
DALLIST TEXT,DUNDSNAM,(0(XRB),DSNSIZE); % DSNAME
DALLIST TEXT,DUNUNALC,MF=L; % FORCE UNALLOCATION
DALLIST END; END;
DATA BEGIN % DYNAMIC ALLOCATION PARAMETER LIST FOR
% UNALLOCATION BY DSNAME
UALLOCD2:
DALLIST BEGIN,S99VRBUN,MF=L; BEGIN
DALLIST TEXT,DUNDSNAM,(,DSNSIZE); % DSNAME
DALLIST TEXT,DUNUNALC; % FORCE UNALLOCATION
DALLIST END; END;
END;
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'RECSW';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : RECSW
% FUNCTION : THIS ROUTINE DRIVES THE RECEIVE MODULES,
% EACH ROUTINE CHANGES THE STATE
% INPUT:
%
%
% OUTPUT :
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RECSW:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
%MVI HIGHBCC,3; % INDICATE BLOCK CHECK TYPE
BCCTYPE 1; % BLOCK CHECK TYPE
ZEROSEQ; % ZERO SEQUENCE NUMBER
ZERORTRY; % ZERO RETRY
MVI STATE,RISTATE; % SEND INIT STATE
RSWTBLCK: DO BEGIN % LOOP TILL EXIT
SELECT FIRST;
<TF STOPF>: <CCALL STOPPROC,A; EXIT FROM RSWTBLCK>; % USER STOP
<CLI STATE,RISTATE>: CCALL RINIT,A;
<CLI STATE,RFSTATE>: CCALL RFILE,A; % FILE HEADER PACKET
<CLI STATE,RDSTATE>: CCALL RDATAMOD,A; % GET DATA PACKETS
<CLI STATE,SESTATE>: BEGIN % ABORT
CCALL SABORT,A,VR0=LH:RPSEQ; EXIT FROM RSWTBLCK; % ABORT
END;
<CLI STATE,RESTATE>: <CCALL RABORT,A; EXIT FROM RSWTBLCK>; % ABORT
<CLI STATE,CSTATE>: EXIT FROM RSWTBLCK; % COMPLETE STATE SPLIT
ENDSEL;
END FOREVER;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'RFILE';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : RFILE
% FUNCTION : Receives the f packet and decodes it
% changes states
% INPUT: none
%
%
% OUTPUT : state = either 'C' complete || 'B' EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RFILE:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE RFILBLCK: DO BEGIN % Receive file name
CCALL RPACK,A;
EXIT IF <TF STOPF>; % Leave if user entered stop
IF <RNZ VRF> THEN BEGIN % NACK if Timeout or Bad BCC
NACKPACK SEQNUM,VR0; % NACK IT
EXIT FROM RFILBLCK;
END; % OF ERROR
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX SCASE MIN ECASE CHECK;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A SENDINIT PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SCASE: BEGIN % SEND INIT PACKET RECEIVED
BUMPOTRY VR0;
IF <MCLC OLDTRY,RETRY,4; CC NL> % Retry exceeded
| ^<MCLC OLDSEQ,RPSEQ,2; CC NL> THEN % MUST BE LAST SEQ
MVI STATE,SESTATE % Send abort state
ELSE BEGIN % Receive file name
CCALL SPAR,A,VR1=PDATA,VR0=LH:RECLEN; % SET PARMS
SPSPACK AY,RPSEQ,RECLEN,VR0;
CCALL SPACK,A;
MZC NUMTRY,L'NUMTRY; % % Zero retry counter
END;
END; % OF REC INIT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A EOF PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZCASE: BEGIN % EOF PACKET RECEIVED - CLOSE OUT
BUMPOTRY VR0;
IF <MCLC OLDTRY,RETRY,4; CC NL> % Retry exceeded
| ^<MCLC OLDSEQ,RPSEQ,2; CC NL> THEN % MUST BE LAST SEQ
MVI STATE,SESTATE % Send abort state
ELSE BEGIN % Receive file name
SPSPACK AY,RPSEQ,ZERO,VR0;
CCALL SPACK,A;
MZC NUMTRY,L'NUMTRY; % % Zero retry counter
CCALL CLOSERDS,A; % CLOSE THE DATA SET
END;
END; % OF REC EOF FOR THE SECOND TIME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A ERROR PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
CCALL ERRPACK,A,VR1=RDATA,VR0=LH:RECLEN;
END;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A EOT PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
BCASE: BEGIN % End of transmission
IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN % MUST BE THE RIGHT PACKET
MVI STATE,SESTATE; % SENDAN ABORT
ERRORCON 'Illegal packet sequence for eot in rfile- must abort';
CCALL ERRPACK,A;
END % bad sequence number
ELSE BEGIN
ACKPACK SEQNUM,VR0; % ACK IT
MVI STATE,CSTATE; % LA FINE
END;
END; % OF EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A FILE PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FCASE: BEGIN % f packet with file name - what we want
IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN % MUST BE THE RIGHT PACKET
MVI STATE,SESTATE; % SENDAN ABORT
ERRORCON 'Illegal sequence for f packet in rfile- must abort';
CCALL ERRPACK,A;
END % bad sequence number
ELSE BEGIN
IF <MCLC DSNLEN,ZERO,2> THEN BEGIN % GET NAME FROM PACKET
CCALL DSNPACK,A,VR1=RDATA,VR0=LH:RECLEN; % DECODE NAME
IF <RZ VRF> THEN CCALL OPENRDSN,A; % OPEN THE NEXT FILE
IF <RNZ VRF> THEN MVI STATE,SESTATE ; % ABORT ON BOARD
EXIT FROM RFILBLCK IF <RNZ VRF>; % ERROR ON OPEN
END;
ACKPACK SEQNUM,VR0; % ACK IT
MMVC OLDTRY,NUMTRY,4; % KEEP OLD COUNTER
ZERORTRY; % A GOOD PACKET
BUMPSEQ VR0; % NEXT SEQ NUMBER
MZC BUFCNT,2; % ZERO BUFFER COUNTER
MZC DSNLEN,2; % ZERO LENGTH OF DSN FOR NEXT ONE
L VR1,ADDBUF; % BEGINNING OF BUFFER
ST VR1,BUFADD; % POINTER TO PLACE IN BUFFER
ZF CRFLAG,QUO8FLAG;
MVI STATE,RDSTATE; % CHANGE DATA TO RECEIVE DATA
END; % OF GOOD F PACKET
END; % OF F PACKET
ENDCASE
ELSE BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED AN ILLEGAL PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ERRORCON 'Illegal packet type for rfile - transfer aborted';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % SEND ABORT STATE
END;
END; % OK RETRY
END; % of RFILBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'RDATAMOD';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : RDATAMOD
% FUNCTION : Receives data packet and decodes them
% also receives eof
% INPUT: none
%
%
% OUTPUT : state = either 'C' complete || 'B' EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RDATAMOD:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE RDATBLCK: DO BEGIN % Receive file name
CCALL RPACK,A;
EXIT IF <TF STOPF>; % Leave if user entered stop
IF <RNZ VRF> THEN BEGIN % NACK if Timeout or Bad BCC
NACKPACK SEQNUM,VR0; % NACK IT
EXIT FROM RDATBLCK;
END; % OF ERROR
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX FCASE MIN ECASE CHECK;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A FILE HEADER PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FCASE: BEGIN % FILE HEADER PACKET RECEIVED
BUMPOTRY VR0;
IF <MCLC OLDTRY,RETRY,4; CC NL> % Retry exceeded
| ^<MCLC OLDSEQ,RPSEQ,2; CC NL> THEN % MUST BE LAST SEQ
MVI STATE,SESTATE % Send abort state
ELSE BEGIN % Receive file name
SPSPACK AY,RPSEQ,ZERO,VR0;
CCALL SPACK,A;
MZC NUMTRY,L'NUMTRY; % % Zero retry counter
END;
END; % OF REC FILE HEADER
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A ERROR PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
CCALL ERRPACK,A,VR1=RDATA,VR0=LH:RECLEN;
END;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A EOF PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ZCASE: BEGIN % End of file
IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN % MUST BE THE RIGHT PACKET
MVI STATE,SESTATE; % SENDAN ABORT
ERRORCON 'Illegal packet sequence for eof in rdata- must abort';
CCALL ERRPACK,A;
END % bad sequence number
ELSE BEGIN
ACKPACK SEQNUM,VR0; % ACK IT
BUMPSEQ VR0;
IF <MCLC BUFCNT,=H'0',2; CC H> THEN BEGIN % SOMETHING TO WRITE
CCALL WRITEFIL,A;
%IF <MCLC DATA,=C'BINARY',6> THEN CCALL WRITEFIL,A; % old
END; % OF SOMETHING TO WRITE
IF <TF RECVDSNF> THEN CCALL CLOSERDS,A; % CLOSE THE FILE
MVI STATE,RFSTATE; % WE'RE DONE HERE
END;
END; % OF EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED A DATA PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DCASE: BEGIN % D packet with data - what we want
IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN % WRONG PACKET NUMBER
BUMPOTRY VR0;
IF <MCLC OLDTRY,RETRY,4; CC L> THEN BEGIN % HAVEN'T EXCEED RETRY
IF <MCLC OLDSEQ,RPSEQ,2> THEN BEGIN % PREVIOUS PACKNUM JUST ACK
ACKPACK RPSEQ,VR0; % ACK OLD ONE
MZC NUMTRY,L'NUMTRY;
EXIT FROM RDATBLCK;
END;
END;
MVI STATE,SESTATE; % SENDAN ABORT
ERRORCON 'sequence error for D packet in rdata- must abort';
CCALL ERRPACK,A;
END % bad sequence number
ELSE BEGIN
CCALL KGETBUFF,A,VR1=RDATA,VR0=LH:RECLEN; % DECODE PACKET
ACKPACK SEQNUM,VR0; % ACK IT
MMVC OLDTRY,NUMTRY,4; % KEEP OLD COUNTER
ZERORTRY; % A GOOD PACKET
BUMPSEQ VR0; % NEXT SEQ NUMBER
END;
END; % OF GOOD F PACKET
ENDCASE
ELSE BEGIN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% RECEIVED AN ILLEGAL PACKET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ERRORCON 'Illegal packet type for rdata - transfer aborted';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % SEND ABORT STATE
END;
END; % OK RETRY
END; % of RDATBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'RINIT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : RINIT
% FUNCTION : Receives the Send init packet and decodes it
% changes states
% INPUT: none
%
%
% OUTPUT : state = either 'C' complete || 'B' EOT
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RINIT:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
BUMPRTRY XRA; % Increment retry counter
IF <MCLC NUMTRY,RETRY,4; CC NL> THEN % Retry exceeded
MVI STATE,SESTATE % Send abort state
ELSE RINIBLCK: DO BEGIN % Send end of transmisision block
BCCTYPE 1; % LOOK FOR 1 BCC ON REC INIT PACKET
IF ^<TF SERVERF> THEN CCALL RPACK,A;
EXIT IF <TF STOPF>; % Leave if user entered stop
IF <RNZ VRF> THEN BEGIN % NACK if Timeout or Bad BCC
NACKPACK SEQNUM,VR0; % NACK IT
EXIT FROM RINIBLCK;
END; % OF ERROR
ZR XRA; % clear for the case
MTRT RTYPE,COMMAND,1; % Scan command type
DO BEGIN CASE XRA MAX SCASE MIN ECASE CHECK;
RSTATE: BEGIN % SEND INIT PACKET RECEIVED
CCALL RPAR,A,VR1=RDATA,VR0=LH:RECLEN; % GET PARMS
CCALL SPAR,A,VR1=PDATA,VR0=LH:RECLEN; % SET PARMS
SPSPACK AY,SEQNUM,RECLEN,VR0;
CCALL SPACK,A;
SELECT FIRST;
<CLI TRFBCC,1>: BCCTYPE 1;
<CLI TRFBCC,2>: BCCTYPE 2;
<CLI TRFBCC,3>: BCCTYPE 3;
ENDSEL;
ZERORTRY; % % Zero retry counter
BUMPSEQ VR0; % Increment packet counter
MVI STATE,RFSTATE; % NEXT STATE REC FILE HEADER
END; % OF ACK
ECASE: BEGIN % Error abort
MVI STATE,RESTATE; % RECEIVED ABORT
CCALL ERRPACK,A,VR1=RDATA,VR0=LH:RECLEN;
END;
ENDCASE
ELSE BEGIN
ERRORCON 'Illegal packet type for rec init - transfer aborted';
CCALL ERRPACK,A; % PUT IN BUFFERS
MVI STATE,SESTATE; % SEND ABORT STATE
END;
END; % OK RETRY
END; % of RINIBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'DSNPACK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : DSNPACK
% FUNCTION : Scans data set name from a received packet
% calls scandsn to check if ok
% INPUT: VR1-> DATA SET NAME
% VR0=LENGTH OF DATA SET NAME
%
% OUTPUT : VRF=0 A GOOD DSNAME ELSE INVALID NAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DSNPACK:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
IF <RP VR0> THEN BEGIN % GET NAME FROM SENDER
LR XRA,VR0;
L XRB,ATOEVCON;
EXI XRA,TR,0((*-*),VR1),0(XRB),DECR=YES,INCR=YES;
EXI XRA,TR,0((*-*),VR1),UPPER,DECR=YES,INCR=YES; % UPPER
LA XRB,0(XRA,VR1); % SET UP TO SCAN OFF BAD CHARACTERS
SI XRB,1; % ONE LESS
WHILE <<CLI 0(XRB),C' '> | <CLI 0(XRB),C'.'>> DO
BEGIN SI XRA,1; SI XRB,1; END;
LR VR0,XRA; % LENGTH
END; % OF NON LENGTH
CCALL CHKRDSN,A; % CHECK THE DSNAME
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CHKRDSN';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : CHKRDSN
% FUNCTION : Checks for a valid data set name for a received
% file calls scandsn to check if ok
% INPUT: VR1-> DATA SET NAME
% VR0=LENGTH OF DATA SET NAME
%
% OUTPUT : VRF=0 A GOOD DSNAME ELSE INVALID NAME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CHKRDSN:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
CCALL SCANDSN,A; % SET UP DATA SET NAME
CASE VRF MIN 0 MAX 20 CHECK;
0: BEGIN % A GOOD RETURN;
END;
4: BEGIN % GOOD RETURN PLUS PDS
ZR VRF;
END;
8: BEGIN % WILD CARD
ERRORCON 'Asterisk illegal on receive - just leave blank';
END;
12: BEGIN % NO LENGTH
ERRORCON 'No length on data set name';
END;
16: BEGIN % ILLEGAL NAME
ERRORCON 'Non-standard data set name ';
% LR XRA,VR0 ;
% EXI XRA,MMVC,OUTMESS,0(VR1),*-*,INCR=YES,DECR=YES ;
% LA VR1,OUTMESS ; % SET UP BUFFER
% AR VR1,XRA ;
% LH XRA,DSNLEN ;
% L XRB,DSNADD ;
% EXI XRA,MMVC,0(VR1),0(XRB),*-*,INCR=YES,DECR=YES ;
% AR VR0,XRA ; % GET LENGHT
% LA VR1,OUTMESS ;
END;
20: BEGIN % NO MATCHING ENTRIES FROM WILD CARD
ERRORCON 'No matches in catalog for wildcard';
END;
ENDCASE ELSE
BEGIN % ILLEGAL RETURN
ERRORCON 'Illegal data set name return';
END;
IF <RZ VRF> THEN BEGIN
LOCATE DATASET; % DOES IT EXIT
IF <RZ VRF> THEN BEGIN % DATASET EXISTS
IF ^<TF PDSF> THEN BEGIN % PDS MUST EXIST
IF <TF SERVERF> THEN BEGIN
ERRORCON 'Data set exists - in server mode this causes termination';
CCALL ERRPACK,A; % PUT IN OUTPUT BUFFER
MMVC TEMP,=C'NO',2; % MAKE NEXT SECTION ABORT
END % OF SERVER FUNCTION
ELSE BEGIN % NON SERVER
WRTERM 'Data set exists - reply "YES" to destroy old file ';
TGET TEMP,3;
MTR TEMP,UPPER,3; % UPSHIFT IT
END; % OF NON SERVER
IF <MCLC TEMP,=C'YES',3> THEN BEGIN
SCRATCH DELDSN; % DESTROY THE DATA SET
CATALOG UNCAT; % UNCATALOGE IT
ZR VRF; % GOOD RETURN
END % OF NON PDS
ELSE BEGIN
ERRORCON 'Data set already exists';
CCALL ERRPACK,A;
MVI STATE,SESTATE; % ABORT
LI VRF,4; % ERROR RETURN
END;
END % OF DELETION
ELSE BEGIN
% ABORT THE SUCKER
% MVI STATE,SESTATE;
LI VRF,0; % GOOD PDS - DO BUILDL HERE
END; % OF NO
END % OF EXISTIN G DATA SET
ELSE BEGIN
IF <TF PDSF> THEN BEGIN % PDS'S MUST EXIST
ERRORCON 'PDS directory must exist - will create member -'_
'must abort';
IF <TF SERVERF> THEN CCALL ERRPACK,A ELSE TPUT (VR1),(VR0);
MVI STATE,SESTATE;
LI VRF,4; % NO GOOD
END % PDS
ELSE ZR VRF; % GOOD RETURN FOR NON-EXISTENT DATA SET
END; % NON EXISTENT DATA SET
END % GOOD VRF
ELSE BEGIN % BAD DSN
CCALL ERRPACK,A;
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
OUTMESS: DS CL92 ;
LTORG;
EXORG;
SUBTITLE 'KGETBUFF';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% MODULE NAME - KGETBUFF
%
%
% FUNCTION- TAKES DATA VR1-> DATA
% VR0=LENGTH SEARCHES FOR QUOTE CHARACTES
% UPDATES OUTPUT BUFFER, CALLS PUTEM WHICH WRITES FILE
% AND PLACES ITEMS IN BUFFER
% INPUTS -
%
%
%
%
% OUTPUTS-
%
%
% RETURN
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KGETBUFF: ;
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
ST VR1,RDATAADD;
STH VR0,RDATALEN;
UNTIL <MCLC RDATALEN,=X'0000'> DO BEGIN
L XRB,RDATAADD;
LR VR1,XRB;
LH XRE,RDATALEN;
ZR XRA; % ZERO FOR CASE IF NONE FOUND
EXI XRE,MTRT,0(XRB),RECTABLE,*-*,DECR=YES,INCR=YES;
% SEARCH FOR CONTROL CHARACTERS
CASELOOP: DO BEGIN
CASE XRA MAX CASEREPT MIN 0 CHECK;
0: BEGIN % MOVE EM ALL
LR VR0,XRE;
CCALL PUTEM,A; % PUT ALL IN OUT BUFFER
MZC RDATALEN,2; % ZERO COUNTER
END;
CASEQUO: BEGIN % A QUOTE CHARACTER
IF ^<CR VR1,XRB> THEN MOVEALL; % MOVE OTHER STUFF
%IF <MCLC RDATALEN,=X'0001',2> THEN <SF QUOFLAG; MZC RDATALEN,2>
DO BEGIN
AI VR1,1; % POINT TO CHARACTER
IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
SELECT FIRST;
<CLI 0(VR1),X'4D'>: BEGIN
IF <MCLC 1(VR1),LFCR+2,2> |
<<CLI 1(VR1),X'26'> & <MCLC 2(VR1),LFCR+2,2>> THEN BEGIN
CCALL WRITEFIL,A;
IF <CLI 1(VR1),X'26'> THEN DECRDATA VR0,5
ELSE DECRDATA VR0,4;
EXIT FROM CASELOOP;
END
ELSE BEGIN
CNTLLOC 0(VR1); % PUT IT IN
ZR VR0;
LI VR0,1;
CCALL PUTEM,A; % STICK IT IN BUFFER
IF <MCLC RDATALEN,=H'2',2> THEN SF CRFLAG ELSE ZF CRFLAG;
DECRDATA VR0,2;
EXIT FROM CASELOOP;
END; % OF LFCR
END;
<CLI 0(VR1),X'4A'>: BEGIN
IF <TF CRFLAG> THEN BEGIN
LH VR0,BUFCNT;
SI VR0,1; % CNTL LF LAST CHARACTER OMIT
STH VR0,BUFCNT;
CCALL WRITEFIL,A;
DECRDATA VR0,2;
EXIT FROM CASELOOP;
END
ELSE BEGIN
CNTLLOC 0(VR1);
LI VR0,1;
CCALL PUTEM,A;
DECRDATA VR0,2;
EXIT FROM CASELOOP;
END; % OF ELSE
END;
<MCLC 0(VR1),TABCHAR#,1>: BEGIN
IF <TF TABF> THEN BEGIN % TAB FUNCTION
CCALL GETTABS,A; % ROUTINE RETURNS NUMBER OF BLANKS NECESSARY
IF <RP VRF> THEN BEGIN
LR VR0,VRF; % NUMBER OF BLANKS
CCALL PUTEM,A,VR1=ASCBLANK; % PUT ASCII BLANKS IN FILE
END; % OF TABBING EXISTS
DECRDATA VR0,2; % DECREMENT BY TWO
EXIT FROM CASELOOP;
END;
END; % OF SELECT
ENDSEL;
END; % OF TEXT
SELECT FIRST;
<MCLC 0(VR1),QUOCHAR,1>: ; % JUST DROP OUT CONTROL
<MCLC 0(VR1),BINQC,1>: ; % DONT CNTL QUOTES
<MCLC 0(VR1),REPTCHAR,1>: DO IF ^<TF REPTF> THEN CNTLLOC 0(VR1);
ENDSEL
ELSE CNTLLOC 0(VR1); % IT'S A CONTROL CHARACTER
LI VR0,1;
CCALL PUTEM,A; % PUT IT IN BUFFER
AR VR1,VR0;
ST VR1,RDATAADD; % NEW ADD ADDRESS
LH VR0,RDATALEN;
SI VR0,2;
STH VR0,RDATALEN; % STORE OFF NEW LENGTH
END; % OF ELSE SELECT
END;
CASE8BIT: BEGIN
IF ^<CR VR1,XRB> THEN MOVEALL; % MOVE OTHER STUFF
EIGHTBLK: DO BEGIN
AI VR1,1; % POINT TO CHARACTER
IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
CCALL ATOE8BIT,A ; % ERROR NO REAL HIGH ORDER BITS ON
DECRDATA VR0,1 ; %
EXIT FROM EIGHTBLK ; % LEAVE BLOCK
END ;
IF <MCLC 0(VR1),QUOCHAR,1> THEN BEGIN
IF <MCLC RDATALEN,=X'0003'; CC NL> THEN BEGIN
DECRDATA VR0,3; % DECREMENT RDATA
AI VR1,1;
END
ELSE BEGIN
SF QUO8FLAG;
SF QUOFLAG;
MZC RDATALEN,2; % OUTTA HERE
EXIT FROM CASELOOP;
END; % OF ONLY 2 LEFT AND QUOTED
SELECT FIRST;
<MCLC 0(VR1),QUOCHAR,1>: ; % JUST DROP OUT CONTROL
<MCLC 0(VR1),BINQC,1>: ; % DONT CNTL QUOTES
<MCLC 0(VR1),REPTCHAR,1>: DO IF ^<TF REPTF> THEN CNTLLOC 0(VR1);
ENDSEL
ELSE CNTLLOC 0(VR1); % IT'S A CONTROL CHARACTER
END % OF QUOTE CHARACTER
ELSE BEGIN % ANY OTHER CHARACTER DECR = 2
LH VR0,RDATALEN;
SI VR0,2;
STH VR0,RDATALEN;
END;
OI 0(VR1),X'80'; % OR TURN ON HIGH ORDER BIT
ZR VR0;
LI VR0,1; % ONE CHARACTER
CCALL PUTEM,A;
AI VR1,1; % INCREMENT TO NEXT
ST VR1,RDATAADD; % POINTER TO NEX
END; % OF ELSE
END; % CASE8BIT
CASEREPT: BEGIN % REPEAT CHARACTER
IF <MCLC RDATALEN,=H'3'; CC L> THEN BEGIN % NOT ENOUGH
WRTERM 'ERROR IN REPEAT COUNT IN RECEIVE';
END
ELSE BEGIN
IF ^<CR VR1,XRB> THEN MOVEALL; % MOVE OTHER STUFF
AI VR1,1; % POINT TO LENGTH CHARACTER
ZR VR0; IC VR0,0(VR1);
UNCHAR VR0; % GET THE LENGTH
IF <CI VR0,94; CC H> | <RNP VR0> THEN BEGIN % SIZE ERROR
WRTERM 'REPEAT COUNT TOO LARGE ON RECEIVE 94 MAXIMUM';
END; % OF TOO LARGE
AI VR1,1; % POINT TO NEXT
ZR XRA; LI XRA,3; % DEFAULT LENGTH TO DECREMENT
ZF HIGHBITF; % TURN OFF FLAG
SELECT;
<MCLC 0(VR1),BINQC,1>: BEGIN % 8 BIT QUOTING
AI VR1,1; % MOVE POINTER
AI XRA,1; % DECREMENT LENGTH
SF HIGHBITF; % SET 8 BIT INDICATOR
END; % 8 BIT SELECT
<MCLC 0(VR1),QUOCHAR,1>: BEGIN % A CNTRL CHARACTER
AI XRA,1; % BUMP DECREMENT COUNTER
AI VR1,1; % POINT TO CHARACTER
SELECT FIRST;
<CLI 0(VR1),X'7E'>: ; % JUST DROP THROUGH DEL CHARACTER
<MCLC 0(VR1),QUOCHAR,1>: BEGIN % JUST DROP OUT CONTROL
%IF <TF HIGHBITF> THEN CNTLLOC 0(VR1); %
END;
<MCLC 0(VR1),BINQC,1>: BEGIN % DONT CNTL QUOTES
%IF <TF HIGHBITF> THEN CNTLLOC 0(VR1); %
END;
<MCLC 0(VR1),TABCHAR#,1>: BEGIN % DONT CNTL QUOTES
IF ^<TF HIGHBITF> THEN BEGIN
IF <TF TABF> & <MCLC DATA,=C'TEXT',4> THEN BEGIN % TAB FUNCTION
ZR XRB; LR XRB,VR0; % LOAD COUNT FOR FOR STATEMENT
FOR XRB DO BEGIN % LOOP THROUGH NUMBER OF TABS
CCALL GETTABS,A; % ROUTINE RETURNS NUMBER OF BLANKS NECESSARY
IF <RP VRF> THEN BEGIN
LR VR0,VRF; % NUMBER OF BLANKS
CCALL PUTEM,A,VR1=ASCBLANK; % PUT ASCII BLANKS IN FILE
END; % OF TABBING EXISTS
END; % OF FOR LOOP FOR XRB TIMES
DECRDATA VR0,4; % DECREMENT BY TWO
EXIT FROM CASELOOP;
END
ELSE CNTLLOC 0(VR1); % CONTROL IT
END % OF NON HIGH ORDER ON
ELSE CNTLLOC 0(VR1); % CONTROL IT
END; % END OF TAB
<MCLC 0(VR1),REPTCHAR,1>: DO IF ^<TF REPTF> THEN CNTLLOC 0(VR1);
ENDSEL
ELSE CNTLLOC 0(VR1); % CONTROL IT
END; % OF SECOND SELECT
ENDSEL;
IF <TF HIGHBITF> THEN BEGIN % TURN ON HIGH BIT
IF ^<MCLC DATA,=C'TEXT',4> THEN OI 0(VR1),X'80' % TURN ON HIGH BIT
ELSE CCALL ATOE8BIT,A;
END; % CHECK FOR CONVERSION ERRORS
SELECT FIRST;
<CI XRA,3>: DECRDATA XRA,3; % 3 CHARACTERS
<CI XRA,4>: DECRDATA XRA,4; % 4 CHARACTERS
<CI XRA,5>: DECRDATA XRA,5; % 5 CHARACTERS
ENDSEL;
LR XRA,VR0; % LENGTH TO REPEAT
IF <RP XRA> THEN BEGIN
SI XRA,1; % ONE LESS CAUSE ALREADY USED ONE
MMVC REPTBUFF,0(VR1),1; % PUT IN FIRST CHARACTER
EXI XRA,MMVC,REPTBUFF+1,REPTBUFF,*-*,DECR=YES; % PUT IN REPEATS
CCALL PUTEM,A,VR1=REPTBUFF; % PUT EM IN OUTPUT BUFFER
END;
END; % OF LONG ENOUGH
EXIT FROM CASELOOP;
END; % OF REPEAT CASE
ENDCASE
ELSE BEGIN
WRTERM ' ERROR IN GETBUF SUB CASE ';
END;
END; % OF CASE LOOP
LH VR0,RDATALEN; % PICK UP LENGTH
END; % OF UNTIL 0 DATA
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
% SOME EQUATES
CASEQUO: EQU 4; % HASH FOR TABLE
CASE8BIT: EQU 8; % HASH FOR TABLE 8BIT
CASEREPT: EQU 12; % HASH FOR REPEAT CHARACTER
SUBTITLE 'PUTEM ';
%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE PUTEM
%%%%%%%%%%%%%%%%%%%%%%%%%%
PUTEM:
CENTER VRE,HIGHR,ENTRY=NO;
IF <TF QUO8FLAG> THEN <OI 0(VR1),X'80'; ZF QUO8FLAG>; % QUOTE LAST
LR XRA,VR0; % LOAD FOR EXECUTE AND LATER
L XRB,ADDBUF; % ADDRESS OF BUFFER
AH XRB,BUFCNT; % INCREMENT INTO BUFFER
LR XRE,VR0; % LENGTH IF TOO LONG
DO BEGIN
IF <CLI XRE,255; CC H> THEN <LI XRA,255; SI XRE,255>
ELSE <LR XRA,XRE; ZR XRE;>;
EXI XRA,MMVC,0(XRB),0(VR1),*-*,INCR=YES,DECR=YES;
IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
L XRC,ATOEVCON;
EXI XRA,MTR,0(XRB),0(XRC),*-*,INCR=YES,DECR=YES; % TRANSLATE IT
END; % OF TEXT
END; % OF TRANSLATES
LR XRA,VR0; % RESTORE
AH XRA,BUFCNT; % INCREMENT BUFFER COUNTER
STH XRA,BUFCNT;
%SELECT FIRST;
IF <CH XRA,MAXWRITE; CC H> THEN BEGIN % MORE CHAR THAN LRECL SIZE
% IF BINARY WRITE - IF TEXT TRUNCATION ONLY RIGHT ON REQUEST
%IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
MMVC BUFCNT,MAXWRITE,2; % WRITE MAXWRITE'S WORTH
CCALL WRITEFIL,A; % OUTPUT THE RECORD
SH XRA,MAXWRITE; % GET REMAINDER
L XRB,ADDBUF;
LR VR1,XRB; % SET UP FOR MOVE
AH XRB,MAXWRITE; % INDEX FOR MOVE
EXI XRA,MMVC,0(VR1),0(XRB),*-*,INCR=YES,DECR=YES;
% SH XRA,LRECL; % SUB OFF LRECL
STH XRA,BUFCNT; % UPDATE BUF COUNTER
%END; % OF BINARY - TEXT JUST FALLS THROUGH
%
END; % OF MORE CHARACTERS
%<CH XRA,MAXWRITE; CC =>: BEGIN % MAXWRITE EQUALS CHARACTERS
%
%%IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
%CCALL WRITEFIL,A; % OUTPUT THE RECORD
%MZC BUFCNT,2; % ZERO COUNTER
%%END; % OF BINARY - TEXT JUST FALLS THROUGH
%END; % OF EQUAL SELECT
%
%<CH XRA,MAXWRITE; CC L>: ; % NO OP JUST FALL THRU
%ENDSEL;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'OPENSDSN';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : OPENSDSN
% FUNCTION : OPENS AND ALLOCATES THE DATA SET KERIN
% CALLED BY SEND FUNCTIONS
% INPUT: NONE
%
%
% OUTPUT : VRF=0 GOOD OPEN, VRF=4 ERROR
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
OPENSDSN:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
KINBLCK: DO BEGIN
MMVC KERMDDNM,=C'KERIN ',8; % SET UP DDNAME
IF ^<TF PDSF> THEN BEGIN % A REGULAR DATA SET
DALLIST BEGIN,MF=(E,KFILEIN),INIT=NO; BEGIN
DALLIST TEXT,DALDDNAM,(KERMDDNM,8); % DDNAME
DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE); % DSNAME
DALLIST TEXT,DALSTATS,(X'08',1,'STC'); % STATUS SHARE
DALLIST END; END;
END
ELSE BEGIN % A PDS MEMBER
DALLIST BEGIN,MF=(E,KFPDSIN),INIT=NO; BEGIN
DALLIST TEXT,DALDDNAM,(KERMDDNM,8); % DDNAME
DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE); % DSNAME
DALLIST TEXT,DALSTATS,(X'08',1,'STC'); % STATUS SHARE
DALLIST TEXT,DALMEMBR,(DSMEMBER,8); % MEMBER NAME
DALLIST END; END;
END; % PDS
ST VRF,DACKRC; % RETURN CODE FROM ALLOCATE
IF <RNZ VRF> THEN BEGIN % ERROR IN ALLOCATION?
IF <TF PDSF> THEN L VR1,KFPDSIN
ELSE L VR1,KFILEIN; % POINT TO DYNAL BLOCK
IF <CI VRF,16> & <MCLC 4(VR1),=X'035C0002',4> THEN BEGIN
ERRORCON 'Non-Standard MVS data set name' ;
CCALL ERRPACK,A ;
MVI STATE,ASTATE ;
IF ^<TF SERVERF> THEN TPUT (VR1),(VR0) ;
END
ELSE CCALL DYNERR,A; % CALL ERROR ROUTINE
EXIT FROM KINBLCK;
END;
DATA BEGIN % DYNAMIC ALLOCATION PARAMETER LIST FOR INPUT DATA SET
KFILEIN:
DALLIST BEGIN,S99VRBAL,_
FLAGS1=(S99NOMNT),_
ERROR=KERMERR,INFO=KERMINFO,MF=L; BEGIN
DALLIST TEXT,DALDDNAM,(,8); % DDNAME
DOUDSNAM:
DALLIST TEXT,DALDSNAM,(,DSNSIZE); % DSNAME
DALLIST TEXT,DALSTATS,X'08'; % STATUS
DALLIST END; END;
KFPDSIN:
DALLIST BEGIN,S99VRBAL,_
FLAGS1=(S99NOMNT),_
ERROR=KPDSERR,INFO=KPDSINFO,MF=L; BEGIN
DALLIST TEXT,DALDDNAM,(,8); % DDNAME
DALLIST TEXT,DALDSNAM,(,DSNSIZE); % DSNAME
DALLIST TEXT,DALSTATS,X'08'; % STATUS
DALLIST TEXT,DALMEMBR,(,8); % PDS MEMBER
DALLIST END; END;
END;
% MAKE SURE NON EDIT FORMAT
IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
CALL EDSET,(EDCNTRL,EDRETURN,SIX,TWO,TEMP,EDLEN);
END ;
CALL EDOPEN,(EDCNTRL,EDRETURN,KERMDDNM,ONE);
IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN % FILE OPEN FAIL
ZF SENDDSNF; % INDICATE NOT OPEN
CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
L VR0,EDLENACT;
CCALL ERRPACK,A,VR1=EDLINE; % OUTPUT IT
LI VRF,4; % ABORT IT
EXIT FROM KINBLCK;
END
ELSE SF SENDDSNF; % OPEN INDICATOR
ZF KINEOF; % END OF FILE INDICATOR
CALL EDSHOW,(EDCNTRL,EDRETURN,ONEOONE,TEMP,EDLINE,EDLMAX2,EDLENACT);
SELECT FIRST;
<CLI EDLINE,C'V'>: MVI RRECFM,C'V';
<CLI EDLINE,C'F'>: MVI RRECFM,C'F';
<CLI EDLINE,C'U'>: MVI RRECFM,C'U';
ENDSEL
ELSE BEGIN
ERRORCON ' Only V, U and F RECFM supported ';
CCALL ERRPACK,A; % PUT IN BUFFER
MVI STATE,ASTATE; % ABORT IT
LI VRF,4; % ERROR
END; % ELSE SELECT
ZR VRF; % INDICATE A GOOD OPEN
END; % OF KINBLCK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'OPENRDSN';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : OPENRDSN
% FUNCTION : OPENS DATA SET KEROUT FOR DOWNLOAD TO MICRO
% GETS SPACE FOR FILE BUFFER
% INPUT: OPENS DSNAME AND IF PDS DSMEMBER
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
OPENRDSN:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
OPENOBLK: DO BEGIN % BLOCK TO FALL OUT OF
MMVC KERMDDNM,=C'KEROUT ',8; % SET UP DDNAME
IF ^<TF PDSF> THEN BEGIN % NON PDS
LH VR0,LRECL;
ST VR0,TEMP;
CALL EDSET,(EDCNTRL,EDRETURN,ONE,TEMP,TEMP,EDLEN); % LRECL
LH VR0,BLKSIZE;
ST VR0,TEMP;
CALL EDSET,(EDCNTRL,EDRETURN,TWO,TEMP,TEMP,EDLEN); % BLKSIZE
IF <TF EDITF> & ^<MCLC DATA,=C'BINARY',6> THEN BEGIN
CALL EDSET,(EDCNTRL,EDRETURN,SIX,ONE,TEMP,EDLEN);
END
ELSE % NON EDIT FORMAT
CALL EDSET,(EDCNTRL,EDRETURN,SIX,TWO,TEMP,EDLEN);
IF <CLI RFM,C'U'> | <CLI RFM+1,C' '> THEN % UNDEFINED OR UNBLOCKED
CALL EDSET,(EDCNTRL,EDRETURN,ONEOONE,TEMP,RFM,ONE)
ELSE CALL EDSET,(EDCNTRL,EDRETURN,ONEOONE,TEMP,RFM,TWO);
% CALL EDNGEN,(EDCNTRL,EDRETURN,TWO,ONE,ONE); %
END; % ON NON PDS
LOCATE DATASET; % DOES IT EXIST
IF <RZ VRF> THEN BEGIN % DATASET EXISTS
IF ^<TF PDSF> THEN BEGIN
ERRORCON 'Data set already exists';
CCALL ERRPACK,A;
MVI STATE,SESTATE;
EXIT FROM OPENOBLK; % NO FILE
END; % ON NON PDS
END; % OF NO
IF <TF PDSF> THEN BEGIN
MVI OUTSTATS,X'01'; % ANOLD VOLUME
MVI OUTNDISP,X'08'; % DISPOSITION CATALOG
MVI OUTCDISP,X'08'; % DISPOSITION KEEP
END
ELSE BEGIN
MVI OUTSTATS,X'04'; % A NEW VOLUME
MVI OUTNDISP,X'02'; % DISPOSITION CATALOG
MVI OUTCDISP,X'02'; % DISPOSITION CATALOG
END;
IF <MCLC DATA,=C'BINARY'> THEN BEGIN % NO LINE NUMBERS
CALL EDNCOL,(EDCNTRL,EDRETURN,ONE,EDCOL1,EDCOL2);
END % OF BINARY FILE
ELSE BEGIN % TEXT FILE
IF ^<TF EDITF> THEN
CALL EDNCOL,(EDCNTRL,EDRETURN,EDTYPE,EDCOL1,EDCOL2);
IF ^<MCLC EDTYPE,ONE,4> THEN BEGIN
CALL EDNGEN,(EDCNTRL,EDRETURN,TWO,ONETHOU,ONETHOU);
END;
END; % OF TEXT FILE
CCALL KRDYNAL,A; % CALL DYNAL SUB
IF <RNZ VRF> THEN BEGIN % ERROR IN DYNAL
MVI STATE,SESTATE;
EXIT FROM OPENOBLK; % NONE ZERO PROBLEM
END; % OF DYNAL ERROR
CALL EDOPEN,(EDCNTRL,EDRETURN,KERMDDNM,ONEOONE); % OUTPUT
IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN % FILE OPEN FAIL
CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
L VR0,EDLENACT; % LENGTH OF MESSAGE
CCALL ERRPACK,A,VR1=EDLINE; % PUT IN OUTPUT BUFFER
MVI STATE,SESTATE; % ABORT IT
EXIT FROM OPENOBLK;
END
ELSE SF RECVDSNF; % OPEN FLAG INDICATOR
CALL EDSHOW,(EDCNTRL,EDRETURN,ONEOONE,TEMP,EDLINE,EDLMAX2,EDLENACT);
MMVC RRECFM,EDLINE,1; % RETURNED REC FORMAT
CALL EDSHOW,(EDCNTRL,EDRETURN,THREE,TEMP,EDLINE,EDLMAX2,EDLENACT);
MMVC MAXWRITE,TEMP+2,2; % SIZE OF BUFFER
AI XRA,200; % EXTRA SPACE FOR BUFFER
GETMAIN RC,LV=32777,SP=7; % GET MAIN FOR WORKBUFFER
IF <RNZ VRF> THEN BEGIN
ERRORCON ' GET MAIN ERROR - NO ENOUGH REGION FOR RECEIVE BUFFER ';
CCALL ERRPACK,A;
MVI STATE,SESTATE;
END; % OF FAILED GETMAIN
ST VR1,ADDBUF; % ADDRESS OF STORAGE
END; % OF OPENOBLK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'KRDYNAL';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE - R DYNAL
% FUNCTION - PERFORMS DYNAMIC ALLOCATION
% FOR RECEIVE MODULE
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
KRDYNAL:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
ZR VRF; % ZERO REGISTER
IF <TF PDSF> THEN BEGIN % WE HAVE A PDS
MZC LTRK,4; % TRACKS
MZC LPRIME,4;
MZC LSECND,4;
MZC LRLSE,4;
MZC LVLSER,4;
MMVC PDSMEM1,PDSMEM2,4; % INDICATE MEMBER
MMVC PDSORG1,PDSORG2,4;
END % OF PDS
ELSE BEGIN
MZC PDSMEM1,4; % INDICATE NO MEMBER
MZC PDSORG1,4;
MMVC LTRK,TTRK,4; % TRACKS
MMVC LPRIME,TPRIME,4;
MMVC LSECND,TSECND,4;
MMVC LRLSE,TRLSE,4;
L XRA,TMPDISKA;
LH XRB,TMPDISKL;
LA VR1,VOLUME;
IF <EXI XRB,MCLC,0(XRA),0(VR1),*-*,INCR=YES,DECR=YES> THEN BEGIN
AR VR1,XRB; % POINT TO END
LI XRC,6; % VOL LENGTH
SR XRC,XRB; % REMAINING BLANKS
IF <EXI XRC,MCLC,0(VR1),BLANKS,*-*,INCR=YES,DECR=YES> THEN
MZC LVLSER,4 % LET SYSTEM FIND THE VOLUME
ELSE MMVC LVLSER,TVLSER,4;
END
ELSE MMVC LVLSER,TVLSER,4;
END; % OF NON PDS
DO BEGIN
DALLIST BEGIN,MF=(E,NOVOL),INIT=NO; BEGIN % LET SYSTEM SELECT
DALLIST TEXT,DALDDNAM,(KERMDDNM,8); % DDNAME
DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE); % DSNAME
DALLIST TEXT,DALMEMBR,(DSMEMBER,8); % MEMBER NAME
% DALLIST TEXT,DALUNIT,(OUTUNIT,8); % UNIT ADDRESS
DALLIST TEXT,DALSTATS,(OUTSTATS,1); % STATUS
DALLIST TEXT,DALNDISP,(OUTNDISP,1); % NORMAL DISPOSITION
DALLIST TEXT,DALCDISP,(OUTCDISP,1); % CONDITIONAL DISPOSITION
DALLIST TEXT,DALTRK,MF=L; % SPACE IN TRACKS
DALLIST TEXT,DALPRIME,(TRACK+1,3); % PRIMARY SPACE
DALLIST TEXT,DALSECND,(TRACK+1,3); % SECONDARY SPACE
DALLIST TEXT,DALRLSE,MF=L; % RELEASE UNUSED SPACE (RLSE)
DALLIST TEXT,DALRTVOL,(,6); % VOLUME SERIAL NUMBER IS TO BE
DALLIST TEXT,DALDSORG,(PO,2);
DALLIST TEXT,DALVLSER,(VOLUME,6); % VOLUME SERIAL NUMBER
DALLIST END; END;
END;
ST VRF,DACKRC; % RETURN CODE FROM ALLOCATE
DATA BEGIN % DYNAMIC ALLOCATION PARAMETER LIST FOR OUTPUT DATA SET
NOVOL:
DALLIST BEGIN,S99VRBAL,_
FLAGS1=(S99NOMNT),_
ERROR=DEFERR,INFO=DEFINFO,MF=L; BEGIN
DALLIST TEXT,DALDDNAM,(,8); % DDNAME
DALLIST TEXT,DALDSNAM,(,DSNSIZE); % DSNAME
PDSMEM1:
DALLIST TEXT,DALMEMBR,(,8); % PDS MEMBER
% DALLIST TEXT,DALUNIT,(,8); % UNIT ADDRESS
DALLIST TEXT,DALSTATS,(,1); % STATUS
DALLIST TEXT,DALNDISP,(,1); % NORMAL DISPOSITION
DALLIST TEXT,DALCDISP,(,1); % CONDITIONAL DISPOSITION
LTRK: % TRACKS
DALLIST TEXT,DALTRK; % SPACE IN TRACKS
LPRIME:
DALLIST TEXT,DALPRIME,(,3); % PRIMARY SPACE
LSECND:
DALLIST TEXT,DALSECND,(,3); % SECONDARY SPACE
LRLSE:
DALLIST TEXT,DALRLSE,MF=L; % RELEASE UNUSED SPACE (RLSE)
RECVOL:
DALLIST TEXT,DALRTVOL,(,6); % RETURN VOLUME SERIAL
PDSORG1:
DALLIST TEXT,DALDSORG,(,2);
LVLSER:
DALLIST TEXT,DALVLSER,(,6); % VOLUME SERIAL NUMBER
DALLIST END; END;
END;
MMVC TSOVOL,RECVOL+6,6; % RETURNED VOLUME NAME
%END; % OF DEFAULT
DATA BEGIN % A SPECIFIC VOLUME
DO BEGIN
DALLIST BEGIN,MF=(E,MOVEOUT),INIT=NO; BEGIN
DALLIST TEXT,DALDDNAM,(KERMDDNM,8); % DDNAME
DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE); % DSNAME
DALLIST TEXT,DALMEMBR,(DSMEMBER,8); % MEMBER NAME
% DALLIST TEXT,DALUNIT,(OUTUNIT,8); % UNIT ADDRESS
DALLIST TEXT,DALVLSER,(VOLUME,6); % VOLUME SERIAL NUMBER
DALLIST TEXT,DALSTATS,(OUTSTATS,1); % STATUS
DALLIST TEXT,DALNDISP,(OUTNDISP,1); % NORMAL DISPOSITION
DALLIST TEXT,DALCDISP,(OUTCDISP,1); % CONDITIONAL DISPOSITION
DALLIST TEXT,DALTRK,MF=L; % SPACE IN TRACKS
DALLIST TEXT,DALPRIME,(TRACK+1,3); % PRIMARY SPACE
DALLIST TEXT,DALSECND,(TRACK+1,3); % SECONDARY SPACE
DALLIST TEXT,DALRLSE,MF=L; % RELEASE UNUSED SPACE (RLSE)
% FROM DATA SET ASSOCIATED WITH THIS DDNAME
% RETURNED
DALLIST END; END;
END;
ST VRF,DACKRC; % RETURN CODE FROM ALLOCATE
DATA BEGIN % DYNAMIC ALLOCATION PARAMETER LIST FOR OUTPUT DATA SET
MOVEOUT:
DALLIST BEGIN,S99VRBAL,_
FLAGS1=(S99NOMNT),_
ERROR=MOUTERR,INFO=MOUTINFO,MF=L; BEGIN
DALLIST TEXT,DALDDNAM,(,8); % DDNAME
DALLIST TEXT,DALDSNAM,(,DSNSIZE); % DSNAME
PDSMEM2:
DALLIST TEXT,DALMEMBR,(,8); % PDS MEMBER
% DALLIST TEXT,DALUNIT,(,8); % UNIT ADDRESS
TVLSER:
DALLIST TEXT,DALVLSER,(,6); % VOLUME SERIAL NUMBER
DALLIST TEXT,DALSTATS,(,1); % STATUS
DALLIST TEXT,DALNDISP,(,1); % NORMAL DISPOSITION
DALLIST TEXT,DALCDISP,(,1); % CONDITIONAL DISPOSITION
TTRK:
DALLIST TEXT,DALTRK; % SPACE IN TRACKS
TPRIME:
DALLIST TEXT,DALPRIME,(,3); % PRIMARY SPACE
TSECND:
DALLIST TEXT,DALSECND,(,3); % SECONDARY SPACE
TRLSE:
DALLIST TEXT,DALRLSE,MF=L; % RELEASE UNUSED SPACE (RLSE)
PDSORG2:
DALLIST TEXT,DALDSORG,(,2);
DALLIST END; END;
END;
END;
ST VRF,TEMP+4;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
ST VRF,DACKRC; % RETURN CODE FROM ALLOCATE
IF <RNZ VRF> THEN BEGIN % ERROR IN ALLOCATION?
L VR1,NOVOL;
CCALL DYNERR,A; % CALL ERROR SUB
%WRTERM 'Error in Dynamic Allocation REC CMD '_
%'Unable to allocate file ';
%CVBTX TEMP,4,TEMP+4;
%VSEG KERMVA,'Dynamic reg 15 return ';
%VSEG KERMVA,TEMP,4;
%VOUT KERMVA;
%VSEG KERMVA,'The dynamic error code = ';
%CVBTX TEMP,4,MOUTERR;
%VSEG KERMVA,TEMP,4;
%VOUT KERMVA;
%VSEG KERMVA,'The dynamic info code = ';
%CVBTX TEMP,4,MOUTINFO;
%VSEG KERMVA,TEMP,4;
%VOUT KERMVA;
%MVI STATE,ASTATE; % ABORT IT
END;
RDYNEXIT: CEXIT VRE,HIGHR;
LTORG;
EXORG;
PDSORGTL: DC X'003C0001';
PO: DC X'0200'; % PARTIONED DS
SUBTITLE 'DYNERR';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE - DYNERR
% FUNCTION - CALLS MACROS FOR DYNAL ROUTINES
% INPUT VR1-> DYNAL REQUEST BLOCK
% OUTPUT SCREEN INFORMATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
DYNERR:
CENTER VRE,HIGHR,ENTRY=NO;
ST VR1,TEMP; % STORE OFF REGS
VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;
DALMSG DALLIST=TEMP,RC=DACKRC,MF=(E,DALMSG); % OBTAIN TEXT OF
DATA BEGIN
DALMSG: DALMSG MSG1=DAIRMSG1,MSG1LEN=DAIRLEN1,MSG2=DAIRMSG2,_
MSG2LEN=DAIRLEN2,MF=L; % PARAMETER LIST FOR OBTAINING DYNAMIC
END; % OF DATA
% DYNAMIC ALLOCATION ERROR MESSAGE
LH VR0,DAIRLEN1; % GET LENGTH OF FIRST MESSAGE
LR XRA,VR0; % SAVE THE REGISTER
IF <RP VR0> THEN BEGIN % ANY MESSAGE PRESENT?
LA VR1,DAIRMSG1;
UNTIL <CLI 0(VR1),C' '> DO <SI VR0,1; AI VR1,1>;
UNTIL <CLI 0(VR1),C' '; CC NE> DO <SI VR0,1; AI VR1,1>;
CCALL ERRPACK,A;
%IF ^<TF SERVERF> THEN VOUT KERMVA,DAIRMSG1,(VR0); % OF FIRST DYNAMIC
%STH XRA,STATLEN; % STATUS ROUTINE
%LR XRA,VR0; % STATUS REGISTER
%EXI XRA,MMVC,STATBUFF,DAIRMSG1,*-*,INCR=YES,DECR=YES;
%CCALL ERRPACK,A,VR1=STATBUFF; % PUT IT IN ERROR PACK
% ALLOCATION ERROR MESSAGE
END;
LH VR0,DAIRLEN2; % GET LENGTH OF SECOND MESSAGE
IF <RP VR0> THEN BEGIN % ANY MESSAGE PRESENT?
%IF ^<TF SERVERF> THEN VOUT KERMVA,DAIRMSG2,(VR0); %TEXT SECOND DYNAMIC
% ALLOCATION ERROR MESSAGE
END;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'WRITEFIL';
WRITEFIL:
CENTER VRE,HIGHR,ENTRY=NO;
%%%%%%%%%%%%%% PUT TO FILE
LH XRB,BUFCNT; % NUMBER TO PUT
IF <RNM XRB> THEN BEGIN % IF WE HAVE SOMETHING TO PUT
ST XRB,EDLEN; % NUMBER OF CHARACTERS TO PUT
L XRA,ADDBUF; % ADDRESS OF BUFFER
CALL EDPUT,(EDCNTRL,EDRETURN,EDLINEN,EDLINER,(XRA),EDLEN);
IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN % FILE OPEN FAIL
CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
CCALL ERRPACK,A,VR1=EDLINE,VR0=L:EDLENACT; % OUTPUT IT
END;
IF <OPENP DEBUG> THEN BEGIN
DATA BEGIN
DBMSG1: DC C'QSAM PUT';
DS 4CL1; % INCLUDE FOR WORD SIZE
DBMSG1L: EQU *-DBMSG1;
END;
ZR VR1;
LI VR1,DBMSG1L;
STH VR1,WRKBUFF;
MZC WRKBUFF+2,2; % ZERO REST
MMVC WRKBUFF+4,DBMSG1,8;
PUT DEBUG,WRKBUFF; % OUT PUT IT
AI XRB,4; % INCLUDE FOUR FOR HEADER
LR VR1,XRB; % RESTORE LENGTH
IF <CH VR1,DEBUG+(DCBLRECL-IHADCB); CC H> THEN
LH VR1,DEBUG+(DCBLRECL-IHADCB);
IF <CI VR1,255; CC H> THEN <LI VR1,255>;
EXI VR1,MMVC,BUF,(XRA),0,INCR=YES,DECR=YES; % MOVE IT OVER
STH VR1,BUF-4; % STORE OFF LENGTH
MZC BUF-2,2;
PUT DEBUG,BUF-4;
LR VR1,XRB; % RESTORE LENGTH
END; % OF DEBUG
END; % OF SOMETHING TO PUYT
IF <MCLC DATA,=C'TEXT',4> THEN MZC BUFCNT,2; % ZERO BUFFER COUNT
L VR1,ADDBUF;
ST VR1,BUFADD;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KSPACK';
SPACK: % SEND PACKET TO MICRO
CENTER VRE,HIGHR,ENTRY=NO;
LA XRC,SNDPKT;
USE XRC AS PACKET IN BEGIN % ADRESSABLE DSECT
SPACKBLK: DO BEGIN
MMVC MARK,SSOH,1; % MOVE IN SEND START OF HEADER
LENCALC XRB; % CALCULATE THE LENGTH
CHAR XRB;
STC XRB,LEN; % PUT IN LENGTH
UNCHAR XRB; % NUMERIC
AI XRB,1; % ONE MORE FOR THE LENGTH BYTE
SH XRB,BCCLEN; % GET RID OF BCC FOR SUB
LR VR0,XRB; % SET UP FOR SUB
CCALL BCCCALC,A,VR1=LEN; % BCC COMPUTATION SUB
EXIT FROM SPACKBLK IF <C VRF,=X'FFFFFFFF'>; % SOMETHING FUNNY
LENCALC XRB; % LENGTH
AI XRB,2; % INCLUDE FIRST TWO BYTES
LA VR1,PACKET;
SH VR1,BCCLEN;
AR VR1,XRB; % ONE LESS
LH XRA,BCCLEN; % LENGTH FOR STM
SI XRA,1; % DECREMENT FOR EXECUTE
EX XRA,STOREBCC; % ST BCC
L VRF,ATOEVCON;
EXI XRB,MTR,PACKET,0(VRF),*-*,DECR=YES,INCR=YES; % TRANSLATE TO EBCIDIC
IF <OPENP DEBUG> THEN BEGIN % DEBUGGING ON
MZC WRKBUFF,4; % BLAST 1ST 4 BYTES
MVI WRKBUFF+1,20;
MMVC WRKBUFF+4,=C'TPUT SEND PACKET',16;
PUT DEBUG,WRKBUFF;
AI XRB,4; % BUMP LENGTH COUNTER TO INCLUDE HEADER
STH XRB,WRKBUFF;
EXI XRB,MVC,WRKBUFF+4(*-*),PACKET,DECR=YES,INCR=YES;
SI XRB,4; % ADJUST LENGTH BACK TO ORIGINAL
PUT DEBUG,WRKBUFF; % OUTPUT AGAIN
END; % OF DEBUG BLOCK
LA XRA,SNDPKT;
AR XRA,XRB; % LENGTH OF PACKET
MMVC 0(XRA),SEOL,1; % PUT ON EOL CHARACTER
L VRF,ATOEVCON; MTR 0(XRA),0(VRF),1; % TRANSLATE TO EBCIDIC FOR TCAM
AI XRB,1; % BUMP LENGTH FOR PUT
IF <TF STURNRND> THEN BEGIN
STIMER WAIT,BINTVL=STURNTIM;
END;
TPUT SNDPKT,(XRB),CONTROL; % THE BEEF
IF <RNZ VRF> THEN BEGIN
ERRORCON 'Error in Tput to Micro ';
CCALL ERRPACK,A;
END; % OF ERROR OF TPUT
L VRF,ETOAVCON;
EXI XRB,TR,PACKET(*-*),0(VRF),DECR=YES,INCR=YES; % TRANSLATE TO EBCIDIC
END; % OF SPACKBLK
CEXIT VRE,HIGHR;
LTORG;
EXORG;
STOREBCC: MMVC 0(VR1),BCC,*-*; % ST BCC
END; % OF DSECT PACKET
SUBTITLE 'BCCCALC';
BCCCALC: % BCC CHECKING ROUTINE
% VR1 = PACKET ADDRESS
% VR0 = PACKET LENGTH LESS BCC
% VRF = BCC CHECK RETURN
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
LH XRA,BCCLEN; % LEVEL CHECKING
ZR VRF; % ZERO REG TO HOLD BCC
SELECT FIRST;
<CI XRA,1>: BEGIN % LEVEL 1 BCC CHECKING
DO BEGIN
ZR XRB;
IC XRB,0(VR1); % OFFSET 1 FOR MARK
AR VRF,XRB; % BUMP ACCUMULATOR
AI VR1,1; % INCREMENT
END FOR VR0;
ST VRF,TEMP; % STORE OFF FOR ADD
N VRF,=X'000000C0'; % MOD 192
M VRE,ONE; % CARRY OVER SIGN BIT
D VRE,O1H; % MOD 64
A VRF,TEMP; % ADD THE TWO VALUES
N VRF,MOD64; % MOD 64
CHAR VRF;
STC VRF,BCC; % STORE IT OFF
END; % LEVEL 1
<CI XRA,2>: BEGIN % LEVEL 2 BCC CHECKING
%SI XRB,2; % SUB 2 FOR BCC
DO BEGIN
ZR XRB;
IC XRB,0(VR1); % OFFSET 1 FOR MARK
AR VRF,XRB; % BUMP ACCUMULATOR
AI VR1,1; % INCREMENT
END FOR VR0;
LR XRB,VRF; % SAVE OFF TOTAL
% FIRST CHARACTER IN BCC BITS 11-6 OF TOTAL
N XRB,=X'00000FFF'; % TURN OFF ALL BUT 12 BITS
SRL XRB,6; % SHIFT OVER 6 BITS
CHAR XRB; % MAKE IT PRINTALBE
STC XRB,BCC; % STORE OFF 1ST CHARACTER
N VRF,=X'0000003F'; % ONLY LAST 6 BITS
CHAR VRF; % THE CHARACTER FUNCTION
STC VRF,BCC+1; % STORE IT OFF
LA VRF,BCC; % RETURN ADDRESS OF BCC IN VRF
END; % LEVEL 2
<CI XRA,3>: BEGIN % LEVEL 3 CRC CHECKING
ZR VRF; % VRF CRC VALUE - ORIGINALLY 0
DO BEGIN
ZR XRB;
LR XRC,VRF; % GET SET UP FOR XOR
N XRC,=X'000000FF'; % BLAST ALL BUT LAST BYTE
IC XRB,0(VR1); % OFFSET 1 FOR MARK
XR XRC,XRB; % X-OR CRC WITH BYTE
SRL VRF,8; % SHIFT CRC REG 8 BIT TO THE RIGHT
L XRB,CRCCONAD; % CRC CONSTANT TABLE CRC CCITT
AR XRB,XRC;
AR XRB,XRC; % ADD INDEX TWICE SINCE ALL VALUES ARE HALFWORD
ICM XRC,3,0(XRB); % LOAD HALF WORD
N XRC,=X'0000FFFF'; % TURN OFF HIGH ORDER
XR VRF,XRC; % REMAINING CRC VALUE
AI VR1,1; % INCREMENT
END FOR VR0;
LR XRB,VRF; % SAVE OFF TOTAL
% FIRST CHARACTER IN CRC BITS 11-6 OF TOTAL
N XRB,=X'0000FFFF'; % TURN OFF ALL BUT 16 BITS
SRL XRB,12; % SHIFT OVER 12BITS
CHAR XRB; % MAKE IT PRINTALBE
STC XRB,BCC; % STORE OFF 1ST CHARACTER (B12-B15)
LR XRB,VRF; % RESTORE REGISTER
% SECOND CHARACTER IN CRC BITS 11-6 OF TOTAL
N XRB,=X'00000FFF'; % TURN OFF ALL BUT 12 BITS
SRL XRB,6; % SHIFT OVER 6 BITS
CHAR XRB; % MAKE IT PRINTALBE
STC XRB,BCC+1; % STORE OFF 2ND CHARACTER
N VRF,=X'0000003F'; % ONLY LAST 6 BITS
CHAR VRF; % THE CHARACTER FUNCTION
STC VRF,BCC+2; % STORE IT OFF
LA VRF,BCC; % RETURN ADDRESS OF BCC IN VRF
END; % LEVEL 3
ENDSEL; % CRC SELECTION
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
BCCEXIT: CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CHKETOA';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: CHKETOA
% FUNCTION: CHECKS EBCDIC TEXT FILE FOR UNVALID ASCII CHARACTERS
% INPUT: VR1=>POINTS TO STRING
% VR0= LENGTH OF STRING / ALWAYS LESS THAN 256
% OUTPUT: MESSAGE OUTPUT-FLAGS SET
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CHKETOA:
CENTER VRE,HIGHR,ENTRY=NO;
LR XRB,VR0; % LENGTH FOR EXECUTE
ZR XRA;
LR VRF,VR1; % POINT OT STRING
L XRC,ETOAERRV; % ADDRESS OF ETOA ERROR TABLE
EXI XRB,MTRT,0(VRF),0(XRC),*-*,INCR=YES,DECR=YES;
IF <RNZ XRA> THEN BEGIN
SF WARNINGF;
MVC WARNBUFF,=C'EDCDIC characterdoes not have ASCII equivalent.';
MMVC WARNLEN,=H'48',2;
END; % OF TRANSLATE ERROR
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'STOPPROC';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : STOPPROC
% FUNCTION : CLOSES OPENED DATA SEST KERIN
% OR KEROUT - USER ENTERED STOP
% INPUT: NONE
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
STOPPROC:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
IF <TF SENDDSNF> THEN CCALL CLOSESDS,A;
IF <TF RECVDSNF> THEN CCALL CLOSERDS,A;
ZF STOPF; % RESET STOP FLAG
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'SABORT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : SABORT
% FUNCTION : SENDS AN ABORT PACKET TO THE OTHER KERMIT
% DATA OF PACKET ALREADY ENTERED
% INPUT: NONE
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SABORT:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
STH VR0,TEMP;
IF <MCLC OLDTRY,RETRY,4; CC NL> |
<MCLC NUMTRY,RETRY,4; CC NL> THEN BEGIN % Retry exceeded
ERRORCON 'Retry count exceeded - transfer aborted';
CCALL ERRPACK,A; % PUT IT IN BUFFER
END; % OF EXCEEDED RETRY
SPSPACK AE,TEMP,PUTLEN,VR0; % INIT SEND BUFFER
CCALL SPACK,A; % FIRE AWAY
CCALL STOPPROC,A; % CLOSES FILES
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'RABORT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : RABORT
% FUNCTION : ACKS AN ABORT PACKET RECEIVED FROM THE OTHER KERMIT
% MOST DON'T REQUIRE THIS BUT JUST IN CASE
% INPUT: NONE
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
RABORT:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
SPSPACK AY,SEQNUM,ZERO,VR0; % INIT SEND BUFFER
CCALL SPACK,A; % FIRE AWAY
LH VR0,RECLEN;
IF <CI VR0,255; CC H> THEN LI VR0,255;
IF <RP VR0> THEN BEGIN
LR XRB,VR0;
L XRA,ATOEVCON; EXI XRB,MTR,RDATA,0(XRA),*-*,DECR=YES;
END;
IF <RP VR0> THEN CCALL ERRPACK,A,VR1=RDATA; % PUT IN STATUS BUFFER
CCALL STOPPROC,A;
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'CLOSESDS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : CLOSESDS
% FUNCTION : CLOSES AND DEALLOCATES THE DATA SET KERIN
% CALLED BY SEND FUNCTIONS AND ABORT PROCESSING
% INPUT: NONE
%
%
% OUTPUT : NONE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLOSESDS:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
IF <TF SENDDSNF> THEN BEGIN % CLOSE INPUT FILE
CALL EDCLOS,(EDCNTRL,EDRETURN); % CLOSE INPUT FILE
ZF SENDDSNF; % OPEN FILE INDICATOR
END; % OF CLOSE KERIN
LA XRB,DSNAME; % GET ADDRESS OF DSNAME
DALLIST BEGIN,MF=(E,UALLOCDS),INIT=NO; BEGIN
DALLIST TEXT,DALDDNAM,(KERMDDNM,8); % DDNAME
DALLIST TEXT,DUNUNALC,MF=L; % FORCE UNALLOCATION
DALLIST END; END;
DATA BEGIN % DYNAMIC ALLOCATION PARAMETER LIST FOR
% UNALLOCATION BY DSNAME
UALLOCDS:
DALLIST BEGIN,S99VRBUN,MF=L; BEGIN
DALLIST TEXT,DALDDNAM,(,8); % DDNAME
DALLIST TEXT,DUNUNALC; % FORCE UNALLOCATION
DALLIST END; END;
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CLOSERDS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : CLOSERDS
% FUNCTION : CLOSES THE DATA SET KEROUT USED BY RECEIVE
% THE UPLOADED FILE, CALLS RECUNAL FOR DEALLOCATION
% INPUT: NONE
%
%
% OUTPUT : NONE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLOSERDS:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
IF <TF RECVDSNF> THEN BEGIN % CLOSE INPUT FILE
CALL EDCLOS,(EDCNTRL,EDRETURN); % CLOSE INPUT FILE
ZF RECVDSNF;
L XRA,TMPDISKA;
LH XRB,TMPDISKL;
IF <EXI XRB,MCLC,VOLUME,0(XRA),*-*,INCR=YES,DECR=YES> &
<MCLC STATLEN,=H'0',2> THEN DO BEGIN
%VINIT KERMVA,L:ADDSTATA,KERMBUFF,L'KERMBUFF;
%VSEG KERMVA,'Data set ';
MMVC TMPDSN,DSNAME,44;
EXIT IF <CLI STATE,SESTATE> | <CLI STATE,RESTATE>;
MMVC TMPVOL,TSOVOL,6; % RETURN ED VOL SERIAL NUMBER
LI VR0,TMPMSL;
CCALL ADSTATUS,A,VR1=TMPDSMES;
%VOUT KERMVA;
END; % OF DEFAULT
END; % OF CLOSE KEROUT
CCALL RECUNAL,A; % UNALLOCATE DS
FREEMAIN RU,SP=7; % FREE THE BUFFER ATTEMPT % %NO; ON ORG CHECK
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KERMTGET';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : KERMTGET
% FUNCTION: TIMER ON ALL READS THIS SUB IS ATTACHED
% ECB'S CONTROL TIMING FLOW
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KERMTGET:
OSENTER (14,12);
L XRF,PARMADD2; % SET UP BASE REGISTER
L XRB,STAXADD; % PARMETER EXIT ROUTINE ADDRESS
L XRC,STAXLADD; % PARM LIST ADDRESS
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
FOREVER DO BEGIN % LOOP ALL DAY
WAIT ECB=ECBREAD;
MZC ECBREAD,4; % ZERO ECB
L VR1,TGETBUFA; % ADDRESS OF BUFFER TO PUT IN
LI VR0,32767; % MAX VALUE OF TGET ( ALTHOUGH TCAM'S 4 K)
TGET (VR1),(VR0),ASIS;
IF <RZ VRF> | <CI VRF,18> THEN ST VR1,TGETLEN % LENGTH OF RECEIVED
ELSE BEGIN % ERROR
ZR VRF;
SI VRF,1;
ST VRF,TGETLEN;
END;
POST ECBTGET,ECBTREAD; % TELL EM WE READ IT
END; % OF FOREVER DO
OSEXIT (14,12);
LTORG;
PARMADD2: DC A(PARMS); % ADDRESS OF STORAGE
SUBTITLE 'ERRPACK';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: ERRPACK
% FUNCTION: SEND ERROR PACKETS
% INPUT: R1-> MESSAGE STRING
% VR0=LENGTH OF MESSAGE
% OUTPUT: PRESPARED AND SEND PACKET
% MAYBE WAIT ONt( NACK THEN BLOCK OFF
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ERRPACK:
CENTER VRE,HIGHR,ENTRY=NO;
IF <CH VR0,MAXPUT; CC H> THEN LH VR0,MAXPUT; % IN CASE TOO BIG
DEBLANK VR1,VR0,XRA,BOTH; % DEBLANK ERROR PACKET
% SET UP DSECT FOR SEND PACKET
LR XRA,VR0; % LENGTH FOR EXECUTE
EXI XRA,MMVC,PDATA,0(VR1),*-*,INCR=YES,DECR=YES;
STH XRA,PUTLEN;
EXI XRA,MMVC,STATBUFF,PDATA,*-*,INCR=YES,DECR=YES; % FINAL STATUS
STH XRA,STATLEN; % LENGTH OF BUFFER
L XRB,ETOAVCON;
EXI XRA,TR,PDATA(*-*),0(XRB),DECR=YES,INCR=YES; % TRANSLATE TO ASCII
MVI PTYPE,ACOMLIT; % ABORT LITERAL INTO PACKET
%
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'ATOEERRS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: ATOEERRS
% FUNCTION: SETS ERROR BUFFER FOR ASCII TO EBCDIC CONVERSION MESSAGE
% INPUT: NONE
%
% OUTPUT: NONE
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ATOEERRS:
CENTER VRE,HIGHR,ENTRY=NO;
SF WARNINGF;
MVC WARNBUFF,=C'Invalid characters for ASCII to EBCDIC translation.';
MMVC WARNLEN,=H'51',2;
SF WARNTPCK ;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'ATOE8BIT';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: ATOE8BIT
% FUNCTION: SETS ERROR BUFFER FOR ASCII TO EBCDIC CONVERSION MESSAGE
% INPUT: VR1=> CHARACTER
%
% OUTPUT: CHARACTER CONVERSION
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ATOE8BIT:
CENTER VRE,HIGHR,ENTRY=NO;
SF WARNINGF;
MVC WARNBUFF,=C'Eighth bit on for ASCII to EBCDIC translation.';
MMVC WARNLEN,=H'47',2;
SF WARNTPCK ;
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'CHKCNTL';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MODULE : CHKCNTL
% FUNCTION : CHECKS A NUMBER FOR A VALID QUOTE CHARACTER
% CHECKS RANGE AND OTHER QUOTES
% INPUT: VRF= NUMBER (BINARY) VR0=1 - CQUOTE
% VR0=2 - BQUOTE VR0=3 RQUOTE
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CHKCNTL:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
SELECT FIRST;
<CLM VRF,1,QUOCHAR>: % User entered same just fall through
BEGIN
IF ^<CI VR0,1> THEN % QUOTE CHARACTER
WRTERM _
'Character entered matches CQUOTE character. Change it first.';
ZR VRF;
END;
<CLM VRF,1,BINQC>: BEGIN % User entered Quote like other
IF ^<CI VR0,2> THEN % BQUOTE CHARACTER
WRTERM _
'Character entered matches BQUOTE character. Change it first.';
ZR VRF;
END;
<CLM VRF,1,REPTCHAR>: BEGIN % User entered Quote like other
IF ^<CI VR0,3> THEN % CQUOTE CHARACTER
WRTERM _
'Character entered matches RQUOTE character. Change it first.';
ZR VRF;
END;
<<CI VRF,32; CC L> | % Check whether number is in range
<<CLI VRF,63; CC H> & <CLI VRF,95; CC L>>>: ; % ILLEGAL JUST FALL OUT
ENDSEL
ELSE BEGIN % We actually have a good quote character
% Now take old values out of tables
SELECT FIRST; % NOW PICK UP CHARACTER THAT WE'RE QUOTING
<CI VR0,1>: LA XRA,QUOCHAR;
<CI VR0,2>: LA XRA,BINQC;
<CI VR0,3>: LA XRA,REPTCHAR;
ENDSEL;
LOADB VR0,0(XRA);
LA VR1,SENDTBL;
AR VR1,VR0; % POINT TO PLACE IN TABLE
MVI 0(VR1),0; % QUOTE FOR HASH IN TABLE
AI VR1,X'80'; % POINT TO HIGH ORDER
MVI 0(VR1),ASCI8BIT;
LA VR1,RECTABLE;
AR VR1,VR0; % POINT TO PLACE IN TABLE
MVI 0(VR1),0; % QUOTE FOR HASH IN TABLE
STC VRF,0(XRA); % STORE THE QUOTE CHARACTER
ZR VRF; % INDICATE GOOD RETURN
END;
USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'KSTATUS ';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: KSTATUS
% FUNCTION: OUTPUT A MESSAGE TO THE TERM CONCERNING WARNINGS
% AND THE FINAL COMPLETION CODE OF THE PROGRAM
% INPUT: STATBUFF CONTAINS THE MESSAGE
% STATLEN IS THE LENGTH OF MESSAGE
% OUTPUT: SCREEN MESSAGE
% RETURN : NONE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
KSTATUS:
CENTER VRE,HIGHR,ENTRY=NO;
VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;
VSEG KERMVA,' TSO KERMIT Status Report';
VOUT KERMVA; % OUTPUT HEADER FOR STATUS REPORT
IF <TF WARNINGF> THEN BEGIN % WARNINGS ISSUED
LA VR1,WARNBUFF;
LH VR0,WARNLEN;
VSEG KERMVA,(VR1),(VR0);
VOUT KERMVA; % OUTPUT IT TO SCREEN
END;
LA VR1,STATBUFF;
LH VR0,STATLEN;
IF <RZ VR0> THEN VSEG KERMVA,SUCESSCC,L'SUCESSCC % GOOD RETURN
ELSE VSEG KERMVA,(VR1),(VR0);
VOUT KERMVA; % OUTPUT IT TO SCREEN
CEXIT VRE,HIGHR;
LTORG;
EXORG;
SUBTITLE 'SETCNTLS';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MOD: SETCNTLS
% FUNCTION: SCAN FOR "^" FORMAT SET PARAMETERS
% (E.G. ^A = =X'01' )
% INPUT: VR1=> STRING
% VR0=LENGTH
% OUTPUT: VRF= CONVERTED NUMBER - NEGATIVE NUMBERS= ILLEGAL
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SETCNTLS:
CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
SCPUSH;
ZR VRF;
SCINIT (VR1),(VR0); % REINITIALIZE SCANNER
SCAN *;
SCKW ,STORCNTL,I,LIMIT=AL1(32); % HIGHEST NUMBER
SCKW ^,CNTLETTR; % A CNTL LETTER (E.G. ^A = X'01')
SCKW NUL,*,CODE=AL1(0);
SCKW SOH,*,CODE=AL1(1);
SCKW STX,*,CODE=AL1(2);
SCKW ETX,*,CODE=AL1(3);
SCKW EOT,*,CODE=AL1(4);
SCKW ENQ,*,CODE=AL1(5);
SCKW ACK,*,CODE=AL1(6);
SCKW BEL,*,CODE=AL1(7);
SCKW BS,*,CODE=AL1(8);
SCKW HT,*,CODE=AL1(9);
SCKW LF,*,CODE=AL1(10);
SCKW VT,*,CODE=AL1(11);
SCKW FF,*,CODE=AL1(12);
SCKW CR,*,CODE=AL1(13);
SCKW SO,*,CODE=AL1(14);
SCKW SI,*,CODE=AL1(15);
SCKW DLE,*,CODE=AL1(16);
SCKW DC1,*,CODE=AL1(17);
SCKW DC2,*,CODE=AL1(18);
SCKW DC3,*,CODE=AL1(19);
SCKW DC4,*,CODE=AL1(20);
SCKW NAK,*,CODE=AL1(21);
SCKW SYN,*,CODE=AL1(22);
SCKW ETB,*,CODE=AL1(23);
SCKW CAN,*,CODE=AL1(24);
SCKW EM,*,CODE=AL1(25);
SCKW SUB,*,CODE=AL1(26);
SCKW ESC,*,CODE=AL1(27);
SCKW FS,*,CODE=AL1(28);
SCKW GS,*,CODE=AL1(29);
SCKW RS,*,CODE=AL1(30);
SCKW US,*,CODE=AL1(31);
SCKW ,*,CODE=AL1(-1); % ILLEGAL VALUE
SCANEND;
DATA BEGIN % START OF ANTHER SCAN
CNTLETTR: ;
SCPOP;
SCTELL;
IF <CI VR0,1> THEN BEGIN % IS THERE ONE CHARACTER
SCINIT (VR1),(VR0);
SCAN *;
SCKW @,*,CODE=AL1(0);
SCKW A,*,CODE=AL1(1);
SCKW B,*,CODE=AL1(2);
SCKW C,*,CODE=AL1(3);
SCKW D,*,CODE=AL1(4);
SCKW E,*,CODE=AL1(5);
SCKW F,*,CODE=AL1(6);
SCKW G,*,CODE=AL1(7);
SCKW H,*,CODE=AL1(8);
SCKW I,*,CODE=AL1(9);
SCKW J,*,CODE=AL1(10);
SCKW K,*,CODE=AL1(11);
SCKW L,*,CODE=AL1(12);
SCKW M,*,CODE=AL1(13);
SCKW N,*,CODE=AL1(14);
SCKW O,*,CODE=AL1(15);
SCKW P,*,CODE=AL1(16);
SCKW Q,*,CODE=AL1(17);
SCKW R,*,CODE=AL1(18);
SCKW S,*,CODE=AL1(19);
SCKW T,*,CODE=AL1(20);
SCKW U,*,CODE=AL1(21);
SCKW V,*,CODE=AL1(22);
SCKW W,*,CODE=AL1(23);
SCKW X,*,CODE=AL1(24);
SCKW Y,*,CODE=AL1(25);
SCKW Z,*,CODE=AL1(26);
SCKW [,*,CODE=AL1(27);
SCKW \,*,CODE=AL1(28);
SCKW ],*,CODE=AL1(29);
SCKW ,*,CODE=AL1(30);
SCKW _,*,CODE=AL1(31);
SCKW ,*,CODE=AL1(-1);
SCANEND;
END % OF ONE CHARACTER TO SCAN
ELSE <ZR VRE; SI VRE,1>; % ERROR RETURN
SCPUSH;
END; % OF BLOCK
LR VRF,VRE; % LOAD VALUE IN RETURN REGISTER
STORCNTL: USE WAR AS WA IN ST VRF,WAVRF; % STORE VRF
SCPOP; % RESTORE SCANNER
CEXIT VRE,HIGHR;
LTORG;
SUBTITLE 'DSECTS AND BIG BUFFERS';
NOTOUCH: DC F'0'; % WORD FOR LRECL
BUF: DS CL32000; % DISK READ INTO HERE;
TGETBUFF: DS CL33000; % LENTH OF TGET BUFFER
USERWORK: AREA H,DSECT=NO;
LENWK: DC H'32004'; % LENGTH OF WORKAREA
DATALEN: DC H'0'; % LENGTH OF RETURNED DATA
RETURNDS: DS CL32000; % DATA SET NAME
VOLJUNK: DC 15AL1(0); % VOL INFO
AREAEND;
NOQUOTE: AREA F,DSECT=NO;
DC 256AL1(0); % TABLE FOR NON QUOTED CHARACTERS
AREAEND;
% DSECTS FOR PACKETS
PACKET: AREA F,DSECT=YES;
MARK: DS X; % ^A SOH CHARACTER
LEN: DS X; % LENGTH OF PACKET-2
SEQ: DS X; % 0-63 (MOD 64) SEQUENCE NUMBER
TYPE: DS X; % PACKET TYPE
DATABUFF: DS CL92; % MAX PACKET DATABUFF
PACKETL: AREAEND;
SPACKET: AREA F,DSECT=YES;
SMARK: DS X; % ^A SOH CHARACTER
SLEN: DS X; % LENGTH OF PACKET-2
SSEQ: DS X; % 0-63 (MOD 64) SEQUENCE NUMBER
STYPE: DS X; % PACKET TYPE
SDATABUF: DS CL92; % MAX PACKET DATABUFF
SPACKETL: AREAEND;
SENDIDST: AREA H,DSECT=YES;
MAXL: DS X; % MAX PACKET LENGTH MAX 94
TIME: DS X; % TIMEOUT FOR RECIEVER
NPAD: DS X; % NUMBER OF PAD CHARS (0)
PADC: DS X; % THE CONTROL CHAR OF PAD
EOLCHAR: DS X; % CHARACTER TO TERMINATE IN PACK
QCTL: DS X; % ASCII QUOTE CHAR
QBIN: DS X; % ASCII BIN QUOTE CHAR
CHKT: DS X; % CHARACTER CHECKING
REPT: DS X; % PREFIX REPEAT CHAR
CAPA1: DS X; % CAPABILITIES
SENDINIL: AREAEND;
%%DSECTS END
RECINIT: AREA H,DSECT=YES;
RMAXL: DS X; % MAX PACKET LENGTH MAX 94
RTIME: DS X; % TIMEOUT FOR RECIEVER
RNPAD: DS X; % NUMBER OF PAD CHARS (0)
RPADC: DS X; % THE CONTROL CHAR OF PAD
REOLCHAR: DS X; % CHARACTER TO TERMINATE IN PACK
RQCTL: DS X; % ASCII QUOTE CHAR
RQBIN: DS X; % ASCII BIN QUOTE CHAR
RCHKT: DS X; % CHARACTER CHECKING
RREPT: DS X; % PREFIX REPEAT CHAR
RCAPA1: DS X; % CAPABILITIES
RECINIL: AREAEND;
DCBD: AREA F,DSECT=YES;
DCBD DSORG=(PS),DEVD=DA;
DCBDL: AREAEND;
CATDSET: AREA ,DSECT=YES;
TYPEBYTE: DS XL1; % TYPE BYTE WE WANT ONLY A'S
CATDNAME: DS 44CL1; % DATA SET NAME
AREAEND;
END;