home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / ibmtsonih / tsnker.alp < prev    next >
Text File  |  2020-01-01  |  236KB  |  8,104 lines

  1. KERMIT: TITLE 'NIH TSO KERMIT';
  2. SUBTITLE 'MACRO DEFINITIONS';
  3. MACRO &&L: CHAR &®  % MAKES INTEGER PRINTABLE
  4. &&L:
  5.     AI &®,32;
  6. MEND;
  7. MACRO &&L: BCCTYPE &&LIT;  % SETS BLOCK CHECK TYPE
  8. &&L:
  9. MVI LEVELCK,&&LIT;  % BCC LEVEL CHECKING
  10. MVI BCCLEN+1,&&LIT;
  11. MEND;
  12.  
  13. MACRO &&L: BUMPSEQ &®  % INCREMENTS SEQUENCE NUMBER
  14. &&L:
  15. LH &®,SEQNUM;  % GET PREVIOUS SEQ NUMBER
  16. STH &®,OLDSEQ;
  17. AI &®,1;  % INCREMENT IT
  18. N  &®,MOD64;  % GET  MOD 64
  19. STH &®,SEQNUM;
  20. MEND;
  21.  %   SPSPACK - PASS PARAMETERS TO SPACK
  22. MACRO &&L: SPSPACK &&PTYPE,&&PNUM,&&SDATALEN,&®  % n
  23. &&L:
  24. MVI PTYPE,&&PTYPE;  % PACKET TYPE
  25. LH &®,&&PNUM;
  26. CHAR &®  % MAKE IT A CHARACTER
  27. STC &®,PNUM;
  28. MMVC PUTLEN,&&SDATALEN,2;  % DATA LEN OF SEND PACK
  29. MEND;
  30.  
  31. MACRO &&L: RPSPACK &&SMARK,&&PTYPE,&&PNUM,&&SDATALEN,&&PTRDATA;  % n
  32. &&L:
  33. MMVC &&SMARK,SSOH;  % SOH PACKET FOR PACKET
  34. MEND;
  35. MACRO &&L: BUMPRTRY &®  % INCREMENT RETRY
  36. &&L:
  37. L &®,NUMTRY;  % GET RETRY COUNT
  38. AI &®,1;  % INCREMENT BY 1
  39. ST &®,NUMTRY;
  40. MEND;
  41. MACRO &&L: BUMPOTRY &®  % INCREMENT RETRY
  42. &&L:
  43. L &®,OLDTRY;  % GET RETRY COUNT
  44. AI &®,1;  % INCREMENT BY 1
  45. ST &®,OLDTRY;
  46. MEND;
  47. MACRO &&L: ZEROSEQ;  % ZERO OUT  RETRY
  48. &&L:
  49. MVI OLDSEQ,0;
  50. MVI OLDSEQ,63;  % FORMER NUMBER
  51. MZC SEQNUM,L'SEQNUM;  % GET RETRY COUNT
  52. MEND;
  53. MACRO &&L: ZERORTRY;  % ZERO OUT  RETRY
  54. &&L:
  55. MMVC OLDTRY,NUMTRY,4;
  56. MZC NUMTRY,L'NUMTRY;  % GET RETRY COUNT
  57. MEND;
  58.  
  59. MACRO &&L: ZEROSDAT;  % ZERO OUT  LENGTH OF DATA TO PUT
  60. &&L:
  61. MZC PUTLEN,2;  % ZERO LENGTH OF DATA TO PUT
  62. MEND;
  63.  
  64. MACRO &&L: LENCALC &®1;
  65. &&L:
  66. LH &®1,BCCLEN;  % LEN OF BCC
  67. AH &®1,PUTLEN;
  68. AI &®1,YLEN;  % HEADER LENGTH
  69. MEND;
  70.  
  71. MACRO &&L: MAKESLEN &&LIT,&®1;
  72. &&L:
  73. LI &®1,&&LIT;  % GET THE LITERAL
  74. STH &®1,PUTLEN;
  75. MEND;
  76.  
  77. MACRO &&L: UNCHAR &®  % TRANSFORMS PRINTABLE TO INTEGER
  78. &&L:
  79.     SI  &®,32;
  80. MEND;
  81. MACRO &&L: PACKTYPE &&LIT;  % MOVES PACKET TYPE   USED BY SPACK
  82. &&L:
  83.     MVI TYPE,&&LIT;
  84. MEND;
  85.  
  86. MACRO &&L: CNTLLOC &&STORAGE;  % MAKES CNTL CHAR PRINT
  87. &&L:
  88. XI &&STORAGE,X'40';
  89. MEND;
  90.  
  91. MACRO &&L: MOVEALL;  % MOVE ALL DATA
  92. &&L:
  93. LR VR0,VR1;
  94. SR VR0,XRB;  % LENGTH
  95. LR VR1,XRB;  % SET UP POINTER FOR SUB
  96. CCALL PUTEM,A;  % SUB PUTS IN
  97. AR VR1,VR0;  % VR1-> BACK WHERE WAS
  98. %LH XRB,RDATALEN;
  99. %SR XRB,VR0;
  100. %STH XRB,RDATALEN;  % UPDATE GET LENGTH
  101. DECREGDD XRB,VR0;  % DECREMENT COUNTER
  102.  
  103. MEND;
  104.  
  105.  
  106. MACRO &&L: ACKIT &®  % ACKNOWLEDGE PACKET
  107. &&L:
  108. MMVC PNUM,RSEQ,1;  % MOVE SEQUENCE NUMBER
  109. ADCONLEN &®,YLEN,PLEN;  % COMPUTE LENGTH
  110. MVI PTYPE,YCOMLIT;  % YACK TYPE
  111. CCALL SPACK,A;
  112. ZR &®
  113. IC &®,RSEQ;  % GET SEQUENCE NUMBER
  114. UNCHAR &®  % MAKE INTEGER
  115. STH &®,RECSEQ;  % STORE OFF COUNTER
  116. MEND;
  117.  
  118. MACRO &&L: NACKIT &®  % NEGATIVE ACKNOWLEDGE PACKET
  119. &&L:
  120. MMVC PHDR,SSOH;  % PUT IN START OF HEADER
  121. MMVC PNUM,RSEQ,1;  % MOVE SEQUENCE NUMBER
  122. ADCONLEN &®,NLEN,PLEN;  % COMPUTE LENGTH
  123. MVI PTYPE,NCOMLIT;  % NACK TYPE
  124. CCALL SPACK,A;
  125. MEND;
  126. MACRO &&L: NACKPACK &&SEQ,&®  % NEGATIVE ACKNOWLEDGE PACKET
  127. &&L:
  128. SPSPACK AN,&&SEQ,ZERO,&®  % N PACKET,SEND PARAMETERS FOR SPACK
  129. CCALL SPACK,A;
  130. MEND;
  131. MACRO &&L: SERVNACK &®  % NEGATIVE ACKNOWLEDGE PACKET
  132. &&L:
  133. MMVC PHDR,SSOH;  % PUT IN START OF HEADER
  134. MVI PNUM,X'20';  % MOVE SERVER 0 NUMBER
  135. ADCONLEN &®,NLEN,PLEN;  % COMPUTE LENGTH
  136. MVI PTYPE,NCOMLIT;  % NACK TYPE
  137. CCALL SPACK,A;
  138. MEND;
  139. MACRO &&L: ACKPACK &&SEQ,&®  % POSTIVE ACKNOWLEDGE PACKET
  140. &&L:
  141. SPSPACK AY,&&SEQ,ZERO,&®  % N PACKET,SEND PARAMETERS FOR SPACK
  142. CCALL SPACK,A;
  143. MEND;
  144.  
  145. MACRO &&L: ZAP8BIT &&STORAGE;  % MAKES CNTL CHAR PRINT
  146. &&L:
  147. NI &&STORAGE,X'7F';
  148. MEND;
  149.  
  150. MACRO &&L: CNTLREG &®
  151. &&L:
  152.     X &®,O1H;  % XOR '64'
  153. MEND;
  154. MACRO &&L: ADCONLEN &®1,&&LITEQU,&&PACLEN;
  155. &&L:
  156. LI &®1,&&LITEQU;
  157. % CHAR &®1;  % MAKE IT ALPHA INTEGER
  158. MMVC PUTLEN,=X'0000',2;
  159. STC &®1,&&PACLEN;
  160. MEND;
  161.  
  162. MACRO &&L: DECRDATA &®1,&&LIT;
  163. &&L:     % THIS MACRO DECREMENT RDATALEN + UPDATES RDATAADD
  164. LH &®1,RDATALEN;
  165. SI &®1,&&LIT;
  166. STH &®1,RDATALEN;
  167. L &®1,RDATAADD;
  168. AI &®1,&&LIT;
  169. ST &®1,RDATAADD;
  170. MEND;
  171.  
  172. MACRO &&L: DECREGDD &®1,&®2;
  173. &&L: %THIS MACRO DECREMENT RDATALEN UPDATES RDATAADD USING REGISTERS
  174. L &®1,RDATAADD;
  175. AR &®1,&®2;
  176. ST &®1,RDATAADD;
  177. LH &®1,RDATALEN;
  178. SR &®1,&®2;
  179. STH &®1,RDATALEN;
  180. MEND;
  181. BAL;  % FOR MACRO DEFINITIONS
  182.          MACRO
  183. &LAB     WRTERM &MSG
  184.          LCLC   &MS
  185.          LCLA   &LN
  186. &MS      SETC  '&MSG'
  187. &LN      SETA  K'&MS
  188. &LN      SETA  &LN-2
  189. &LAB     TPUT =C&MS,&LN
  190.          MEND
  191.          MACRO
  192. &LAB     ERRORCON &MSG
  193.          LCLC   &MS
  194.          LCLA   &LN
  195. &MS      SETC  '&MSG'
  196. &LN      SETA  K'&MS
  197. &LN      SETA  &LN-2
  198. &LAB     LA 1,=C&MS
  199.          LA 0,&LN
  200.          MEND
  201.          MACRO
  202. &LAB     PROMPT &MSG
  203.          LCLC   &MS
  204.          LCLA   &LN
  205. &MS      SETC  '&MSG'
  206. &LN      SETA  K'&MS
  207. &LN      SETA  &LN-2
  208. &LAB     TPUT =C&MS,&LN,ASIS
  209.          MEND
  210.          MACRO
  211.          RDTERM &BUFF
  212.          TGET &BUFF,130
  213.          MEND
  214. ALP;
  215. SUBTITLE 'DEFINITIONS';
  216. COPY CPARMGBL;  % COPY GLOBAL SYMBOLS
  217. KERMIT: CSETUP MDC=YES,S99=YES;
  218.  
  219. SPLEVEL SET=1;  % INSURE MVS/370 MACRO EXPANSIONS
  220. EJECT;
  221. WA: AREA; BEGIN
  222. CSA VRE,HIGHR,EQU=(WAVRF,VRF);
  223. WASIZE: AREAEND; END;
  224. EJECT;
  225. IKJCPPL;
  226. IKJLSD;
  227. IKJGTPB;
  228. IKJUPT;
  229. IKJPSCB;
  230. IKJTAIE;
  231. KERMIT: CSECT;
  232. EJECT;
  233. AD: EQU 68;  % DATA PACKET (ASCII 'D')
  234. AN: EQU 78;  % NAK
  235. AZ: EQU 90;  % EOF PACKET
  236. AS: EQU 83;  % INIT PACKET
  237. AY: EQU 89;  % ACK
  238. AF: EQU 70;  % FILE PACKET
  239. AB: EQU 66;  % BREAK PACKET
  240. AE: EQU 69;  % ERROR PACKET
  241. AX: EQU 88;
  242.  
  243. ERCOD: EQU 12;  % MEANS EOF WITH 'FSREAD'
  244.  
  245. FLG1: EQU X'80';  % IS FILE THE FIRST OR NOT
  246. FLG2: EQU X'40';  % OVERWRITE SENT FILENAME?
  247. FLG3: EQU X'20';  % ONE = SENT ONLY PARTIAL RECORD
  248. FLG4: EQU X'10';  % NAK FROM MICRO(0) OR RPACK(1)?
  249. FLG5: EQU X'08';  % ALLOCATED MORE SPACE (DMSFREE)
  250. FLGBIN: EQU X'04';  % BINARY FILE TRANSFER
  251.  
  252. BIT8ON: EQU X'80';  % MASK FOR CHECKING AND TURNING
  253. BIT8OFF: EQU X'7F';  % BITS ON OR OFF !!
  254.  
  255. QUOTEYES: EQU X'01';  % SWITCH FOR EIGHT BIT QUOTING
  256. FILEWRIT: EQU X'80';  % FILE WRITE OCCURRED ?
  257. SUBTITLE 'KERMCNTL';
  258. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  259. %
  260. %     MODULE NAME   -   KERMCNTL
  261. %
  262. %
  263. %     FUNCTION-  THE DRIVER MODULE FOR KERMIT TSO
  264. %
  265. %
  266. %
  267. %     INPUTS -   NONE
  268. %
  269. %
  270. %
  271. %
  272. %     OUTPUTS-   KERMIT PROCESSING COMPLETED
  273. %
  274. %
  275. %     RETURN
  276. %
  277. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  278.  
  279. OSENTER (14,12),SAVE=SAVECNTL,FORWARD=YES;
  280. L XRF,PARMSADD;
  281. LA XRG,4095(,XRF);  % SET UP STORAGE BASE REGS
  282.  
  283.          USING PARMS,XRF;
  284.          USING PARMS+4095,XRG;
  285. ST STKR,OSAVE;  % NEW STACK POINTER
  286. LA STKR,STACK;  % INTERNAL STACK
  287. ST VR1,CPPLADD;  % ADDRESS OF COMMAND PROCESSOR PARAMETER LIST
  288. USE VR1 AS CPPL IN BEGIN
  289. L XRA,CPPLUPT;  % FOR PUT GET STUFF
  290. ST XRA,UPTADD;
  291. L XRA,CPPLECT;
  292. ST XRA,ECTADD;
  293. MMVC CBUFFADD,CPPLCBUF,4;  % ADDRESS TO COMMAND
  294. END;  % OF CPPL BLOCK
  295.  
  296. L VR1,CPPLADD;  % ADDRESS OF COMMAND PROCESSOR PARMETER LIST
  297. L VR0,UPTADD;  % ADDRESS OF UPT
  298. CALL USERID;  % EXTERNAL ROUTINE RETURNS ADDRESS AND LENGTH
  299.                 % OF USER PREFIX IN VR1 & VR0 RESPECTIVELY
  300. IF <CI VR0,44; CC H> THEN BEGIN  % REAL PROBLEMS CAN NOT GET USER ID
  301. WRTERM 'Length of user prefix greater than 44.'_
  302.        '  Check USERID external routine.';
  303. WRTERM 'Must terminate';
  304. GOTO DOEXIT;
  305. END;
  306. ST VR1,USERPREA;  % STORE OFF PREFIX ADDRESS
  307. STH VR0,USERPREL;  % LENGTH OF PREFIX
  308.  
  309. L XRD,STAXOLD;  % SAVE THE REPLACE
  310. L XRB,STAXADD;  % PARMETER EXIT ROUTINE ADDRESS
  311. L XRC,STAXLADD;  % PARM LIST  ADDRESS
  312. STAX (XRB),DEFER=NO,REPLACE=YES,MF=(E,(XRD));
  313. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  314. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  315. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  316. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  317.  
  318. LOAD EP=TSOLNK;
  319. ST VR0,TSOADD;  % STORE OFF ADDRESS
  320. L XRB,TGETADD;  % ADDRESS OF TGET MODULE
  321. IDENTIFY EP=KERMTGET,ENTRY=(XRB);
  322.  
  323. IF <RNZ  VRF> THEN BEGIN  % ERROR IN IDENTIFY
  324. TPUT =C'ERROR IN IDENTIFY',17;
  325. END;
  326.  
  327. LOAD EP=IKJGETL;  % GET LINE ROUTINE ADDRESS
  328. ST VR0,GETLINAD;  % STORE IT OFF
  329. ATTACH EP=KERMTGET,PARAM=((XRF));
  330. IF <RNZ VRF> THEN BEGIN
  331. TPUT =C'ERROR IN ATTACH ',16;
  332. END;
  333.  
  334. ST VR1,TASKADD;  % STORE OFF ADDRESS FOR DETACH
  335.  
  336. LOAD EP=IKJSTCK;  % STACK ROUTINE
  337. ST VR0,STACKADD;  % STORE OFF POINTER TO STACK ROUTINE
  338. CCALL STCKMOD,A;  % STACK ROUTINE TO CHECK FOR PARAMETER ON ENTRY
  339.  
  340. CALL EDINIT,(EDCNTRL,EDRETURN);  % INITIALIZATION FOR ED ROUTINES
  341.  
  342.  CCALL KRESET,A;  % INITALIZATION SUB
  343.  
  344. CCALL PROFILES,A;  % EXECUTES SYSTEM AND USER PROFILES
  345.  
  346.  
  347. %WRTERM ' ';  % BLANK LINE
  348. WRTERM 'NIH TSO KERMIT VERSION 1.1A';  % VERSION LOGON
  349. %WRTERM ' ';  % BLANK LINE
  350. MAINLOOP: FOREVER DO BEGIN  % MAIN LOOP
  351. DO BEGIN  % LOOP IF NO INPUT
  352. %PROMPT: ;  % MAIN PROMPT FOR PROGRAM
  353. ZF STOPF;  % ZERO STOP FLAG INCASE IT WAS SET
  354. IF <TF  SENDDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN);  % CLOSE INPUT
  355. IF <TF RECVDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN);  %CLOSE OUTPUT
  356.  
  357. %  PROMPT      'KERMIT-TSO> ';  % MAIN PROMPT FOR PROGRAM
  358. %             RDTERM INPUT;  % GET INPUT FROM USER
  359. CCALL PROMPTIT,A;
  360. LH VR1,INPUT;  % SET UP FOR DEBLANK
  361. SI VR1,4;  % SUBTRACT OFF HEADER
  362. END UNTIL <RNZ VR1>;  % IF NO INPUT REPROMPT
  363.  
  364.  
  365. SCINIT INPUT+4,(VR1);  % SET UP SCANNER
  366. SCTYPE NEW=1;
  367. SCERROR NEW=PARSEERR;
  368.  
  369. SCANBLCK: DO BEGIN SCAN *;  % SCAN OFF FUNCTIONS
  370.  
  371.    SCKW  (RECEIVE,REC,R),DOREC;  % RECEIVE COMMAND
  372.   SCKW  (SEND,S),DOSEND;  % SEND COMMAND - 44 CHAR
  373.        SCKW  SHOW,DOSHOW;  % SHOW COMMAND
  374.        SCKW  (ST,STATUS),DOSTATUS;  % STATUS COMMAND
  375.        SCKW  EXIT,DOQUIT;  % EXIT COMMAND -
  376.        SCKW  END,DOQUIT;  % END ALSO QUIT  COMMAND -
  377.        SCKW  QUIT,DOQUIT;  % QUIT COMMAND -
  378.        SCKW  SERVER,DOSERVER;  % SERVER COMMAND -
  379.        SCKW  ?,DOQUES;  % QUESTION COMMAND -
  380.        SCKW  HELP,DOHELP;  % HELP COMMAND -
  381.        SCKW  RESET,DORESET;  % RESET COMMAND -
  382.        SCKW  SET,DOSET;  % SET COMMAND -
  383.        SCKW  TSO,DOTSO;  % TSO COMMAND -
  384. SCKW TEST,DOTEST;  %
  385.    SCKW  EXECUTE,DOEXEC;  % EXEC COMMAND -
  386.        SCKW  (KERMIT,K),DOKERM;  % FOR EXEC COMMANDS TO CRUCOMVENT TSO
  387. SCKW STOP,STOPHELP;  % COMMAND ONLY USED TO STOP TRANSFER
  388.        SCKW ,INVALKEY;  % UNKNOWN COMMAND -
  389.        SCANEND;
  390.  
  391. PARSEERR:
  392. WRTERM 'Unknown TSO KERMIT command';
  393.  
  394. NEXT OF MAINLOOP;
  395.  
  396.  
  397. DOREC:
  398. <CCALL KRECEIVE,A>;  % WE HAVE A RECEIVE COM
  399. NEXT OF MAINLOOP;
  400. DOSEND:
  401.                <CCALL KSEND,A>;  % WE HAVE A SEND COMMAND
  402. NEXT OF MAINLOOP;
  403. DOSHOW:
  404.                <CCALL KSHOW,A>;  % WE HAVE A SHOW COMMAND
  405. NEXT OF MAINLOOP;
  406. DOSTATUS:
  407. SCTELL;
  408. IF <RP VR0> THEN BEGIN
  409. WRTERM 'STATUS displays messages that tell what happened during the';
  410. WRTERM 'last file transfer operation.';
  411. END
  412. ELSE <CCALL KSTATUS,A>;  % WE HAVE A STATUS COMMAND
  413. NEXT OF MAINLOOP;
  414. DOTEST:
  415.  %IF YOUR SYSTEM PROGRAMMER THEN BEGIN
  416. SF TESTF;
  417. SCAN;
  418. %SCANEND;
  419. IF <MCLC 0(VR1),=C'OFF',3> THEN BEGIN
  420. ZF TESTF;
  421. CLOSE TESTFILE;
  422. END
  423. ELSE BEGIN
  424. DATA BEGIN
  425. TESTX: DC C'ALLOC FI(TESTFILE) DS(KERMIT.TESTFILE)'
  426. END;
  427.  
  428. TESTXLEN:   EQU *-TESTX;
  429. LI VR0,TESTXLEN;
  430. %CCALL TSOCMD,A,VR1=TESTX;
  431.  
  432. OPEN (TESTFILE,(INPUT));
  433. IF ^<OPENP TESTFILE> THEN BEGIN
  434. WRTERM 'UNABLE TO OPENTEST FILE';
  435. END;
  436. END;
  437. % END;
  438. NEXT OF MAINLOOP;
  439. DORESET:
  440. SCAN *;
  441. SCKW ?,RESETHLP;
  442. SCKW HELP,RESETHLP;
  443. SCANEND;
  444.  
  445.                <CCALL KRESET,A>;  % WE HAVE A RESET COMMAND
  446. NEXT OF MAINLOOP;
  447. DOKERM:
  448. SCAN *;
  449. SCKW ?,KERHELP;
  450. SCKW ,*,B;  % PAST ON THROUGH
  451. SCANEND;
  452. NEXT OF SCANBLCK;
  453. KERHELP :
  454. WRTERM 'The KERMIT command allows TSO KERMIT to process TSO KERMIT';
  455. WRTERM 'SET comands from an EXEC (CLIST) data set.';
  456. WRTERM 'Any TSO KERMIT SET command '_
  457. 'in an EXEC data set must be prefixed by KERMIT.';
  458. NEXT OF MAINLOOP;
  459. RESETHLP:
  460. WRTERM 'RESET resets TSO KERMIT options to initial defaults.';
  461. NEXT OF MAINLOOP;
  462. DOHELP:
  463. SCTELL;
  464. IF <RP VR0> THEN BEGIN
  465. WRTERM 'HELP tells how to use the TSO KERMIT help facility to get';
  466. WRTERM 'information about TSO KERMIT commands.';
  467. END
  468. ELSE BEGIN  % WE HAVE A HELP COMMAND
  469. WRTERM 'Enter ? at prompt to receive list of commands.';
  470. WRTERM 'Enter ? after a command to receive list of operands.';
  471.                 END;  % OF HELP
  472.  
  473. NEXT OF MAINLOOP;
  474.  
  475. DOQUES:
  476.                 BEGIN  % WE HAVE A ? COMMAND
  477. CCALL MAINHELP,A;  % HELP ROUTINE
  478.  
  479. NEXT OF MAINLOOP;
  480. END;  % OF QUESTION BLOCK
  481. DOSET:
  482.               <CCALL KSET,A>;  % WE HAVE A SET COMMAND
  483. NEXT OF MAINLOOP;
  484. STOPHELP:
  485. WRTERM 'STOP is used to abort a file transfer currently in progress.';
  486. NEXT OF MAINLOOP;
  487.  
  488. DOEXEC:     % EXEC A FILE FULL OF KERMIT COMMANDS
  489. IF <CI VR0,7> THEN <MMVC 4(VR1),=C'   ',3>;
  490. SCBACK;  % BACK UP TO INCLUDE COMMAND
  491. SCTELL;  % GET REMAINDER
  492. ST VR1,TSOCMDA;
  493. STH VR0,TSOCMDL;
  494. SCAN;
  495. DO BEGIN SCAN *;  % CHECK FOR HELP REQUEST
  496.    SCKW ?,EXECHELP;
  497.    SCKW ,SENDEXEC;
  498.    SCANEND;
  499. END;
  500. WRTERM 'EXECUTE command requires a data set name of TSO KERMIT'_
  501.        ' commands.';
  502. NEXT OF MAINLOOP;
  503. EXECHELP:
  504. WRTERM 'The EXECUTE command processes a data set containing TSO '_
  505.        'KERMIT commands.  The only parameter is the';
  506. WRTERM 'name of the data set.';
  507. NEXT OF MAINLOOP;
  508. SENDEXEC:
  509.  
  510. CCALL TSOCMD,A,VR1=L:TSOCMDA,VR0=LH:TSOCMDL;  % LET TSO FEED
  511. NEXT OF MAINLOOP;
  512. DOTSO:
  513. SCTELL;
  514.  
  515. DEBLANK VR1,VR0,XRA;  % DEBLANK STRING
  516. IF <RNP VR0> THEN BEGIN  % NO PARMS
  517. % NO MESSAGE
  518. WRTERM 'TSO Command requires a command string ';
  519. NEXT OF MAINLOOP;
  520.  
  521. END
  522. ELSE BEGIN
  523. UNTIL ^<CLI 0(VR1),C' '>
  524. DO BEGIN
  525. SI VR0,1;  % DECREMENT COUNTER
  526. AI VR1,1;
  527. END;
  528. IF <CI VR0,1> & <CLI 0(VR1),C'?'> THEN BEGIN
  529.  
  530. TSOHELP:
  531. WRTERM _
  532. 'The TSO command is followed (on the same line) by a TSO command'_
  533.        ' to be executed.';
  534. NEXT OF MAINLOOP;
  535. END
  536. ELSE BEGIN
  537.  
  538. TSOKEY:       CCALL TSOCMD,A;  % WE HAVE A TSO COMMAND
  539. END;
  540. END;
  541. NEXT OF MAINLOOP;
  542.  
  543. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  544.  
  545. DOQUIT:
  546. DO BEGIN
  547. SCAN *;
  548. SCKW (HELP,?),EXITHELP;
  549. SCKW ,BADEXIT;
  550. SCANEND;
  551.  
  552. GOTO DOEXIT;  % REALLY WANT TO LEAVE
  553.  
  554. EXITHELP:
  555. WRTERM 'END, EXIT, and QUIT terminate TSO KERMIT '_
  556. 'and return the user to TSO.';
  557. NEXT OF MAINLOOP;
  558.  
  559. BADEXIT:
  560. WRTERM 'No parameters except HELP for QUIT or END ';
  561. NEXT OF MAINLOOP;
  562. END;  % OF QUIT BLOCK
  563.  
  564.  
  565. DOSERVER:
  566. DO BEGIN
  567. SCAN *;
  568. SCKW (HELP,?),SERVHELP;
  569. SCKW ,BADSERV;
  570. SCANEND;
  571.  
  572. SF SERVERF;  % TURN ON SERVER INDICATOR
  573. CCALL SERVER,A;  % ENGAGE SERVER SLAVE MODE
  574.  
  575.  
  576. ZF SERVERF;  % TURN OFF SERVER INDICATOR
  577. GOTO DOEXIT IF <TF LOGOUT>;  % IF LOGPOFF GET OUT
  578.  
  579. NEXT OF MAINLOOP;
  580.  
  581. SERVHELP:
  582. WRTERM 'The SERVER command invokes TSO KERMIT '_
  583.     'as a slave server of the microcomputer.';
  584. WRTERM 'While TSO KERMIT is in server mode, all commands are'_
  585. ' normally';
  586. WRTERM 'issued to the microcomputer only.  However, '_
  587. 'TSO KERMIT will recognize';
  588. WRTERM '"FINISH" as a command to leave server mode.';
  589. NEXT OF MAINLOOP;
  590.  
  591. BADSERV:
  592. WRTERM 'No parameters except ? for SERVER';
  593. NEXT OF MAINLOOP;
  594. END;  % OF SERV BLOCK
  595.  
  596.  
  597. %                 INVALID     COMMAND
  598. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  599. %
  600. INVALKEY:
  601. WRTERM 'Invalid TSO KERMIT Command.'_
  602.        '  Type in HELP if you need assistance.';
  603.  
  604. END;  % OF SCANBLCK
  605. END;  % OF FOREVER MAIN DO LOOP
  606. DOEXIT:
  607. IF <TF  SENDDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN);  % CLOSE INPUT
  608. IF <TF RECVDSNF> THEN CALL EDCLOS,(EDCNTRL,EDRETURN);  %CLOSE OUTPUT
  609. IF <OPENP DEBUG> THEN CLOSE DEBUG;  % CLOSE FILES
  610. CALL EDTERM,(EDCNTRL,EDRETURN);  % TERMINATE ED ROUTINE PROCESSING
  611. DETACH TASKADD;  % RELEASE AYSN TGET READ ROUTINE
  612.  
  613. FREEMAIN RC,SP=18;  % FREE TAB BUFFER
  614.  
  615. L STKR,OSAVE;  % RESTORE STACK POINTER
  616. ZR VRF;  % OK PROCESSING FOR CP
  617. OSEXIT (14,14),(0,12),SAVE=SAVECNTL;
  618.  
  619. SAVECNTL:  DC  18F'0';  % SAVE AREA
  620.  
  621. USE VRF AS STAXEXIT IN BEGIN
  622.  
  623. STAXEXIT: DS  0H;
  624. % THE STAX EXIT HERE DO NOTHING BUT KEEP GOING BR ON 14
  625. RGOTO 14;  % GO REG 14
  626. %
  627. END;  % OF USING
  628.  
  629.  
  630. PARMSADD:    DC   A(PARMS);  % ADDRESS OF STORAGE
  631. LTORG;
  632. STAXLIST: STAX 0,DEFER=NO,REPLACE=NO,MF=L;
  633. STAXOLDL: STAX 0,DEFER=NO,REPLACE=YES,MF=L;
  634. EXORG;
  635. SUBTITLE 'MAINHELP';
  636. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  637. %MOD: MAINHELP
  638. % FUNCTION: PRINTS HELPS FOR DRIVER LOOP
  639. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  640. MAINHELP: CENTER VRE,HIGHR,ENTRY=NO;
  641. WRTERM 'Legal commands are: ';
  642. WRTERM ' ';
  643. WRTERM 'RECEIVE uploads a data set (file) from the micro'_
  644.  'computer to the mainframe';
  645. WRTERM 'SEND downloads a data set (file) from the mainframe '_
  646.   'to the microcomputer';
  647. WRTERM 'STOP aborts a file transfer in progress '_
  648.        '(valid only during file transfer)';
  649. WRTERM 'STATUS displays the status of the last file transfer';
  650. WRTERM 'SERVER invokes TSO KERMIT as a slave server';
  651. WRTERM 'END terminates TSO KERMIT and returns user to TSO ';
  652. WRTERM 'QUIT and EXIT are synonyms of END';
  653. WRTERM 'SET changes KERMIT protocol and data set options ';
  654. WRTERM 'SHOW displays the current KERMIT option settings ';
  655. WRTERM 'RESET reinitializes KERMIT to default settings ';
  656. WRTERM 'HELP tells how to use the TSO KERMIT help facility';
  657. WRTERM 'TSO issues a command to TSO';
  658. WRTERM 'EXEC reads a data set of TSO KERMIT commands '_
  659.        '(a TSO CLIST)';
  660. WRTERM 'KERMIT allows TSO KERMIT EXEC files to process the '_
  661.        'TSO KERMIT SET commands';
  662. WRTERM '(must prefix each SET cmd)';
  663. WRTERM ' ';  % BLANK LINE
  664. WRTERM 'TSO KERMIT executes a profile containing TSO KERMIT'_
  665.         ' commands at program startup.  ';
  666. WRTERM 'KERMIT.PROFILE.CLIST is the profile data set name.';
  667. CEXIT VRE,HIGHR;
  668. LTORG;
  669. EXORG;
  670. SUBTITLE 'PROMPTIT';
  671. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  672. % MOD: PROMPIT
  673. % FUNCTION: DO A PUT GET FOR INPUT AT THE TERMINAT
  674. % INPUT : NONE
  675. % OUTPUT: INFO MOVED INTO INPUT
  676. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  677. PROMPTIT: CENTER VRE,HIGHR,ENTRY=NO;
  678. L XRA,UPTADD;
  679. L XRB,ECTADD;
  680. DO BEGIN
  681. L 15,GETLINAD;  % ENTRY POINT FOR GETLINE ROUTINES
  682. GETLINE PARM=APGPB,UPT=(XRA),ECT=(XRB),ECB=ECBGETLN,_
  683.      TERMGET=(EDIT,NOWAIT),ENTRY=(15),_
  684.         MF=(E,IOPLADS);
  685. PROMPCAS: CASE VRF MAX 36 MIN 0 CHECK;
  686. 0: BEGIN  % LINE FROM TERMINAL
  687. %PROMPT      'KERMIT-TSO> ';  % MAIN PROMPT FOR PROGRAM
  688. ZR VRF;  % ZERO RETURN AFTER TPUT
  689.  END;  % JUST FALL OUT
  690.  
  691. 4: BEGIN  % INPUT FROM STACK - CLIST ETC
  692. % JUST FALL OUT DON'T ISSUE PROMPT;
  693.   END;
  694.  
  695. 8: ;  % EOD JUST FALL THROUGH
  696.  
  697. 12: BEGIN  % NO INPUT ISSUE PROMPT AND WAIT
  698.   PROMPT      'KERMIT-TSO> ';  % MAIN PROMPT FOR PROGRAM
  699. L 15,GETLINAD;  % ENTRY POINT FOR GETLINE ROUTINES
  700. GETLINE PARM=APGPB,UPT=(XRA),ECT=(XRB),ECB=ECBGETLN,_
  701.      TERMGET=(EDIT,WAIT),_
  702.         ENTRY=(15),MF=(E,IOPLADS);
  703. NEXT OF PROMPCAS;
  704. END;
  705. 16 THRU 36: ;  % FALL THROUGH
  706. ENDCASE
  707. ELSE WRTERM 'UNKNOWN VALUE RETURNED FROM GETLINE';
  708. END UNTIL <CI VRF,0> | <CI VRF,4>;
  709. DATA BEGIN
  710. APGPB:   GETLINE MF=L;
  711. END;
  712. LA XRA,APGPB;
  713. USE XRA AS GTPB IN L VR1,GTPBIBUF;
  714. LH XRB,0(VR1);  %  LENGTH OF STUFF
  715. EXI XRB,MMVC,INPUT,(VR1),0,INCR=YES,DECR=YES;
  716. %O XRB,=X'01000000';  % OR LENGTH  PER GTWTMP MANUAL PAGE 12-79
  717. FREEMAIN RC,LV=(XRB),A=(VR1),SP=1;  % FREE UP THE INPUT BUFFER
  718. SI XRB,4 ; % REMOVE LENGTH
  719. EXI XRB,MTR,INPUT+4,UPPER,*-*,INCR=YES,DECR=YES ; % UPPER CASE
  720.  
  721. CEXIT VRE,HIGHR;
  722. LTORG;
  723. EXORG;
  724. SUBTITLE 'KERMIT WORKING STORAGE';
  725. PARMS:    DS        0H;  % GLOBAL DATA LIST;
  726. TESTFILE: DCB DDNAME=TESTFILE,DSORG=PS,MACRF=(GL),_
  727.                EODAD=KLUDGCIT,LRECL=264,RECFM=VB,BLKSIZE=2048;
  728. TESTEOF:    DC    A(KLUDGCIT);  % IN RPACK ROUTINE
  729. %KEROUT: DCB DDNAME=KEROUT,DSORG=PS,MACRF=(PM),LRECL=80,BLKSIZE=84,_
  730. %               RECFM=VB;
  731. DEBUG:  DCB DDNAME=DEBUG,DSORG=PS,MACRF=(PM),LRECL=260,BLKSIZE=2048,_
  732.                RECFM=VB;
  733. %MODDCBF: DCB DDNAME=KEROUT,DSORG=PS,MACRF=(PM),LRECL=80,BLKSIZE=80,_
  734. %               RECFM=FB;
  735. %MODDCBFL: EQU *-MODDCBF;
  736. %MODDCBV: DCB DDNAME=KEROUT,DSORG=PS,MACRF=(PM),LRECL=80,BLKSIZE=84,_
  737. %               RECFM=VB;
  738. %MODDCBVL: EQU *-MODDCBV;
  739. DF SAMEPKTF,RECFLAG,SENDFLAG,SHOWFLAG,DATAFLAG,_ % DEFINE FLAGS
  740.    STOPF,STURNRND,RTURNRND;
  741. DF QUITFLAG,HELPFLAG,SETFLAG,EXITFLAG,QUESFLAG,_% DEFINE FLAGS
  742.    PREFPDSF,ACKX,ACKZ;  % FOR ACK WITH X DATA OR Z DATA
  743. DF DBUGFLAG,TESTF,BIT8FLAG,CRFLAG,QUOFLAG,QUO8FLAG,KINEOF,_
  744.    LOGOUT;
  745. DF SENDDSNF,RECVDSNF,EDITF,TABF,TABFOUND,FORWARDF,HIGHBITF,REPTF;
  746. DF FORWARD,SERVERF,TIMERF,WARNINGF,PDSF,ASTERISK,_
  747.    FULLQUOF,PREFXQUO;  % MORE FLAGS
  748. DF WARNTPCK,FULLQDSN  ;
  749. STAXADD:     DC    A(STAXEXIT);  % ADDRESS OF STAX ROUTINE
  750. STAXLADD:    DC    A(STAXLIST);  % ADDRESS OF STAX PARM LIST
  751. STAXOLD:    DC    A(STAXOLDL);
  752. UPTADD:   DS   A;  % ADDRESS OF UPT FROM CPPL
  753. STACKADD:   DS  A;  % ADDRESS OF STACK MODULE
  754. CBUFFADD:   DS  A;  % ADDRESS OF CPPLCBUFF ON LOG IN
  755. ECTADD:   DS  A;  % ADDRESS OF ECT FROM CPPL
  756. ECBGETLN:  DC  F'0';  % PUT GET ECB
  757. OLD:   DC  F'1';  % OUT PUT LINE DESCRIPTOR ONLY ONE ON CHAIN
  758. %      DC  F'1';  % NUMBER OF MESSAGE SEGMENTS ONLY ONE
  759.        DC  A(PROMPT);  % MESSAGE TO PUT OUT
  760. PROMPT:    DC  H'17';  % LENGTH OF MESSAGE
  761.            DC  H'0';  % FOR PROMPT
  762.            DC  C' KERMIT-TSO> ';  % THE PROMPT MESSAGE
  763. IOPLADS:   DC  4F'0';  % INPUT OUPUT PARM LIST PUT GET
  764. PUTADD:   DC       A(PDATA);  % ADDRESS POINTER
  765. TGETADD:  DC   A(KERMTGET);  % ADDRESS FOR ATTACH
  766. PUTLEN:   DC       H'0';  % NUMBER OF CHARACTERS IN DATA
  767. LASTTAB:  DC       H'0';  % LAST TAB FOR SENDS
  768. TABADDR: DS         A;  % ADDRESS OF TABBING BUFFER
  769. LASTADDR:  DS      A;  % ADDRESS OF PLACE IN REC BUFFER TABBING
  770. ECBREAD:  DC   F'0';
  771. TASKADD:    DS    A;  % ASYNC TASK ADDRESS
  772. ECBTGET:   DC    F'0';
  773. ECBTREAD:  EQU   X'AA';  % DO A READ
  774. ECBTIMER:  EQU   X'BB';  % TIME OUT ECB
  775. TABCNT: DS         H;  % TAB COUNTER
  776. GETADD:  DC    A(BUF);  % ADDRESS OF GET BUFER
  777. TSOADD:  DS     A;  % TSO ADDRESS OF LOAD MOD
  778. GETLINAD: DS    A;  % ADDRESS OF GET LINE ROUTINE
  779. CPPLADD:  DS      A;  % ADDRESS OF COMMAND PROCESSOR PARM LIST
  780. GETLEN:  DS    H;  % LENGTH OF GET BUFFER
  781. ADDBUF:  DC         A(BUF);  % ADDRESS OF BUFFER
  782. BUFADCON:   DC      A(BUF);  % ADDRESS OF BUFFER
  783. TGETBUFA:   DC  A(TGETBUFF);
  784. TGETLEN:   DS   F;  % LENGTH OF RECEIVED DATA FROM TGET
  785. SETADD:  DC        A(SETLABEL);  % ADDRESS OF SET AREA
  786. BUFADD:  DS         F;  % POINTER TO PLACE IN BUF
  787. BUFCNT:  DS         H;  % NUMBER OF CHARACTERS IN BUFCNT
  788. RDATALEN:  DS    H;  % COUNTER OF RECEIVED DATA
  789. RDATAADD:  DS    F;  % ADDRESS POINTER TO DATA
  790. DACKRC:   DS    F;  % RETURN FROM DYNAL ALLOCATE
  791. MAXPUT:   DC       H'91';  % MAX CHARACTERS TO PUT
  792. MAXWRITE: DS       H;  % MAXIMUM SIZE OF WRITE TO DISK
  793. BCCLEN:      DC        H'1';  % LEN OF VARIOUS BCC CHECKING
  794. OLDBCC:   DC    H'0';  % SAVE BCC VALUE
  795. TRFBCC:   DS       X;  % TRANSFER BCC
  796. LFCR:     DC        X'234D234A';  % LIN FEE C R
  797. LFCRLEN:  EQU  *-LFCR;
  798. REPTBUFF:  DS         CL120;  % BUFFER FOR REPEAT CHARACTER
  799. OLDSEQ:   DS        H;  % PREVIOUS SEQ NUMBER
  800. SNDPKT:   DS        CL130;  % SEND THIS TO MICRO;
  801.          ORG       SNDPKT;
  802. PHDR:     DS        X;
  803. PLEN:     DS        X;
  804. PNUM:     DS        X;
  805. PTYPE:    DS        X;
  806. PDATA:    DS        0C;
  807.          ORG       ,;
  808. RECPKT:   DS        CL130;  % RECEIVE THIS FROM MICRO;
  809. ORG      RECPKT;
  810. RMARK:   DS    X;  % RECEIVE MARK
  811. RLEN:    DS    X;  % RECEIVE LENGTH
  812. RSEQ:    DS    X;  % RECEIVE SEQUENCE NUMBER
  813. RTYPE:   DS    X;  % RECEIVE TYPE
  814. % THESE LENGTHS ARE FOR FIXED LENGTH MESSAGES
  815. YLEN:     EQU *-RSEQ;  % ACK LENGTH
  816. NLEN:     EQU *-RSEQ;  % NACK LENGTH
  817.  ZLEN:     EQU *-RSEQ;  % EOF PACKET  LENGTH
  818. CLEN:     EQU *-RSEQ;  % COMPLETE PACKET  LENGTH
  819. BLEN:     EQU *-RSEQ;  % EOT PACKET  LENGTH
  820. ALEN:     EQU *-RSEQ;  % ABORT PACKET  LENGTH
  821. RDATA:   DS    0C;
  822.          ORG ,;  % RESET ORG COUNTER
  823. LSDAT:    DS        F;  % SEND PACKET SIZE;
  824. LRDAT:    DS        F;  % RECEIVE PACKET SIZE;
  825. EDCNTRL:   DS       F;  % FOR EDIT ROUTINES
  826. EDRETURN:  DS       F;  % RETURN CODE
  827. EDTYPE:    DS       F;  % EDIT TYPE
  828. EDCOL1:    DS       F;  % 1ST COLUMN POSTION
  829. EDCOL2:    DS       F;  % 2ND COLUMN POSITION
  830. EDLMAX2:   DC       F'132';  % MAX OF LINE
  831. EDLENACT:  DS       F;  % AMOUNT RECEIVEDD
  832. EDLINE:    DS       CL132;  % DATA FROM ERROR MESSAGE
  833. EDLINENO: DS        F;  % LINENUMBER RETURNED FROM EDGET
  834. EDPNTR:   DS        F;  % POINTER TO DATA ADDRESS
  835. EDLINEN:  DC       XL4'FFFFFFFF';  % LINE NUMBER OF PUT AUTO
  836. EDLINER:  DS       F;  % LINE NUMBER RETURNED FROM PUT
  837. EDLEN:    DS       F;  % LENGTH FOR PUT
  838. OTHERLEN:      DS    H;  % USED IN FILL DPCK
  839. SEQNUM:  DS           H;  % NUMBER OF PACKET
  840. RPSEQ:   DS           H;  % REC PACKET NUMBER
  841. RECLEN:  DS           H;  % LENGTH OF REC DATA
  842. RECPNTR: DS           F;  % POINTER TO RECEIVED DATA
  843. LENERROR:   DC XL4'FFFFFFEE';  % LENGTH ERROR
  844. FLAGS:    DC        X'00';  % USE TO TEST OUR FLAGS;
  845. FLAGS2:   DC        X'00';  % USE TO TEST OUR FLAGS2;
  846. NAME:     DC        18X'20';  % NAME OF FILE(S) TO SEND;
  847.          DS        0F;
  848.          DS        0F;
  849. INPUT:    DS        CL130;  % INPUT BUFFER;
  850. INPUT2:    DS        CL130;  % INPUT BUFFER;
  851.          DS        0F;
  852.          DS        F;  % RDW FOR VARIABLE RECORDS;
  853.          DS        F;  % RDW FOR VARIABLE RECORDS;
  854. N:        DC        F'0';  % SEND PACKET NUMBER;
  855. NUM:      DC        F'0';  % RECEIVE PACKET NUMBER;
  856. RETRY:    DC        F'20';  % RETRY COUNTER
  857. NUMTRY:   DC        F'0';  % TRIAL COUNTER FOR TRANSFERS;
  858. OLDTRY:   DS        F;  % COUNTER FOR PREVIOUS PACKET;
  859. STORLOC:  DS        F;  % POINTER TO EXTRA STORAGE;
  860. MAXPACK:  DC        F'94';  % MAX PACKET SIZE;
  861. RECL:     DS        F;  % RECORD LEN (IF RECFM = V);
  862. RPSIZ:    DC        F'94';  % MAX RECEIVE PACKET SIZE;
  863. DSSIZ:    DC        F'40';  % DEFAULT MAX SEND PACKET SIZE
  864. MAXTRY:   DC        F'5';  % NO. OF TIMES TO RETRY PACKET
  865. IMXTRY:   DC        F'16';  % NO. OF INITIAL TRIALS ALLOWE
  866. SIZE:     DS        F;  % MAX SIZE FOR SEND DATA;
  867. CRTLINE#:   DS  H;  % SCREEN LINE NUMBER IN SHOW
  868. MAXCRC#:    DC  H'11';  % MAX LINES ON SCREEN FOR SHOW AT PRESENT
  869. RECSEQ:     DC  H'0';  % NUMBER COUNTER
  870. DEL:      DC        F'127';  % OCTAL 177 (DELETE CHAR);
  871. MOD64:    DC        XL4'0000003F';  % MODUL 64
  872. ASCIIONE: DC        X'31';  % ASCII LIT 1
  873. ASCII2: DC        X'32';  % ASCII LIT 1
  874. ASCII3: DC        X'33';  % ASCII LIT 1
  875. ZERO:     DC        F'0';
  876. ONE:      DC        F'1';
  877. ONETHOU:      DC        F'1000';
  878. FIVE:     DC        F'5';
  879. SIX:      DC        F'6';
  880. TWO:      DC        F'2';
  881. THREE:    DC   F'3';  % CONSTANT FOR EDSETS
  882. FOUR:     DC   F'4';  % "
  883. ONEOONE:  DC        F'101';  %  FOR EDIT ROUTINES
  884. TEN:    DC  F'10';
  885. SPACE:    DC        F'32';  % ASCII SPACE;
  886. O1H:      DC        F'64';  % OCTAL 100;
  887. O2H:      DC        F'128';  % OCTAL 200;
  888. SAVPL:    DC        F'0';  % POINTER WITHIN BUF,INIT=0;
  889. RSAVPL:   DC        F'0';  % POINTER IN 'PTCHR',INIT=0;
  890. RCRCREAL: DS        H;  % RECEIVE CHARACTER
  891. DQUOTE:   DC        X'23';  % DEFAULT QUOTE CHARACTER = #;
  892. QUOCHAR:  DS        X;  % QOUTE CHAR WE'LL SEND;
  893. RQUO:     DS        X;  % MICRO'S QUOTE CHAR;
  894. DOT:      DC       C'.';  % DOT FOR DS NAME SCAN
  895. DBINQC:   DC    X'26';  % DEFAULT 8 BIT QUOTE CHAR = &
  896. BINQC:    DC    X'26';  % 8 BIT QUOTE CHARACTER
  897. DTABCHAR: DC        X'09';  % ASCII HT
  898. TABCHAR:  DS        X;  % TABCHAR
  899. TABCHAR#: DC        X'49';  % ASCII HT+ CNTL QUOTE VALUE
  900. TEMP:     DS        D;  % TEMPORARY SPACE;
  901.          DS        0D;
  902. SDAT:     DS        CL130;  % TEMP PLACE FOR SEND DATA;
  903. RDAT:     DS        CL130;  % TEMP PLACE FOR RECEIVE DATA;
  904. FILNAML:  DS    H;  % LENGTH OF FILENAME;
  905. FILNAM:   DS        CL18;  % SEND/REC FILENAME;
  906. STATE:    DS        C;  % OUR CURRENT STATE;
  907. DEOL:     DC        X'0D';  % DEFAULT END OF PACKET (CR);
  908. REOL:     DS        X'0D';  % EOL CHAR I NEED (CR);
  909. SEOL:     DS        X'0D';  % EOL I'LL SEND;
  910. QBINCHAR:     DC        X'26';  % EIGHTTH BIT QUOTE CHARA
  911. DQBIN:    DC        X'26';  % EIGHTTH BIT QUOTE CHARACTER;
  912. DREPT:    DC        X'7E';  % ASCII ~
  913. REPTCHAR:    DS     X;  % CHARACTER USED FOR REPEAT QUOTING
  914. DCAPA1:   DC        X'0';  % CAPABILITIES ZERO NOW
  915. DSOH:     DC        X'01';  % DEFAULT START OF HEADER (CTL
  916. RSOH:     DS        X;  % RECEIVE START OF HEADER;
  917. SSOH:     DS        X;  % SEND START OF HEADER;
  918. DLRECL:   DC        H'504';  % DEFAULT LRECL SIZE OF 80;
  919. LRECL:    DS        H'255';  % LRECL PROGRAM WILL USE;
  920. DBLKSIZE: DC        H'6356';  % DEFAULT BLKSIZE OF 6356;
  921. BLKSIZE:  DS        H;  % BLKSIZE PROGRAM WILL USE;
  922. DTRACK:   DC        F'5';  % DEFAULT SPACE ALLOCATION;
  923. DRECFM:   DC    CL2'VB';  % W       DEFAULT WITH VARIE RECFM;
  924. RFM:      DC        CL2'UB';  % RECFM PROGRAM WILL USE;
  925. RRECFM:      DS        C;  % REC FORMAT OF FILE IN USE
  926. VOLUME:   DC        CL7'TMP    ';  % JDW  VOLUME FOR ALLOCATE;
  927. OUTUNIT:  DC        CL8'FILE    ';  % FOR DYNAL
  928. OUTSTATS: DS        X;  % STATUS FOR DYNAL
  929. OUTNDISP: DS        X;  % NORMAL DISPOSITION DYNAL
  930. OUTCDISP: DS        X;  % CONDITIONAL DISPOSITION DYNAL
  931. DATA:     DC        CL7'TEXT   ';  % JDW  DATA TYPE BIN OR TEXT;
  932. % DALRTVOL: DS        CL6;  % VOL SERIAL OF RETURNED DYNAL
  933. BLIP:     DS        X;  % SAVE USER'S BLIP CHAR;
  934. LINSIZ:   DS        F;  % SAVE USER'S CONSOLE LINESIZE
  935. %STYPE:    DS        C;  % TYPE OF PACKET SENT;
  936. %RTYPE:    DS        C;  % TYPE OF PACKET RECEIVED;
  937.  
  938. READSAVE: DS        4F;
  939. WRITSAVE: DS        4F;
  940. PARSELST: DS        3F;  % PTRS TO OPERAND STACK;
  941. PTRTBL:   DS        15F;  % OPERAND STACK;
  942. PTRTBLL:  EQU       *-PTRTBL;  % LENGTH OF PTRTBL;
  943. DBLWRK:   DS        D;
  944. IDSYS:    DC        F'2';  % MVS TSO;
  945. DDNAME:   DC        CL8' ';  % DDNAME TO ALLOCATE;
  946. DSNAME:   DC        CL80' ';  % DSNAME TO ALLOCATE;
  947. DSMEMBER: DC        CL8' ';  % MEMBER NAME
  948. DSNAMEX:  DC        CL80' ';  % WRKBUFFER;
  949. MEMBER:   DC        CL8' ';  % MEMBER NAME FOR PDS ALLOC;
  950. LASTDSN:   DC        CL44' ';  % FOR THE WILDCARD SEND
  951. DISP1:    DC        F'2';  % DISP (0=NEW,1=OLD,2=SHR);
  952. DISP2:    DC        F'3';  % DISP (0=UNCAT,1=CAT,3=KEEP);
  953. INOUT:    DC        F'2';  % 0=INPUT,1=OUTPUT,2=INOUT);
  954. RECFMX:   DC        F'1';  % 1=FB,2=VBS;
  955. BLKSIZEX: DC        F'3600';  % FOR NEW DATA SETS ONLY;
  956. LRECLX:   DC        F'80';  % ....;
  957. DEV:      DC        CL8'FILE ';  % DEVICE;
  958. TRACK:    DC        F'20';  % # TRACKS TO ALLOC FOR NEW DS
  959. DYNALCRC: DC        F'0';  % RETURN CODE FROM FUNCTION;
  960. VOLAD:    DC        F'0';  % ADDRESS OF VOLUME FOR DYNAL;
  961. WRKBUFF:  DS        CL280;
  962. PREFIX:   DC   CL44'       ';  % USERS DSET PREFIX FROM SET
  963. PREFIXL:  DC H'0';  % PREFIX LENGTH-1;
  964. PREFMEM:  DS CL8;  % MEMBER NAME FOR PDS PREFIX
  965. PREFMEML: DC H'0';  % LENGTH OF PREFIX PDS MEMBER
  966. DSNPFIX:  DC  CL44' ';  % PREFIX IF WILDCARD SEND
  967. DSNPFL:   DC  H'0';  % PREFIX LENGTH
  968. DSNSFIX:  DC  CL44' ';  % SUFFIX LENGTH
  969. DSNSFL:   DC  H'0';  % SUFFIX LENGTH
  970. MATCHDSN:  DC CL44' ';  % NAME TO MATCH
  971. MATCHDSL:   DS  H;  % LENGTH OF MATCHNAME
  972. DDELAY:   DC        F'2000';  % DEFAULT DELAY TIME;
  973. DELAY:    DS        F;  % DELAY TIME;
  974.          DC   CL8'CRC*****';  % DUMP BUSTERS
  975. BCC:     DS   F;  % FOR BCC COMP
  976. TIMEOUT: DC   F'8';  % TIMEOUT FOR OTHER KERMIT
  977. TIMEOUT2: DC   F'800';  % TIMEOUT FOR OTHER KERMIT
  978. RTIMEOUT: DC   F'800';  % RDATA TIMEOUT
  979. ATIMEOUT: DC   F'50';  % ATTACH TIMEOUT
  980. SERVTOUT: DC   F'3000';  % SERVER TIMEOUT FOR NACKING 30 SECONDS
  981. SERVWAIT: DC  F'720000' ; % SERVER LOGOFF AFTER SIXTY MINUTES
  982. SERVTIME: DC F'0' ; % TIME BUFFER FOR SERVER
  983. STURNTIM:  DC   F'100';  % SEND TURN TABLE
  984. RTURNTIM:  DC   F'100';  % RECEIVE TURN TABLE
  985. DSNLEN:  DS   H;  % LENGTH OF DSNAME
  986. DSNADD:  DS   A;  % ADDRESS OF DSNAME
  987. PARM1:   DC    F'1';  % NO DUMP - TSO COMMAND =1
  988. PARM2:   DS    CL255;  % COMMAND STRING
  989. PARM3:   DC    F'0';  % LENGTH OF COMMAND STRING
  990. PARM4:   DS    F;  % RETURN CODE HERE
  991. PARM5:   DS    F;  % SERVICE RETURN CODE
  992. PARM6:   DS    F;  % ABEND CODE
  993. KERMDDNM:   DS    CL8;  % DDNAME BUFFER
  994. DSNSIZE: EQU 44;  % LEN OF DSNAME
  995. LEVELCK: DC   X'01';  % ASCII BCC LEVEL CH 1
  996. HIGHBCC: DC  X'03';  % HIGHEST BCC WE SUPPORT
  997. DBCC:   DC  X'03';  % DEFAULT BCC CHECKING
  998. BLANKS:    DC    100CL1' ';  % BLANKS
  999. ASCBLANK:    DC    100XL1'20';  % BLANKS
  1000. AAAAIII: DS XL7;  % USER ACCOUNT AND INITIALS
  1001.           DC CL1'.';  % DOT FOR THE DSNAME
  1002. USERPREA: DC   A(AAAAIII);
  1003. USERPREL: DC   H'7';  % LENGTH OF USER PREFIX
  1004. TMPDISKA: DC   A(TMPVOLID);  % INSTALLATION DEFAULT DISK DRIVE NAME
  1005. TMPDISKL: DC   H'3';  % LENGTH OF TMP NAME
  1006. TMPVOLID:  DC   CL3'TMP';  % REMOVEME
  1007. TSOCMDA:  DS   A;  % ADDRESS OF TSO COMMAND TO ISSUE
  1008. TSOCMDL:  DS   H;  % LENGTH OF TSO COMMAND
  1009. XUSERPRO: AREA H,DSECT=NO;
  1010.           DC CL3'EX ';
  1011. USERPROF:   DS 0X;  % LABEL FOR USERPROFILE NAME
  1012.           DC C'KERMIT.PROFILE.CLIST';
  1013. USERPROL:    EQU *-USERPROF;  % LENGTH OF NAME
  1014. XUSERPRL: EQU *-XUSERPRO;  % LENGTH OF COMMAND
  1015. AREAEND;  % LENGTH OF COMMAND
  1016.  
  1017. XSYSPRO: AREA H,DSECT=NO;
  1018.         DC CL3'EX ';  % EXECUTE COMMAND FOR PROFILE OF SYSTEM
  1019.         DC  CL1'"';  % QUOTE AROUND DSNAME
  1020.         DC  CL1'"';  % QUOTE AROUND DSNAME
  1021. XSYSPROL: AREAEND 0X;
  1022. STATBUFF:   DC  CL256' ';  % FINAL STATUS OF KERMIT
  1023. CATDSPTR:    DS    A;  % ADDRESS OF PLACE IN CATALOG BUFFER
  1024. STATLEN:    DS  H;
  1025. WARNBUFF:  DC  CL255' ';  % WARNING BUFFER
  1026. WARNLEN:   DS  H;
  1027. WARNAD1:    DC   A(0);  % WARNING BEGINNING OF CHAIN
  1028. WARNADL:    DC   A(0);  % ADDRESS OF LAST WARNING ENTRY
  1029. SUCESSCC:   DC   C'TSO KERMIT completed successfully';
  1030. ATOEVCON:   DC   V(ATOETBL);  % ASCII TO EBCIDIC TRANSLATE TABLE
  1031. ETOAVCON:   DC   V(ETOATBL);  % EBCIDIC TO ASCII TRANSLATE TABLE ADD
  1032. ETOAERRV:   DC   V(ETOAERRT);  % TABLE OF UNTRANSLATABLE CHARACTERS
  1033. BAL;
  1034. *;  % TABLE TO TRANSLATE TO UPPER CASE
  1035. *;
  1036. UPPER    DC    256AL1(*-UPPER)
  1037.          ORG   UPPER+X'81'
  1038.          DC    C'ABCDEFGHI'
  1039.          ORG   UPPER+X'91'
  1040.          DC    C'JKLMNOPQR'
  1041.          ORG   UPPER+X'A2'
  1042.          DC    C'STUVWXYZ'
  1043.          ORG
  1044. *;  % THIS IS THE ASCII TO EBCDIC TABLE
  1045. ATOE     DC        X'00010203372D2E2F1605250B0C0D0E0F'
  1046.          DC        X'101112133C3D322618193F271C1D1E1F'
  1047.          DC        X'405A7F7B5B6C507D4D5D5C4E6B604B61'
  1048.          DC        X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'
  1049.          DC        X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'
  1050.          DC        X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D'    NIH JDW
  1051.          DC        X'79818283848586878889919293949596'    NIH JDW
  1052.          DC        X'979899A2A3A4A5A6A7A8A98B4F9BA107'    NIH JDW
  1053.          DC        X'00010203372D2E2F1605250B0C0D0E0F'    NIH JDW
  1054.          DC        X'101112133C3D322618193F271C1D1E1F'    NIH JDW
  1055.          DC        X'405A7F7B5B6C507D4D5D5C4E6B604B61'    NIH JDW
  1056.          DC        X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'    NIH JDW
  1057.          DC        X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'    NIH JDW
  1058.          DC        X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D'    NIH JDW
  1059.          DC        X'79818283848586878889919293949596'    NIH JDW
  1060.          DC        X'979899A2A3A4A5A6A7A8A98B4F9BA107'    NIH JDW
  1061. *THIS IS THE EBCDIC TO ASCII CONVERSION TABLE
  1062. *CHARACTERS NOT REPRESENTABLE IN ASCII ARE REPLACED BY A X'3A'
  1063. *                 0 1 2 3 4 5 6 7 8 9 A B C D E F
  1064. ETOA     DC    X'000102033A093A7F3A3A3A0B0C0D0E0F' 0  EBCDIC
  1065.          DC    X'101112133A0A080018193A3A1C1D1E1F' 1  TO            NI
  1066.          DC    X'3A3A3A3A3A0A171B3A3A3A3A3A050607' 2  ASCII
  1067.          DC    X'3A3A163A3A3A3A043A3A3A3A14153A1A' 3                NI
  1068.          DC    X'203A3A3A3A3A3A3A3A3A3A2E3C282B7C' 4                NI
  1069.          DC    X'263A3A3A3A3A3A3A3A3A21242A293B5E' 5                NI
  1070.          DC    X'2D2F2D3A3A3A3A3A3A3A3A2C255F3E3F' 6                NI
  1071.          DC    X'3A3A3A3A3A3A3A3A3A603A2340273D22' 7                NI
  1072.          DC    X'3A6162636465666768693A7B3A3A3A3A' 8
  1073.          DC    X'3A6A6B6C6D6E6F7071723A7D3A3A3A3A' 9
  1074.          DC    X'3A7E737475767778797A3A3A3A5B3A3A' A                NI
  1075.          DC    X'3A3A3A3A3A3A3A3A3A3A3A3A3A5D5E3A' B                NI
  1076.          DC    X'3A4142434445464748493A3A3A3A3A3A' C
  1077.          DC    X'3A4A4B4C4D4E4F5051523A3A3A3A3A3A' D
  1078.          DC    X'5C3A535455565758595A3A3A3A3A3A3A' E                NI
  1079.          DC    X'303132333435363738393A3A3A3A3A3A' F
  1080.          SPACE 1
  1081. *
  1082. *  THIS IS TABLE FOR SEARCHING FOR SPECIAL CHARACTER
  1083. *  QUOTING - TRT FOR QUOTE,BINARY, OR REPEAT
  1084. RECTABLE DC    256X'00'
  1085. *
  1086. ALP;
  1087. TMPDSMES: AREA H,DSECT=NO;
  1088. DC C'Data set ';
  1089. TMPDSN:  DS CL44;
  1090. DC C' is on Volume ';
  1091. TMPVOL: DS CL6;  % RETURN ED VOL SERIAL NUMBER
  1092. TMPMSL: AREAEND;
  1093. BAL;
  1094. DATASET CAMLST     NAME,DSNAME,,WRKBUFF
  1095. DELDSN  CAMLST SCRATCH,DSNAME,,WRKBUFF,,OVRD
  1096. UNCAT   CAMLST UNCAT,DSNAME
  1097. ALP;
  1098. PARMLEN1:     EQU *-PARMS;
  1099. WORK2:   DS    0F;  % WORK AREA 2
  1100.  
  1101. DDSN:      DS      CL44;  % DELETE DSNAME
  1102. VOLIST:    DC      H'1';  % ONE VOLUME ON LIST
  1103. TSOVOL:    DS      CL6;  % VOLUME
  1104. KERMVA: VAREA;  % THE V AREA FOR MACROS
  1105. KERMBUFF:    DS     CL80;  % BUFFER FOR VOUT
  1106. SCT: DS 0F; SCT;
  1107. STACK: DS 1024X'FF';
  1108. OSAVE: DC A(0);
  1109. %%WORKING STORAGE
  1110.  
  1111. %% SOME LITS FOR SEND TABLE
  1112. SENDTBL: AREA F,DSECT=NO;
  1113.          DC  256AL1(0);  % FILL ARRAY WITH ZEROS
  1114. ORG SENDTBL;
  1115.          DC  32AL1(ASCIIQUO);  % CONTROL QUOTE
  1116. ORG SENDTBL+127;
  1117.          DC  AL1(ASCIIQUO);  % THE DELETE CHARACTER
  1118. ORG SENDTBL+128;  % CONTROL + 8BIT
  1119.           DC    32AL1(ASCIQUO8);  % CONTROL + 8BIT
  1120.         DC 95AL1(ASCI8BIT);
  1121. ORG SENDTBL+255;  % CONTROL + 8BIT
  1122.            DC   AL1(ASCIQUO8);  % CONTROL + 8BIT
  1123. SENDTBLL: AREAEND;
  1124. REPTABLE: AREA F,DSECT=NO;  % THESE LENGTHS ARE ALEAST THE NUMBER
  1125.        DC  256AL1(4);  % FILL ARRAY WITH 4'S WORTH WHILE TO QUOTE
  1126. ORG REPTABLE;  % LESS THAN THESE WOULDN'T BE WORTHWHILE
  1127.          DC  32AL1(3);  % CONTROL QUOTE
  1128. ORG REPTABLE+127;
  1129.          DC  AL1(3);  % THE DELETE CHARACTER
  1130. ORG REPTABLE+128;  % CONTROL + 8BIT
  1131.           DC    32AL1(2);  % CONTROL + 8BIT
  1132.         DC 95AL1(3);
  1133. ORG REPTABLE+255;  % CONTROL + 8BIT
  1134.            DC   AL1(2);  % CONTROL + 8BIT
  1135. REPTABLL: AREAEND;
  1136.  
  1137. TABTBLAD:   DC  A(TABTABLE);  % ADDRESS OF TAB TABLE
  1138. TABWRKA:    DS  D;  % WORK AREA FOR TAB ROUTINE
  1139. TABTABLE:   AREA H,DSECT=NO;  % HALF WORD TABLE OF TAB SETS
  1140.        DC 256AL1(0);
  1141. TABTLEN: AREAEND;
  1142.  
  1143. ASTRKTBL:   AREA H,DSECT=NO;  % SHACT TABLE FOR ********** IN WILDCAR
  1144.        DC 256AL1(0);
  1145. ORG ASTRKTBL+C'*';  % THE "*"
  1146. DC AL1(4);
  1147. ORG   ,;  % RESET COUNTER
  1148. AREAEND;
  1149. SERVCOMM:   AREA F,DSECT=NO;  % TABLE FOR SERVER COMMANDS
  1150.        DC 256AL1(0);  % ZERO TABLE
  1151. ORG SERVCOMM+YOFF;
  1152.      DC AL1(YCASE);  % ACK PACKET
  1153. ORG SERVCOMM+NOFF;
  1154.      DC AL1(NCASE);  % NACK PACKET
  1155. ORG SERVCOMM+GOFF;
  1156.      DC AL1(GCASE);  % SERVER GENERIC COMMANDS
  1157. ORG SERVCOMM+R2OFF;
  1158.      DC AL1(R2CASE);  % SERVER GET  COMMAND
  1159. ORG SERVCOMM+IOFF;
  1160.      DC AL1(ICASE);  % SERVER I PACKET
  1161. ORG SERVCOMM+ROFF;
  1162.      DC AL1(SCASE);  % SENDINIT PACKET
  1163. ORG   ,;  % RESET COUNTER
  1164. AREAEND;
  1165.  
  1166. COMMAND:   AREA F,DSECT=NO;  % TABLE FOR COMMANDS
  1167.        DC 256AL1(0);  % ZERO TABLE
  1168. ORG COMMAND+YOFF;
  1169.      DC AL1(YCASE);  % ACK PACKET
  1170. ORG COMMAND+NOFF;
  1171.      DC AL1(NCASE);  % NACK PACKET
  1172. ORG COMMAND+FOFF;
  1173.      DC AL1(FCASE);  % FILE INIT  PACKET
  1174. ORG COMMAND+DOFF;
  1175.      DC AL1(DCASE);  % DATA PACKET
  1176. ORG COMMAND+ZOFF;
  1177.      DC AL1(ZCASE);  % EOF PACKET
  1178. ORG COMMAND+COFF;
  1179.      DC AL1(CCASE);  % COMPLETEPACKET
  1180. ORG COMMAND+BOFF;
  1181.      DC AL1(BCASE);  % EOT PACKET
  1182. ORG COMMAND+EOFF;
  1183.      DC AL1(ECASE);  % ERROR PACKET
  1184. ORG COMMAND+AOFF;
  1185.      DC AL1(ACASE);  % ABORT PACKET
  1186. ORG COMMAND+ROFF;
  1187.      DC AL1(SCASE);  % SENDINIT PACKET
  1188. ORG   ,;  % RESET COUNTER
  1189. AREAEND;
  1190. KOUTADDR:      DC    A(KERMVOUT);  % ADDRESS OF OUTPUT
  1191. ADDSTATA:      DC     A(ADSTATUS);  % ROUTINE TO ADD TO STATUS BUFFER
  1192. ASCILITS: AREA H,DSECT=NO;  % TABLE OF VALUES FOR SHOW ROUTINE
  1193.        DC   CL3'NUL';
  1194.        DC   CL3'SOH';
  1195.        DC   CL3'STX';
  1196.        DC   CL3'ETX';
  1197.        DC   CL3'EOT';
  1198.        DC   CL3'ENQ';
  1199.        DC   CL3'ACK';
  1200.        DC   CL3'BEL';
  1201.        DC   CL3'BS ';
  1202.        DC   CL3'HT ';
  1203.        DC   CL3'LF ';
  1204.        DC   CL3'VT ';
  1205.        DC   CL3'FF ';
  1206.        DC   CL3'CR ';
  1207.        DC   CL3'SO ';
  1208.        DC   CL3'SI ';
  1209.        DC   CL3'DLE';
  1210.        DC   CL3'DC1';
  1211.        DC   CL3'DC2';
  1212.        DC   CL3'DC3';
  1213.        DC   CL3'DC4';
  1214.        DC   CL3'NAK';
  1215.        DC   CL3'SYN';
  1216.        DC   CL3'ETB';
  1217.        DC   CL3'CAN';
  1218.        DC   CL3'EM ';
  1219.        DC   CL3'SUB';
  1220.        DC   CL3'ESC';
  1221.        DC   CL3'FS ';
  1222.        DC   CL3'GS ';
  1223.        DC   CL3'RS ';
  1224.        DC   CL3'US ';
  1225. ASCLITLN: AREAEND;
  1226. ASCCNTLC: AREA H,DSECT=NO;  % TABLE FOR CONTROL CHARACTER IN SHOW
  1227.        DC   CL2'^@';
  1228.        DC   CL2'^A';
  1229.        DC   CL2'^B';
  1230.        DC   CL2'^C';
  1231.        DC   CL2'^D';
  1232.        DC   CL2'^E';
  1233.        DC   CL2'^F';
  1234.        DC   CL2'^G';
  1235.        DC   CL2'^H';
  1236.        DC   CL2'^I';
  1237.        DC   CL2'^J';
  1238.        DC   CL2'^K';
  1239.        DC   CL2'^L';
  1240.        DC   CL2'^M';
  1241.        DC   CL2'^N';
  1242.        DC   CL2'^O';
  1243.        DC   CL2'^P';
  1244.        DC   CL2'^Q';
  1245.        DC   CL2'^R';
  1246.        DC   CL2'^S';
  1247.        DC   CL2'^T';
  1248.        DC   CL2'^U';
  1249.        DC   CL2'^V';
  1250.        DC   CL2'^W';
  1251.        DC   CL2'^X';
  1252.        DC   CL2'^Y';
  1253.        DC   CL2'^Z';
  1254.        DC   CL2'^[';
  1255.        DC   CL2'^\';
  1256.        DC   CL2'^]';
  1257.        DC   CL2'^^';
  1258.        DC   CL2'^_';
  1259.        DC   CL2'^`';
  1260. ASCCNTLL: AREAEND;
  1261. CRCCONAD:   DC    A(CRCCONST);  % ADDRESS OF CRC TABLE
  1262. NOQUADD:   DC    A(NOQUOTE);  % TABLE FOR CONTROL CHARACTERS
  1263. CIRPARM: AREA F,DSECT=NO;
  1264. CIROPT:    DC    X'02';  % OPTION GET NEX LEVEL DATA SET NAME AND VOL
  1265.         DC    2AL1(0);  % RESERVED BY SYSTEM
  1266. CIRLOCRC:  DC    AL1(0);  % LOCATE RETURN CODE
  1267. CIRSRCH:  DC    A(LASTDSN);  % SEARCH ARG ADDRESS OF LAST DATA SET NAME
  1268. CIRCVOL:   DC    F'0';  % ADDRESS OF VOL ALWAYS 0 FORCE CAT LOOKUP
  1269. CIRWA:     DC    A(USERWORK);  % USER WORK AREA
  1270. CIRSAVE:   DC    A(SAVECAT);  % SAVE AREA FOR MACRO
  1271. CIRPSWD:   DC    F'0';  % ADDRESS OF PASSWORD
  1272. AREAEND;
  1273.  
  1274. SAVECAT:   DC  18F'0';  % SAVE AREA FOR CATALOG ROUTINE
  1275. CRCCONST: AREA H,DSECT=NO;  % BCC VALUE CONSTANTS
  1276. % GIVEN BY DIVIDING ANY GIVEN BYTE VALUE BY
  1277. % THE CCITT POLYNOMIAL X^16+X^12+X^5+1
  1278. % THIS VALUE IS THE REMAINDER
  1279. %
  1280.   DC AL2(0);  % 0
  1281.   DC AL2(4489);  % 1
  1282.   DC AL2(8978);  % 2
  1283.   DC AL2(12955);  % 0
  1284.   DC AL2(17956);  % 0
  1285.   DC AL2(22445);  % 0
  1286.   DC AL2(25910);  % 0
  1287.   DC AL2(29887);  % 0
  1288.   DC AL2(35912);  % 0
  1289.   DC AL2(40385);  % 0
  1290.   DC AL2(44890);  % 0
  1291.   DC AL2(48851);  % 0
  1292.   DC AL2(51820);  % 0
  1293.   DC AL2(56293);  % 0
  1294.   DC AL2(59774);  % 0
  1295.   DC AL2(63735);  % 0
  1296.   DC AL2(4225);  % 0
  1297.   DC AL2(264);  % 0
  1298.   DC AL2(13203);  % 0
  1299.   DC AL2(8730);  % 0
  1300.   DC AL2(22181);  % 0
  1301.   DC AL2(18220);  % 0
  1302.   DC AL2(30135);  % 0
  1303.   DC AL2(25662);  % 0
  1304.   DC AL2(40137);  % 0
  1305.   DC AL2(36160);  % 0
  1306.   DC AL2(49115);  % 0
  1307.   DC AL2(44626);  % 0
  1308.   DC AL2(56045);  % 0
  1309.   DC AL2(52068);  % 0
  1310.   DC AL2(63999);  % 0
  1311.   DC AL2(59510);  % 0
  1312.   DC AL2(8450);  % 0
  1313.   DC AL2(12427);  % 0
  1314.   DC AL2(528);  % 0
  1315.   DC AL2(5017);  % 0
  1316.   DC AL2(26406);  % 0
  1317.   DC AL2(30383);  % 0
  1318.   DC AL2(17460);  % 0
  1319.   DC AL2(21949);  % 0
  1320.   DC AL2(44362);  % 0
  1321.   DC AL2(48323);  % 0
  1322.   DC AL2(36440);  % 0
  1323.   DC AL2(40913);  % 0
  1324.   DC AL2(60270);  % 0
  1325.   DC AL2(64231);  % 0
  1326.   DC AL2(51324);  % 0
  1327.   DC AL2(55797);  % 0
  1328.   DC AL2(12675);  % 0
  1329.   DC AL2(8202);  % 0
  1330.   DC AL2(4753);  % 0
  1331.   DC AL2(792);  % 0
  1332.   DC AL2(30631);  % 0
  1333.   DC AL2(26158);  % 0
  1334.   DC AL2(21685);  % 0
  1335.   DC AL2(17724);  % 0
  1336.   DC AL2(48587);  % 0
  1337.   DC AL2(44098);  % 0
  1338.   DC AL2(40665);  % 0
  1339.   DC AL2(36688);  % 0
  1340.   DC AL2(64495);  % 0
  1341.   DC AL2(60006);  % 0
  1342.   DC AL2(55549);  % 0
  1343.   DC AL2(51572);  % 0
  1344.   DC AL2(16900);  % 0
  1345.   DC AL2(21389);  % 0
  1346.   DC AL2(24854);  % 0
  1347.   DC AL2(28831);  % 0
  1348.   DC AL2(1056);  % 0
  1349.   DC AL2(5545);  % 0
  1350.   DC AL2(10034);  % 0
  1351.   DC AL2(14011);  % 0
  1352.   DC AL2(52812);  % 0
  1353.   DC AL2(57285);  % 0
  1354.   DC AL2(60766);  % 0
  1355.   DC AL2(64727);  % 0
  1356.   DC AL2(34920);  % 0
  1357.   DC AL2(39393);  % 0
  1358.   DC AL2(43898);  % 0
  1359.   DC AL2(47859);  % 0
  1360.   DC AL2(21125);  % 0
  1361.   DC AL2(17164);  % 0
  1362.   DC AL2(29079);  % 0
  1363.   DC AL2(24606);  % 0
  1364.   DC AL2(5281);  % 0
  1365.   DC AL2(1320);  % 0
  1366.   DC AL2(14259);  % 0
  1367.   DC AL2(9786);  % 0
  1368.   DC AL2(57037);  % 0
  1369.   DC AL2(53060);  % 0
  1370.   DC AL2(64991);  % 0
  1371.   DC AL2(60502);  % 0
  1372.   DC AL2(39145);  % 0
  1373.   DC AL2(35168);  % 0
  1374.   DC AL2(48123);  % 0
  1375.   DC AL2(43634);  % 0
  1376.   DC AL2(25350);  % 0
  1377.   DC AL2(29327);  % 0
  1378.   DC AL2(16404);  % 0
  1379.   DC AL2(20893);  % 0
  1380.   DC AL2(9506);  % 0
  1381.   DC AL2(13483);  % 0
  1382.   DC AL2(1584);  % 0
  1383.   DC AL2(6073);  % 0
  1384.   DC AL2(61262);  % 0
  1385.   DC AL2(65223);  % 0
  1386.   DC AL2(52316);  % 0
  1387.   DC AL2(56789);  % 0
  1388.   DC AL2(43370);  % 0
  1389.   DC AL2(47331);  % 0
  1390.   DC AL2(35448);  % 0
  1391.   DC AL2(39921);  % 0
  1392.   DC AL2(29575);  % 0
  1393.   DC AL2(25102);  % 0
  1394.   DC AL2(20629);  % 0
  1395.   DC AL2(16668);  % 0
  1396.   DC AL2(13731);  % 0
  1397.   DC AL2(9258);  % 0
  1398.   DC AL2(5809);  % 0
  1399.   DC AL2(1848);  % 0
  1400.   DC AL2(65487);  % 0
  1401.   DC AL2(60998);  % 0
  1402.   DC AL2(56541);  % 0
  1403.   DC AL2(52564);  % 0
  1404.   DC AL2(47595);  % 0
  1405.   DC AL2(43106);  % 0
  1406.   DC AL2(39673);  % 0
  1407.   DC AL2(35696);  % 0
  1408.   DC AL2(33800);  % 0
  1409.   DC AL2(38273);  % 0
  1410.   DC AL2(42778);  % 0
  1411.   DC AL2(46739);  % 0
  1412.   DC AL2(49708);  % 0
  1413.   DC AL2(54181);  % 0
  1414.   DC AL2(57662);  % 0
  1415.   DC AL2(61623);  % 0
  1416.   DC AL2(2112);  % 0
  1417.   DC AL2(6601);  % 0
  1418.   DC AL2(11090);  % 0
  1419.   DC AL2(15067);  % 0
  1420.   DC AL2(20068);  % 0
  1421.   DC AL2(24557);  % 0
  1422.   DC AL2(28022);  % 0
  1423.   DC AL2(31999);  % 0
  1424.   DC AL2(38025);  % 0
  1425.   DC AL2(34048);  % 0
  1426.   DC AL2(47003);  % 0
  1427.   DC AL2(42514);  % 0
  1428.   DC AL2(53933);  % 0
  1429.   DC AL2(49956);  % 0
  1430.   DC AL2(61887);  % 0
  1431.   DC AL2(57398);  % 0
  1432.   DC AL2(6337);  % 0
  1433.   DC AL2(2376);  % 0
  1434.   DC AL2(15315);  % 0
  1435.   DC AL2(10842);  % 0
  1436.   DC AL2(24293);  % 0
  1437.   DC AL2(20332);  % 0
  1438.   DC AL2(32247);  % 0
  1439.   DC AL2(27774);  % 0
  1440.   DC AL2(42250);  % 0
  1441.   DC AL2(46211);  % 0
  1442.   DC AL2(34328);  % 0
  1443.   DC AL2(38801);  % 0
  1444.   DC AL2(58158);  % 0
  1445.   DC AL2(62119);  % 0
  1446.   DC AL2(49212);  % 0
  1447.   DC AL2(53685);  % 0
  1448.   DC AL2(10562);  % 0
  1449.   DC AL2(14539);  % 0
  1450.   DC AL2(2640);  % 0
  1451.   DC AL2(7129);  % 0
  1452.   DC AL2(28518);  % 0
  1453.   DC AL2(32495);  % 0
  1454.   DC AL2(19572);  % 0
  1455.   DC AL2(24061);  % 0
  1456.   DC AL2(46475);  % 0
  1457.   DC AL2(41986);  % 0
  1458.   DC AL2(38553);  % 0
  1459.   DC AL2(34576);  % 0
  1460.   DC AL2(62383);  % 0
  1461.   DC AL2(57894);  % 0
  1462.   DC AL2(53437);  % 0
  1463.   DC AL2(49460);  % 0
  1464.   DC AL2(14787);  % 0
  1465.   DC AL2(10314);  % 0
  1466.   DC AL2(6865);  % 0
  1467.   DC AL2(2904);  % 0
  1468.   DC AL2(32743);  % 0
  1469.   DC AL2(28270);  % 0
  1470.   DC AL2(23797);  % 0
  1471.   DC AL2(19836);  % 0
  1472.   DC AL2(50700);  % 0
  1473.   DC AL2(55173);  % 0
  1474.   DC AL2(58654);  % 0
  1475.   DC AL2(62615);  % 0
  1476.   DC AL2(32808);  % 0
  1477.   DC AL2(37281);  % 0
  1478.   DC AL2(41786);  % 0
  1479.   DC AL2(45747);  % 0
  1480.   DC AL2(19012);  % 0
  1481.   DC AL2(23501);  % 0
  1482.   DC AL2(26966);  % 0
  1483.   DC AL2(30943);  % 0
  1484.   DC AL2(3168);  % 0
  1485.   DC AL2(7657);  % 0
  1486.   DC AL2(12146);  % 0
  1487.   DC AL2(16123);  % 0
  1488.   DC AL2(54925);  % 0
  1489.   DC AL2(50948);  % 0
  1490.   DC AL2(62879);  % 0
  1491.   DC AL2(58390);  % 0
  1492.   DC AL2(37033);  % 0
  1493.   DC AL2(33056);  % 0
  1494.   DC AL2(46011);  % 0
  1495.   DC AL2(41522);  % 0
  1496.   DC AL2(23237);  % 0
  1497.   DC AL2(19276);  % 0
  1498.   DC AL2(31191);  % 0
  1499.   DC AL2(26718);  % 0
  1500.   DC AL2(7393);  % 0
  1501.   DC AL2(3432);  % 0
  1502.   DC AL2(16371);  % 0
  1503.   DC AL2(11898);  % 0
  1504.   DC AL2(59150);  % 0
  1505.   DC AL2(63111);  % 0
  1506.   DC AL2(50204);  % 0
  1507.   DC AL2(54677);  % 0
  1508.   DC AL2(41258);  % 0
  1509.   DC AL2(45219);  % 0
  1510.   DC AL2(33336);  % 0
  1511.   DC AL2(37809);  % 0
  1512.   DC AL2(27462);  % 0
  1513.   DC AL2(31439);  % 0
  1514.   DC AL2(18516);  % 0
  1515.   DC AL2(23005);  % 0
  1516.   DC AL2(11618);  % 0
  1517.   DC AL2(15595);  % 0
  1518.   DC AL2(3696);  % 0
  1519.   DC AL2(8185);  % 0
  1520.   DC AL2(63375);  % 0
  1521.   DC AL2(58886);  % 0
  1522.   DC AL2(54429);  % 0
  1523.   DC AL2(50452);  % 0
  1524.   DC AL2(45483);  % 0
  1525.   DC AL2(40994);  % 0
  1526.   DC AL2(37561);  % 0
  1527.   DC AL2(33584);  % 0
  1528.   DC AL2(31687);  % 0
  1529.   DC AL2(27214);  % 0
  1530.   DC AL2(22741);  % 0
  1531.   DC AL2(18780);  % 0
  1532.   DC AL2(15843);  % 0
  1533.   DC AL2(11370);  % 0
  1534.   DC AL2(7921);  % 0
  1535.   DC AL2(3960);  % 0
  1536. AREAEND;
  1537.  
  1538. %%WORKING STORAGE END
  1539. SUBTITLE 'KRESET';
  1540. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1541. %      INITIALIZATION ROUTINE
  1542. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1543. %
  1544. KRESET:
  1545. CENTER VRE,HIGHR,ENTRY=NO;
  1546. BAL;
  1547.          XC        N,N                 SET VARIABLES TO ZERO
  1548.          XC        NUM,NUM
  1549.          XC        LSDAT,LSDAT
  1550.          XC        LRDAT,LRDAT
  1551.          MVI       FLAGS,X'00'         CLEAR ALL FLAGS
  1552.          XC        SAVPL,SAVPL
  1553.          XC        RSAVPL,RSAVPL
  1554.          XC        NUMTRY,NUMTRY
  1555.          MVC       FILNAM,=18X'20'     BLANK OUT FILNAM & NAME
  1556.          MVC       NAME,=18X'20'
  1557.          XC        OLDTRY,OLDTRY
  1558.          XC        SIZE,SIZE
  1559.          XC        TEMP,TEMP
  1560.          XC        STORLOC,STORLOC
  1561.          MVC       DELAY,DDELAY        SET DEFAULT DELAY
  1562.          MVC       LRECL(2),DLRECL     SET DEFAULTS, JUST IN CASE
  1563.          MVC       BLKSIZE(2),DBLKSIZE SET DEFAULTS, JUST IN CASE
  1564.          MVC       TRACK,DTRACK        DEFAULT SPACE OF 5 TRACKS
  1565.          MVC       RFM(2),DRECFM
  1566.          MVC       QUOCHAR(1),DQUOTE
  1567.          MVC        TABCHAR(1),DTABCHAR  TAB CHARACTER
  1568.          MVC       RQUO(1),DQUOTE
  1569.          MVC       REOL(1),DEOL
  1570.          MVC       SEOL(1),DEOL
  1571.          MVC       SSOH(1),DSOH
  1572.          MVC       RSOH(1),DSOH
  1573.          MVC      BINQC(1),DQBIN         EIGTH BIT QUOTE CHARACTER
  1574.          MVI       STATE,C' '
  1575. *        MVI       STYPE,C' '
  1576.          MVI       RTYPE,C' '
  1577. *
  1578. ALP;  % RETURN TO ALP LAND
  1579.  
  1580. MZC TABTABLE,TABTLEN;  % ZERO TAB TABLE
  1581. LA XRA,TABTABLE;  % POINT AT TABLE
  1582. LI VR1,10;  % TEN ENTRIES IBM STYLE
  1583. LI VR0,9;  % 9 FIRST ENTRY EACH 8 UNITS LONG
  1584. DO BEGIN
  1585. STH VR0,0(,XRA);  % PUT IN TABLE
  1586. AI VR0,8;  % NEXT ENTRY
  1587. AI XRA,2 % NEXT POINT IN BUFFER
  1588. END FOR VR1;
  1589.  
  1590. MZC RECTABLE,256;  % ZERO RECTABLE
  1591. MMVC SENDTBL,SENDTLIT,256;  % INITIALIZE BOTH TABLES
  1592. MMVC REPTCHAR,DREPT,1;  % MOVE IN DEFAULT VALUE FOR REPEAT PREFIX
  1593. MZC PREFIXL,2;  % NO PREFIX SET
  1594. ZF PREFXQUO;  % QUOTED PREFIX
  1595. SF EDITF;  % DEFAULT AS EDIT FILE
  1596.  
  1597. MMVC EDTYPE,=F'1',4;  % TURN OFF LINE NUMBERS
  1598. MMVC HIGHBCC,DBCC,1;  % SET BCC CHECK LEVEL
  1599. SF TIMERF;  % TURN ON TIMER
  1600. MMVC DATA,=C'TEXT  ',6;
  1601. ZF DATAFLAG;
  1602. MMVC PHDR,SSOH,1;  % INITIALIZE START O HEADER
  1603. CALL XANYVOL;  % EXTERNAL ROUTINE GIVES THE SYSTEM
  1604.              %   SYMBOL FOR SYSTEM SELECTING THE VOLUMRE
  1605.  %  ON UPLOADED DATA SET (E.G SET VOL TMP - SYSTEM SELECTS
  1606. ST VR1,TMPDISKA;
  1607. STH VR0,TMPDISKL;
  1608. LR XRA,VR0;
  1609. MFC VOLUME,L'VOLUME;
  1610. EXI XRA,MMVC,VOLUME,0(VR1),*-*,INCR=YES,DECR=YES;
  1611.  
  1612. CEXIT VRE,HIGHR;
  1613.          LTORG;
  1614. KWRDSECT: AREA ,0X;
  1615. COPY KWR;
  1616. AREAEND;
  1617. SENDTLIT: AREA F,DSECT=NO;
  1618.          DC  256AL1(0);  % FILL ARRAY WITH ZEROS
  1619. ORG SENDTLIT;
  1620.          DC  32AL1(ASCIIQUO);  % CONTROL QUOTE
  1621. ORG SENDTLIT+127;
  1622.          DC  AL1(ASCIIQUO);  % THE DELETE CHARACTER
  1623. ORG SENDTLIT+128;  % CONTROL + 8BIT
  1624.           DC    32AL1(ASCIQUO8);  % CONTROL + 8BIT
  1625.         DC 95AL1(ASCI8BIT);
  1626. ORG SENDTLIT+255;  % CONTROL + 8BIT
  1627.            DC   AL1(ASCIQUO8);  % CONTROL + 8BIT
  1628. SENDTLTL: AREAEND;
  1629. SUBTITLE 'PROFILES';
  1630. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1631. %  MODULE NAME - PROFILES
  1632. %  FUNCTION - EXECUTE SYSTEM AND USER PROFILES IF ANY VIA LOCATE
  1633. % INPUTS NONE
  1634. % OUTPUTS EXECTION OF PROFILE
  1635. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1636. PROFILES:
  1637. CENTER VRE,HIGHR,ENTRY=NO;
  1638. MFC DSNAME,44;
  1639.  
  1640. % NOW CHECK IF THERE IS A USER PROFILE
  1641. LH XRA,USERPREL;  % LENGTH OF USER PREFIX
  1642. L XRB,USERPREA;  % USER PREFIX NAME
  1643. EXI XRA,MMVC,DSNAME,0(XRB),*-*,INCR=YES,DECR=YES;  % USER  + "."
  1644. LA VR1,DSNAME;
  1645. AR VR1,XRA;
  1646. MVI 0(VR1),C'.';  % PUT IN DOT AFTER USER CODE
  1647. AI VR1,1;
  1648. MMVC 0(VR1),USERPROF,USERPROL;
  1649. LOCATE DATASET;
  1650. IF <RZ VRF> THEN BEGIN  % DATASET EXISTS - SO EXECUTE IT VIA TSO
  1651. LI VR0,XUSERPRL;  % LENGTH OF COMMAND
  1652. CCALL TSOCMD,A,VR1=XUSERPRO;  % EXECUTE THE PROFILE COMMAND
  1653. END;
  1654. MFC DSNAME,44;
  1655. % FIRST CHECK IF THERE IS A SYSTEM PROFILE
  1656. CALL SYSPRODS;  % CALL EXTERNAL ROUTINE FOR NAME OF SYSTEM PROFILE
  1657. IF <RP VR0> & <CLI VR0,45; CC L> THEN BEGIN  % MUST HAVE LENGTH
  1658. LR XRA,VR1;  % POINTER TO SYSTEM PROFILE
  1659. LR XRB,VR0;  % LENGTH OF SYSTEM PROFILE
  1660. EXI XRB,MMVC,DSNAME,0(XRA),*-*,INCR=YES,DECR=YES;
  1661. LOCATE DATASET;
  1662. IF <RZ VRF> THEN BEGIN  % DATASET EXISTS - SO EXECUTE IT VIA TSO
  1663. LR VR0,XRB;  % LENGTH OF COMMAND
  1664. AI VR0,5;  % LENGTH OF DSN + EX + QUOTES AND BLANKS
  1665. EXI XRB,MMVC,EXDSN,0(XRA),*-*,INCR=YES,DECR=YES;
  1666. LA VR1,EXDSN;
  1667. AR VR1,XRB;
  1668. MVI 0(VR1),C'''';
  1669. CCALL TSOCMD,A,VR1=EXBUFFER;  % EXECUTE THE PROFILE COMMAND
  1670. END;
  1671. MFC DSNAME,44;
  1672. END;  % OF POSITIVE RETURN ON SYSTEM PROFILE
  1673.  
  1674. DATA BEGIN
  1675. EXBUFFER:
  1676. DC CL3'EX ';  % THE EXECUTE COMMAND
  1677. DC CL1'''';  % QUOTE AROUND SYSTEM PROFILE
  1678. EXDSN: DS   CL46;  % FOR DATA SET NAME
  1679. END;
  1680.  
  1681. CEXIT VRE,HIGHR;
  1682. LTORG;
  1683. EXORG;
  1684. SUBTITLE 'STCKMOD';
  1685. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1686. % MOD: STCKMOD
  1687. % FUNCTION: CALLS THE STACK MACRO TO PUT INPUT ON STACK
  1688. %           IF ONE EXISTS ON THE COMMAND LINE OF CP
  1689. %  RETURN   : ITEM STACKED ON INPUT STACK
  1690. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1691. STCKMOD:
  1692. CENTER VRE,HIGHR,ENTRY=NO;
  1693. L XRA,CBUFFADD;  % ADDRESS
  1694. LH XRB,0(XRA);  % LOAD LENGTH OF COMMAND STRING
  1695. SI XRB,4;  % SUB OFF FOUR FOR HEADER
  1696. LH XRC,2(XRA);  % LOAD OFFSET FOR PARAMETER
  1697. SR XRB,XRC;  % SEE IF A PARAMETER EXISTS
  1698. IF <RP XRB> THEN BEGIN  % WE HAVE ONE
  1699. AI XRA,4;  % POINT TO BEGINING OF COMMAND STRING
  1700. AR XRA,XRC;  % INDEX TO BEGINNING OF PARAMETER
  1701. %  NOW XRA-> PARAMETER
  1702. %   AND XRB= THE LENGTH
  1703.  
  1704. LA VR0,16(,XRB);  % THE LENGTH
  1705. O VR0,=AL1(78,0,0,0);  % SUBPOOL 78  WHERE THE STACK WANTS IT
  1706. GETMAIN R,LV=(0);  % GET THE CORE
  1707. LR XRC,VR1;  % ADDRESS
  1708. MZC 0(XRC),16;  % CLEAR LSD
  1709. USE XRC AS LSD IN BEGIN
  1710. AI VR1,16;  % INCREMENT PAST LSD
  1711. ST VR1,LSDADATA; ST VR1,LSDANEXT;  % PLANT BUFFER ADDRESS
  1712. STH XRB,LSDRCLEN;  % PLANT RECORD LENGTH
  1713. STH XRB,LSDTOTLN;  % PLANT TOTAL LENGTH
  1714. END;
  1715. EXI XRB,MMVC,0(VR1),0(XRA),*-*,INCR=YES,DECR=NO;
  1716. L XRA,UPTADD;  % UPTADDRESS
  1717. L XRB,ECTADD;  % ECT ADDRESS
  1718. L VRF,STACKADD;
  1719. STACK STORAGE=((XRC),SOURCE),ENTRY=(15),MF=(E,IOPLADS),_
  1720. PARM=STACKLST,UPT=(XRA),ECT=(XRB),ECB=ECBGETLN;
  1721. DATA BEGIN
  1722. STACKLST: STACK MF=L;
  1723. END;  % THAT'S ALL FOLKS
  1724. END;  % OF SOMETHING TO STACK
  1725. CEXIT VRE,HIGHR;
  1726. LTORG;
  1727. EXORG;
  1728. SUBTITLE 'KSET';
  1729.  
  1730. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1731. %
  1732. %     MODULE NAME   -   KSET
  1733. %
  1734. %
  1735. %     FUNCTION-  MODULE SETS VARIOUS KERMIT OPTIONS
  1736. %               WHICH ARE DISPLAYED VIA THE SHOW COMMAND
  1737. %
  1738. %
  1739. %     INPUTS -   THE BUFFER 'INPUT' CONTAINS A COMMAND STRING
  1740. %
  1741. %
  1742. %
  1743. %
  1744. %     OUTPUTS-   CORRECTLY SET OPTIONS
  1745. %
  1746. %
  1747. %     RETURN
  1748. %
  1749. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1750. KSET: ;
  1751. CENTER VRE,HIGHR,ENTRY=NO;
  1752.  
  1753. LA XRC,*+4095;
  1754. USING *+4095-4,XRC;
  1755. %USING *+4095,XRC;
  1756. L XRD,SETADD;
  1757. LA XRE,4095(,XRD);
  1758. USING SETLABEL+4095,XRE;  % LITERALS ADDRESSIBILITY
  1759. USING SETLABEL,XRD;  % ADDRESSIBILITY
  1760. SCERROR NEW=SETERROR;  % ROUTINE FOR SCANNER ERROR
  1761. VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;  % INIT VAREA FOR OUTPUT
  1762. SETBLCK: DO BEGIN  % MAINLY TO FALL OUT
  1763.  
  1764.        SCAN   *;  % SCAN FOR SPECIFIC SET COMMAND
  1765.        SCKW  DATA,SETDATA,J;  % DATA COMMAND
  1766.        SCKW  BLOCK,SETBLOCK,J;  % BLOCK COMMAND
  1767.        SCKW  DEBUG,SETDBUG,J;  % DEBUG COMMAND
  1768.        SCKW  (HELP,?),SETHELP;  % HELP COMMAND
  1769.        SCKW  BIT8,SETBIT8,J;  % 8 BIT QUOTING Y/N COMMAND
  1770.        SCKW  EDIT,SETEDIT,J;  % EDIT DATA SET OPTIONS
  1771.        SCKW  (TAB,TABS),SETTAB,J;  % TAB OPTIONS
  1772.        SCKW  (SER,SERVER),SETSER,J;  % SERVER MODE OPTIONS
  1773.        SCKW  (TIME,TIMER),SETTIME,J;  % ENABLE TIMEOUT FEATURE
  1774.        SCKW  LRECL,SETLRECL,P;  % LRECL COMMAND
  1775.        SCKW  BLKSIZE,SETBLK,P,LIMIT=AL1(5);  % BLKSIZE COMMAND
  1776.        SCKW  SPACE,SETSPACE,P;  % SPACE COMMAND
  1777.        SCKW  DELAY,SETDELAY,P;  % DELAY COMMAND
  1778.        SCKW  REOL,SETREOL,P,LIMIT=AL1(3);  % RECEIVE  EOL COMMAND
  1779.        SCKW  SEOL,SETSEOL,P,LIMIT=AL1(3);  % SEND     EOL COMMAND
  1780.        SCKW  SOH,SETSOH,P,LIMIT=AL1(3);  % SOH COMMAND
  1781.        SCKW  (P,PACK,PACKET),SETPACK,P;  % RECEIVE  PACKET COMMAND
  1782.        SCKW  RECFM,SETRECFM,P,LIMIT=AL1(2);  % RECFM COMMAND
  1783.        SCKW  CQUOTE,SETQUOTE,P,LIMIT=AL1(3);  % QUOTE COMMAND
  1784.        SCKW  VOLUME,SETVOL,P,LIMIT=AL1(7);  % VOL COMMAND
  1785.        SCKW  BQUOTE,SETBINQC,P,LIMIT=AL1(3);  %  BINARY QUOTE   COMMAND
  1786.        SCKW  RQUOTE,SETREPTQ,P,LIMIT=AL1(3);  %  REPEAT QUOTE   COMMAND
  1787.        SCKW NUMBERED,DONUMBER;  % NUMBERING COMMAND
  1788.        SCKW PREFIX,DOPREFIX;  % PREFIX COMMAND
  1789.        SCKW NOPREFIX,NOPREFIX;  % PREFIX COMMAND
  1790. SCKW TURNAROUND,DOTURNRN,J;
  1791.        SCKW  ,BADSETKY;  % UNKNOWN KEYWORD
  1792. SCANEND;  % END OF SCANNING
  1793. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1794. %                 NO PARM ERROR HERE
  1795. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1796. %
  1797. WRTERM 'Parameter required for the Set command  ';
  1798.  
  1799. % drop into help message
  1800.  
  1801. %
  1802. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1803. %                 SET HELP TELLS VARIOUS SET OPTIONS
  1804. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1805. %
  1806. SETHELP:
  1807.  
  1808. WRTERM 'SET command options are ';
  1809. WRTERM ' ';  % BLANK LINE
  1810. WRTERM 'Data set attributes    ';
  1811. WRTERM 'DATA - Specifies text or binary file processing.';
  1812. WRTERM 'EDIT - Selects WYLBUR edit format or'_
  1813.    ' non-edit format for received text';
  1814. WRTERM  'data sets.';
  1815. WRTERM 'NUMBERED - Controls line numbering in non-edit '_
  1816. 'format text data sets.';
  1817. WRTERM 'TABS - Controls tab processing (tabs to spaces '_
  1818.        'receiving, vice-versa sending).';
  1819. WRTERM 'RECFM - Record format for received data set'_
  1820.    ' (non-edit format only).';
  1821. WRTERM 'LRECL - Logical record length for received data set'_
  1822.    ' (non-edit format only).';
  1823. WRTERM 'BLKSIZE - Block size for received data set'_
  1824.    ' (non-edit format only).';
  1825. WRTERM 'SPACE - Space allocation for received data set in tracks.';
  1826. WRTERM 'VOLUME - Disk volume to store received data set.';
  1827. WRTERM 'PREFIX - Prefix to be appended to the start of data'_
  1828.        ' set names.';
  1829. WRTERM 'NOPREFIX - Cancels a previously set prefix.';
  1830. WRTERM ' ';
  1831. WRTERM 'Protocol Attributes ';
  1832. WRTERM 'DELAY - Timing value for delay before starting send.';
  1833. WRTERM 'TIMER - Timeout on received packets.';
  1834. WRTERM 'BLOCK - Type of block checking on packets.';
  1835. WRTERM 'PACKET - Packet size.';
  1836. WRTERM 'CQUOTE - Quote character for control characters.';
  1837. WRTERM 'BQUOTE - Quote character for 8th bit quoting.';
  1838. WRTERM 'RQUOTE - Quote character for repeat count quoting.';
  1839. WRTERM 'SOH - First character of packet.';
  1840. WRTERM 'SEOL - Character appended to the end of sent packets.';
  1841. WRTERM 'REOL - Character expected at the end of received packets.';
  1842. WRTERM 'DEBUG - Sends log of all KERMIT packets '_
  1843. 'and disk I/O to a data set.';
  1844. WRTERM ' ';
  1845. WRTERM 'Specific information on each item is '_
  1846.        'available by "SET item ?".';
  1847.  
  1848.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1849.  
  1850. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1851. %                 SET DATA   FUNCTION     BINARY OR TEXT
  1852. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1853. %
  1854. SETDATA:
  1855.         SCKW  ?,DATAHELP;  % USER NEEDS INFO
  1856.         SCKW  (B,BINARY),BINON;  % TURN ON INDICATOR
  1857.         SCKW  (TEXT,T),BINOFF;  % TURN OFF
  1858.         SCKW   ,DATAERR;  % MISSING PARM
  1859.  
  1860. BINON:
  1861.         SF DATAFLAG;  % TURN ON BINARY INDICATOR
  1862.         MMVC DATA,=C'BINARY',6;
  1863.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1864. %
  1865.  
  1866. BINOFF:
  1867.         ZF DATAFLAG;  % TURN OFF BINARY INDICATOR
  1868.         MMVC DATA,=C'TEXT  ',6;
  1869.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1870. DATAHELP:
  1871. WRTERM 'Sets TEXT (ASCII-EBCDIC conversion) '_
  1872. 'or BINARY (no conversion)';
  1873. WRTERM 'processing of data.';
  1874.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1875. %
  1876. DATAERR:
  1877. WRTERM 'Valid options for data are binary or text ';
  1878.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1879. %
  1880. %
  1881. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1882. %     SET BLOCK CHECK TYPE
  1883. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1884. SETBLOCK:
  1885.        SCKW 1,SETBCC,CODE=AL1(1);
  1886.        SCKW 2,SETBCC,CODE=AL1(2);
  1887.        SCKW 3,SETBCC,CODE=AL1(3);
  1888.        SCKW CRC,SETBCC,CODE=AL1(3);
  1889.        SCKW (HELP,?),BCCHELP;
  1890.        SCKW ,BCCSETER;
  1891.  
  1892. SETBCC:
  1893. STC VRE,HIGHBCC;  % STORE OFF THE VALUE
  1894. EXIT FROM SETBLCK;
  1895. %
  1896. BCCHELP:
  1897. WRTERM 'Specifies which type of block checking is used.';
  1898. BCCSETER :
  1899. WRTERM 'Valid options are 1 (1-byte checksum), 2 (2-byte checksum),';
  1900. WRTERM '3 (3 byte cyclic redundancy check), or CRC '_
  1901. '(synonym for 3).';
  1902.  
  1903. EXIT FROM SETBLCK;
  1904. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1905. %                 SET BIT8   FUNCTION     ON OR OFF
  1906. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1907. %
  1908. SETBIT8:
  1909.         SCKW  ?,BIT8HELP;  % USER NEEDS INFO
  1910.         SCKW  ON,BITON8;  % TURN ON INDICATOR
  1911.         SCKW  OFF,BITOFF8;  % TURN OFF
  1912.         SCKW   ,BIT8ERR;  % MISSING PARM
  1913.  
  1914. BITON8:
  1915.         SF BIT8FLAG;  % TURN ON WORD INDICATOR
  1916.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1917. %
  1918.  
  1919. BITOFF8:
  1920.         ZF BIT8FLAG;  % TURN OFF WORD INDICATOR
  1921.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1922. BIT8HELP:
  1923. WRTERM 'BIT8 either on/off';
  1924.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1925. %
  1926. BIT8ERR:
  1927. WRTERM 'BIT8 turns on/off eighth bit quoting ';
  1928.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1929. %
  1930. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1931. %                 SET EDIT   FUNCTION     ON OR OFF
  1932. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1933. %
  1934. SETEDIT:
  1935.         SCKW  ?,EDITHELP;  % USER NEEDS INFO
  1936.         SCKW  ON,EDITON;  % TURN ON INDICATOR
  1937.         SCKW  OFF,EDITOFF;  % TURN OFF
  1938.         SCKW   ,EDITERR;  % MISSING PARM
  1939.  
  1940. EDITON:
  1941.         SF EDITF;  % TURN ON WORD INDICATOR
  1942.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1943. %
  1944.  
  1945. EDITOFF:
  1946.         ZF EDITF;  % TURN OFF WORD INDICATOR
  1947.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1948. EDITHELP:
  1949. WRTERM 'Controls use of WYLBUR edit format for received data sets.';
  1950. WRTERM 'Valid options are ON and OFF (default ON).';
  1951.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1952. %
  1953. EDITERR:
  1954. WRTERM 'Valid SET EDIT parameters are on, off, or help ';
  1955.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1956. %
  1957. %
  1958. %
  1959. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1960. %                 SET TIME   FUNCTION     ON OR OFF
  1961. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  1962. %
  1963. SETTIME:
  1964.         SCKW  ?,TIMEHELP;  % USER NEEDS INFO
  1965.         SCKW  ON,TIMEON;  % TURN ON INDICATOR
  1966.         SCKW  OFF,TIMEOFF;  % TURN OFF
  1967. SCKW ,TIMEINT,I,;  % GETS ACTUAL VALUE OF TIME FOR TIMER
  1968.         SCKW   ,TIMEERR;  % MISSING PARM
  1969.  
  1970. TIMEON:
  1971.         SF TIMERF;  % TURN ON WORD INDICATOR
  1972.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1973. %
  1974.  
  1975. TIMEOFF:
  1976.         ZF TIMERF;  % TURN OFF WORD INDICATOR
  1977.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1978. TIMEHELP:
  1979. WRTERM _
  1980. 'Controls timeout processing for received packets.  TSO KERMIT ';
  1981. WRTERM _
  1982. 'sends a NAK packet after timeout interval expires.  After ';
  1983. WRTERM _
  1984. '20 retries, TSO KERMIT terminates the file transfer.  Valid';
  1985. WRTERM _
  1986. 'are OFF (turns off timeout), ON (turns on timeout), or the number';
  1987. WRTERM _
  1988. 'of seconds to be used for the timeout interval.';
  1989.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  1990. %
  1991. TIMEINT:
  1992. IF <CI VRF,TIMERTOP; CC H> THEN BEGIN
  1993. WRTERM 'Too large a value for timer - 3600 seconds max';
  1994. END  % OF ERROR
  1995. ELSE BEGIN
  1996. MI VRF,100;  % STIMER MACRO USES 100'S OF SECONDS
  1997. ST VRF,RTIMEOUT;
  1998. SF TIMERF;
  1999. END;
  2000. EXIT FROM SETBLCK;
  2001.  
  2002. TIMEERR:
  2003. WRTERM 'Valid SET TIME parameters are on, off, or help ';
  2004.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2005. %
  2006. %
  2007. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2008. %                 SET TAB   FUNCTION     ON OR OFF
  2009. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2010. %
  2011. SETTAB:
  2012.         SCKW  ?,TABHELP;  % USER NEEDS INFO
  2013.         SCKW  ON,TABON;  % TURN ON INDICATOR
  2014.         SCKW  OFF,TABOFF;  % TURN OFF
  2015.         SCKW   ,TABSCN,B;  % CALL SCAN TAB ROUTINE
  2016.  
  2017. TABON:
  2018. FREEMAIN RC,SP=18;  % FREE TAB BUFFER
  2019.         SF TABF;  % TURN ON WORD INDICATOR
  2020. LA XRA,TABTABLE;  % STANDARD TABLE
  2021. ST XRA,TABTBLAD;  % STORE IN ADDRESS THAT TAB ROUTINES USE
  2022.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2023. %
  2024.  
  2025. TABOFF:
  2026. FREEMAIN RC,SP=18;  % FREE TAB BUFFER
  2027.         ZF TABF;  % TURN OFF WORD INDICATOR
  2028.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2029. TABHELP:
  2030. WRTERM _
  2031. 'Controls TAB processing on upload or download of text files.'_
  2032. '  OFF disables';
  2033. WRTERM _
  2034. 'TAB processing.  ON assumes tabs are set every 8 positions on the ';
  2035. WRTERM _
  2036. 'microcomputer and changes tabs to blanks in received data sets and';
  2037. WRTERM _
  2038. 'blanks to tabs in transmitted data sets.  Tab positions may also ';
  2039. WRTERM _
  2040. 'be specified as "column", "column+interval*count" '_
  2041. 'to set a tab at';
  2042. WRTERM '"column" and every "interval" columns for "count" times,';
  2043. WRTERM '"and/or column+interval/max"'_
  2044.  ' to set a tab "interval" columns through ';
  2045. WRTERM 'column "max".';
  2046.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2047. %
  2048. TABSCN:
  2049. CCALL SCANTABS,A;
  2050. IF <RNZ VRF> THEN  % ISSUE MESSAGE ON ERROR
  2051. WRTERM 'Invalid SET TAB parameters.  Type SET TAB ? for information.'
  2052. ELSE SF TABF;  % INDICATE TABBING
  2053.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2054. %
  2055. %
  2056. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2057. %                 SET SERVER   FUNCTION     ON OR OFF
  2058. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2059. %
  2060. SETSER:
  2061.         SCKW  ?,SERHELP;  % USER NEEDS INFO
  2062.         SCKW  ON,SERON;  % TURN ON INDICATOR
  2063.         SCKW  OFF,SEROFF;  % TURN OFF
  2064.         SCKW   ,SERERR;  % MISSING PARM
  2065.  
  2066. SERON:
  2067.         SF SERVERF;  % TURN ON WORD INDICATOR
  2068.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2069. %
  2070.  
  2071. SEROFF:
  2072.         ZF SERVERF;  % TURN OFF WORD INDICATOR
  2073.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2074. SERHELP:
  2075. WRTERM 'The SERVER command enables SERVER processing '_
  2076. 'TSO KERMIT becomes a slave to micro KERMIT . ';
  2077.  
  2078. WRTERM 'No set commands available while in Server mode ';
  2079. WRTERM 'the pc KERMIT issuses a logoff to the Server  ';
  2080.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2081. %
  2082. SERERR:
  2083. WRTERM 'Valid SET SERVER parameters are on, off, or help ';
  2084.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2085. %
  2086. %
  2087. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2088. %                 SET DEBUG   FUNCTION     ON OR OFF
  2089. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2090. %
  2091. SETDBUG:
  2092.         SCKW  ?,DBUGHELP;  % USER NEEDS INFO
  2093.         SCKW  ON,DBUGON;  % TURN ON INDICATOR
  2094.         SCKW  OFF,DBUGOFF;  % TURN OFF
  2095.         SCKW   ,DBUGERR;  % MISSING PARM
  2096.  
  2097. DBUGON:
  2098.         SF DBUGFLAG;  % TURN ON WORD INDICATOR
  2099.    %   OPEN FILE IF CLOSED
  2100. IF ^<OPENP DEBUG> THEN BEGIN  % FILE OPEN
  2101.      OPEN (DEBUG,(OUTPUT));
  2102. IF ^<OPENP DEBUG> THEN BEGIN  % FILE OPEN
  2103. WRTERM 'Unable to open DEBUG - DEBUG disabled';
  2104.         ZF DBUGFLAG;  % TURN OFF WORD INDICATOR
  2105. END;  % OF ERROR OPEN
  2106. END;  % OF OPEN BLOCK
  2107.  
  2108.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2109. %
  2110.  
  2111. DBUGOFF:
  2112.         ZF DBUGFLAG;  % TURN OFF WORD INDICATOR
  2113.        % CLOSE FILE IF OPEN
  2114. IF <OPENP DEBUG> THEN CLOSE DEBUG;  % FILE CLOSE
  2115.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2116. DBUGHELP:
  2117. WRTERM 'SET DEBUG ON dumps all received and sent packets';
  2118.  % 'all data set';
  2119. WRTERM 'plus all data set I/O to a VB data set.';
  2120. WRTERM 'The user must allocate the DD name DEBUG '_
  2121. 'to a sequential data set.';
  2122. WRTERM 'SET DEBUG OFF (default) closes debug data set (if open) ';
  2123. WRTERM  'and turns off debugging information.';
  2124.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2125. %
  2126. DBUGERR:
  2127. WRTERM 'Only valid debug options are on/off ';
  2128.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2129. %
  2130. %
  2131. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2132. %                 SET VOLUME   SERIAL NUMBER
  2133. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2134. %
  2135. SETVOL:
  2136. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2137. VOLHELP:
  2138. WRTERM 'Specifies which disk volume will be used for the'_
  2139. ' received data set.';
  2140. WRTERM 'VOLUME requires a 6 character volume serial number (e.g.'_
  2141.  ' FILE24).';
  2142. %WRTERM 'TMP means that any TMP volume may be used.';
  2143. L XRA,TMPDISKA;
  2144. LH XRB,TMPDISKL;
  2145. LA VR1,WRKBUFF;
  2146. EXI XRB,MMVC,WRKBUFF,0(XRA),*-*,INCR=YES,DECR=YES;
  2147. AR VR1,XRB;
  2148. MMVC 0(VR1),=C' means that any ',16;
  2149. AI VR1,16;
  2150. EXI XRB,MMVC,0(VR1),0(XRA),*-*,INCR=YES,DECR=YES;
  2151. AR VR1,XRB;
  2152. MMVC 0(VR1),=C' volume will be used.',21;
  2153. AI VR1,21;
  2154. LR VR0,VR1;
  2155. LA VR1,WRKBUFF;
  2156. SR VR0,VR1;
  2157. TPUT (VR1),(VR0);
  2158. END  % OF HELP
  2159. ELSE BEGIN
  2160. IF ^<CI VR0,6> THEN BEGIN  % MUST HAVE 6 CHARACTER VOLUME
  2161. L XRA,TMPDISKA;  % ADDRESS OF DEFAULT DISK
  2162. LH XRB,TMPDISKL;
  2163. IF <EXI XRB,MCLC,0(VR1),0(XRA),*-*,INCR=YES,DECR=YES> THEN BEGIN
  2164. MFC VOLUME,L'VOLUME;
  2165. EXI XRB,MMVC,VOLUME,0(XRA),*-*,INCR=YES,DECR=YES;
  2166. END
  2167. ELSE BEGIN  % ERROR
  2168. VOLERR:
  2169. WRTERM 'VOLUME must have 6 character length';
  2170. END;  % ERROR
  2171. END
  2172. ELSE BEGIN  % A GOOD 6 SERIAL
  2173. MMVC VOLUME,0(VR1),6;  % CHANGE VOLUME
  2174. MVI VOLUME+6,C' ';  % BLANK LAST
  2175. END;  % OF GOOD
  2176. END;  % OF NON HELP
  2177. %
  2178.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2179. %
  2180. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2181. %                 SET RECFM   V OR F
  2182. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2183. %
  2184. SETRECFM:
  2185. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2186. RECFMHLP:
  2187. WRTERM 'Record format for received non-edit format data set.';
  2188. WRTERM 'Valid Record formats are F, FB, V, VB, VBS or U (default VB).';
  2189. %
  2190. END  % OF HELP
  2191. ELSE BEGIN
  2192. LR XRA,VR0;  % GET LENGTH
  2193. IF <CLI 0(VR1),C'F'>  |   % MUST HAVE F CHARACTER RECFM   OR
  2194.  <CLI 0(VR1),C'U'>     |        % MUST HAVE U CHARACTER RECFM
  2195.  <CLI 0(VR1),C'V'> THEN BEGIN  % MUST HAVE V CHARACTER RECFM
  2196. IF <CI VR0,1> THEN MVI RFM+1,C' ' % BLANK IT OUT
  2197. ELSE <GOTO RECFMERR IF <CLI 1(VR1),C'B'; CC NE>>;  % JUMP OUT
  2198. EXI XRA,MMVC,RFM,0(VR1),0,DECR=YES;  % CHANGE RECFM
  2199. END
  2200. ELSE BEGIN  % RECFM  ERROR
  2201. RECFMERR:
  2202. WRTERM 'Valid Record formats are F, FB, V, VB ,VBS or U (default VB)';
  2203. END;  % OF GOOD
  2204. END;  % OF NON HELP
  2205. %
  2206.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2207. %
  2208. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2209. %                 SET QUOTE CHARACTER
  2210. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2211. %
  2212. SETQUOTE:
  2213. SCINIT (VR1),(VR0);
  2214. SCAN *;
  2215. SCKW (HELP,?),CQUOTHLP;
  2216. SCKW ,CQUOTNUM,PI,LIMIT=AL1(127);
  2217. SCKW ,CQUOTCHK,P,LIMIT=AL1(1);
  2218. SCKW ,CQUOTBAD;
  2219. SCANEND;
  2220. EXIT FROM SETBLCK;
  2221.  
  2222. CQUOTHLP:
  2223. WRTERM 'CQUOTE character (default #) is used for prefixing'_
  2224.   ' characters with a value lower ';
  2225. WRTERM 'than 32 decimal in  ASCII. Value must be between 33-62 '_
  2226.  'or 96-126 decimal,';
  2227. WRTERM 'indicating the ASCII code for the character.'_
  2228.        '  The actual character may';
  2229. WRTERM 'also be specified.';
  2230. %
  2231. EXIT FROM SETBLCK;
  2232. CQUOTCHK:
  2233. L XRA,ETOAVCON;  % ADDRESS OF TABLE
  2234. MTR 0(VR1),0(XRA),1;  % GET ASCII CHARACTER
  2235. LOADB VRF,0(VR1);  % LOAD IT
  2236.                    % NOW DROP INTO CHECK
  2237. CQUOTNUM: % NUMBER IN VRF
  2238. CCALL CHKCNTL,A,VR0=1;
  2239. IF <RNZ VRF>  THEN
  2240. BEGIN  % UNVALID VALUE
  2241. CQUOTBAD:
  2242. WRTERM 'Invalid value - must be between 33-62 - ASCII '_
  2243.  'Or 96-126 ASCII ';
  2244. END;  % OF ERROR VALUE
  2245.  
  2246. %
  2247.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2248. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2249. %     SET BINARY QUOTE CHARACTER
  2250. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2251. %
  2252. SETBINQC:
  2253. SCINIT (VR1),(VR0);
  2254. SCAN *;
  2255. SCKW (HELP,?),BQUOTHLP;
  2256. SCKW ,BQUOTNUM,PI,LIMIT=AL1(127);
  2257. SCKW ,BQUOTCHK,P,LIMIT=AL1(1);
  2258. SCKW ,BQUOTBAD;
  2259. SCANEND;
  2260. EXIT FROM SETBLCK;
  2261.  
  2262. BQUOTHLP:
  2263. TPUT =C'8th bit quote character (default &&) is used for ',48;
  2264. WRTERM  'prefixing characters that have their 8th bit on.';
  2265. WRTERM 'Value must be between 33-62 '_
  2266.  'or 96-126 decimal,';
  2267. WRTERM 'indicating the ASCII code for the character.';
  2268. WRTERM 'The actual character may also be specified.';
  2269. %
  2270. EXIT FROM SETBLCK;
  2271. BQUOTCHK:
  2272. L XRA,ETOAVCON;  % ADDRESS OF TABLE
  2273. MTR 0(VR1),0(XRA),1;  % GET ASCII CHARACTER
  2274. LOADB VRF,0(VR1);  % LOAD IT
  2275. BQUOTNUM: % NUMBER IN VRF
  2276. CCALL CHKCNTL,A,VR0=2;
  2277. IF <RNZ VRF> THEN  BEGIN  % UNVALID VALUE
  2278. BQUOTBAD:
  2279. WRTERM 'Invalid value - must be between 33-62 - ASCII ';
  2280. WRTERM 'Or 96-126 ASCII ';
  2281. END;  % OF ERROR VALUE
  2282.  
  2283. %
  2284.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2285. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2286. %     SET REPEAT QUOTE CHARACTER
  2287. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2288. %
  2289. SETREPTQ:
  2290. SCINIT (VR1),(VR0);
  2291. SCAN *;
  2292. SCKW (HELP,?),RQUOTHLP;
  2293. SCKW ,RQUOTNUM,PI,LIMIT=AL1(127);
  2294. SCKW ,RQUOTCHK,P,LIMIT=AL1(1);
  2295. SCKW ,RQUOTBAD;
  2296. SCANEND;
  2297. EXIT FROM SETBLCK;
  2298.  
  2299. RQUOTHLP:
  2300. WRTERM 'Repeat quote character (default ~) is used for ';
  2301. WRTERM  'prefixing repeated characters.';
  2302. WRTERM 'Value must be between 33-62 '_
  2303.  'or 96-126 decimal,';
  2304. WRTERM 'indicating the ASCII code for the character.';
  2305. WRTERM 'The actual character may also be specified.';
  2306. EXIT FROM SETBLCK;
  2307. RQUOTCHK:
  2308. L XRA,ETOAVCON;  % ADDRESS OF TABLE
  2309. MTR 0(VR1),0(XRA),1;  % GET ASCII CHARACTER
  2310. LOADB VRF,0(VR1);  % LOAD IT
  2311.                    % NOW DROP INTO CHECK
  2312. RQUOTNUM: % NUMBER IN VRF
  2313. CCALL CHKCNTL,A,VR0=3;
  2314. IF <RNZ VRF>  THEN   BEGIN
  2315. RQUOTBAD:
  2316. WRTERM 'Invalid value - must be between 33-62 - ASCII ';
  2317. WRTERM 'Or 96-126 ASCII ';
  2318. END;  % OF ERROR VALUE
  2319.  
  2320. %
  2321.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2322. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2323. %                 SET BLOCKING
  2324. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2325. %
  2326. SETBLK:
  2327. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2328. BLKHELP:
  2329. WRTERM 'Block size for received non-edit format data set '_
  2330.  '(default 6356, max 32760).';
  2331. %
  2332. END  % OF HELP
  2333. ELSE BEGIN
  2334. CVDTB (VR1),(VR0);  % CONVERT THE EBCDIC TO BINARY
  2335. IF <RMZ VRF> | <CI VRF,32767; CC NL> THEN BEGIN  % 32767 HIGHEST VALUE
  2336. BLKERR:
  2337. WRTERM 'BLOCKING HIGHEST VALUE = 32767';
  2338. END
  2339.  
  2340. ELSE BEGIN  % A GOOD 1 BLK
  2341. STH VRF,BLKSIZE;  % STORE IF OFFF
  2342. END;  % OF SELECT BEGIN
  2343. END;  % OF NON HELP
  2344. %
  2345.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2346. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2347. %                 SET LRECL
  2348. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2349. %
  2350. SETLRECL:
  2351. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2352. LRECLHLP:
  2353. WRTERM 'Logical record length for received non-edit format data set';
  2354. WRTERM '(default 504, max 32760).';
  2355. %
  2356. END  % OF HELP
  2357. ELSE BEGIN
  2358. CVDTB (VR1),(VR0);  % CONVERT THE EBCDIC TO BINARY
  2359. IF <RMZ VRF> | <CI VRF,32761; CC NL> THEN BEGIN  % 32760 HIGHEST VALUE
  2360. LRECLERR:
  2361. WRTERM 'LRECL  HIGHEST VALUE = 32760-CAN`T BE 0 OR MINUS';
  2362. END
  2363. ELSE BEGIN  % A GOOD  LRECL
  2364. STH VRF,LRECL;  % STORE IF OFFF
  2365. END;  % OF GOOD
  2366. END;  % OF NON HELP
  2367. %
  2368.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2369. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2370. %                 SET DELAY BEFORE SEND INIT
  2371. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2372. %
  2373. SETDELAY:
  2374. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2375. DELAYHLP:
  2376. WRTERM 'Specifies number of seconds (default 20)'_
  2377. ' that TSO KERMIT waits before the ';
  2378. WRTERM 'first packet is sent by the SEND command.';
  2379. %
  2380. END  % OF HELP
  2381. ELSE BEGIN
  2382. CVDTB (VR1),(VR0);  % CONVERT THE EBCDIC TO BINARY
  2383. IF <RMZ VRF> | <CI VRF,32767; CC NL> THEN BEGIN  % 32767 HIGHEST VALUE
  2384. DELAYERR:
  2385. WRTERM 'DELAY  HIGHEST VALUE = 32767-CAN`T BE 0 OR MINUS';
  2386. END
  2387. ELSE BEGIN  % A GOOD  DELAY
  2388. MI VRF,100;  % PUT IN 100TH OF SECONDS
  2389. ST VRF,DELAY;  % STORE IF OFFF
  2390. END;  % OF GOOD
  2391. END;  % OF NON HELP
  2392. %
  2393.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2394. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2395. %                 SET SOH START-OF-HEADER  CHARACTER
  2396. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2397. %
  2398. SETSOH:
  2399. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2400. SOHHELP:
  2401. WRTERM 'Sets the Start-of-header character sent at the start of'_
  2402. ' each transmitted packet ';
  2403. WRTERM 'and expected at the start of each received packet.';
  2404. WRTERM 'May be specified as decimal value of ASCII '_
  2405.          'code (0-31), ASCII control character ';
  2406. WRTERM 'name (e.g., SOH), or in control key notation (e.g., ^A).';
  2407. %
  2408. END  % OF HELP
  2409. ELSE BEGIN
  2410. %CVDTB (VR1),(VR0);  % CONVERT THE EBCDIC TO BINARY
  2411. CCALL SETCNTLS,A;
  2412. IF <RM VRF> | <CI VRF,32; CC NL> THEN BEGIN  % 31 HIGHEST VALUE
  2413. SOHERR:
  2414.  
  2415. WRTERM 'Valid Values 0-31 decimal';
  2416. END
  2417. ELSE BEGIN  % A GOOD 1 SOH
  2418. STC VRF,SSOH;  % STORE IF OFFF
  2419. STC VRF,RSOH;  % RECEIVE SOH
  2420. STC VRF,PHDR;  % STORE OFF IN SEND PACKET
  2421. END;  % OF GOOD
  2422. END;  % OF NON HELP
  2423. %
  2424.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2425. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2426. %                 SET EOL END-OF-LINE  CHARACTER
  2427. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2428. %
  2429. SETSEOL:
  2430. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2431. WRTERM 'The End-of-line control character '_
  2432.    'sent at the end of each transmitted packet.';
  2433. WRTERM 'May be specified as decimal value of ASCII '_
  2434.          'code (0-31), ASCII control character ';
  2435. WRTERM 'name (e.g., CR), or in control key notation (e.g., ^M).';
  2436. %
  2437. END  % OF HELP
  2438. ELSE BEGIN
  2439. CCALL SETCNTLS,A;
  2440. IF <RM VRF> | <CI VRF,32; CC NL> THEN BEGIN  % 31 HIGHEST VALUE
  2441. EOLERR:
  2442.  
  2443. WRTERM 'Valid Values 0-31 decimal';
  2444. END
  2445. ELSE BEGIN  % A GOOD 1 EOL
  2446. STC VRF,SEOL;  % STORE IF OFFF
  2447. END;  % OF GOOD
  2448. END;  % OF NON HELP
  2449.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2450. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2451. SETREOL:
  2452. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2453. WRTERM 'The End-of-line control character '_
  2454.    'expected at the end of each received packet.';
  2455. WRTERM 'May be specified as decimal value of ASCII '_
  2456.          'code (0-31), ASCII control character ';
  2457. WRTERM 'name (e.g., CR), or in control key notation (e.g., ^M).';
  2458. %
  2459. END  % OF HELP
  2460. ELSE BEGIN
  2461. CCALL SETCNTLS,A;
  2462. IF <RM VRF> | <CI VRF,32; CC NL> THEN BEGIN  % 31 HIGHEST VALUE
  2463. %EOLERR:
  2464.  
  2465. WRTERM 'Valid Values 0-31 decimal';
  2466. END
  2467. ELSE BEGIN  % A GOOD 1 EOL
  2468. STC VRF,REOL;  % RECEIVE EOL
  2469. END;  % OF GOOD
  2470. END;  % OF NON HELP
  2471. %
  2472.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2473. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2474. %                 SET RECEIVE PACKET LENGTH
  2475. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2476. %
  2477. SETPACK:
  2478. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2479. PACKHELP:
  2480. WRTERM 'Sets the maximum packet length'_
  2481.   '.  Valid Values are 26-94 decimal.';
  2482. %
  2483. END  % OF HELP
  2484. ELSE BEGIN
  2485. CVDTB (VR1),(VR0);  % CONVERT THE EBCDIC TO BINARY
  2486. IF <CI VRF,26; CC NL> & <CI VRF,94; CC NH> THEN BEGIN  % 94 HIGHEST VALU
  2487. ST VRF,RPSIZ;  % STORE IF OFFF
  2488. END
  2489. ELSE BEGIN  % A ERROR PACKET SIZE
  2490. PACKERR:
  2491. WRTERM 'Valid Values 26-94 decimal';
  2492. END;  % OF GOOD
  2493. END;  % OF NON HELP
  2494. %
  2495.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2496. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2497. %                 SET SPACE -TRACK ALLOCATIONS
  2498. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2499. %
  2500. SETSPACE:
  2501. IF <CLI 0(VR1),C'?'> | <MCLC 0(VR1),=C'HELP',4> THEN BEGIN
  2502. SPACEHLP:
  2503. WRTERM 'Space allocation for received data sets'_
  2504. ' in tracks (default 5, max 32767).';
  2505. %
  2506. END  % OF HELP
  2507. ELSE BEGIN
  2508. CVDTB (VR1),(VR0);  % CONVERT THE EBCDIC TO BINARY
  2509. IF <RMZ VRF> | <CI VRF,32767; CC NL> THEN BEGIN  % 32767 HIGHEST VALUE
  2510. SPACEERR:
  2511. WRTERM 'HIGHEST TRACK VALUE = 32767';
  2512. END
  2513. ELSE BEGIN  % A GOOD 1 SPACE
  2514. ST VRF,TRACK;  % STORE IF OFFF
  2515. END;  % OF GOOD
  2516. END;  % OF NON HELP
  2517.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2518. %
  2519. %
  2520. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2521. %     SET NUMBERS - COLUMN POSITIONS WYL/TSO
  2522. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2523. DONUMBER: % COL NUMBERS
  2524.  
  2525. CCALL SCANNUMS,A;  % SET UP NUMBERING
  2526.  
  2527.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2528. %
  2529. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2530. %     SET PREFIX - PREFIX USED FOR DATA SET NAME
  2531. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2532. DOPREFIX:
  2533. SCTELL;  % GET REMAINDER OF STRING
  2534.  
  2535.  
  2536. CCALL SETPREFX,A;
  2537.  
  2538. EXIT FROM SETBLCK;  % BLOW THIS POP STAND
  2539. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2540. %     SET NOPREFIX
  2541. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2542. NOPREFIX:  % DISABLE PREFIX
  2543. SCTELL;
  2544. IF <RP VR0> THEN BEGIN
  2545. SCAN *;
  2546.      SCKW (HELP,?),NOPREFHP;
  2547. SCANEND;  % OTHER PARAMETERS
  2548. WRTERM 'NOPREFIX has no parameters execept HELP or ?';
  2549. EXIT FROM SETBLCK;
  2550. NOPREFHP: % HELP EM OUT
  2551. WRTERM 'NOPREFIX cancels prefixing a data set name on send or'_
  2552. ' receive.';
  2553. EXIT FROM SETBLCK;
  2554. END;  % OF MORE TO SCAN
  2555. MZC PREFIXL,2;  % EASY AY
  2556. ZF PREFPDSF;
  2557. ZF PREFXQUO;
  2558.  
  2559. EXIT FROM SETBLCK;  % BLOW THIS POP STAND
  2560. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2561. %                 INVALID  SET    COMMAND
  2562. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2563. %
  2564. BADSETKY:
  2565. WRTERM 'Invalid Set Command '_
  2566. 'Type in "SET HELP" if you need assistance.';
  2567.  
  2568.         EXIT FROM SETBLCK;  % DROP OUT OF SET BLOCK
  2569. %
  2570. %
  2571. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2572. % TURNAROUND TIME
  2573. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2574. DOTURNRN:
  2575. SCKW SON,STRNDON;
  2576. SCKW SOFF,STRNDOFF;
  2577.  
  2578. SCKW ROFF,RTRNDOFF;
  2579. SCKW RON,RTRNDON;
  2580. STRNDON: SF STURNRND;
  2581. EXIT FROM SETBLCK;
  2582. STRNDOFF: ZF STURNRND;
  2583. EXIT FROM SETBLCK;
  2584. RTRNDON: SF RTURNRND;
  2585. EXIT FROM SETBLCK;
  2586. RTRNDOFF: ZF RTURNRND;
  2587. EXIT FROM SETBLCK;
  2588. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2589. %               SCAN ERROR ROUTINE
  2590. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2591. %
  2592. SETERROR:     %    SCAN ERROR ROUTINE
  2593. SELECT FIRST;
  2594. <CI VRF,SCTCUE>: <VSEG KERMVA,'  Missing parameter for command Set '>;
  2595. <CI VRF,SCTCLXM>:
  2596. <SCLAST; VSEG KERMVA,'  Parameter too long for command Set '>;
  2597. ENDSEL
  2598. ELSE BEGIN
  2599. VSEG KERMVA,'Illegal value for SET command';
  2600. END;
  2601. SCLAST;  % GET LAST TOKEN SCANNNED
  2602. VSEG KERMVA,(VR1),(VR0);  % PLACE IN BUFFER\
  2603. VOUT KERMVA;  % PRINT IT
  2604. SETLABEL:   DS   0H;  % USING LABEL
  2605.  
  2606. END;  % OF SET BLOCK
  2607. CEXIT VRE,HIGHR;
  2608.  
  2609.  
  2610. LTORG;
  2611. EXORG;
  2612. DROP XRD;  % FREE LITERAL REG
  2613. DROP XRE;  % FREE LITERAL REG
  2614. DROP XRC;  % FREE ADDRESSIBILTY REG
  2615. TIMERTOP:     EQU    3600;  % TOP LIMIT FOR TIMER
  2616.  
  2617. SUBTITLE 'SETPREFX';
  2618. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
  2619. %  MOD: SETPREFX
  2620. %  FUNCTION:  SET PREFIX TO DATA SET NAME FOR UPLOAD
  2621. %              OR DOWNLOAD
  2622. %  INPUT:     VR1-> STRING
  2623. %             VR0= LENGTH OF STRING
  2624. %  OUTPUT:    VARIABLE PREFIX FILLED AND FLAGS SET
  2625. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2626. SETPREFX:
  2627. CENTER VRE,HIGHR,ENTRY=NO;
  2628.  
  2629. ZF PREFXQUO;
  2630. ZF PREFPDSF;
  2631. MZC PREFIXL,2;
  2632. MZC PREFMEML,2;  % ZERO OUT LENGTHS
  2633. SCINIT (VR1),(VR0);
  2634. SCERROR NEW=SCPREERR;
  2635. SCANPREF: DO BEGIN SCAN *;
  2636.      SCKW ?,PREFHELP;  % INFORMATION ON PREFIX
  2637.          SCKW ,QPREFIX,QS,LIMIT=AL1(54);  % IF QUOTED DATA SET NAME
  2638.          SCKW ,UNQPFIX,LIMIT=AL1(44);  % REGULAR DSN
  2639.          SCKW ,SCPREERR,CODE=AL1(8);  % TOO LONG PREFIX
  2640.  
  2641. UNQPFIX:
  2642. % MTRT   TEST FOR ILLEGAL CHARACTERS IN DATA SET NAME
  2643. LR XRB,VR0;  % LENGTH
  2644. EXI XRB,MMVC,PREFIX,0(VR1),*-*,INCR=YES,DECR=YES;  % SAVE DATA SET NAME)
  2645. STH XRB,PREFIXL;  % STORE OFF LENGTH
  2646.  
  2647. BEGIN SCAN *;
  2648.       SCKW ,PREMEM,PS;  % SEE IF MEMBER EXISTS FOR PDS
  2649.       SCKW ,*,B;  % ALL DONE BABY
  2650.  
  2651. PREFHELP:
  2652. WRTERM _
  2653. 'PREFIX sets a data set name prefix for SEND and RECEIVE.';
  2654. WRTERM _
  2655. 'The parameter is the prefix.  No prefix is the default.';
  2656. WRTERM _
  2657. 'The prefix may also indicate a PDS.  SET PRE FILE() causes SEND';
  2658. WRTERM 'and RECEIVE data set to use the PDS FILE.';
  2659. WRTERM 'NOPREFIX cancels prefixing a data set name on send or'_
  2660. ' receive.';
  2661.         EXIT;  % DROP OUT OF BLOCK
  2662.  
  2663. PREMEM:
  2664. DEBLANK VR1,VR0;
  2665. %MTRT TEST FOR VALID DSN AGAIN
  2666.  
  2667. IF <RZ VR0> THEN SF PREFPDSF  % HAVE A PDS
  2668. ELSE BEGIN
  2669. SCPUSH;
  2670. SCINIT (VR1),(VR0);
  2671. SCAN;
  2672. LR XRA,VR0;  % LENGTH FOR EXECUTE
  2673. IF <CI VR0,8; CC H> THEN BEGIN  % MEMBER NAME TOO LONG
  2674. WRTERM 'Member name excedes 8 characters';
  2675. MZC PREFIXL,2;  % ERROR CITY
  2676. EXIT;  % SPLIT THE BLOCK
  2677. END;  % OF ERROR BLOCK
  2678. EXI XRA,MMVC,PREFMEM,0(VR1),*-*,INCR=YES,DECR=YES;
  2679. STH XRA,PREFMEML;  % LENGTH OF PREFIX MEMBER
  2680. SCDONE;  % ERROR IF MORE JUNK ON LINE
  2681. SF PREFPDSF;  % INDICATE WE HAVE A PDS   PREFIX
  2682. SCPOP;
  2683. END;  % OF ZERO LENGTH ELSE
  2684. SCANEND; END;
  2685.  
  2686. EXIT;
  2687.  
  2688. QPREFIX:
  2689. SCPUSH;
  2690. SCINIT (VR1),(VR0);
  2691. % SAME THING AS FOR UNQUOTED NAME
  2692. SF PREFXQUO;  % INDICATE A QUOTED PREFIX
  2693. GOTO SCANPREF;  % A BIT KLUDGEY FOR NOW
  2694. SCDONE;
  2695. SCPOP;
  2696. EXIT;
  2697. SCANEND;
  2698.  % DROPS THRU HERE
  2699. WRTERM 'PREFIX requires a parameter for the prefix of data set';
  2700. WRTERM 'names.  Enter "SET PREFIX ?" for a more information.';
  2701. END;
  2702. DATA BEGIN  % NOTHING SPECIFIED
  2703. SCPREERR: % ERROR ROUTINE
  2704. IF <CI VRE,8> THEN LR VRF,VRE;  % LENGTH ERROR
  2705. SELECT FIRST;
  2706. <CI VRF,SCTCUBQ>: WRTERM 'Unbalanced Quotes on Prefix';
  2707. <CI VRF,SCTCUBP>: WRTERM 'Unbalanced Parentheses on Prefix';
  2708. <CI VRF,SCTCIXM>: WRTERM 'Exceeds the limits of possible prefix';
  2709. ENDSEL
  2710. ELSE WRTERM 'Error in scan of Prefix';
  2711. END;  % OF THEN
  2712. STPREXIT: CEXIT VRE,HIGHR;
  2713. LTORG;
  2714. EXORG;
  2715. SUBTITLE 'SCANNUMS';
  2716. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2717. % MOD: SCANNUMS
  2718. % FUNCTION: SETS UP NUMBER COMMAND
  2719. %
  2720. SCANNUMS:
  2721. CENTER VRE,HIGHR,ENTRY=NO;
  2722. SCERROR NEW=BADNUM;
  2723. NUMBLCK: DO BEGIN  % A BLOCK TO FALL OUT OF
  2724.  
  2725. SCAN *;
  2726. SCKW ,NUMSOME;
  2727. SCANEND;
  2728.  
  2729. WRTERM 'NUMBER command requires parameter ';
  2730. WRTERM 'enter SET NUMBERED HELP for more information ';
  2731. EXIT FROM NUMBLCK;
  2732.  
  2733. NUMSOME:  % WE HAVE SOMETHING HERE
  2734. SCBACK;  % RESET POINTERS
  2735. SCPUSH;  % STORE OFF SCANNER POINTERS
  2736. CALL EDSET,(EDCNTRL,EDRETURN,FOUR,ONE,TEMP,EDLEN);  % INSERT
  2737.  
  2738.  
  2739. MVI EDTYPE,X'FF';  % BLAST NUMBER BIT
  2740. SCNUMBLK: DO BEGIN
  2741.  
  2742. SCAN *;
  2743.  
  2744. SCKW ,DOCOL1,PI;  % LOOK FOR COLUMN NUMBER
  2745. SCKW OFF,OFFCOLS;  % NO NUMBERING
  2746. SCKW (HELP,?),NUMHELP;  % HELP COMMAND
  2747. SCKW (ON,WYLBUR),DOWYL;  % WYLBUR
  2748. SCKW TSO,TSONUM;  % TSO NUMBERING
  2749. SCKW OVERLAY,NUMOVER;  % OVERLAY NUMBERS OPTION
  2750. SCKW INSERT,NUMINSER;  % NUMBERING INSERT
  2751. SCKW MERGE,NUMMERGE;  % MERGE NUMBERS
  2752. SCKW ,BADNUM;  % UNKNOWN COMMAND
  2753.  
  2754. SCANEND;
  2755.  
  2756. EXIT FROM NUMBLCK;
  2757.  
  2758. BADNUM:
  2759. WRTERM 'Illegal Parameter for the SET NUMBERED command ';
  2760. MMVC EDTYPE,=F'2',4;  % RESTORE DEFAULT
  2761. EXIT FROM NUMBLCK;
  2762.  
  2763. NUMHELP:
  2764. MVI EDTYPE,0;  % ZERO BYTE
  2765.  
  2766. WRTERM 'Controls line numbering in non-edit format text data sets.';
  2767. WRTERM 'Valid Options are: ';
  2768. WRTERM ' OFF indicates unnumbered ';
  2769. WRTERM ' ON or WYLBUR indicates a data set with '_
  2770.        'WYLBUR line numbers in default columns';
  2771. WRTERM ' WYLBUR m/n indicates '_
  2772. 'line numbers in columns m through n';
  2773. WRTERM ' TSO indicates '_
  2774.        'TSO line numbers in default columns';
  2775. WRTERM ' TSO m/n indicates TSO '_
  2776.        'line numbers in columns m through n';
  2777. WRTERM _
  2778.  'Default columns for line numbers are the last 8 for data sets';
  2779. WRTERM 'with fixed length records, and the firest 8 for data sets';
  2780. WRTERM 'with variable length records.';
  2781.  
  2782. EXIT FROM NUMBLCK;
  2783.  
  2784. DOCOL1:
  2785.  
  2786. ST VRF,EDCOL1;  % STORE OFF FIRST COLUMN
  2787.  
  2788. SCAN *;  % LOOK FOR ENDING COLUMN POSITION
  2789.  
  2790. SCKW ,DOCOL2,PI;  % NEED NEXT COLUMN
  2791. SCKW ,COLERR;
  2792. SCANEND;
  2793.  
  2794. WRTERM 'required second number column omitted ';
  2795. EXIT FROM NUMBLCK;
  2796.  
  2797. COLERR:
  2798. WRTERM 'the second column number must be a non zero integer';
  2799. EXIT FROM NUMBLCK;
  2800.  
  2801. DOCOL2:
  2802. ST VRF,EDCOL2;  % STORE OFF SECOND COLUMN
  2803.  
  2804. SELECT FIRST;
  2805. <MCLC EDTYPE,=F'2',4>: MVI EDTYPE+3,X'3';
  2806. <MCLC EDTYPE,=F'4',4>: MVI EDTYPE+3,X'5';
  2807. ENDSEL;
  2808.  
  2809.  
  2810. DOWYL: % SET UP WYLBUR NUMBERING
  2811. IF <CLI EDTYPE,X'FF'> THEN MMVC EDTYPE,=F'2',4 % WYLBUR DEFAULTS
  2812. ELSE MMVC EDTYPE,=F'3',4;  % WE HAVE COLUMN POSTIONS
  2813.  
  2814. NEXT OF SCNUMBLK;  % SCAN SOMEMORE
  2815.  
  2816.  
  2817. TSONUM: % SET UP TSO NUMBERING
  2818. IF <CLI EDTYPE,X'FF'> THEN MMVC EDTYPE,=F'4',4 % TSO DEFAULTS
  2819. ELSE MMVC EDTYPE,=F'5',4;  % WE HAVE COLUMN POSTIONS
  2820.  
  2821. NEXT OF SCNUMBLK;  % SCAN SOMEMORE
  2822. NUMOVER:   % OVERLAY NUMBERING
  2823.  
  2824. CALL EDSET,(EDCNTRL,EDRETURN,FOUR,TWO,TEMP,EDLEN);  % OVERLAY
  2825. NEXT OF SCNUMBLK;  % SCAN SOMEMORE
  2826. NUMINSER:   %INSERT NUMBERING
  2827.  
  2828. CALL EDSET,(EDCNTRL,EDRETURN,FOUR,ONE,TEMP,EDLEN);  % INSERT
  2829. NEXT OF SCNUMBLK;  % SCAN SOMEMORE
  2830.  
  2831. NUMMERGE: % MERGE NUMBERS
  2832.  
  2833.  
  2834. CALL EDSET,(EDCNTRL,EDRETURN,FOUR,THREE,TEMP,EDLEN);  % MERGE
  2835. NEXT OF SCNUMBLK;  % SCAN SOMEMORE
  2836. OFFCOLS: % TURN OFF NUMBERING
  2837. MMVC EDTYPE,=F'1',4;  % TURN OFF LINE NUMBERS
  2838.  
  2839. EXIT FROM NUMBLCK;
  2840.  
  2841. END;  % OF SCAN BLOCK
  2842. END;  % OF NUMBLCK
  2843. CEXIT VRE,HIGHR;
  2844. LTORG;
  2845. EXORG;
  2846.  
  2847. SUBTITLE 'SCANTABS';
  2848. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2849. % MODULE : SCANTABS
  2850. % FUNCTION : Scans a parameter string for tab values
  2851. %            get memory for table,
  2852. % INPUT:     none - scanner already called just scan away
  2853. %
  2854. %
  2855. % OUTPUT :  VRF=0 good entries in table (TABTBLAD) VRF=4 ERROR
  2856. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2857. SCANTABS:
  2858. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  2859. SCANTBLK: DO BEGIN  % MAIN BLOCK TO FALL OUT OF
  2860. SCTYPE NEW=0;
  2861. SCERROR NEW=BADTABS;
  2862. GETMAIN RC,LV=256,SP=18;  % GET POOL FOR BUFFER
  2863. IF <CI VRF,4> THEN BEGIN
  2864. WRTERM 'Not enough memory for tab routine';
  2865.  
  2866. EXIT FROM SCANTBLK;
  2867. END;
  2868. MZC 0(VR1),256;  % ZERO OUT TAB BUFFER
  2869. LR XRA,VR1;  % POINT TO ADDRESS
  2870. ST VR1,TEMP;  % STORE ADDRESS OF STORAGE
  2871. LI XRB,NUMTABS;  % SET FIELD SIZE
  2872. LR XRC,XRA;
  2873. ZR XRE;  % INDENT
  2874. ZR XRD;  % LENGTH
  2875.  
  2876. TTABSCAN: DO BEGIN SCAN *;
  2877.    SCKW ,TTABSTAB,(PI),LIMIT=AL1(255);
  2878.    SCKW INDENT,TTABSIND,(P,I),LIMIT=AL2(32767);
  2879.    SCKW LENGTH,TTABSLEN,(P,PI),LIMIT=AL2(32767);
  2880.        SCKW  (TAB,TABS),0;  % CONTINUE SCAN
  2881.    SCKW ,BADTABS;
  2882.  
  2883.    %  INDENT
  2884.  
  2885.    TTABSIND:
  2886.    LR XRE,VRF;
  2887.    SCRTN;
  2888.  
  2889.    %  LENGTH
  2890.  
  2891.    TTABSLEN:
  2892.    LR XRD,VRF;
  2893.    SCRTN;
  2894.  
  2895.    %  TAB POSITION
  2896.  
  2897.    TTABSTAB:
  2898.    CBAL RTNR,TTABPUT;  % STORE TAB POSITION
  2899.    BEGIN SCAN *;
  2900.       SCKW '+',TTABPLUS,(P,PI),LIMIT=AL1(255);
  2901.       SCKW ,*,B;
  2902.  
  2903.       TTABPLUS:
  2904.       ST VRF,TABWRKA+4;  % SAVE INCREMENT
  2905.       BEGIN SCAN *;
  2906.          SCKW '/',TTABSLSH,(P,PI),LIMIT=AL1(255);
  2907.          SCKW '*',TTABSTAR,(P,PI),LIMIT=AL1(255);
  2908.          SCKW ,*;
  2909.          SCANEND; END;
  2910.       IF <RP VR0> THEN BEGIN
  2911.          VSEG KERMVA,(VR1),(VR0);
  2912.          VSEG KERMVA,': ';
  2913.          END;
  2914.       WRTERM '"/" OR "*" REQUIRED WITH "+"';
  2915.       LI VRF,4; EXIT FROM SCANTBLK;
  2916.       TTABSLSH:
  2917.       LR VRE,VRF;  % SAVE LIMIT
  2918.       LR VR1,XRC; SI VR1,2; LH VRF,0(VR1);  % LAST TAB JDW
  2919.       IF <CR VRF,VRE; CC NL> THEN BEGIN
  2920.          WRTERM 'LIMIT LESS THAN STARTING TAB POSITION';
  2921.          LI VRF,4; EXIT FROM SCANTBLK;
  2922.          END;
  2923.       FOREVER DO BEGIN
  2924.          A VRF,TABWRKA+4;  % ADD INCREMENT
  2925.          NEXT OF TTABSCAN IF <CR VRF,VRE; CC H>;
  2926.          CBAL RTNR,TTABPUT;  % STORE TAB
  2927.          END;
  2928.  
  2929.       TTABSTAR:
  2930.       LR VRE,VRF;  % SAVE LIMIT
  2931.       LR VR1,XRC; SI VR1,2; LH VRF,0(VR1);  % LAST TAB JDW
  2932.       FOR VRE DO BEGIN
  2933.          A VRF,TABWRKA+4;  % ADD INCREMENT
  2934.          CBAL RTNR,TTABPUT;  % STORE TAB
  2935.          END;
  2936.       SCANEND; END;
  2937.    NEXT OF TTABSCAN;
  2938.  
  2939.    TTABPUT:
  2940.    IF <CI VRF,255; CC H> THEN BEGIN  % TAB TOO LARGE
  2941.       WRTERM 'TAB POSITION GREATER THAN 255';
  2942.       LI VRF,4; EXIT FROM SCANTBLK;
  2943.       END;
  2944.    SI XRB,1;  % DECR COUNT
  2945.    IF <RM XRB> THEN BEGIN
  2946.       WRTERM 'MORE THAN NUMTABS TABS SPECIFIED';
  2947.       LI VRF,4; EXIT FROM SCANTBLK;
  2948.       END;
  2949.    STH VRF,0(,XRC);  % PUT TAB IN AREA      JDW
  2950.    AI XRC,2;  % JDW
  2951.    RGOTO RTNR;
  2952.    SCANEND; END;
  2953.  
  2954. IF ^<MCLC 0(XRA),=H'0',2> THEN BEGIN  % TABS WERE SPECIFIED
  2955.    LI VR0,NUMTABS;
  2956.    DO BEGIN  % SORT INTO ASCENDING ORDER
  2957.       ZR XRB;  % SET SWAP SWITCH OFF
  2958.       LR XRC,VR0; SI XRC,1;  % SET LIMIT
  2959.       LR XRD,XRA;  % POINT AT TABS
  2960.       FOR XRC DO BEGIN
  2961.          EXIT IF <MCLC 2(XRD),=H'0',2>;  % NO MORE TABS
  2962.          LH VRF,0(,XRD);  % PICK UP TAB
  2963.          IF <CH VRF,2(XRD); CC H> THEN BEGIN  % OUT OF ORDER
  2964.             LA XRB,2(,XRD); SR XRB,XRA;  % SET SWAP SWITCH
  2965.             MMVC 0(XRD),2(XRD),2; STH VRF,2(,XRD);  % SWAP
  2966.             END
  2967.          ELSE IF <CC E> THEN BEGIN
  2968.             WRTERM 'TWO TABS SPECIFIED AT SAME COLUMN';
  2969.             LI VRF,4; EXIT FROM SCANTBLK;
  2970.             END;
  2971.          AI XRD,2;
  2972.          END;
  2973.       LTR VR0,XRB;  % NEW LIMIT
  2974.       NEXT IF <CC P>;
  2975.       END;
  2976.  
  2977.    %  ADD IN INDENT, CHECK MARGIN
  2978.  
  2979.    LR XRB,XRA;
  2980.    LI XRC,NUMTABS;
  2981.    DO BEGIN
  2982.       LH VR0,0(XRB);  % NEXT TAB     JDW
  2983.       EXIT IF <RZ VR0>;  % NO MORE
  2984.       AR VR0,XRE;  % ADD INDENT
  2985.       IF <CI VR0,255; CC H> THEN BEGIN
  2986.          WRTERM 'TAB PLUS INDENT GREATER THAN 255';
  2987.          LI VRF,4; EXIT FROM SCANTBLK;
  2988.          END;
  2989.       STH VR0,0(,XRB);
  2990.       AI XRB,2;
  2991.       END FOR XRC;
  2992.    END
  2993. ELSE BEGIN  % NO TABS SPECIFIED
  2994. WRTERM 'No tabs were specified';
  2995. LI VRF,4; EXIT FROM SCANTBLK;
  2996. END;
  2997. MMVC TABTBLAD,TEMP,4;  % SUCCESSFUL RETURN UPDATE TAB TABLE POINTER
  2998.  
  2999. ZR VRF;
  3000. END;  % OF SCANTBLK
  3001. SCTYPE NEW=1;
  3002. DATA BEGIN
  3003. BADTABS: LI VRF,4;
  3004. END;
  3005. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3006.  
  3007. CEXIT VRE,HIGHR;
  3008. LTORG;
  3009. EXORG;
  3010. NUMTABS:    EQU  125;  % ALLOW THIS MANY TABS
  3011. SUBTITLE 'KSEND';
  3012.  
  3013. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3014. %
  3015. %     MODULE NAME   -   KSEND
  3016. %
  3017. %
  3018. %     FUNCTION-   DRIVER FOR SEND COMMAND DYNAL, OPEN,
  3019. %     FORMATS PACKETS, FILE HEADER, EOF ETC
  3020. %
  3021. %
  3022. %     INPUTS -
  3023. %
  3024. %
  3025. %
  3026. %
  3027. %     OUTPUTS-
  3028. %
  3029. %
  3030. %     RETURN
  3031. %
  3032. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3033. KSEND: ;
  3034. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3035. LA XRC,SNDPKT;
  3036. USE XRC AS PACKET IN BEGIN  % DSECT FOR INIT
  3037. LA XRD,DATABUFF;
  3038. USE XRD AS SENDIDST IN BEGIN
  3039. SENDBLCK: DO BEGIN  % GLOBAL SEND BLOCK
  3040. MZC STATLEN,2;  % ZERO OUT STATUS LENGTH
  3041. ZF WARNINGF;
  3042. SCTYPE NEW=1;  % SCAN ACROSS * IN CASE WILD CARD SEND
  3043. MVI STATE,SEND;  % SEND BLOCK STATE
  3044. BCCTYPE 1;  % 1 BCC BYTE AT END
  3045.  
  3046. SCERROR NEW=SENDERR;  % SCAN OFF DSN
  3047.  
  3048.    SCAN *;
  3049.    SCKW ?,SENDHELP;  % INFO
  3050.    SCKW ,SEND1ST,B,LIMIT=AL1(44);  % DSN
  3051.    SCANEND;
  3052. %  IF HERE NO DSNAME
  3053. WRTERM 'SEND Command requires a dsname ';
  3054.    EXIT FROM SENDBLCK;  % LEAVE SEND
  3055.  
  3056. SENDHELP:
  3057. WRTERM _
  3058. 'SEND sends a data set (file) to the microcomputer.  A corresponding';
  3059. WRTERM 'RECEIVE command must be issued to the microcomputer KERMIT'_
  3060. ' after the SEND to';
  3061. WRTERM 'TSO KERMIT.  The parameter is the data set name '_
  3062.    'for the data set to be';
  3063. WRTERM 'transmitted.  The data set must be cataloged.';
  3064.    EXIT FROM SENDBLCK;  % LEAVE SEND
  3065.  
  3066. SENDERR:
  3067. SELECT FIRST;
  3068. <CI VRF,SCTCLXM>: ERRORCON  'Data Set Name maximum 44 letters ';
  3069. <CI VRF,SCTCUBQ>: ERRORCON  'Unbalanced quotes in Data Set Name';
  3070. ENDSEL
  3071. ELSE <ERRORCON 'Error in data set name'>;
  3072. CCALL ERRPACK,A;
  3073. IF <TF SERVERF> THEN BEGIN
  3074. CCALL SABORT,A,VR0=LH:RPSEQ;
  3075. END
  3076. ELSE TPUT (VR1),(VR0);
  3077. EXIT FROM SENDBLCK;  % ERROR EXIT
  3078. SEND1ST:  % THE BEEF
  3079. SCTELL;  % HOW MUCH IS LEFT ?
  3080. DEBLANK VR1,VR0,XRA,TYPE=BOTH;  % STRIP OFF BLANKS
  3081. % STORE OFF POINTERS IN CASE MORE FILES
  3082. ST VR1,DSNADD;  % ADDRESS OF DSNAME
  3083. STH VR0,DSNLEN;  % LENGTH OF SCANNED NAME
  3084.  
  3085. CCALL SCANDSN,A;  % ROUTINE SETS UP DSNAME
  3086. CASE VRF MIN 0 MAX 20 CHECK;
  3087. 0: BEGIN  % A GOOD RETURN;
  3088. END;
  3089. 4: BEGIN  % GOOD RETURN PLUS PDS
  3090. % SF PDS;
  3091. END;
  3092. 8: BEGIN  % WILD CARD
  3093. END;
  3094. 12: BEGIN  % NO LENGTH
  3095. ERRORCON 'No length on data set name';
  3096. CCALL ERRPACK,A;
  3097. MVI STATE,SESTATE;
  3098. IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
  3099. ELSE BEGIN
  3100. CCALL SABORT,A,VR0=LH:RPSEQ;  % ABORT
  3101. END;
  3102. END;
  3103. 16: BEGIN  % ILLEGAL NAME
  3104. ERRORCON 'Non standard data set name';
  3105. CCALL ERRPACK,A;
  3106. MVI STATE,SESTATE;
  3107. IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
  3108. ELSE BEGIN
  3109. CCALL SABORT,A,VR0=LH:RPSEQ;  % ABORT
  3110. END;
  3111. EXIT FROM SENDBLCK;
  3112. END;
  3113. 20: BEGIN  % NO MATCHING ENTRIES FROM WILD CARD
  3114. ERRORCON 'No matches in catalog for wildcard';
  3115. CCALL ERRPACK,A;
  3116. MVI STATE,SESTATE;
  3117. IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
  3118. ELSE BEGIN
  3119. CCALL SABORT,A,VR0=LH:RPSEQ;  % ABORT
  3120. END;
  3121. EXIT FROM SENDBLCK;
  3122. END;
  3123. ENDCASE ELSE
  3124. BEGIN  % ILLEGAL RETURN
  3125. ERRORCON 'Illegal data set name.  Extra data on line.';
  3126. CCALL ERRPACK,A;
  3127. MVI STATE,SESTATE;
  3128. IF ^<TF SERVERF> THEN TPUT (VR1),(VR0)
  3129. ELSE BEGIN
  3130. CCALL SABORT,A,VR0=LH:RPSEQ;  % ABORT
  3131. END;
  3132. EXIT FROM SENDBLCK;
  3133. END;
  3134. CCALL OPENSDSN,A;  % Open next sendfile
  3135. IF ^<TF SENDDSNF> THEN BEGIN
  3136. IF <TF SERVERF> THEN BEGIN
  3137.  
  3138. CCALL SABORT,A,VR0=LH:RPSEQ;  % ABORT
  3139. END
  3140. ELSE <LH VR0,STATLEN; TPUT STATBUFF,(VR0)>;  % OUTPYUT TO SCREEN
  3141. EXIT FROM SENDBLCK;
  3142. END;  % OF OPEN ERROR
  3143.  
  3144. IF <TF TABF> THEN BEGIN
  3145. GETMAIN RC,LV=66000,SP=8;  % GET POOL FOR BUFFER
  3146. IF <CI VRF,4> THEN BEGIN
  3147. WRTERM 'GET MAIN TAB ERROR ON SEND';
  3148. END;
  3149.  
  3150. MMVC TABCNT,=H'0',2;  % INITIALIZE TAB COUNTER
  3151.  
  3152. ST VR1,TABADDR;  % TAB ADDRESS
  3153. END;  % OF TABBING
  3154.  
  3155. IF ^<TF SERVERF> THEN BEGIN  % TIMER ONLY IF NO SERVER MODE
  3156. VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;
  3157. VSEG KERMVA,'  Waiting ';  % build message
  3158. L VR1,DELAY;  % SET UP DELAY FOR STIMER
  3159. ZR VR0;
  3160. DI VR0,100;
  3161. LR XRA,VR1;
  3162. CVBTD TEMP,0,(XRA);  % CONVERT TO PRINT
  3163. VSEG KERMVA,(VR1),(VR0);
  3164. VSEG KERMVA,' seconds before sending. ';
  3165. VOUT KERMVA;  % OUT PUT MESSAGE
  3166.  
  3167. STIMER WAIT,BINTVL=DELAY;  % SET TIMER
  3168. END;  % OF NON SERVER TIMER
  3169.  
  3170. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3171. % CALL THE SEND SWITCH TABLE DRIVER
  3172. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3173.  
  3174. CCALL SENDSW,A;
  3175.  
  3176.  
  3177. %L VR1,RPSIZ;  % PACKET SIZE
  3178. %SI VR1,2;  % SUBTRACT HEADER
  3179. %SH VR1,BCCLEN;  % % SUB OFF BCC LENGH THEN
  3180. %STH VR1,MAXPUT;  % MAX DATA SIZE FOR PUT
  3181.  
  3182. END;  % OF SENDBLCK
  3183. IF <TF TABF> THEN FREEMAIN RC,SP=8;  % FREE THE BUFFER
  3184.  
  3185. SCTYPE NEW=1;  % RETURN SCANNER TO NORMAL MODE
  3186.  
  3187. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3188.  
  3189. CEXIT VRE,HIGHR;
  3190. LTORG;
  3191. EXORG;
  3192.  
  3193. END;  % OF DSECT
  3194. END;  % OF DSECT SENDINIT
  3195. SUBTITLE 'SENDSW';
  3196. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3197. % MODULE : SENDSW
  3198. % FUNCTION :  THIS ROUTINE DRIVES THE SEND MODULES,
  3199. %            EACH ROUTINE CHANGES THE STATE
  3200. % INPUT:
  3201. %
  3202. %
  3203. % OUTPUT :
  3204. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3205. SENDSW:
  3206. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3207. %MVI HIGHBCC,3;  % INDICATE BLOCK CHECK TYPE
  3208. ZEROSEQ;  % ZERO SEQUENCE NUMBER
  3209. ZERORTRY;  % ZERO RETRY
  3210. MVI STATE,SISTATE;  % SEND INIT STATE
  3211. SSWTBLCK: DO BEGIN  % LOOP TILL EXIT
  3212. SELECT FIRST;
  3213. <TF STOPF>: <CCALL STOPPROC,A; EXIT FROM SSWTBLCK>;  % USER STOP
  3214. <CLI STATE,SISTATE>: CCALL SINIT,A;
  3215. <CLI STATE,SFSTATE>: CCALL SFILE,A;  % FILE HEADER PACKET
  3216. <CLI STATE,SDSTATE>: CCALL SDATA,A;  % SEND DATA PACKETS
  3217. <CLI STATE,SZSTATE>: CCALL SEOF,A;  % SEND EOF
  3218. <CLI STATE,SBSTATE>: CCALL SEOT,A;  % END OF TRANSMISSION
  3219. <CLI STATE,SESTATE>: BEGIN  % ABORT
  3220. CCALL SABORT,A,VR0=LH:SEQNUM; EXIT FROM SSWTBLCK;  % ABORT
  3221. END;
  3222. <CLI STATE,RESTATE>: <CCALL RABORT,A; EXIT FROM SSWTBLCK>;  % ABORT
  3223. <CLI STATE,CSTATE>: EXIT FROM SSWTBLCK;  % COMPLETE STATE SPLIT
  3224. ENDSEL;
  3225. END FOREVER;
  3226. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3227.  
  3228. CEXIT VRE,HIGHR;
  3229. LTORG;
  3230. EXORG;
  3231. SUBTITLE 'SINIT';
  3232. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3233. % MODULE : SINIT
  3234. % FUNCTION : Sends the SEND INIT  packet  and receives
  3235. %            the rinit packet , each sets the options
  3236. % INPUT:     none
  3237. %
  3238. %
  3239. % OUTPUT :  state = either 'F' file header   || 'S' TRY AGAIN
  3240. %           plus options are set (i.e quotes,repeat, etc)
  3241. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3242. SINIT:
  3243. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3244. ZF ACKX;
  3245. ZF ACKZ;
  3246. BUMPRTRY XRA;  % Increment retry counter
  3247. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  3248. MVI STATE,SESTATE  % Send abort state
  3249. ELSE SINITBLK: DO BEGIN  % Send end of transmisision block
  3250. MMVC TRFBCC,HIGHBCC,1;
  3251. LI VR0,SENDINIL;
  3252. CCALL SPAR,A,VR1=PDATA;  % CALL ROUTINE THAT BUILDS PACK
  3253. SPSPACK AS,SEQNUM,PUTLEN,VR0;  % S PACKET,SEND PARAMETERS FOR SPACK
  3254. TCLEARQ INPUT;  % CLEAR INPUT BUFFER
  3255. CCALL SPACK,A;
  3256. CCALL RPACK,A;
  3257. EXIT IF <RNZ VRF> | <TF STOPF>;  % Leave if Timeout or Bad BCC
  3258. ZR XRA;  % clear for the case
  3259. MTRT RTYPE,COMMAND,1;  % Scan command type
  3260. DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
  3261. NCASE: BEGIN  % Got a nack
  3262. LH XRA,RPSEQ;  % Load received sequence number
  3263. IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1;  % see if nack for pack+1
  3264. STH XRA,RPSEQ;  % STORE IN CASE NACK FOR SEQ+1
  3265. IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>;  % Ok yack case next
  3266. END;  % of nack
  3267. YCASE: BEGIN  % ACK
  3268. EXIT IF ^<MCLC SEQNUM,RPSEQ,2>;  % Wrong packet number
  3269. ZERORTRY;  % % Zero retry counter
  3270. BUMPSEQ VR0;  % Increment packet counter
  3271. LH VR0,RECLEN;  % Length of data
  3272. CCALL RPAR,A,VR1=RDATA;  % %%FIXME
  3273. SELECT FIRST;
  3274. <CLI TRFBCC,1>: BCCTYPE 1;
  3275. <CLI TRFBCC,2>: BCCTYPE 2;
  3276. <CLI TRFBCC,3>: BCCTYPE 3;
  3277. ENDSEL;
  3278. MZC PUTLEN,2;
  3279. MVI STATE,SFSTATE;  % SEND FILE HEADER  STATE
  3280. END;  % OF ACK
  3281. ECASE: BEGIN  % Error abort
  3282. MVI STATE,RESTATE;  % RECEIVED ABORT
  3283. END;
  3284. ENDCASE
  3285. ELSE BEGIN
  3286. ERRORCON 'Illegal packet type received ';
  3287. CCALL ERRPACK,A;  % PUT IN BUFFERS
  3288. MVI STATE,SESTATE;  % ABORT
  3289. END;
  3290. END;  % OK RETRY
  3291. END;  % of SINITBLCK
  3292. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3293.  
  3294. CEXIT VRE,HIGHR;
  3295. LTORG;
  3296. EXORG;
  3297.  
  3298. SUBTITLE 'SPAR';
  3299. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3300. % MODULE : SPAR
  3301. % FUNCTION : Builds the send  init packet
  3302. %
  3303. % INPUT:     none
  3304. %
  3305. %
  3306. % OUTPUT :  formatted data area of send init packet
  3307. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3308. SPAR:
  3309. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3310.  
  3311. L VR1,NOQUADD;  % LOAD ADDRESS OF CHARACTERS NOT QUOTED
  3312. XC 0(255,VR1),0(VR1);  % CLEAR BUFFER
  3313. LA XRC,SNDPKT;
  3314. USE XRC AS PACKET IN BEGIN  % DSECT FOR INIT
  3315. %%LOAD XRD FROM VR1 - AS DESECT POINTER
  3316. LA XRD,DATABUFF;
  3317. USE XRD AS SENDIDST IN BEGIN
  3318. SINITLAB:
  3319. SENDIBLK: DO BEGIN  % A BLOCK TO FALL OUT OFF
  3320.  
  3321. %LI VR1,SENDINIL;  % SEND INIT DSECT LENGTH   %%FIX MAKE VR0
  3322. STH VR0,PUTLEN;  % LENGTH FOR PUT
  3323.  
  3324. MMVC RCRCREAL,BCCLEN,2;  % STORE OF BCC
  3325. BCCTYPE 1;
  3326. L VR1,RPSIZ;  % PACKET SIZE
  3327. CHAR VR1;  % CHARACTER FUNCTION
  3328. STC VR1,MAXL;
  3329.  
  3330. L VR1,TIMEOUT;  % NUMBER OF SECONDS FOR KERM TO TIMEOUT
  3331. CHAR VR1;  % CHARACTER FUNCTION
  3332. STC VR1,TIME;
  3333.  
  3334. MVI NPAD,X'20';  % MOVE " " FOR NPAD
  3335.  
  3336. MVI PADC,X'40';  % MOVE " " FOR PADC
  3337.  
  3338. ZR VR1; IC VR1,REOL;  % EOL CHARACTER
  3339. CHAR VR1;  % PRINTABLE FUNCTION
  3340. STC VR1,EOLCHAR;
  3341.  
  3342. MMVC QCTL,QUOCHAR;  % MOVE QUOTE CHARACTER
  3343.  
  3344. MMVC QBIN,BINQC;
  3345.  
  3346. SELECT FIRST;
  3347. <CLI TRFBCC,1>: MMVC CHKT,ASCIIONE,1;  % BCC LEVEL 1 CHECK
  3348. <CLI TRFBCC,2>: MMVC CHKT,ASCII2,1;  % BCC LEVEL 2 CHECK
  3349. <CLI TRFBCC,3>: MMVC CHKT,ASCII3,1;  % BCC LEVEL 3 CHECK
  3350. ENDSEL;
  3351.  
  3352. %%REPT  REPEAT CHARACTER
  3353.  
  3354. MMVC REPT,REPTCHAR,1;  % PUT IN REPEAT FUNCTION
  3355.  
  3356. %%CAPA BIT MAP OF CAPABILITIES
  3357.  
  3358. ZR VR1;
  3359. IC VR1,DCAPA1;  % CAPABILITIES BYTE
  3360. CHAR VR1;  % ASCII SPACE
  3361. STC VR1,CAPA1;  % NO CAPA FUNCTION NOW
  3362.  
  3363. END;  % OF DSECT
  3364. END;  % OF DSECT
  3365. END;  % OF DSECT
  3366. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3367.  
  3368. CEXIT VRE,HIGHR;
  3369. LTORG;
  3370. EXORG;
  3371.  
  3372. SUBTITLE 'RPAR';
  3373. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3374. % MODULE : RPAR
  3375. % FUNCTION : Takes the received init packet and set options
  3376. %            to what we accept (e.g. 8th bit , repeat quoting,etc)
  3377. % INPUT:     none
  3378. %
  3379. %
  3380. % OUTPUT :  correctly set options
  3381. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3382. RPAR:
  3383. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3384.  
  3385. LA XRA,RDATA;
  3386. USE XRA AS RECINIT IN BEGIN
  3387. LI XRB,SENDINIL;  % LENGTH OF OUR SEND INIT
  3388. SR XRB,VR0;  % LENGTH OF DATA SENT
  3389. IF <RP XRB> THEN BEGIN
  3390. SELECT;
  3391. <CI XRB,4; CC NL>: MVI RQBIN,AN;  % NO BINARY QUOTING
  3392. <CI XRB,2; CC NL>: MMVC RCHKT,ASCIIONE,1;  % LEVEL ONE CHECK
  3393. <CI XRB,3; CC NL>: MVI RREPT,C' ';  % NO REPT
  3394. <CI XRB,1; CC NL>: MVI RCAPA1,C' ';
  3395. ENDSEL;
  3396. END;
  3397. SELECT FIRST;
  3398. <MCLC RCHKT,ASCIIONE,1>: BEGIN
  3399. MVI TRFBCC,1;  % 1 BCC BYTE AT END
  3400. END;
  3401.  
  3402. <MCLC RCHKT,ASCII2,1>: BEGIN
  3403. IF <CLI HIGHBCC,2; CC L> THEN BEGIN
  3404. MMVC RCHKT,ASCIIONE,1;
  3405. NEXT;
  3406. END;
  3407. MVI TRFBCC,2;  % 2 BCC BYTE AT END
  3408. END;
  3409. <MCLC RCHKT,ASCII3,1>: BEGIN
  3410.  
  3411. IF <CLI HIGHBCC,3; CC L> THEN BEGIN
  3412. MMVC RCHKT,ASCII2,1;
  3413. NEXT;
  3414. END;
  3415. MVI TRFBCC,3;  % 3 BCC BYTE AT END
  3416. END;
  3417. ENDSEL;
  3418. ZR VR0; IC VR0,RMAXL;  % LOAD IN LENGTH
  3419. UNCHAR VR0;  % CHANGE IT TO AN INTEGER
  3420. SI VR0,2;  % SEQ & TYPE BYTES
  3421. ZR VR1; IC VR1,TRFBCC;  % GET BCC LENGTH OF PROPOSED TRANSFER
  3422. SR VR0,VR1;
  3423. STH VR0,MAXPUT;  % STORE IT OFF
  3424. IF <CLI STATE,RISTATE> THEN LA VR1,RECTABLE
  3425. ELSE LA VR1,SENDTBL;  % POINTER TO TRANSLATE TABLE
  3426. IF <MCLC RREPT,REPTCHAR> THEN BEGIN  % WE HAVE REPT PREFIXING
  3427. SF REPTF;  % TURN ON INDICATOR
  3428. ZR VR0; IC VR0,REPTCHAR;  % LOAD LITERAL FOR CASE STATEMENT
  3429. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  3430.  % LI VR0,ASCIIQUO;  % LOAD HASH  % REMOVE ME IF IT WORKS
  3431. IF <CLI STATE,RISTATE> THEN LI VR0,CASEREPT  % REPEAT QUOTING
  3432. ELSE BEGIN
  3433. LI VR0,NOQUOQUO;  % LOAD HASH   DON'T QUOTE REPT CHAR
  3434. STC VR0,0(VR1);  % QUOTE FOR HASH IN TABLE
  3435. AI VR1,X'80';  % POINT TO HIGH ORDER COMPLEMENT
  3436. LI VR0,NOQUOQU8;
  3437. END;
  3438. STC VR0,0(VR1);
  3439. END
  3440. ELSE BEGIN
  3441. ZF REPTF;  % NO REPEAT COUNTING POSSIBLE
  3442. ZR VR0; IC VR0,REPTCHAR;  % LOAD LITERAL FOR CASE STATEMENT
  3443. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  3444. MVI 0(VR1),0;  % QUOTE FOR HASH IN TABLE
  3445. AI VR1,X'80';  % POINT TO HIGH ORDER
  3446. MVI 0(VR1),ASCI8BIT;
  3447. END;  % OF NO REPT CHARACTER
  3448. IF <CLI STATE,RISTATE> THEN LA VR1,RECTABLE
  3449. ELSE LA VR1,SENDTBL;  % POINTER TO TRANSLATE TABLE
  3450. IF <MCLC RQCTL,QUOCHAR,1> THEN BEGIN  % QUOTE CHARACTER PREFIXING
  3451.  
  3452. ZR VR0; IC VR0,QUOCHAR;  % LOAD LITERAL FOR CASE STATEMENT
  3453. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  3454.  % LI VR0,ASCIIQUO;  % LOAD HASH  % REMOVE ME IF IT WORKS
  3455. LI VR0,NOQUOQUO;  % LOAD HASH   DON'T QUOTE REPT CHAR
  3456. IF <CLI STATE,RISTATE> THEN LI VR0,CASEQUO
  3457. ELSE BEGIN
  3458. STC VR0,0(VR1);  % QUOTE FOR HASH IN TABLE
  3459. AI VR1,X'80';  % POINT TO HIGH ORDER COMPLEMENT
  3460. LI VR0,NOQUOQU8;
  3461. END;
  3462. STC VR0,0(VR1);
  3463. END
  3464. ELSE BEGIN
  3465.  
  3466. ZR VR0; IC VR0,QUOCHAR;  % LOAD LITERAL FOR CASE STATEMENT
  3467. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  3468. MVI 0(VR1),0;  % QUOTE FOR HASH IN TABLE
  3469.  
  3470. AI VR1,X'80';  % POINT TO HIGH ORDER
  3471. MVI 0(VR1),ASCI8BIT;
  3472. %%% RESTORE HIGH ORDER QUOTE
  3473. END;  % OF QUOTE CHARACTER
  3474. IF <CLI STATE,RISTATE> THEN LA VR1,RECTABLE
  3475. ELSE LA VR1,SENDTBL;  % POINTER TO TRANSLATE TABLE
  3476. IF <CLI RQBIN,AY> | %ASCII Y
  3477. <MCLC RQBIN,BINQC,1> THEN BEGIN  % WE HAVE 8BIT PREFIXING
  3478.  
  3479. ZR VR0; IC VR0,BINQC;  % LOAD LITERAL FOR CASE STATEMENT
  3480. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  3481.  % LI VR0,ASCIIQUO;  % LOAD HASH  % REMOVE ME IF IT WORKS
  3482. IF <CLI STATE,RISTATE> THEN LI VR0,CASE8BIT
  3483. ELSE BEGIN
  3484. LI VR0,NOQUOQUO;  % LOAD HASH   DON'T QUOTE REPT CHAR
  3485. STC VR0,0(VR1);  % QUOTE FOR HASH IN TABLE
  3486. AI VR1,X'80';  % POINT TO HIGH ORDER COMPLEMENT
  3487. LI VR0,NOQUOQU8;
  3488. END;
  3489. STC VR0,0(VR1);
  3490. END
  3491. ELSE BEGIN
  3492.  
  3493. IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
  3494. ERRORCON 'Your PC Kermit does not support 8 bit quote'_
  3495.          ' binary transfer impossible';
  3496. CCALL ERRPACK,A;
  3497. MVI STATE,SESTATE;  % ABORT STATE
  3498. END;
  3499. ZR VR0; IC VR0,BINQC;  % LOAD LITERAL FOR CASE STATEMENT
  3500. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  3501. MVI 0(VR1),0;  % QUOTE FOR HASH IN TABLE
  3502. AI VR1,X'80';  % POINT TO HIGH ORDER
  3503. MVI 0(VR1),ASCI8BIT;
  3504. END;  % OF NO REPT CHARACTER
  3505. END;  % OF DSECT
  3506.  
  3507. ZR VRF;  % SET RETURN CODE
  3508. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3509.  
  3510. CEXIT VRE,HIGHR;
  3511. LTORG;
  3512. EXORG;
  3513.  
  3514. SUBTITLE 'SFILE';
  3515. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3516. % MODULE : SFILE
  3517. % FUNCTION : Sends the File Header packet
  3518. %            changes states on ack or nack
  3519. % INPUT:     none
  3520. %
  3521. %
  3522. % OUTPUT :  state = either 'D' send data || 'F' same || 'E' error
  3523. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3524. SFILE:
  3525. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3526. BUMPRTRY XRA;  % Increment retry counter
  3527. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  3528. MVI STATE,SESTATE  % Send abort state
  3529. ELSE FDSNBLCK: DO BEGIN  % Send end of file block
  3530. CCALL KFILENAM,A,VR1=DSNAME,VR0=LH:DSNLEN,VRF=DSNAMEX;  % LEGAL DSN
  3531. LH VR0,PUTLEN;
  3532. MZC PUTLEN,2;
  3533. LA VR1,PDATA; ST VR1,PUTADD; MZC PUTLEN;  % INIT FOR NEXT ROUTINE
  3534. CCALL SENDDATA,A,VR1=DSNAMEX;
  3535. SPSPACK AF,SEQNUM,PUTLEN,VR0;  % FILE PACKET  SPACK
  3536.  
  3537. CCALL SPACK,A;
  3538. CCALL RPACK,A;
  3539. EXIT IF <RNZ VRF> | <TF STOPF>;  % Leave if Timeout or Bad BCC
  3540. ZR XRA;  % clear for the case
  3541. MTRT RTYPE,COMMAND,1;  % Scan command type
  3542. DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
  3543. NCASE: BEGIN  % Got a nack
  3544. LH XRA,RPSEQ;  % Load received sequence number
  3545. IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1;  % see if nack for pack+1
  3546. STH XRA,RPSEQ;  % STORE IN CASE NACK FOR SEQ+1
  3547. IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>;  % Ok yack case next
  3548. END;  % of nack
  3549. YCASE: BEGIN  % ACK
  3550. EXIT IF ^<MCLC SEQNUM,RPSEQ,2>;  % Wrong packet number
  3551. ZERORTRY;  % % Zero retry counter
  3552. BUMPSEQ VR0;  % Increment packet counter
  3553. MZC PUTLEN,2;  % ZERO OUT PUT LENGTH
  3554. LA XRA,PDATA;
  3555. ST XRA,PUTADD;  % RESTORE PUT POINTER
  3556. MZC OTHERLEN,2;  % ZERO EOR
  3557. MZC EDLENACT,4;  % ZERO LENGTH OF RECEIVED DATA
  3558. CCALL FILLDPCK,A;
  3559. IF <RZ VRF> THEN BEGIN
  3560. IF <CLI STATE,SFSTATE> THEN MVI STATE,SDSTATE;  % ELSE OTHER STATE
  3561.  
  3562. END
  3563. ELSE MVI STATE,SZSTATE;  % SEND DATA STATE
  3564. END;  % OF ACK
  3565. ECASE: BEGIN  % Error abort
  3566. MVI STATE,RESTATE;  % RECEIVED ABORT
  3567. END;
  3568. ENDCASE
  3569. ELSE BEGIN
  3570. ERRORCON 'Illegal packet type received ';
  3571. CCALL ERRPACK,A;  % PUT IN BUFFERS
  3572. MVI STATE,SESTATE;  % ABORT
  3573. END;
  3574. END;  % OK RETRY
  3575. END;  % of FDSNBLCK
  3576. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3577.  
  3578. CEXIT VRE,HIGHR;
  3579. LTORG;
  3580. EXORG;
  3581.  
  3582. SUBTITLE 'KFILENAM';
  3583. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3584. % MODULE : KFILENAM
  3585. % FUNCTION : Formats data set name for the kermit standard
  3586. %            for the F packet on a send (download)
  3587. % INPUT:     none
  3588. %
  3589. %
  3590. % OUTPUT :  updata packet pointer and length
  3591. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3592. KFILENAM:
  3593. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3594. LR XRC,VRF;  % PLACE TO STORE FILENAME
  3595. LH VRF,DSNLEN;  % LENGTH OF DSNAME
  3596. LA VR0,DOT;  % LOOK FOR 1ST DOT IN DATA SET NAME
  3597. LA VR1,DSNAME;
  3598. LH XRA,DSNLEN;  % LENGTH
  3599. AR VR1,VRF;  % POINT TO LAST
  3600. LCR VRF,VRF;  % COUNT BACKWARDS FOR THE FIRST DOT
  3601. LI XRB,2;
  3602. FOR XRB DO BEGIN  % LOOP UNTIL LAST DOT
  3603.  
  3604. CCALL FINDCHAR,A;
  3605. %% IF ZERO EXIT
  3606. IF <RP VRF> THEN BEGIN
  3607. SR XRA,VRF;  % MINUS BEGINNING NAME
  3608. SR VR1,VRF;  % POINT 1 AFTER DOT
  3609. LR VRF,XRA;  % RESTORE LENGTH FOR NEXT LOOK
  3610. LCR VRF,VRF;  % INDICATE COUNT BACKWARDS
  3611. END;  % OF ANOTHER DOT
  3612. END;  % NO MORE DOTS
  3613. AI XRA,2;  % LENGTH PLUS DOT
  3614. LH XRB,DSNLEN;  % LENGTH
  3615. LA VR1,DSNAME;
  3616. AR VR1,XRA;  % PONIT AFTER DOT
  3617. SR XRB,XRA;  % GET LENGTH
  3618. L XRA,ETOAVCON;
  3619. IF <CI XRB,12; CC H> THEN LI XRB,12;  % MAXIMUM LENGTH OF DSNAME
  3620. EXI XRB,MMVC,0(XRC),0(VR1),0,INCR=YES,DECR=YES;
  3621. EXI XRB,MTR,0(XRC),0(XRA),*-*,DECR=YES,INCR=YES;  % TRANSLATE ETOA
  3622. STH XRB,PUTLEN;  % LENGTH OF DATA
  3623.  
  3624. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3625.  
  3626. CEXIT VRE,HIGHR;
  3627. LTORG;
  3628. EXORG;
  3629.  
  3630. SUBTITLE 'SDATA';
  3631. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3632. % MODULE : SDATA
  3633. % FUNCTION : Sends data  packet   calls filldpck build packets
  3634. %
  3635. % INPUT:     none
  3636. %
  3637. %
  3638. % OUTPUT :  state = either 'D' more data   || 'Z' EOF
  3639. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3640. SDATA:
  3641. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3642. BUMPRTRY XRA;  % Increment retry counter
  3643. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  3644. MVI STATE,SESTATE  % Send abort state
  3645. ELSE DO BEGIN  % Send data block
  3646. SPSPACK AD,SEQNUM,PUTLEN,VR0;  % D PACKET,SEND PARAMETERS FOR SPACK
  3647. CCALL SPACK,A;
  3648. CCALL RPACK,A;
  3649. EXIT IF <RNZ VRF> | <TF STOPF>;  % Leave if Timeout or Bad BCC
  3650. ZR XRA;  % clear for the case
  3651. MTRT RTYPE,COMMAND,1;  % Scan command type
  3652. DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
  3653. NCASE: BEGIN  % Got a nack
  3654. LH XRA,RPSEQ;  % Load received sequence number
  3655. IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1;  % see if nack for pack+1
  3656. STH XRA,RPSEQ;  % STORE IN CASE NACK FOR SEQ+1
  3657. IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>;  % Ok yack case next
  3658. END;  % of nack
  3659. YCASE: BEGIN  % ACK
  3660. EXIT IF ^<MCLC SEQNUM,RPSEQ,2>;  % Wrong packet number
  3661. ZERORTRY;  % % Zero retry counter
  3662. BUMPSEQ VR0;  % Increment packet counter
  3663. MZC PUTLEN,2;  % ZERO OUT PUT LENGTH
  3664. LA XRA,PDATA;
  3665. ST XRA,PUTADD;  % RESTORE PUT POINTER
  3666. IF <MCLC RECLEN,=H'1',2> THEN BEGIN
  3667. IF <CLI RDATA,AX> | <CLI RDATA,AZ> THEN BEGIN
  3668. IF <CLI RDATA,AX> THEN SF ACKX;
  3669. IF <CLI RDATA,AZ> THEN SF ACKZ;
  3670. MVI STATE,SZSTATE;
  3671. EXIT;
  3672. END;
  3673. END;
  3674. CCALL FILLDPCK,A;
  3675. IF <RZ VRF> THEN MVI STATE,SDSTATE  % More data
  3676. ELSE MVI STATE,SZSTATE;  % End of file
  3677. END;  % OF ACK
  3678. ECASE: BEGIN  % Error abort
  3679. MVI STATE,RESTATE;  % RECEIVED ABORT
  3680. END;
  3681. ENDCASE
  3682. ELSE BEGIN
  3683. ERRORCON 'Illegal packet type received ';
  3684. CCALL ERRPACK,A;  % PUT IN BUFFERS
  3685. MVI STATE,SESTATE;  % ABORT
  3686. END;
  3687. END;  % OK RETRY
  3688. END;  % of SDATABLCK
  3689. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3690.  
  3691. CEXIT VRE,HIGHR;
  3692. LTORG;
  3693. EXORG;
  3694.  
  3695. SUBTITLE 'FILLDPCK';
  3696. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3697. % MODULE : FILLDPCK
  3698. % FUNCTION :   FILLS A SEND PACKET WITH DATA FROM KERIN
  3699. %              CALLS KGETREC & PUT BUFF WHEN NEEDED SEND FUNCTIONS
  3700. % INPUT:       NONE
  3701. %
  3702. %
  3703. % OUTPUT :     VRF=0 SUCCESSFUL, VRF=KERIN EOF
  3704. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3705. FILLDPCK:
  3706. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3707. ZR VRF;
  3708. FDPBLCK: FOREVER  DO BEGIN  % LOOP UNTIL PACKET FULL OR EOF
  3709.  
  3710. IF ^<MCLC OTHERLEN,ZERO,2> THEN BEGIN  % WE HAVE TO PUT CRLF
  3711. CCALL PUTBUFF,A,VR1=LFCR,VR0=LFCRLEN;  % PUT IT IN
  3712. MZC OTHERLEN,2;  % ZERO OUT
  3713. END;  % OF OTHER LENGTH
  3714. IF <MCLC EDLENACT,ZERO,4>  THEN BEGIN
  3715. IF <TF KINEOF> THEN BEGIN  % EOF ALREADY OCCURED
  3716. IF ^<MCLC PUTLEN,ZERO,2> THEN ZR VRF  % EOF BUT STUFF TO PUT
  3717. ELSE LI VRF,KERINEOF;
  3718. EXIT FROM FDPBLCK;
  3719. END;
  3720. CCALL GETAREC,A;  % READS A RECORD
  3721.  
  3722. IF <RNZ VRF> THEN BEGIN  % EOF OR ERROR
  3723. IF <CI VRF,KERINEOF> THEN BEGIN  % ALL DONE
  3724. SF KINEOF;  % INDICATE EOF
  3725. IF ^<MCLC PUTLEN,ZERO,2> THEN ZR VRF;  % EOF BUT STUFF STILL TO PUT
  3726. END  % OF EOF RETURN
  3727. ELSE MVI STATE,SESTATE;  % OTHER ERROR ABORT
  3728. EXIT FROM FDPBLCK;
  3729. END;
  3730. END;  % READ A RECORD
  3731.  
  3732. IF <TF TABF> THEN BEGIN  % IF TABBING PUT IN
  3733. CCALL PUTTABS,A;  % IF TABBING PUT IN
  3734. END;  % OF TABBING
  3735. % EOF FOR TEXT FILES
  3736. L VR0,EDLENACT;  % LENGTH
  3737. L VR1,EDPNTR;  % POINT TO PLACE IN RECORD TO PUT
  3738. ZR VRF;
  3739. IF ^<MCLC EDLENACT,ZERO,4> THEN CCALL SENDDATA,A;
  3740. IF <RZ VRF> THEN BEGIN
  3741. MZC EDLENACT,4;  % ZERO OUT COUNTER
  3742. IF <MCLC DATA,=C'TEXT',4> THEN BEGIN  % PUT EOF
  3743. EXIT FROM FDPBLCK IF <TF KINEOF>;  % CRLF ALREADY IN BUFFER
  3744. IF <MCLC OTHERLEN,ZERO,2> THEN BEGIN  % WE NEED EOF
  3745. MMVC OTHERLEN,=H'2',2;
  3746. CCALL CHECKLEN,A,VR0=4;  % SEE IF BUFFFER BIG ENOUGH
  3747. IF <RNZ VRF> THEN <ZR VRF; EXIT FROM FDPBLCK>;
  3748. END ELSE MZC OTHERLEN,2;  % JUST DID CRLF
  3749. END;  % OF TEXT
  3750. END  % OF ALL DATA PUT
  3751. ELSE BEGIN  % UPDATE POINTERS
  3752. L XRA,EDPNTR;  % POINTER TO DATA
  3753. L XRB,EDLENACT;  % LENGTH OF DATA
  3754. AR XRA,XRB;  % POINT TO LAST CHARACTER PLUS ONE
  3755. SR XRA,VRF;  % POINT TO REMAINING CHARACTERS
  3756. ST XRA,EDPNTR;
  3757. ST VRF,EDLENACT;  % UPDATA LENGTH AND POINTERS
  3758. ZR VRF;  % INDICATE OK
  3759. EXIT FROM FDPBLCK;
  3760. END;
  3761. END;  % OF FDPBLCK
  3762.  
  3763. IF ^<CI VRF,KERINEOF> THEN ZR VRF;  % NON EOF
  3764. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3765. CEXIT VRE,HIGHR;
  3766. LTORG;
  3767. EXORG;
  3768. KERINEOF:  EQU 4;
  3769.  
  3770. SUBTITLE 'GETAREC';
  3771. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3772. % MODULE : GETAREC
  3773. % FUNCTION :   READS A RECORD FROM DATA SET KERIN FOR
  3774. %              DOWNLOADING USING EDIT ROUTINE
  3775. % INPUT:       NONE
  3776. %
  3777. % OUTPUT:   VRF=0 GOOD RECORD VRF=KERINEOF - END OF FILE
  3778. %           VRF=READERR  - SOME OTHER FATAL ERROR
  3779. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3780. GETAREC:
  3781. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3782.  
  3783. CALL EDGETL,(EDCNTRL,EDRETURN,EDLINENO,EDPNTR,EDLENACT);
  3784.  
  3785. IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN  % FILE READ FAIL
  3786. IF <MCLC EDRETURN,ONE> THEN LI VRF,KERINEOF  % END OF FILE
  3787. ELSE BEGIN  % FILE READ ERRORS
  3788. CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
  3789. L VR0,EDLENACT;
  3790. IF <CI VR0,90; CC H> THEN LI VR0,90;  % SET UP LENGTH
  3791. CCALL ERRPACK,A,VR1=EDLINE;
  3792. LI VRF,KERINERR;  % ERROR
  3793. MVI STATE,SESTATE;  % ABORT IT
  3794. END;
  3795. END  % OF ERROR IN READING
  3796. ELSE BEGIN  % OK READ - TRANSLATE TO ASCII FOR KERIN STANDARDS
  3797. L VR0,EDLENACT;  % LENGTH OF DATA
  3798. LR XRB,VR0;  % FOR EXECUTE
  3799.  
  3800. IF <RP XRB> THEN BEGIN
  3801. L XRE,EDPNTR;  % SET UP POINTER TO GET BUF
  3802. IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
  3803. LR XRA,XRB;
  3804. L XRC,ETOAVCON;
  3805. DO BEGIN  % LOOP UNTIL NO MORE
  3806. IF <CI XRA,255; CC H> THEN <LI XRB,255; SI XRA,255>
  3807. ELSE <LR XRB,XRA; ZR XRA>;
  3808. CCALL CHKETOA,A,VR1=(XRE),VR0=(XRB);  % SEE IF UNTRANSLATABLE CHARS
  3809. EXI XRB,TR,0(*-*,XRE),0(XRC),DECR=YES,INCR=YES;
  3810. AI XRE,255;
  3811. END UNTIL <RZ XRA>;  % LOOP ALONG
  3812.  
  3813. END;  % TEXT
  3814. END;  % A POSITIVE AMOUNT OF DATA
  3815. ZR VRF;  % INDICATE A GOOD READ
  3816. END;  % OF GOOD READ
  3817. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3818. CEXIT VRE,HIGHR;
  3819. LTORG;
  3820.  
  3821.  
  3822. KERINERR:     EQU  8;  % READ ERROR
  3823. SUBTITLE 'SEOF';
  3824. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3825. % MODULE : SEOF
  3826. % FUNCTION : Sends the end-of-file packet
  3827. %            changes states on ack or nack
  3828. % INPUT:     none
  3829. %
  3830. %
  3831. % OUTPUT :  state = either 'z' eof || 'f' new file || 'B' EOT
  3832. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3833. SEOF:
  3834. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3835. BUMPRTRY XRA;  % Increment retry counter
  3836. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  3837. MVI STATE,SESTATE  % Send abort state
  3838. ELSE SEOFBLCK: DO BEGIN  % Send end of file block
  3839. SPSPACK AZ,SEQNUM,ZERO,VR0;  % Z PACKET,SEND PARAMETERS FOR SPACK
  3840. SELECT FIRST;
  3841. <TF ACKX>: <LA XRA,PDATA; MVI 0(XRA),AD; MMVC PUTLEN,=H'1',2; ZF ACKX>;
  3842. <TF ACKZ>: <LA XRA,PDATA; MVI 0(XRA),AD; MMVC PUTLEN,=H'1',2>;
  3843. ENDSEL;
  3844.  
  3845. CCALL SPACK,A;
  3846. CCALL RPACK,A;
  3847. EXIT IF <RNZ VRF> | <TF STOPF>;  % Leave if Timeout or Bad BCC
  3848. ZR XRA;  % clear for the case
  3849. MTRT RTYPE,COMMAND,1;  % Scan command type
  3850. DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
  3851. NCASE: BEGIN  % Got a nack
  3852. LH XRA,RPSEQ;  % Load received sequence number
  3853. IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1;  % see if nack for pack+1
  3854. STH XRA,RPSEQ;  % STORE IN CASE NACK FOR SEQ+1
  3855. IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>;  % Ok yack case next
  3856. END;  % of nack
  3857. YCASE: BEGIN  % ACK
  3858. EXIT IF ^<MCLC SEQNUM,RPSEQ,2>;  % Wrong packet number
  3859. ZERORTRY;  % % Zero retry counter
  3860. BUMPSEQ VR0;  % Increment packet counter
  3861. CCALL CLOSESDS,A;  % Close input file
  3862. IF <TF ASTERISK> & ^<TF ACKZ> THEN BEGIN  % Wild card or multiple send
  3863. CCALL NEXTFILE,A;
  3864. IF ^<CI VRF,ENDCAT> THEN BEGIN
  3865. CCALL OPENSDSN,A;  % Open next sendfile
  3866. IF ^<TF SENDDSNF> THEN BEGIN
  3867. ERRORCON 'Can not next file for down load';
  3868. CCALL ERRPACK,A;
  3869. END  % OF OPEN ERROR
  3870. ELSE <MVI STATE,SFSTATE; EXIT>;  % SUCCESSFUL FILE OPEN
  3871. END;
  3872. END;  % of wildcard
  3873. MVI STATE,SBSTATE;
  3874. END;  % OF ACK
  3875. ECASE: BEGIN  % Error abort
  3876. MVI STATE,RESTATE;  % RECEIVED ABORT
  3877. END;
  3878. ENDCASE
  3879. ELSE BEGIN
  3880. ERRORCON 'Illegal packet type received ';
  3881. CCALL ERRPACK,A;  % PUT IN BUFFERS
  3882. MVI STATE,SESTATE;  % ABORT
  3883. END;
  3884. END;  % OK RETRY
  3885. END;  % of SEOFBLCK
  3886. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3887.  
  3888. CEXIT VRE,HIGHR;
  3889. LTORG;
  3890. EXORG;
  3891.  
  3892. SUBTITLE 'SEOT';
  3893. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3894. % MODULE : SEOT
  3895. % FUNCTION : Sends the end-of-transmission packet
  3896. %            changes states on ack or nack
  3897. % INPUT:     none
  3898. %
  3899. %
  3900. % OUTPUT :  state = either 'C' complete  || 'B' EOT
  3901. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3902. SEOT:
  3903. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  3904. BUMPRTRY XRA;  % Increment retry counter
  3905. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  3906. MVI STATE,SESTATE  % Send abort state
  3907. ELSE SEOTBLCK: DO BEGIN  % Send end of transmisision block
  3908. SPSPACK AB,SEQNUM,ZERO,VR0;  % B PACKET,SEND PARAMETERS FOR SPACK
  3909. SELECT FIRST;
  3910. <TF WARNINGF>: <L XRA,RECPNTR; MVI 0(XRA),AX; MMVC PUTLEN,=H'1',2>;
  3911. ENDSEL;
  3912.  
  3913. CCALL SPACK,A;
  3914. CCALL RPACK,A;
  3915. EXIT IF <RNZ VRF> | <TF STOPF>;  % Leave if Timeout or Bad BCC
  3916. ZR XRA;  % clear for the case
  3917. MTRT RTYPE,COMMAND,1;  % Scan command type
  3918. DO BEGIN CASE XRA MAX ECASE MIN NCASE CHECK;
  3919. NCASE: BEGIN  % Got a nack
  3920. LH XRA,RPSEQ;  % Load received sequence number
  3921. IF <RZ XRA> THEN LI XRA,63 ELSE SI XRA,1;  % see if nack for pack+1
  3922. STH XRA,RPSEQ;  % STORE IN CASE NACK FOR SEQ+1
  3923. IF <CH XRA,SEQNUM> THEN <LI XRA,YCASE; NEXT>;  % Ok yack case next
  3924. END;  % of nack
  3925. YCASE: BEGIN  % ACK
  3926. EXIT IF ^<MCLC SEQNUM,RPSEQ,2>;  % Wrong packet number
  3927. ZERORTRY;  % % Zero retry counter
  3928. BUMPSEQ VR0;  % Increment packet counter
  3929. MVI STATE,CSTATE;  % COMLETE STATE
  3930. END;  % OF ACK
  3931. ECASE: BEGIN  % Error abort
  3932. MVI STATE,RESTATE;  % RECEIVED ABORT
  3933. END;
  3934. ENDCASE
  3935. ELSE BEGIN
  3936. ERRORCON 'Illegal packet type received ';
  3937. CCALL ERRPACK,A;  % PUT IN BUFFERS
  3938. MVI STATE,SESTATE;  % SEND ABORT    STATE
  3939. END;
  3940. END;  % OK RETRY
  3941. END;  % of SEOTBLCK
  3942. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  3943.  
  3944. CEXIT VRE,HIGHR;
  3945. LTORG;
  3946. EXORG;
  3947.  
  3948. ASCIIREG:   EQU    0;  % EQUATES FOR TABLE
  3949. ASCIIQUO:   EQU    4;  % QUOTE CHARACTER
  3950. ASCIQUO8:   EQU    8;  % " + BIT 8 ON
  3951. ASCI8BIT:   EQU    12;  % BIT 8 ON
  3952. REPTQUO:  EQU 16;  % REPTCHARACTER
  3953. NOQUOQUO:  EQU   20;
  3954. NOQUOQU8:  EQU   24;
  3955.  
  3956. % ASCII OFFSETS INTO TABLE
  3957. YOFF:     EQU    X'59';
  3958. NOFF:     EQU    X'4E';
  3959. FOFF:     EQU    X'46';
  3960. DOFF:     EQU    X'44';
  3961. ZOFF:     EQU    X'5A';
  3962. COFF:     EQU    X'43';
  3963. BOFF:     EQU    X'42';
  3964. EOFF:     EQU    X'45';
  3965. AOFF:     EQU    X'41';
  3966. R2OFF:     EQU     X'52';  % ASCII I SERVER GET COMM
  3967. IOFF:     EQU     X'49';  % ASCII I SERVER GET COMM
  3968. GOFF:     EQU     X'47';  %ASCII G;
  3969. ROFF:     EQU     SCOMLIT;
  3970. % ASCII COMMAND LITERALS
  3971. YCOMLIT:     EQU    X'59';
  3972. NCOMLIT:     EQU    X'4E';
  3973. FCOMLIT:     EQU    X'46';
  3974. DCOMLIT:     EQU    X'44';
  3975. ZCOMLIT:     EQU    X'5A';
  3976. CCOMLIT:     EQU    X'43';
  3977. BCOMLIT:     EQU    X'42';
  3978. ECOMLIT:     EQU    X'45';
  3979. ACOMLIT:     EQU    X'45';
  3980. %ACOMLIT:     EQU    X'41';
  3981. SCOMLIT:     EQU    X'53';
  3982.  %   EQUATES FOR A CASE STATEMENT INDEAL1 FOR PACKET TYPE
  3983. YCASE:  EQU  8;  % ACK     T  PACKET
  3984. NCASE:  EQU  4;  % NACK  PACKET
  3985. ECASE:  EQU  12;  % ERROR PACKET
  3986. FCASE:  EQU  32;  % FILE INIT  PACKET
  3987. DCASE:  EQU  16;  % DATA PACKET
  3988. ZCASE:  EQU  20;  % EOF PACKET
  3989. CCASE:  EQU  24;  % COMPLETEPACKET
  3990. BCASE:  EQU  28;  % EOT PACKET
  3991. ACASE:  EQU  36;  % ABORT PACKET
  3992. SCASE:  EQU  40;  % SENDINIT PACKET
  3993. R2CASE:  EQU  44;  % SERVER GET  PACKET
  3994. GCASE:  EQU  48;  % SERVER GENERIC COMMMAND PACKET
  3995. ICASE:  EQU  52;  % SERVER I PACKET
  3996.  
  3997. %  VARIOUS KERMIT SEND STATES
  3998.  
  3999. SFSTATE:  EQU  12;  % SEND  FILE INIT  PACKET
  4000. SDSTATE:  EQU  16;  % SEND  % DATA PACKET
  4001. SZSTATE:  EQU  20;  % SEND   EOF PACKET
  4002. CSTATE:  EQU  24;  % COMPLETEPACKET
  4003. SBSTATE:  EQU  28;  % SEND EOT PACKET
  4004. ASTATE:  EQU  36;  % ABORT PACKET
  4005. SESTATE:  EQU  36;  % SEND ABORT PACKET
  4006. RESTATE:  EQU  44;  % RECEIVED ABORT PACKET
  4007. SISTATE:  EQU  40;  % SENDINIT PACKET
  4008.  
  4009. %  VARIOUS KERMIT RECEIVE STATES
  4010.  
  4011. RFSTATE:  EQU  12;  % RECEIVE  FILE HEADER  PACKET
  4012. RDSTATE:  EQU  16;  % RECEIVE  % DATA PACKET
  4013. RZSTATE:  EQU  20;  % RECEIVE   EOF PACKET
  4014. RBSTATE:  EQU  28;  % RECEIVE EOT PACKET
  4015. RISTATE:  EQU  56;  % RECEIVE INIT PACKET
  4016. RSTATE:  EQU  40;  % RECEIVE PACKET
  4017. R2STATE:  EQU 44;  % GET PACKET FOR SERVER MODE
  4018. GSTATE:   EQU 48;  % GENERIC SERVER COMMANDS
  4019. ISTATE:  EQU 52;  % I PACKET
  4020.  
  4021. SEND:    EQU    60;  % IN SEND COMMAND MODE
  4022. RECEIVE: EQU    64;  % IN RECEIVE COMMAND MODE
  4023. SUBTITLE 'SENDDATA';
  4024. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4025. %  MOD NAME : SENDDATA
  4026. %  FUNCTION: BREAK RECORDS INTO PACKET - CALLED BY KSEND
  4027. %  INPUT : VR1-> DATA STRING
  4028. %           VR0=LENGTH OF STRING TO SEND IN PACKETS
  4029. %  OUTPUT: A PACKET
  4030. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4031. SENDDATA:
  4032. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4033. LR  XRB,VR0;  % LENGTH OF DATA
  4034. LR XRE,VR1;  % POINTER TO BEGINNING OF THE STRING
  4035. SDATABLK: UNTIL <RNP XRB> DO BEGIN
  4036. IF <TF REPTF> THEN BEGIN
  4037. LR VR1,XRE;
  4038. ZR XRA;  % FOR TRT TEST
  4039. CCALL CNTXCHAR,A,VR0=(VR1),VRF=(XRB);  % CHECK FOR MATCHES
  4040. MTRT 0(VR1),REPTABLE,1;
  4041. IF <CR XRA,VRF; CC L> THEN BEGIN  % IF ENUFF WORTH QUOTING BEGIN
  4042. IF <CI VRF,94; CC H> THEN LI VRF,94;  % NINE FOUR HIGHEST KERMIT NUMBER
  4043. ZR XRA;
  4044. MTRT 0(VR1),SENDTBL,1;  % WHAT TYPE OF CHARACTER
  4045. CASE XRA MAX 24 MIN 0 CHECK;  % CHECK IF BUFFER LARGE ENOUGH
  4046. 0: LI VR0,3;
  4047. 4,20,ASCI8BIT: LI VR0,4;
  4048. ASCIQUO8,24: LI VR0,5;
  4049. ENDCASE;
  4050. LR XRC,VRF;  % SAVE LENGTH OF MATCHES IN CASE NEEDED
  4051. CCALL CHECKLEN,A;
  4052. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4053. LR VRF,XRC;  % RESTORE LENGTH OF CHARACTERS TO QUOTE
  4054. MMVC 0(VR1),REPTCHAR,1;
  4055. CHAR VRF;  % MAKE IT A KERMIT INTEGER
  4056. STC VRF,1(VR1);  % PUT IN THE COUNT
  4057. UNCHAR VRF;
  4058. CCALL PUTBUFF,A,VR0=2;  % PUT THE TWO IN
  4059. SI VRF,1;  % DECREMENT COUNT  % BIT KLUDGE
  4060. SR XRB,VRF;
  4061. AR XRE,VRF;  % MOVE POINTER;
  4062. END;
  4063. END;  % OF REPEAT
  4064. ZR XRA;
  4065. MTRT 0(XRE),SENDTBL,1;  % SCAN FOR CERTAIN CHARACTER
  4066. CASE XRA MAX 24 MIN 0 CHECK;
  4067. 0: BEGIN  % MOVE EM ALL
  4068. CCALL CHECKLEN,A,VR0=1;  % SET ANY ROOM LEFT
  4069. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4070. END;  % OF ALL MOVE
  4071. ASCIIQUO: BEGIN
  4072.  
  4073. LI VR0,2;
  4074. CCALL CHECKLEN,A;
  4075. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4076. LI VR0,1;  % ONE CHARACTER PUT
  4077. CCALL PUTBUFF,A,VR1=QUOCHAR;  % PUT IN THE CONTROL QUOTE CHARACTER
  4078. CNTLLOC 0(XRE);  % MACRO FOR CONTROL CHARACTERS
  4079.           END;
  4080. ASCIQUO8: BEGIN
  4081.  
  4082. LI VR0,3;  % THREE CHARACTERS NON SPLIT
  4083. CCALL CHECKLEN,A;
  4084. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4085. LI VR0,1;  % ONE CHARACTER PUT
  4086. CCALL PUTBUFF,A,VR1=BINQC;  % PUT IN THE BINARY QUOTE CHARACTER
  4087. CCALL PUTBUFF,A,VR1=QUOCHAR;  % PUT IN THE CONTROL QUOTE CHARACTER
  4088. CNTLLOC 0(XRE);  % MACRO FOR CONTROL CHARACTERS
  4089. ZAP8BIT 0(XRE);  % MACRO FOR ZERO HIGH ORDER
  4090.  
  4091.           END;  % 2 QUOTE BITS
  4092. ASCI8BIT: BEGIN  % HIGH ORDER BIT ON
  4093.  
  4094. LI VR0,2;
  4095. CCALL CHECKLEN,A;
  4096. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4097. LI VR0,1;  % ONE CHARACTER PUT
  4098. CCALL PUTBUFF,A,VR1=BINQC;  % PUT IN THE BINARY QUOTE CHARACTER
  4099. ZAP8BIT 0(XRE);  % KILL HIGH ORDER BIT
  4100.  
  4101.           END;
  4102.  
  4103. REPTQUO: BEGIN
  4104. WRTERM 'REPT CASE DONT BELONG LUCY';
  4105. ZR XRA;  % FOR CASE
  4106.         % REGISTER 1 POINTS TO REPT CHAR
  4107. LA XRD,2(,VR1);  % POINT TO CHARACTER
  4108.  
  4109. MTRT 0(XRD),SENDTBL,1;  % TEST ONE CHARACTER
  4110. CASE XRA MAX 24 MIN 0 CHECK;
  4111.  
  4112. 0: BEGIN  % NO OTHER QUOTING NECESSARY
  4113. LI VR0,3;
  4114. END;  % OF NO OTHER QUOTE NECESSARY
  4115.  
  4116.       4,16 :  BEGIN  % NEED ONE
  4117. LI VR0,4;
  4118. CNTLLOC 0(XRD);  % MACRO FOR CONTROL CHARACTERS
  4119. END;  % END OF QUOTE CASE
  4120.  
  4121.  
  4122. 8: BEGIN  % NEED ONE   ASCII + HIGH ORDER BIT ON
  4123. LI VR0,5;
  4124.  
  4125. CNTLLOC 0(XRD);  % MACRO FOR CONTROL CHARACTERS
  4126. ZAP8BIT 0(XRD);  % MACRO FOR ZERO HIGH ORDER
  4127. END;  % END OF  HIGH BIT&  QUOTE CASE
  4128.  
  4129.      12 : BEGIN  % NEED ONE
  4130. LI VR0,4;
  4131.  
  4132. ZAP8BIT 0(XRD);  % MACRO FOR ZERO HIGH ORDER
  4133. END;  % END OF QUOTE CASE
  4134. 20: BEGIN  % A QUOTE CHARACTER THAT NOTHING SHOULD BE DONE TO
  4135. LI VR0,4;
  4136. LI XRA,ASCIIQUO;  % SINGLE QUOTE IT
  4137. END;
  4138. 24: BEGIN  % SAME AS ABOVE BUT IT'S HIGH ORDER COUNTER PART
  4139. LI VR0,5;
  4140. ZAP8BIT 0(XRD);  % ZAP HIGH ORDER
  4141. LI XRA,ASCIQUO8;  % FAKE OUT NEXT SECTION
  4142. END;
  4143.  
  4144. ENDCASE;
  4145.  
  4146. CCALL CHECKLEN,A;  % MUST ALL BE ONE UNIT
  4147. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4148. LR VR1,XRD;
  4149. SI VR1,2;  % BACK UP
  4150. LI VR0,2;  % PUT IN REPEAT AND COUNT
  4151. CCALL PUTBUFF,A;  % DO IT
  4152.  
  4153. LI VR0,1;
  4154. CASE XRA MAX REPTQUO MIN 0 CHECK;
  4155. 0: ;  % DO NOTHING FALL OUT
  4156. ASCIIQUO: BEGIN
  4157. CCALL PUTBUFF,A,VR1=QUOCHAR;
  4158. END;
  4159. ASCIQUO8: BEGIN
  4160. CCALL PUTBUFF,A,VR1=BINQC;  % THE BINARY QUOTE CHARACTER
  4161. CCALL PUTBUFF,A,VR1=QUOCHAR;
  4162. END;
  4163. ASCI8BIT: BEGIN
  4164. CCALL PUTBUFF,A,VR1=BINQC;  % THE BINARY QUOTE CHARACTER
  4165. % THE HIGH ORDER BIT IS ON
  4166. END;
  4167. REPTQUO: ;  % JUST DROP THROUGH
  4168.  
  4169. ENDCASE;
  4170.  
  4171. %
  4172.  
  4173. LR VR1,XRD;  % POINT TO THE CHARACTER
  4174. CCALL PUTBUFF,A;  % PUT IT IN THE OUTPUT BUFFER
  4175.  
  4176. SI VR1,1;  % BACK UP TO LENGTH
  4177. ZR XRD; IC XRD,0(VR1);
  4178. UNCHAR XRD;  % MAKE IT AN INTEGER
  4179.  
  4180. AR XRE,XRD;  % INCREMENT COUNTER
  4181. SR XRB,XRD;  % DECRENT LENGTH
  4182. END;  % OF REPT CASE
  4183. 20: BEGIN  % A QUOTE CHARACTER
  4184. LI VR0,2;
  4185. CCALL CHECKLEN,A;
  4186. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4187. LI VR0,1;
  4188. CCALL PUTBUFF,A,VR1=QUOCHAR;
  4189. END;
  4190.  
  4191. 24: BEGIN  % A HIGH ORDER QUOTE CHARACTER
  4192. LI VR0,3;
  4193. CCALL CHECKLEN,A;
  4194. EXIT FROM SDATABLK IF <RNZ VRF>;  % NO MORE ROOM IN PACKET
  4195. LI VR0,1;
  4196. CCALL PUTBUFF,A,VR1=BINQC;
  4197. CCALL PUTBUFF,A,VR1=QUOCHAR;
  4198. ZAP8BIT 0(XRE);
  4199. END;
  4200.           ENDCASE;
  4201. CCALL PUTBUFF,A,VR1=(XRE),VR0=1;  % PUT IT IN THE BUFFER
  4202. AI XRE,1;  % POINT TO NEXT CHARACTER
  4203. SI XRB,1;  % DECREMENT THE LENGTH REGISTER
  4204. END;
  4205. LR VRF,XRB;  % REMAINING CHARACTERS
  4206. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4207. CEXIT VRE,HIGHR;
  4208. LTORG;
  4209. EXORG;
  4210.  
  4211. SUBTITLE 'PUTTABS';
  4212. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4213. %  MODULE : PUTTABS
  4214. %  FUNCTION : PUTS TABS INTO RECORD
  4215. %            CALLED BY FILLDPCK;
  4216. %  INPUT: NONE
  4217. %  OUTPUT : THE RECORD BUFFER WITH TAB CHARACTERS
  4218. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4219. %
  4220. PUTTABS:
  4221. CENTER VRE,HIGHR,ENTRY=NO;
  4222.  
  4223. MZC TABCNT,2;  % ZERO TAB COUNTER
  4224. ZF TABFOUND;  % ZERO FLAG
  4225.  
  4226. ZR XRD;  % ACCUMULATOR
  4227.  
  4228. L VR0,EDPNTR;  % ADDRESS OF POINTER
  4229. L XRE,EDLENACT;  % LENGTH OF DATA RECEIVED
  4230. L XRA,TABTBLAD;  % POINTER TO ARRAY OF TABS
  4231. MMVC LASTTAB,=H'1';  % INTIALIZE LAST TAB
  4232. ST VR0,LASTADDR;  % LAST ADDRESS OF MOVE
  4233.  
  4234.  
  4235.  
  4236. TABBLCK: UNTIL <MCLC 0(XRA),=H'0',2> % UNTIL NO MORE TABS
  4237. DO BEGIN
  4238. %
  4239. L VR1,EDPNTR;  % POINTER TO RECORD  BUFFER
  4240. LH XRB,0(,XRA);  % LOAD TAB CHARACTER
  4241. SI XRB,1;  % ONE LESS FOR COMPARE
  4242. EXIT FROM TABBLCK IF <C XRB,EDLENACT; CC H>;  % EXIT IF TOO LONG
  4243. AI XRB,1;  % RESTORE TAB CHARACTER
  4244. AR VR1,XRB;  % POINT AT TAB PLACE
  4245.  
  4246. SI VR1,2;  % BACK UP IN STRING AT LEAST TWO CHARACTS FOR WORTH WHILE
  4247.  
  4248. LR VRF,XRB;  % SET UP LENGTH TO SCAN
  4249. SH VRF,LASTTAB;  % "
  4250. STH XRB,LASTTAB;  % PUT
  4251.  
  4252. LR XRB,VRF;  % LENGTH OF STRING
  4253.  
  4254.  
  4255.  
  4256. LCR VRF,VRF;  % LOAD COMP TO MAKE ROUTINE COUNT BACKWARD
  4257. CCALL CNTXCHAR,A,VR0=ASCBLANK;
  4258.  
  4259. IF <CI VRF,2; CC NL> THEN BEGIN  % FOUND TWO BLANKS
  4260. SF TABFOUND;
  4261.  
  4262.  
  4263. LR XRE,VRF;  % STORE OFF NUMBER OF BLANKS
  4264. SR XRB,VRF;  % UNTABBED ONES
  4265. L VR0,LASTADDR;  % LAST ADDRESS IN NON TAB BUFFER
  4266. L VR1,TABADDR;  % ADDRESS OF TAB BUFFER
  4267. AH VR1,TABCNT;  % NEXT PLACE TO BE
  4268.  
  4269. L VRF,EDPNTR;
  4270. AH VRF,0(XRA);  % POINT TO END OF CHAIN
  4271. SI VRF,1;  % KNOCK OFF ONE REGARDLESS
  4272. SR VRF,XRE;  % SUB OFF NUMBER OF BLANKS
  4273. S VRF,LASTADDR;  % SUB OFF FOR TOTAL TO MOVE
  4274. CCALL MVCXCHAR,A;  % MOVE UNTABBED ONES
  4275.  
  4276. AR VR1,VRF;  % POINT TO NEXT ENTRY
  4277. MMVC 0(VR1),TABCHAR,1;  % PUT IN TAB CHARACTER
  4278. AH VRF,TABCNT;
  4279. AI VRF,1;  % ONE FOR THE TAB CHARACTER COMING UP
  4280. STH VRF,TABCNT;  % INCREMENT TAB COUNTER
  4281. L VR0,EDPNTR;
  4282. AH VR0,0(XRA);  % ADD TAB
  4283. SI VR0,1;  % FOR CORRECT ADDRESS
  4284. ST VR0,LASTADDR;  % PLACE TO MOVE FROM
  4285.  
  4286.  
  4287.  
  4288. END;  % OF BLANKS
  4289. AI XRA,2;  % MOVE POINTER TO NEXT IN TAB TABLE
  4290. END;  % OF TABBLCK
  4291. IF <TF TABFOUND> THEN BEGIN
  4292.  
  4293. L VRF,EDLENACT;
  4294. L VR0,LASTADDR;
  4295. S VR0,EDPNTR;  % NUMBER ALREADY IN BUFFER
  4296. SR VRF,VR0;  % REMAINDER TO PUT
  4297.  
  4298.  
  4299. IF <RP VRF> THEN BEGIN  % A POSITIVE REMAINDER
  4300. L VR1,TABADDR;  % TAB BUFFER
  4301. AH VR1,TABCNT;  % COUNT IN BUFFER
  4302. L VR0,LASTADDR;  % FROM ADDRESS
  4303. CCALL MVCXCHAR,A;  % MOVE THE CHARACTERS LEFT
  4304. END;  % OF POSITIVE NUMBER
  4305. AH VRF,TABCNT;
  4306. ST VRF,EDLENACT;
  4307. MMVC EDPNTR,TABADDR,4;  % REINIT ADDRESS
  4308. END;  % OF FOUND A TAB
  4309.  
  4310. TABEXIT: CEXIT VRE,HIGHR;
  4311. LTORG;
  4312. EXORG;
  4313.  
  4314.  
  4315. SUBTITLE 'REPTCNT';
  4316. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4317. % MODULE : REPTCNT
  4318. % FUNCTION: SCANS BUFFER FOR LIKE CHARACTERS PUT IN REPTCHAR
  4319. %           PLUS LENGTH, PLUS CHAR
  4320. % ON RETURN R15 - EQUALS LENGTH OF STRING
  4321. %
  4322. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4323. REPTCNT: ;
  4324. CENTER VRE,HIGHR,ENTRY=NO;
  4325. LR XRB,VR0;  % LENGTH OF STRING
  4326.  
  4327. REPTBLCK: DO BEGIN  % BLOCK TO DROP OUT OF
  4328. WHILE <CI XRB,2; CC NL> DO BEGIN  % LOOP LOOKS THROUGH STRING
  4329. DO BEGIN
  4330. EXIT FROM REPTBLCK IF <CI XRB,2; CC L>;
  4331. ZR XRA;  % ZERO CASE STATEMENT
  4332. LR VR0,VR1;  % POINT TO SAME PLACE FOR CHECK
  4333.  
  4334. % CASE TO PUT IN REPEAT CHARACTER
  4335. MTRT 0(VR1),REPTABLE,1;  % NUMBER NEEDED FOR WORTHWHILE QUOTING
  4336. LR VRF,XRB;  % LOAD UP NUMBER OF CHARACTERS
  4337. CCALL CNTXCHAR,A;  % COUNT NUMBER OF MATCHES
  4338. LR XRC,VR1;  % POINTER
  4339. AR XRC,VRF;  % POINTER TO NEXT POSITION
  4340. AI VR1,1;  % INCREMENT POINTER
  4341. SI XRB,1;  % SUBTRACT COUNTER
  4342. END UNTIL <CR VRF,XRA; CC NL>;  % LOOP TILL WE FIND OK ONE
  4343. SI VR1,1;  % POINT BACK
  4344. SR XRB,VRF;  % SUBTRACT THE NUMBER EFFECTED
  4345. AI XRB,1;  % ADD IN ONE THAT WE SUBBED OFF ABOVE
  4346. LR XRA,VRF;  % GET LENGTH
  4347. DO BEGIN  % % 94 MAXIMUM NUMBER OF CHARACTERS
  4348. IF <CI XRA,94; CC H> THEN BEGIN  % TOO LARGE
  4349. LI VRF,94;  % MAX VALUE ACCORDING TO KERMIT STANDARDS
  4350. SI XRA,94;
  4351. END  % OF>94
  4352. ELSE BEGIN
  4353. LR VRF,XRA;  % LENGTH
  4354. ZR XRA;  % INDICATE NO MORE
  4355. END;
  4356.  
  4357. MMVC 0(VR1),REPTCHAR,1;
  4358. CHAR VRF;  % MAKE THE INTEGER A CHARACTER
  4359. STC VRF,1(VR1);  % STORE OFF LENGTH
  4360. % THE CHARACTER IS ALREADY IN STRING SO WE JUST LEAVE IT
  4361. %
  4362. UNCHAR VRF;  % MAKE INTEGER AGAIN
  4363. AR VR1,VRF;  % INCREMENT POINTER TO NEXT REPT PLACE
  4364. END UNTIL <RNP XRA>;  % LOOP THRU WHILE> 94
  4365.  
  4366. LR VR1,XRC;  % RESTORE POINTER
  4367.  
  4368.  
  4369. END;  % OF WHILE
  4370. END;  % OF REPTBLCK
  4371.  
  4372. REPTEXIT: CEXIT VRE,HIGHR;
  4373. LTORG;
  4374. EXORG;
  4375.  
  4376.  
  4377. SUBTITLE 'SCANDSN';
  4378. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4379. % MOD: SCANDSN
  4380. % FUNCTION: SCANS A STRING TO SET UP DATA SET NAME
  4381. % INPUT: VR1-> POINTER TO STRING
  4382. %        VR0 = LENGTH OF STRING
  4383. % OUTPUT: DSNAME VARIABLE FILLED IN
  4384. %         MEMBER NAME FILLED (IF PDS)
  4385. % RETURN:  VRF=0 - GOOD RETURN WITH DSNAME FILLED IN
  4386. %              4 -  "    "      "     " & MEMBER " " + PDS
  4387. %              8    "    "   + A WILD CARD -"*"
  4388. %              12 - VR0=0 ON ENTRY
  4389. %              16 - ERROR ON DS NAME
  4390. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4391. SCANDSN:
  4392. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4393. SCERROR NEW=SCDSNERR;
  4394. ZF PDSF;  % ASSUME NOT A PDS
  4395. ZR VRF;
  4396. MFC DSNAME,44;
  4397. DEBLANK VR1,VR0,XRA,ZERO=NO;  % DEBLANK STRING
  4398. MFC DSMEMBER,8;  % ZERO MEMBER NAME
  4399. IF ^<<CLI STATE,SEND> | <CLI STATE,RECEIVE>> | %NOTHING
  4400.  
  4401. <TF SERVERF> % ALWAYS PASS THROUGH FOR SERVER
  4402. THEN BEGIN
  4403. %%% CHECK NOW FOR REPEAT AND STRANGE CHARACTERS
  4404. MMVC MAXWRITE,=X'7FFF',2;  % MAXVALUE
  4405. MZC BUFCNT,2;  % ZERO OUT BUFFER COUNTER
  4406. MMVC ADDBUF,BUFADCON,4;  % ADDRESS OF BUFFER
  4407. MMVC TEMP,DATA,7;
  4408. MMVC DATA,=C'BINARY',7;
  4409. LR XRA,VR0;
  4410. L XRC,ETOAVCON;
  4411. EXI XRA,MTR,0(VR1),0(XRC),*-*,INCR=YES,DECR=YES;
  4412. CCALL KGETBUFF,A;
  4413. MMVC DATA,TEMP,7;
  4414. LH VR0,BUFCNT;  % NUMBER OF CHARACTERS
  4415. L VR1,ADDBUF;  % ADDRESS OF BEGINNING OF STRING
  4416. L XRC,ATOEVCON;
  4417. LR XRA,VR0;
  4418. EXI XRA,MTR,0(VR1),0(XRC),*-*,INCR=YES,DECR=YES;
  4419. %  ST VR1,DSNADD ;
  4420. %  STH VR0,DSNLEN ;
  4421. END;
  4422. SCANDSBK: DO BEGIN  % BLOCK TO FALL OUT OF IF NECESSARY
  4423. STH VR0,TEMP;  % STORE OFF LENGTH
  4424. LR XRA,VR0;  % LENGTH IN REGISTER
  4425. LR XRB,VR1;  % POINTER TO STRING
  4426. CCALL SCANASRK,A;  % ROUTINE LOOKS FOR ASTERISK
  4427. IF <TF ASTERISK> THEN BEGIN
  4428. IF <<CLI STATE,RFSTATE> | <CLI STATE,RECEIVE>>  %NO WILDCARD RECEIVE
  4429. THEN BEGIN
  4430. LI VRF,8;  % WILDCARD
  4431. EXIT FROM SCANDSBK;
  4432. END;
  4433. CCALL CATLOOK,A;  % LOOK INTO CATALOG
  4434. IF <RZ VRF> THEN CCALL NEXTFILE,A;  % SEE IF ENTRY EXISTS IN CATALOG
  4435. EXIT FROM SCANDSBK;
  4436. END;  % OF * BLOCK
  4437.  
  4438. LA XRC,DSNAME;
  4439. IF ^<TF PREFXQUO> THEN BEGIN
  4440. L XRB,USERPREA;  % POINTER TO USER PREFIX
  4441. LH XRA,USERPREL;  % LENGTH OF PREFIX
  4442. EXI XRA,MMVC,0(XRC),0(XRB),*-*,INCR=YES,DECR=YES; AR XRC,XRA;
  4443. MVI 0(XRC),C'.';  % PUT IN THE DOT
  4444. AI XRC,1;  % MOVE POINTER TO DATA SET NAME
  4445. END;
  4446. IF <MCLC PREFIXL,=H'0',2; CC H> THEN BEGIN
  4447. LH XRB,PREFIXL;
  4448. EXI XRB,MMVC,0(XRC),PREFIX,*-*,INCR=YES,DECR=YES;
  4449. AR XRC,XRB;
  4450. END;
  4451. SCINIT (VR1),(VR0);
  4452. SCANDSN1: DO BEGIN SCAN *;
  4453.          SCKW ,QDSN,QS;  % IF QUOTED DATA SET NAME
  4454.          SCKW ,UNQDSN;  % REGULAR DSN
  4455.  
  4456. UNQDSN:
  4457. % MTRT   TEST FOR ILLEGAL CHARACTERS IN DATA SET NAME
  4458. IF <TF PREFPDSF> THEN BEGIN
  4459. SCBACK;
  4460. GOTO UNQMEM;  % A PDS PREFIX FILL IN THE MEMBER
  4461. END;  % OF PREFIX PDS
  4462.  
  4463. LR XRB,VR0;  % LENGTH
  4464. EXI XRB,MMVC,0(XRC),0(VR1),*-*,INCR=YES,DECR=YES;  % SAVE DATA SET NAME)
  4465.  
  4466. BEGIN SCAN *;
  4467.       SCKW ,UNQMEM,PS;  % SEE IF MEMBER EXISTS FOR PDS
  4468.       SCKW ,*,B;  % ALL DONE BABY
  4469.  
  4470. UNQMEM:
  4471. DEBLANK VR1,VR0;
  4472. %MTRT TEST FOR VALID DSN AGAIN
  4473.  
  4474. SCPUSH;
  4475. SCINIT (VR1),(VR0);
  4476. SCAN;
  4477.  
  4478. IF <CI VR0,8; CC H> THEN LI VR0,8;
  4479. LR XRA,VR0;  % LENGTH FOR EXECUTE
  4480. IF <RZ XRA> THEN BEGIN  % NOTHING FOR MEMBER
  4481. IF ^<TF SERVERF> THEN WRTERM 'Member name excedes 8 characters'
  4482. ELSE BEGIN
  4483. ERRORCON 'No member name specified';
  4484. CCALL ERRPACK,A;
  4485. MVI STATE,ASTATE;
  4486. END;  % OF NON SERVER
  4487. LI VRF,BADDSN;  % ERROR ON NAME
  4488. EXIT;  % SPLIT THE BLOCK
  4489. END;  % OF ERROR BLOCK
  4490. EXI XRA,MMVC,DSMEMBER,0(VR1),*-*,INCR=YES,DECR=YES;
  4491.  
  4492. LA VR0,DOT;  % LOOK FOR DOTS
  4493. LI VRF,8;  % MEMBER NAME LENGTH
  4494. CCALL FINDCHAR,A,VR1=DSMEMBER;
  4495. IF <RNZ VRF> THEN BEGIN
  4496. SI VRF,1; AR VR1,VRF; SI VRF,8; LCR VRF,VRF;
  4497. LA VR0,BLANKS;  % MOVE IN BLANKS
  4498. CCALL MVCXCHAR,A;
  4499. END;  % OF FIXING MEMBER NAME
  4500. SCDONE;  % ERROR IF MORE JUNK ON LINE
  4501. SF PDSF;  % INDICATE WE HAVE A PDS
  4502. SCPOP;
  4503. SCANEND; END;
  4504.  
  4505. EXIT;
  4506.  
  4507. QDSN:
  4508. SCPUSH;
  4509. SCINIT (VR1),(VR0);
  4510. % SAME THING AS FOR UNQUOTED NAME
  4511.  
  4512. MFC DSNAME,44;  % BLANK IT
  4513. MFC DSMEMBER,8;
  4514. LA XRC,DSNAME;  % FOR THE PUT
  4515. % GOTO SCANDSN1;  % A BIT KLUDGEY FOR NOW
  4516. SCAN;
  4517. % MTRT   TEST FOR ILLEGAL CHARACTERS IN DATA SET NAME
  4518. LR XRB,VR0;  % LENGTH
  4519. EXI XRB,MMVC,0(XRC),0(VR1),*-*,INCR=YES,DECR=YES;  % SAVE DATA SET NAME)
  4520.  
  4521. SCAN *;
  4522.       SCKW ,UNQMEM,PS;  % SEE IF MEMBER EXISTS FOR PDS
  4523.       SCKW ,*,B;  % ALL DONE BABY
  4524. SCDONE;
  4525. SCPOP;
  4526. EXIT;
  4527. SCANEND;
  4528. SCANEND; END;
  4529. DATA BEGIN  % NOTHING SPECIFIED
  4530. IF ^<TF SERVERF> THEN WRTERM 'nothing specified for data set name'
  4531. ELSE BEGIN
  4532. ERRORCON 'Nothing specified for data set name to send';
  4533. CCALL ERRPACK,A;
  4534. MVI STATE,ASTATE;
  4535. END;
  4536. END;  % OF THEN
  4537. END;  % OF SCANDSBK GLOBAL BLOCK
  4538. IF <RZ VRF> THEN BEGIN
  4539.  
  4540. ST VRF,TEMP;  % STORE RETURN CODE
  4541. LA VR1,DSNAME;  % NOW WE FIND LENGTH OF  DATA SET
  4542. AI VR1,43;  % POINT TO END
  4543. LI VRF,44;  % NUMBER OF  CHARACTERS IN DATA SET NAME
  4544. LCR VRF,VRF;  % INDICATE COUNT BACKWARDS
  4545. LA VR0,BLANKS;  % LOOK FOR NON BLANKS
  4546. CCALL CNTXCHAR,A;
  4547. LI VR1,44;
  4548. SR VR1,VRF;  % LENGTH OF DATA SET NAME
  4549. STH VR1,DSNLEN;  % STORE OFF LENGTH FIELD
  4550. CCALL VALIDDSN,A,VR1=DSNAME,VR0=LH:DSNLEN,VRF=DSMEMBER;
  4551. % L VRF,TEMP;  % RESTORE COMP CODE
  4552. END;
  4553. DATA BEGIN
  4554. SCDSNERR: LI VRF,BADDSN;
  4555. END;
  4556. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4557. SCDSNEND: CEXIT VRE,HIGHR;
  4558. LTORG;
  4559. EXORG;
  4560. BADDSN:    EQU    16;
  4561. PDSDSN:    EQU     8;
  4562. CATFILE:   EQU    4;  % FILE RETURN FROM CATALOG
  4563. GOODDSN:   EQU     0;
  4564. SUBTITLE 'VALIDDSN';
  4565. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4566. % MODULE : VALIDDSN
  4567. % FUNCTION : CHECKS A STRING FOR A VALID 370/VS DSNAME
  4568. %
  4569. % INPUT:   VR0-> LENGTH OF DSNAME
  4570. %          VR1-> POINTER TO DATASET NAME
  4571. %          VRF = POINTER TO MEMBER NAME IF PDS
  4572. % OUTPUT : REG VRF =0 GOOD DSNAME ELSE BAD DATA SET NAME
  4573. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4574. VALIDDSN:
  4575. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4576. LR XRB,VR1;  % POINTER TO DSNAME
  4577. LR XRC,VR0;  % LENGTH
  4578. LR XRE,VRF;  % MEMBER POINTER
  4579. ZR XRA;  % BLAST REG2 FOR TRT
  4580. LI VRF,BADDSN;  % ASSUME BAD
  4581. DOSYNTAX: DO BEGIN  % BLOCK OF ROUTINE
  4582. IF <TF PDSF> THEN  BEGIN
  4583. EXIT FROM DOSYNTAX IF <MTRT 0(XRE),MEMTABLE,8; CC NZ>;
  4584. EXIT FROM DOSYNTAX IF
  4585. <<CLI 0(XRE),C'A'; CC L> | <CLI 0(XRE),C'Z'; CC H>>
  4586. & ^<CLI 0(XRE),C'#'> & ^<CLI 0(XRE),C'@'> & ^<CLI 0(XRE),C'$'>;
  4587. END;  % OF PDS
  4588. EXI XRC,MTRT,0(XRB),DSNTABLE,*-*,INCR=YES,DECR=YES;  % CHECK BAD CHAR
  4589. EXIT FROM DOSYNTAX IF <RNZ XRA>;
  4590. FOREVER DO BEGIN  % CHECK THE REST
  4591. EXIT FROM DOSYNTAX IF
  4592. <<CLI 0(XRB),C'A'; CC L> | <CLI 0(XRB),C'Z'; CC H>>
  4593. & ^<CLI 0(XRB),C'#'> & ^<CLI 0(XRB),C'@'> & ^<CLI 0(XRB),C'$'>;
  4594. LR VR1,XRC;  % SAVE COUNT
  4595. DO BEGIN
  4596.    EXIT IF <CLI 0(XRB),C'.'>;
  4597.    AI XRB,1;
  4598. END FOR XRC;
  4599. EXIT FROM DOSYNTAX IF <SR VR1,XRC; CI VR1,8; CC H>;  % ONLY 8 BETWEEN
  4600. EXIT IF <RNP XRC>;  % NO MO
  4601. AI XRB,1;
  4602. SI XRC,1;  % SKIP OVER .
  4603. EXIT FROM DOSYNTAX IF <RNP XRC>;
  4604. END;  % OF FOREVER
  4605. ZR VRF;  % INDICATE GOOD RETURN CODE
  4606. END;  % OF MAIN BLOCK
  4607. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4608.  
  4609. CEXIT VRE,HIGHR;
  4610. LTORG;
  4611. EXORG;
  4612.  
  4613. % TABLES FOR LEGAL DATA SET NAME
  4614. DSNTABLE:  DC 256AL1(BADDSN); BEGIN
  4615.    ORG DSNTABLE+C'A'; DC 9X'00';  % A-I
  4616.    ORG DSNTABLE+C'J'; DC 9X'00';  % J-R
  4617.    ORG DSNTABLE+C'S'; DC 8X'00';  % S-Z
  4618.    ORG DSNTABLE+C'@'; DC X'00';  % NATIONAL @
  4619.    ORG DSNTABLE+C'#'; DC X'00';  % NATIONAL #
  4620.    ORG DSNTABLE+C'$'; DC X'00';  % NATIONAL $
  4621.    ORG DSNTABLE+C'.'; DC X'00';  % NATIONAL .
  4622.    ORG DSNTABLE+C'-'; DC X'00';  % NATIONAL -
  4623.    ORG DSNTABLE+C'0'; DC 10X'00';  % 0-9
  4624.    ORG DSNTABLE+X'C0'; DC X'00';  % PLUS ZERO
  4625.    ORG;
  4626.    END;
  4627.  
  4628. % TABLES FOR LEGAL DATA SET MEMBER NAME
  4629. MEMTABLE:  DC 256AL1(BADDSN); BEGIN
  4630.    ORG MEMTABLE+C'A'; DC 9X'00';  % A-I
  4631.    ORG MEMTABLE+C'J'; DC 9X'00';  % J-R
  4632.    ORG MEMTABLE+C'S'; DC 8X'00';  % S-Z
  4633.    ORG MEMTABLE+C'@'; DC X'00';  % NATIONAL @
  4634.    ORG MEMTABLE+C' '; DC X'00';  % A BLANK AT THE END
  4635.    ORG MEMTABLE+C'#'; DC X'00';  % NATIONAL #
  4636.    ORG MEMTABLE+C'$'; DC X'00';  % NATIONAL $
  4637.    ORG MEMTABLE+C'0'; DC 10X'00';  % 0-9
  4638.    ORG;
  4639.    END;
  4640.  
  4641. SUBTITLE 'SCANASRK';
  4642. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4643. % MODULE: SCANASRK
  4644. % FUNCTION : SEARCHES SEND DATASET NAME FOR * FOR WILDCARD SEND
  4645. % INPUT : VR1->STRING
  4646. %         VR0=LENGTH OF NAME
  4647. % OUTPUT: FILLED IN SUFFIX OR/AND PREFIX
  4648. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4649. SCANASRK:
  4650. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4651. ASKBLCK:DO BEGIN % BLOCK TO FALL OUT OF
  4652. MZC DSNPFL,2;  % ZERO LENGTH OF PREFIX
  4653. MZC DSNSFL,2;  % "    "     "   SUFFIX
  4654. MFC LASTDSN,44;  % ZERO OUT OLD
  4655. ZF FULLQDSN ; %
  4656. IF <TF PREFXQUO> THEN <MMVC LASTDSN,PREFIX,8> % QUOTED PREFIX
  4657. ELSE BEGIN  % MOVE IN ACCOUNT INITIALS
  4658. LA XRC,LASTDSN;  % POINT AT DATA SET NAME
  4659. L XRB,USERPREA;  % POINTER TO USER PREFIX
  4660. LH XRA,USERPREL;  % LENGTH OF PREFIX
  4661. EXI XRA,MMVC,0(XRC),0(XRB),*-*,INCR=YES,DECR=YES; AR XRC,XRA;
  4662. MVI 0(XRC),C'.';  % PUT IN THE DOT
  4663. END;
  4664. ZR VRF;  % ZERO RETURN CODE
  4665. % DEBLANK (VR1),(VR0)
  4666. IF <CI VR0,1> & <CLI 0(VR1),C'*'> THEN SF ASTERISK  % SEND ALL
  4667. ELSE BEGIN  % NOT A TOTAL SCAN
  4668. LR XRE,VR1;  % LOAD ADDRESS POINTER
  4669. LR XRB,VR0;  % LOAD FOR EXECUTE
  4670. ZR XRA;  % ZERO FOR CASE
  4671. EXI XRB,MTRT,0(XRE),ASTRKTBL,*-*,INCR=YES,DECR=YES;
  4672. CASE XRA MAX 4 MIN 0 CHECK;
  4673. 0: <ZF ASTERISK>;  % END OF IT NOT A WILDCARD (IE NO *) JUST FALL OUT
  4674. 4: BEGIN  % WE HAVE AN ASTERISK
  4675.   SF ASTERISK;  % TURN ON ASTERISK INDICATOR
  4676. LR XRC,VR1 ; % STORE LOCATION OF ASTERISK
  4677.  % CHECK FOR FULLY QUOTED DATA SET NAME WITH ASTERISK
  4678. SCPUSH ;
  4679. SCINIT (XRE),(XRB) ;
  4680. SCAN * ;
  4681. SCKW ,FQDSN,QS ;
  4682. SCKW ,*,B ;
  4683.  
  4684. FQDSN:
  4685. SF FULLQDSN ; % FULLY QUOTED DATA SET NAME
  4686.  % SINCE FULLY QUALIFIED RELOAD
  4687. LR XRE,VR1;  % LOAD ADDRESS POINTER
  4688. LR XRB,VR0;  % LOAD FOR EXECUTE
  4689. ZR XRA;  % ZERO FOR CASE
  4690. EXI XRB,MTRT,0(XRE),ASTRKTBL,*-*,INCR=YES,DECR=YES;
  4691.  
  4692. LR XRA,VR1 ;
  4693. SR XRA,XRE ; % NUMBER OF SCANNED CHARACTERS
  4694. IF ^<CLI 7(XRE),C'.'> | % BETTER BE A DOT
  4695.    <CI XRA,8;CC L> THEN BEGIN % TOO FEW CHARACTERS
  4696. %                               FOR FULL QUALIFIED DSN
  4697. ERRORCON 'Illegal fully quoted data set name with wildcard';
  4698. CCALL ERRPACK,A ;
  4699. IF <TF SERVERF> THEN CCALL SABORT,A,VR0=LH:RPSEQ
  4700. ELSE TPUT (VR1),(VR0) ; %
  4701.  
  4702. LI VRF,24 ;
  4703. EXIT FROM ASKBLCK ;
  4704. END
  4705. ELSE BEGIN
  4706.  
  4707. MFC LASTDSN,44 ;
  4708. MMVC LASTDSN,0(XRE),8 ; % THIS SETS UP THE CATALOG NAME
  4709. END ;
  4710.  
  4711. SCANEND ; %
  4712. SCPOP ;
  4713.  
  4714. IF ^<TF FULLQDSN> THEN LR VR1,XRC ; % RESTORE ASTERISK POINTER
  4715. LR VR0,VR1;
  4716. SR VR0,XRE;  % TOTAL CHARACTERS SCANED
  4717. IF <RP VR0> THEN BEGIN  % STORE OFF BEGINNINGS
  4718. STH VR0,DSNPFL;  % PREFIX LENGTH;
  4719. LR XRA,VR0;  % FOR EXECUTE
  4720. EXI XRA,MMVC,DSNPFIX,0(XRE),*-*,INCR=YES,DECR=YES;  % MOVE IT
  4721. END;  % OF PREFIX
  4722. SR XRB,VR0;  % SUBTRACT TO SEE IF REMAINDER
  4723. SI XRB,1;  % SUBTRACT ONE FOR ASTERISK ITSELF
  4724. IF <RP XRB> THEN BEGIN  % STORE OFF LAST
  4725. STH XRB,DSNSFL;  % SUFFIX LENGTH
  4726. EXI XRB,MMVC,DSNSFIX,1(VR1),*-*,INCR=YES,DECR=YES;
  4727. END;  % OF SUFFIX
  4728.  
  4729.  
  4730.  
  4731. END;  % OF ASTERISK FOUND
  4732. ENDCASE ELSE WRTERM 'ERROR IN  CASE OF ASTERISK';
  4733. END;  % OF ELSE NON TOTAL * SEND
  4734. END ; % OF ASKBLCK
  4735.  
  4736. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4737. CEXIT VRE,HIGHR;
  4738. LTORG;
  4739. EXORG;
  4740. SUBTITLE 'NEXTFILE';
  4741. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4742. %MODULE : NEXTFILE
  4743. %FUNCTION: CALLS TSO CATALOG TO FIND THE NEXT ENTRY AFTER
  4744. %          DSNAME, CHECKS AGAINST PREFIX AND SUFFIX CRITERIA
  4745. %          AND RETURNS MATCH IF EXISTS IN DSNAME ELSE BLOCKS
  4746. %          IT OUT
  4747. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4748. NEXTFILE:
  4749. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4750.  
  4751. % IF DSNPFL = 45 THEN WE SEND ALL IN CATALOG
  4752. %
  4753. L XRC,CATDSPTR;  % POINTER TO PLACE IN CATALOG
  4754. USE XRC AS CATDSET IN BEGIN  % DATASET DSECT
  4755. DO BEGIN  % LOOP THROUGH CATALOG
  4756. SELECT FIRST;
  4757. <CLI TYPEBYTE,C'A'>: CATBLCK1: DO  BEGIN  % FOUND SOMETHING
  4758. % MMVC LASTDSN,RETURNDS,44;  % MOVE OVER DSNAME
  4759. LH XRA,MATCHDSL;  % LOAD PREFIX LENGTH
  4760. IF <RP XRA> THEN BEGIN
  4761. EXI XRA,MCLC,CATDNAME,MATCHDSN,*-*,DECR=YES,INCR=YES;
  4762. IF <CC => THEN BEGIN  % FOUND A MATCH FOR DATASET NAME
  4763. IF <MCLC DSNSFL,=H'0',2; CC H> THEN BEGIN  % CHECK SUFFIX
  4764. LA VR0,BLANKS;  % POINT TO BLANKS
  4765. LI VRF,44;  % LENGTH OF DSNAME
  4766. CCALL FINDCHAR,A,VR1=CATDNAME;  % FIND FIRST BLANK
  4767. IF <RZ VRF> THEN LI VRF,44 ELSE SI VRF,1;  % LENGTH OF DSN
  4768. SH VRF,DSNSFL;
  4769. AR VR1,VRF;  % POINTER TO SUFFIX BEGINNING
  4770. LH VRF,DSNSFL;
  4771. EXI VRF,MCLC,0(VR1),DSNSFIX,*-*,INCR=YES,DECR=YES;
  4772. IF ^<CC => THEN BEGIN
  4773. LI VRF,NOFILE;
  4774. EXIT FROM CATBLCK1;
  4775. END;
  4776. END;  % OF SUFFIX
  4777. MMVC DSNAME,CATDNAME,44;
  4778. LI VRF,FILEMTCH;
  4779. LI XRB,44;  % INDEX FOR DSNAME
  4780. LA VR1,DSNAME;
  4781. AI VR1,43;  % POINT TO LAST CHARACTER IN DSNAME
  4782. UNTIL <CLI 0(VR1),C' '; CC NE> | <RZ XRB> DO BEGIN
  4783. SI XRB,1;  % DECREMENT COUNTER
  4784. SI VR1,1;
  4785. END;
  4786. IF <CLI 0(VR1),C'.'> THEN <MVI 0(VR1),C' '; SI XRB,1>;  % NO DOTS LAST
  4787. STH XRB,DSNLEN;  % STORE LENGTH OF DSNAME
  4788. END
  4789. ELSE LI VRF,NOFILE;  % NO MATCH KEEP SCANNING
  4790. END;
  4791. END;  % OF FOUND SOMETHING
  4792. %%%% INVERT DSNAME & PREFIX SCAN BACKWARDS
  4793. <CLI TYPEBYTE,X'FF'>: BEGIN  % END OF CHAIN
  4794. LI VRF,ENDCAT;  % END OF CATALOG NO MORE MATCHES
  4795. END;  % OF 4 CASE
  4796.  
  4797. ENDSEL ELSE WRTERM 'WRONG BYTE TYPE IN CAT';
  4798. AI XRC,45;  % INDEX TO NEXT POINT IN CATALOG
  4799. END UNTIL <CI VRF,FILEMTCH> | <CI VRF,ENDCAT>;
  4800. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4801.  
  4802. ST XRC,CATDSPTR;  % STORE OFF POINTER FOR NEXT TIME
  4803. CEXIT VRE,HIGHR;
  4804. LTORG;
  4805. EXORG;
  4806. END;  % OF DSECT FOR DSNAME
  4807. FILEMTCH:    EQU    0;
  4808. NOFILE:      EQU    4;  % NO FILE FOUND
  4809. ENDCAT:   EQU   20;
  4810. SUBTITLE 'BLDMATCH';
  4811. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4812. % MODULE:  BLDMATCH
  4813. % FUNCTION: BUILDS A DATASET NAME FOR THE COMPARE FROM CATALOG
  4814. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4815. BLDMATCH:
  4816. CENTER VRE,HIGHR,ENTRY=NO;
  4817. MFC MATCHDSN,44;  % ZERO OUT
  4818. ZR XRA;  % LENGTH COUNTER
  4819. LA XRB,MATCHDSN;  % POINTER
  4820. IF ^<TF FULLQDSN> THEN BEGIN % FULLY QUALIFIED WILD CARD
  4821. IF ^<TF PREFXQUO> THEN BEGIN
  4822. L XRC,USERPREA;  % POINTER TO USER PREFIX
  4823. LH XRA,USERPREL;  % LENGTH OF PREFIX
  4824. EXI XRA,MMVC,0(XRB),0(XRC),*-*,INCR=YES,DECR=YES;
  4825. AR XRB,XRA;  % % INCREMENT POINTER
  4826. MVI 0(XRB),C'.';  % PUT IN THE DOT
  4827. AI XRB,1; AI XRA,1;  % INCRMENT POINT AND COUNTERS
  4828. END;
  4829. IF <MCLC PREFIXL,=H'0',2; CC H> THEN BEGIN
  4830. LH XRC,PREFIXL;
  4831. AR XRA,XRC;  % LENGTH
  4832. EXI XRC,MMVC,0(XRB),PREFIX,*-*,INCR=YES,DECR=YES;
  4833. AR XRB,XRC;  % MOVE POINTER
  4834. END;
  4835.  
  4836. END ; % OF NOT FULLY QUALIFIED
  4837. IF <MCLC DSNPFL,=H'0',2; CC H> THEN BEGIN
  4838. LH XRC,DSNPFL;
  4839. AR XRA,XRC;  % LENGTH
  4840. EXI XRC,MMVC,0(XRB),DSNPFIX,*-*,INCR=YES,DECR=YES;
  4841. AR XRB,XRC;  % MOVE POINTER
  4842. END;
  4843. STH XRA,MATCHDSL;
  4844. CEXIT VRE,HIGHR;
  4845. LTORG;
  4846. EXORG;
  4847. SUBTITLE 'CNTXCHAR';
  4848. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4849. % MODULE : CNTXCHAR
  4850. % FUNCTION : COMPARES A STRING TO A CHARACTER FOR A LENGTH
  4851. %            AND RETURNS IN REG 15 THE NUMBER OF MATCHES
  4852. % INPUT:   VR0-> THE CHARACTER TO CHECK
  4853. %          VR1-> THE STRING TO CHECK AGAINST
  4854. %          VRF = LENGTH OF VR1 STRING
  4855. % OUTPUT : REG VRF CONTAINS THE NUMBER OF CHARACTERS THAT MATCH
  4856. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4857. CNTXCHAR:
  4858. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4859. LR  XRB,VR0;  % LOAD ADDRESS OF CHARACTER TO CHECK AGAINST
  4860. LR XRA,VRF;  % LOAD COUNTER
  4861. LTR XRA,XRA;
  4862. IF <CC M> THEN <ZF FORWARDF; LCR XRA,XRA> ELSE SF FORWARDF;
  4863.                                     % OR BACKWARD IF HIGH ORGER
  4864.  
  4865. ZR VRF;  % ZERO COUNTER
  4866. FOR XRA DO
  4867.  
  4868. BEGIN
  4869.  
  4870. EXIT IF ^<MCLC 0(VR1),0(XRB),1>;  % LEAVE LOOP ON NOT EQUAL
  4871. AI VRF,1;  % BUMP ACCUMULATOR
  4872. IF <TF FORWARDF> THEN AI VR1,1  % INCREMENT POINTER
  4873. ELSE SI VR1,1;  % BACK UP IF NEGATIVE COUNT
  4874.  
  4875.  
  4876. END;  % OF FOR LOOP
  4877.  
  4878. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4879.  
  4880. CEXIT VRE,HIGHR;
  4881. LTORG;
  4882. EXORG;
  4883.  
  4884. SUBTITLE 'FINDCHAR';
  4885. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4886. % MODULE : FINDCHAR
  4887. % FUNCTION : FINDS  A CHARACTER IN A STRING FOR A LENGTH
  4888. %            AND RETURNS IN REG 15 THE RELATIVE POSITION
  4889. % INPUT:   VR0-> THE CHARACTER TO FIND
  4890. %          VR1-> THE STRING TO CHECK AGAINST
  4891. %          VRF = LENGTH OF VR1 STRING
  4892. % OUTPUT : REG VRF CONTAINS THE RELATIVE POSITION CHARACTERS
  4893. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4894. FINDCHAR:
  4895. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4896. LR  XRB,VR0;  % LOAD ADDRESS OF CHARACTER TO CHECK AGAINST
  4897. LR XRA,VRF;  % LOAD COUNTER
  4898. LTR XRA,XRA;
  4899. IF <CC M> THEN <ZF FORWARDF; LCR XRA,XRA> ELSE SF FORWARDF;
  4900.                                     % OR BACKWARD IF HIGH ORGER
  4901. LR XRC,XRA;  % SAVE COUNT
  4902. AI XRC,1;  % ONE MORE
  4903. LI VRF,1;  % ZERO COUNTER
  4904. FOR XRA DO
  4905.  
  4906. BEGIN
  4907.  
  4908. EXIT IF <MCLC 0(VR1),0(XRB),1>;  % LEAVE LOOP ON  EQUAL
  4909. AI VRF,1;  % BUMP ACCUMULATOR
  4910. IF <TF FORWARDF> THEN AI VR1,1  % INCREMENT POINTER
  4911. ELSE SI VR1,1;  % BACK UP IF NEGATIVE COUNT
  4912.  
  4913.  
  4914. END;  % OF FOR LOOP
  4915. IF <CR XRC,VRF> THEN <ZR VRF>;  % ZERO IF NOTHING FOUND
  4916. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  4917.  
  4918. CEXIT VRE,HIGHR;
  4919. LTORG;
  4920. EXORG;
  4921.  
  4922.  
  4923.  
  4924. SUBTITLE 'MFCXCHAR';
  4925. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4926. % MODULE : MFCXCHAR
  4927. % FUNCTION : FILLS A STRING WITH A CHARACTER FOR A LENGTH
  4928. % INPUT:   VR0-> THE FILL CHARACTER
  4929. %          VR1-> THE BUFFER TO FILL
  4930. %          VRF = LENGTH OF VR1 STRING
  4931. % OUTPUT : THE STRING HAS CHARACTER FILLED
  4932. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4933. MFCXCHAR:
  4934. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4935. LR XRB,VR0;  % ADDRESS POINTER
  4936. LR XRA,VRF;  % ACCUMLATOR IF > 255
  4937.  
  4938. DO BEGIN  % LOOP IF > 255
  4939.  
  4940. IF <CI XRA,255; CC H> THEN <ZR VRF; LI VRF,255; SI XRA,255>
  4941. ELSE ZR XRA;
  4942.  
  4943. IF <RP VRF> THEN BEGIN
  4944.  
  4945.  
  4946. MMVC 0(VR1),0(XRB),1;  % MOVE FIRST CHARACTER
  4947. SI VRF,1;  % DECREMENT ACCUMULATOR
  4948. IF <RP VRF> THEN EXI VRF,MMVC,1(VR1),0(VR1),*-*,DECR=YES;  % MOVE EM
  4949.  
  4950.  
  4951. END;  % OF POSITIVE LOOP
  4952.  
  4953. END UNTIL <RZ XRA>;  % UNTIL ALL DONE
  4954.  
  4955.  
  4956. CEXIT VRE,HIGHR;
  4957. LTORG;
  4958. EXORG;
  4959.  
  4960. SUBTITLE 'MVCXCHAR';
  4961. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4962. % MODULE : MVCXCHAR
  4963. % FUNCTION : MOVES VR0-> TO VR1->FOR A LENGTH
  4964. % INPUT:   VR0-> THE FROM ADDRESS
  4965. %          VR1-> THE BUFFER TO PUT
  4966. %          VRF = LENGTH OF VR1 STRING
  4967. % OUTPUT : THE STRING HAS CHARACTER FILLED
  4968. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4969. MVCXCHAR:
  4970. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  4971.  
  4972. LR XRA,VRF;  % ACCUMLATOR IF > 255
  4973. LR XRB,VR0;  % ADDRESS OF FROM
  4974.  
  4975. DO BEGIN  % LOOP IF > 255
  4976.  
  4977. IF <CI XRA,255; CC H> THEN <ZR VRF; LI VRF,255; SI XRA,255>
  4978. ELSE <LR VRF,XRA; ZR XRA>;
  4979.  
  4980. IF <RP VRF> THEN BEGIN
  4981.  
  4982.  
  4983. EXI VRF,MMVC,0(VR1),0(XRB),*-*,DECR=YES;  % MOVE EM
  4984. AI XRB,255;  % MOVE ADDRESSES
  4985. AI VR1,255;
  4986.  
  4987.  
  4988. END;  % OF POSITIVE LOOP
  4989.  
  4990. END UNTIL <RZ XRA>;  % UNTIL ALL DONE
  4991.  
  4992.  
  4993. CEXIT VRE,HIGHR;
  4994. LTORG;
  4995. EXORG;
  4996. SUBTITLE 'CATLOOK';
  4997. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4998. %MODULE : CATLOOK
  4999. %FUNCTION: CALLS TSO CATALOG TO FIND THE  ENTRY LASTDSN
  5000. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5001. CATLOOK:
  5002. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5003.  
  5004. %
  5005. LA VR1,CIRPARM;  % ADDRESS OF PARAMETER BLOCK
  5006. DO BEGIN  % SEARCH THROUGH CATALOG FOR A MATCH UNTIL EOF
  5007. DS    0H;
  5008. LINK EP=IKJEHCIR;  % ,LSEARCH=NO;  % CALL CATALOG ROUTINE
  5009. LOOKCASE: CASE VRF MAX 12 MIN 0;
  5010. 0: BEGIN  % FOUND SOMETHING
  5011. % MMVC LASTDSN,RETURNDS,44;  % MOVE OVER DSNAME
  5012. L XRA,CIRWA;  % LOAD ADDRESS OF RETURNED CATALOG BUFFER
  5013. MMVC 2(XRA),=H'0',2;  % ZERO OUT LENGTH IN CAT BUFFER
  5014. AI XRA,4;  % INCREMENT PAST COUNT BYTES
  5015. ST XRA,CATDSPTR;  % STORE OFF POINTER TO BUFFER
  5016. CCALL BLDMATCH,A;  % BUILD PREFIX FOR DSNAME
  5017. END;  % OF FOUND SOMETHING
  5018. %%%% INVERT DSNAME & PREFIX SCAN BACKWARDS
  5019. 4: BEGIN  % LOCATE FAIL
  5020. IF <CLI CIRLOCRC,X'08'> THEN  BEGIN  % END OF CHAIN
  5021. LI VRF,NOFILE;  % END OF CATALOG NO MORE MATCHES
  5022. END;
  5023. IF <CLI CIRLOCRC,X'08'> THEN  BEGIN  % END OF CHAIN
  5024. END;
  5025. END;  % OF 4 CASE
  5026. 12: BEGIN
  5027. WRTERM ' VOL BY LOCATE ERROR';
  5028. END;
  5029. ENDCASE;
  5030.  
  5031. END;
  5032. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5033.  
  5034. CEXIT VRE,HIGHR;
  5035. LTORG;
  5036. EXORG;
  5037.  
  5038. SUBTITLE 'CHECKLEN';
  5039. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5040. %   MODULE NAME -CHECKLEN
  5041. %
  5042. %   FUNCTION - USED BY KSEND, QUOTED PACKETS CAN'T BE SPLIT
  5043. %   VR0 - NUMBER OF CHARACTER TO PUT -
  5044. %      VRF=0 ON RETURN RETURN IF BUFF
  5045. %         LARGE ENOUGH, ELSE VRF =4
  5046. %
  5047. CHECKLEN:
  5048. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5049.  
  5050. LH XRA,MAXPUT;  % MAX LENGTH OF BUFFER
  5051. SH XRA,PUTLEN;  % GET REMAINDER
  5052. IF <CR XRA,VR0; CC L> THEN LI VRF,4  %  TOO SMALL   TO FIT
  5053. ELSE ZR VRF;  % ENOUGH ROOM GO AHEAD AND PUT IT
  5054.  
  5055. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5056. CEXIT VRE,HIGHR;
  5057. LTORG;
  5058. EXORG;
  5059. SUBTITLE 'SERVER';
  5060. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5061. % MODULE : SERVER
  5062. % FUNCTION : SERVER SLAVE MODE ENABLED  RECEIVES COMMANDS
  5063. % INPUT:   NONE - WAITS ON PACKETS
  5064. %
  5065. %
  5066. % OUTPUT : NONE - PERFORMS FUNCTIONS TILL L PACKET
  5067. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5068. SERVER:
  5069. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5070. USE XRC AS PACKET IN BEGIN  % ADRESSABLE DSECT
  5071. ZF LOGOUT ;
  5072. LA XRC,RECPKT;  % RECEIVE PACKET ADDRESS
  5073. WRTERM ' Now entering SERVER mode - type FINISH or LOGOUT on micro'_
  5074.         ' to halt SERVER';
  5075.  
  5076. SERVBLCK: WHILE <TF SERVERF> DO BEGIN  % SERVER BLOCK
  5077.  
  5078. % CALL TIMER SO SERVER CAN TIME OUT USER AFTER SERVWAIT TIME
  5079. TIME BIN ; % GET TIME IN BINARY
  5080. A VR0,SERVWAIT ; % BUMP CURRENT TIME BY TIME TO WAIT
  5081. ST VR0,SERVTIME ; % STORE IT OFF
  5082.  
  5083. ZF STOPF;  % ZERO STOP FLAG
  5084. BCCTYPE 1;  % 1 BCC BYTE AT END
  5085. L XRA,RTIMEOUT;  % SAVE TIMEOUT
  5086.  
  5087. MMVC RTIMEOUT,SERVTOUT,4;  % SERVER TIME OUT
  5088.  
  5089. DO BEGIN  % UNTIL WE GET SOMETHING
  5090. CCALL RPACK,A;  % GET THE PACKET
  5091.  
  5092. EXIT FROM SERVBLCK IF ^<TF SERVERF>;
  5093. NEXT OF SERVBLCK IF <TF STOPF>;
  5094. IF <RNZ VRF> THEN BEGIN  % RESPOND TO PACKET
  5095. MZC OLDSEQ,2;  % ZERO OUT SEQUENCE NUMBER
  5096. MMVC OLDBCC,BCCLEN,2;  % STORE OFF OLD BCC
  5097. MVI BCCLEN+1,1;  % TYPE 1 BCC FOR SERVER TIMEOUT
  5098. SERVNACK XRB;  % RESPOND TO PACKET
  5099. MMVC BCCLEN,OLDBCC,2;  % RESTORE BCC
  5100. LR XRB,VRF ; % STORE OLD VALUE
  5101.  
  5102. % CHECK TIMER FOR EXTENDED TIME OUT
  5103. TIME BIN ;
  5104. LR VRF,XRB ; % RESTORE RPACK VALUE
  5105.  
  5106. IF <C VR0,SERVTIME ; CC H> THEN BEGIN
  5107. SF LOGOUT ; % INDICATE TO LOGUSER OFF
  5108.  
  5109. MMVC TEMP,=C'LOGOFF ',7 ; %
  5110. CCALL TSOCMD,A,VR1=TEMP,VR0=7 ; % STACK LOGOFF COMMAND
  5111. ZF SERVERF ;
  5112.  
  5113.  
  5114. WRTERM 'The SERVER has exceeded its timeout and is logged off';
  5115.  
  5116. EXIT FROM SERVBLCK ;
  5117. END ;
  5118.  
  5119. END;  % OF NACK TIMEOUT
  5120. END UNTIL <RZ VRF>;  % LOOP TILL WE GET A GOOD INPUT
  5121.  
  5122.  
  5123. ST XRA,RTIMEOUT;  % REPLACE THE READ TIME OUT
  5124.  
  5125. ZR XRA;  % ZERO REG FOR CASE STATEMEN5T
  5126.  
  5127.  
  5128. MTRT RTYPE,SERVCOMM,1;  % SERVER COMMAND TYPE
  5129.  
  5130. CASE XRA MAX ISTATE MIN 0 CHECK;
  5131. 0 THRU ACASE: BEGIN  % THE REST
  5132.        MVI STATE,ASTATE;  % ABORT
  5133. ERRORCON 'Illegal Packet type for SERVER ';
  5134. CCALL ERRPACK,A;  % SET UP FOR ERROR PROCESSING
  5135.  
  5136.        END;  % REST CASE
  5137.  
  5138. RSTATE: BEGIN  % WE RECEIVED AN SEND INIT PACKET
  5139.  
  5140. CCALL KRECEIVE,A,;  % CALL RECEIVE ROUTINE;
  5141.  
  5142.        END;  % RSTATE CASE
  5143. R2STATE: BEGIN  % WE RECEIVED A GET PACKT
  5144. IC XRA,RLEN;  % LENGTH OF PACKET-2
  5145. UNCHAR XRA;  % MAKE INTEGER
  5146. SH XRA,BCCLEN;  % TAKE OFF BCCLENGTH
  5147. SI XRA,2;  % SUB OFF TYPE & SEQ BYTE
  5148. L XRB,ATOEVCON;
  5149. EXI XRA,TR,RDATA(*-*),0(XRB),DECR=YES,INCR=YES;
  5150. EXI XRA,TR,RDATA(*-*),UPPER,DECR=YES,INCR=YES;  % UPPER
  5151. % HENCE LEFT WITH DSN LENGTH
  5152. EXI XRA,MMVC,DSNAMEX,RDATA,0,DECR=YES,INCR=YES;  % MOVE THE NAME
  5153.  
  5154. LR VR0,XRA;  % LOAD LENGTH OF DSNAME
  5155. SCINIT DSNAMEX,(XRA);
  5156. SCTYPE NEW=1;
  5157.  
  5158. CCALL KSEND,A,VR1=DSNAMEX;  % SET UP
  5159.  
  5160.          END;  % GETCASE
  5161. GSTATE: BEGIN  % A SERVER GENERIC COMMAND
  5162.         SELECT FIRST;
  5163. <CLI RDATA,X'4C'>: BEGIN  % LOGOFF COMMAND
  5164. MMVC TEMP,=C'LOGOFF ',7;
  5165. LI VR0,7;
  5166. CCALL TSOCMD,A,VR1=TEMP;  % LOGOUT
  5167. SF LOGOUT ;
  5168. ZF SERVERF;  % GOOD BYE KERMIE
  5169. ACKIT VR0;
  5170. END;  % OF LOGOFF
  5171. <CLI RDATA,X'46'>: BEGIN  % FINISH SERVER COMMAND
  5172. ZF SERVERF;  % FINISH SERVER COMMAND
  5173. ACKIT VR0;
  5174. END;
  5175.      ENDSEL
  5176.      ELSE BEGIN
  5177. ERRORCON 'Unimplemented SERVER Commmand';
  5178. CCALL ERRPACK,A;  % SET UP FOR ERROR PROCESSING
  5179.        MVI STATE,SESTATE;  % ABORT
  5180. CCALL SABORT,A,VR0=LH:RPSEQ;  % SEND ABOR
  5181.      END;  % OF SELECT
  5182. END;  % OF CASE
  5183.  
  5184. ISTATE: BEGIN  % WE RECEIVED AN I PACKET
  5185. MVI RTYPE,ROFF;  % SEND INIT PACKET FOR SUB
  5186. BCCTYPE 1;  % BLOCK CHECK TYPE
  5187. ZEROSEQ;  % ZERO SEQUENCE NUMBER
  5188. ZERORTRY;  % ZERO RETRY
  5189. MVI STATE,RISTATE;  % SEND INIT STATE
  5190.  
  5191. %UNTIL <CLI STATE,RFSTATE> | <MCLC RETRY,NUMTRY; CC L>  |
  5192. %<CLI STATE,SESTATE> | <CLI STATE,RESTATE>
  5193. CCALL RINIT,A;  % CALL RECEIVE INIT
  5194.  
  5195. IF <CLI STATE,SESTATE> THEN CCALL SABORT,A,VR0=LH:RPSEQ;  % SEND ABOR
  5196.        END;  % ISTATE CASE
  5197.        ENDCASE
  5198.        ELSE BEGIN
  5199. ERRORCON 'Unknown Server packet type';
  5200. CCALL ERRPACK,A;  % SET UP FOR ERROR PROCESSING
  5201.        MVI STATE,ASTATE;  % ABORT
  5202. MMVC PHDR,RSOH,1;  % SOH
  5203. MMVC PNUM,RSEQ,1;
  5204.        END;  % OF ERROR CASE
  5205. END;  % OF SERVER BLOCK   LOOP FOREVER UNTIL END PACKET
  5206. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5207. END;  % OF ADDRESSIBILITY DSECT
  5208. % CHECH WHETHER LOGOFF
  5209. IF ^<TF LOGOUT> THEN BEGIN
  5210.  
  5211. LI VR0,100;  % 1 SECOND FOR TIMER
  5212. ST VR0,TEMP;
  5213. STIMER WAIT,BINTVL=TEMP;  % WAIT FOR ONE SECOND IN ORDER NOT TO LOSE
  5214.                            % THE PROMPT
  5215. END ;
  5216. CEXIT VRE,HIGHR;  % OUT OF SERVER
  5217. LTORG;
  5218. EXORG;
  5219.  
  5220. SUBTITLE 'KSHOW';
  5221.  
  5222. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5223. %
  5224. %     MODULE NAME   -   KSHOW
  5225. %
  5226. %
  5227. %     FUNCTION-   LISTS THE CURRENT ENVIORNMENT OF THE SET COMMAND
  5228. %
  5229. %
  5230. %
  5231. %     INPUTS -   NONE EXCEPT POSSIBLE '?' / OR HELP
  5232. %
  5233. %
  5234. %
  5235. %
  5236. %     OUTPUTS-  SCREEN OUTPUT OF CURRENT OPTIONS
  5237. %
  5238. %
  5239. %     RETURN
  5240. %
  5241. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5242. KSHOW: ;
  5243. CENTER VRE,HIGHR,ENTRY=NO;
  5244. SHOWBLCK: DO BEGIN  % BLOCK TO FALL THRU
  5245.  
  5246. SCERROR NEW=SHOWSCAN;  % SET UP FOR SCDONE IF MORE TOKENS
  5247.     SCAN  *;
  5248.    SCKW (STATUS,STA),SHOWBEG;  % UP TOP IF STATUS REQUEST
  5249.     SCKW (?,HELP),SHOWHELP;
  5250.     SCKW ,SHOWSCAN;  % NO OTHER PARMS
  5251.     SCANEND;  % ERROR
  5252.  
  5253. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5254. SHOWBEG:  % LABEL FOR END
  5255. %%%%%    HEADER %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5256. VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;  % INIT VAREA FOR OUTPUT
  5257.  
  5258. WRTERM ' ';  % BLANK LINE
  5259. VSEG KERMVA,'Data Set Attributes ';  % column 1 title
  5260. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5261.  
  5262. VSEG KERMVA,'Protocol Attributes';  % column 2 title
  5263. VOUT KERMVA;  % OUTPUT IT
  5264.  
  5265. %WRTERM ' ';  % A BLANK LINE
  5266.  
  5267. MMVC CRTLINE#,=H'1',2;  % INITIAL CRT LINE TO FIRST
  5268.  
  5269. DO BEGIN  % UNTIL CRTLINE# = TOTALCRT
  5270.  
  5271. SELECT;
  5272. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5273. <CLI CRTLINE#+1,2>: BEGIN  % EDIT
  5274.  
  5275. IF <TF EDITF> THEN VSEG KERMVA,'EDIT (WYLBUR edit format data set): on'
  5276. ELSE VSEG KERMVA,'EDIT (Non Edit format data set): off';
  5277.  
  5278. END;  % OF SELECT BEGIN
  5279. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5280. <CLI CRTLINE#+1,4>: BEGIN  % TABS
  5281.  
  5282. VSEG KERMVA,'TABS: ';
  5283. IF <TF TABF> THEN VSEG KERMVA,'on' ELSE VSEG KERMVA,'off';
  5284.  
  5285. END;  % OF SELECT BEGIN
  5286. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5287. <CLI CRTLINE#+1,3>: BEGIN  % Number function
  5288. VSEG KERMVA,'NUMBERED ';
  5289. VSEG KERMVA,'(line nos.): ';
  5290. SELECT FIRST;
  5291. <MCLC EDTYPE,=F'1',4>: BEGIN
  5292. VSEG KERMVA,'off';
  5293. END;
  5294. <MCLC EDTYPE,=F'2',4>: VSEG KERMVA,'WYLBUR';
  5295. <MCLC EDTYPE,=F'3',4>: VSEG KERMVA,'(numbered in cols): WYLBUR XX/YYY';
  5296. <MCLC EDTYPE,=F'4',4>: VSEG KERMVA,'(TSO default numbers): TSO';
  5297. <MCLC EDTYPE,=F'5',4>: VSEG KERMVA,'(numbered in cols): TSO COL/COL';
  5298. ENDSEL;
  5299.  
  5300.  
  5301. END;  % OF SELECT BEGIN
  5302. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5303. <CLI CRTLINE#+1,1>: BEGIN  % DATA
  5304.               % DATA TEXT OR BINARY
  5305. VSEG KERMVA,'DATA: ';
  5306. IF <MCLC DATA,=C'TEXT',4> THEN VSEG KERMVA,'Text'
  5307. ELSE VSEG KERMVA,'Binary';
  5308.  
  5309. END;  % OF SELECT BEGIN
  5310.  
  5311. <CLI CRTLINE#+1,5>: BEGIN  % RECFM
  5312. VSEG KERMVA,'RECFM (Record format): ';
  5313. IF <CLI RFM,C'U'> THEN
  5314. VSEG KERMVA,RFM,1       % MOVE IN REC FORMAT
  5315. ELSE VSEG KERMVA,RFM,2;  % MOVE IN REC FORMAT
  5316.  
  5317. END;  % OF SELECT
  5318. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5319. <CLI CRTLINE#+1,6>: BEGIN  % LRECL
  5320. VSEG KERMVA,'LRECL (Logical record length): ';
  5321. CVBTD TEMP,0,LH:LRECL;  % CONVERT BINARY TO DEC
  5322. VSEG KERMVA,(VR1),(VR0);  % LREC IN TO BUFFER
  5323.  
  5324. END;  % OF SELECT BEGIN
  5325. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5326. <CLI CRTLINE#+1,7>: BEGIN  % BLKSIZE
  5327.  
  5328. VSEG KERMVA,'BLKSIZE (Block size): ';
  5329. CVBTD TEMP,0,LH:BLKSIZE;  % CONVERT BINARY TO DEC
  5330. VSEG KERMVA,(VR1),(VR0);  % BLKSIZE IN TO BUFFER
  5331.  
  5332. END;  % OF SELECT BEGIN
  5333. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5334. <CLI CRTLINE#+1,8>: BEGIN  % SPACE
  5335.  
  5336. VSEG KERMVA,'SPACE (Space allocation): ';
  5337. CVBTD TEMP,0,L:TRACK;  % CONVERT BINARY TO DEC
  5338. VSEG KERMVA,(VR1),(VR0);  % TRACK IN TO BUFFER
  5339. VSEG KERMVA,' tracks ';
  5340.  
  5341. END;  % OF SELECT BEGIN
  5342. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5343. <CLI CRTLINE#+1,9>: BEGIN  % VOLUME
  5344. VSEG KERMVA,'VOLUME: ';  % DEFAULT DISK IF ANY
  5345. VSEG KERMVA,VOLUME,7;  % DISK DRIVE
  5346.  
  5347. END;  % OF SELECT
  5348. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5349. <CLI CRTLINE#+1,10>: BEGIN  % PREFIX
  5350.  
  5351. VSEG KERMVA,'PREFIX: ';
  5352. LH VR0,PREFIXL;  % CONVERT BINARY TO DEC
  5353. IF <RZ VR0> THEN VSEG KERMVA,'No prefix' ELSE BEGIN
  5354. IF <TF PREFXQUO> THEN BEGIN
  5355. ST VR0,TEMP;  % STORE OFF NUMBER OF CHARACTERS
  5356. VSEG KERMVA,'"';
  5357. L VR0,TEMP;  % RESTORE LENGTH
  5358. END;  % OF QUOTED PREFIX
  5359. VSEG KERMVA,PREFIX,(VR0);  % PREFIX IN TO BUFFER
  5360.  
  5361. IF <TF PREFXQUO> THEN VSEG KERMVA,'"';
  5362. END;
  5363. END;  % OF SELECT BEGIN
  5364. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5365. <CLI CRTLINE#+1,5>: BEGIN  % QUOTE
  5366.  
  5367. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5368. VSEG KERMVA,'CQUOTE (Control quote character): ';
  5369. MVC TEMP(1),QUOCHAR;  % MOVE TO WORK AREA
  5370. L XRA,ATOEVCON; TR   TEMP(1),0(XRA);  % PUT IN EBCDIC
  5371. VSEG KERMVA,TEMP,1;
  5372.  
  5373. END;  % OF SELECT BEGIN
  5374. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5375. <CLI CRTLINE#+1,8>: BEGIN  % SOH
  5376.  
  5377. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5378. VSEG KERMVA,'SOH (Start of Header): ';
  5379. CVBTD TEMP,0,LOADB:SSOH;  % CONVERT BINARY TO DEC
  5380. VSEG KERMVA,(VR1),(VR0);  % SOH CHAR IN TO BUFFER
  5381. CCALL SHOWASCI,A,VR1=SSOH;
  5382.  
  5383. END;  % OF SELECT BEGIN
  5384. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5385. <CLI CRTLINE#+1,9>: BEGIN  % SEOL
  5386.  
  5387. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5388. VSEG KERMVA,'SEOL (Send End-of-line): ';
  5389. CVBTD TEMP,0,LOADB:SEOL;  % CONVERT BINARY TO DEC
  5390. VSEG KERMVA,(VR1),(VR0);  % EOL CHAR IN TO BUFFER
  5391. CCALL SHOWASCI,A,VR1=SEOL;
  5392.  
  5393. END;  % OF SELECT BEGIN
  5394. <CLI CRTLINE#+1,10>: BEGIN  % REOL
  5395.  
  5396. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5397. VSEG KERMVA,'REOL (Receive End-of-line): ';
  5398. CVBTD TEMP,0,LOADB:REOL;  % CONVERT BINARY TO DEC
  5399. VSEG KERMVA,(VR1),(VR0);  % EOL CHAR IN TO BUFFER
  5400. CCALL SHOWASCI,A,VR1=REOL;
  5401.  
  5402. END;  % OF SELECT BEGIN
  5403. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5404. <CLI CRTLINE#+1,6>: BEGIN  % BINARY QUOTE
  5405.  
  5406. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5407. VSEG KERMVA,'BQUOTE (Binary quote character): ';
  5408. MVC TEMP(1),BINQC;  % MOVE TO WORK AREA
  5409. L XRA,ATOEVCON; TR   TEMP(1),0(XRA);  % PUT IN EBCDIC
  5410. VSEG KERMVA,TEMP,1;
  5411.  
  5412. END;  % OF SELECT BEGIN
  5413. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5414. <CLI CRTLINE#+1,7>: BEGIN  % REPEAT QUOTE
  5415.  
  5416. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5417. VSEG KERMVA,'RQUOTE (Repeat quote character): ';
  5418. MVC TEMP(1),REPTCHAR;  % MOVE TO WORK AREA
  5419. L XRA,ATOEVCON; TR   TEMP(1),0(XRA);  % PUT IN EBCDIC
  5420. VSEG KERMVA,TEMP,1;
  5421.  
  5422. END;  % OF SELECT BEGIN
  5423. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5424. <CLI CRTLINE#+1,4>: BEGIN  % PACKET SIZE
  5425.  
  5426. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5427. VSEG KERMVA,'PACKET (Receive packet size): ';
  5428. CVBTD TEMP,0,L:RPSIZ;  % CONVERT BINARY TO DEC
  5429. VSEG KERMVA,(VR1),(VR0);  % RECEIVE SIZE  INTO BUFFER
  5430.  
  5431. END;  % OF SELECT BEGIN
  5432. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5433. <CLI CRTLINE#+1,1>: BEGIN  % DELAY
  5434.  
  5435. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5436. VSEG KERMVA,'DELAY (after SEND): ';
  5437. L VR1,DELAY;  % DELAY TIME
  5438. ZR VR0;
  5439. D  VR0,=F'100';
  5440. LR VRF,VR1;  % SET UP FOR MACRO
  5441. CVBTD TEMP,0,(VRF);  % CONVERT BINARY TO DEC
  5442. VSEG KERMVA,(VR1),(VR0);  % DELAY TIME INTO BUFFER
  5443. VSEG KERMVA,' seconds ';
  5444.  
  5445. END;  % OF SELECT BEGIN
  5446. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5447. <CLI CRTLINE#+1,11>: BEGIN  % DEBUG
  5448.  
  5449. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5450. VSEG KERMVA,'DEBUG: ';
  5451. IF <TF DBUGFLAG> THEN VSEG KERMVA,'on' ELSE VSEG KERMVA,'off';
  5452.  
  5453. END;  % OF SELECT BEGIN
  5454. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5455. <CLI CRTLINE#+1,2>: BEGIN  % TIMER
  5456.  
  5457. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5458. VSEG KERMVA,'TIMER (Timeout interval): ';
  5459. IF ^<TF TIMERF> THEN VSEG KERMVA,'off' ELSE BEGIN
  5460.  VSEG KERMVA,'on (';
  5461. L VR1,RTIMEOUT;  % TIMEOUT TIME  TIME
  5462. ZR VR0;
  5463. D  VR0,=F'100';
  5464. LR VRF,VR1;  % SET UP FOR MACRO
  5465. CVBTD TEMP,0,(VRF);  % CONVERT BINARY TO DEC
  5466. VSEG KERMVA,(VR1),(VR0);  % DELAY TIME INTO BUFFER
  5467. VSEG KERMVA,' seconds)';
  5468. END;  % OF TIMER FLAG
  5469.  
  5470. END;  % OF SELECT BEGIN
  5471. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5472. <CLI CRTLINE#+1,3>: BEGIN  % BLOCK CHECK TYPE
  5473.  
  5474. CCALL ALIGN,A;  % ADJUSTS THE COLUMNS TO 40
  5475. VSEG KERMVA,'BLOCK (Block check type): ';
  5476. SELECT FIRST;
  5477. <CLI HIGHBCC,1>: VSEG KERMVA,'1';
  5478. <CLI HIGHBCC,2>: VSEG KERMVA,'2';
  5479. <CLI HIGHBCC,3>: VSEG KERMVA,'3 (CRC)';
  5480. ENDSEL;
  5481.  
  5482. END;  % OF SELECT BEGIN
  5483. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5484. ENDSEL;
  5485. LH XRA,CRTLINE#;
  5486. AI XRA,1;
  5487. STH XRA,CRTLINE#;  % BUMP IT
  5488.  
  5489.         VOUT KERMVA;  % OUTPUT IT
  5490. END UNTIL <MCLC CRTLINE#,MAXCRC#,2; CC H>;  % END OF MAIN LOOP
  5491.  
  5492.  
  5493.     EXIT FROM SHOWBLCK;
  5494. SHOWSCAN: DO BEGIN  % IF REMAINING TOKENS ERROR OR HELP
  5495. WRTERM 'Valid options are SHOW STATUS or HELP';
  5496.     EXIT FROM SHOWBLCK;  % FALL OUT
  5497. SHOWHELP:
  5498. WRTERM 'The SHOW command lists the current option settings.';
  5499. WRTERM 'The options may be changed with the SET command.';
  5500. END;  % OF SCDONE
  5501. END;  % OF SHOWBLCK
  5502.  %VSEG KERMVA,')';
  5503.  %WRTERM ' ';  % BLANK
  5504. CEXIT VRE,HIGHR;
  5505.  
  5506. SAVESHOW:  DC  18F'0';  % SAVE AREA
  5507. %TEMP:  DC  CL15;  % A WORK BUFFER  ALREADY DEFINED
  5508. OUTLEN:      EQU         80;  % OUTPUT LINE LENGTH
  5509.  
  5510. LTORG;
  5511. EXORG;
  5512.  
  5513. SUBTITLE 'SHOWASCI';
  5514. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5515. % MODULE SHOWASCI
  5516. % FUNCTION - VSEGS THE ASCII AKCRONYM FOR ITS BINARY CONTER PART
  5517. % INPUT - VR1 -> 1 BYTE HEX
  5518. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5519. SHOWASCI: CENTER VRE,HIGHR,ENTRY=NO;
  5520. LR XRB,VR1;
  5521. ZR XRA;
  5522. IC XRA,0(VR1);  % LOAD THE CHARACTER
  5523. VSEG KERMVA,' (';
  5524. LA VR1,ASCILITS;  % POINT TO BEGINNING OF TABLE
  5525. MH XRA,=H'3';  % INDEX INTO TABLE
  5526. AR VR1,XRA;  % "
  5527. IF <CLI 2(VR1),C' '> THEN VSEG KERMVA,(VR1),2   % PUT INTO VSEG
  5528. ELSE VSEG KERMVA,(VR1),3;  % PUT INTO VSEG
  5529. VSEG KERMVA,',';
  5530. LR VR1,XRB;  % RESTORE POINTER TO BYTE FOR NEXT SUB
  5531. CCALL SHOWCNTL,A;  % PUTS VALUE IN CONTROL NOTATION (EG ^A=X'01')
  5532. VSEG KERMVA,')';
  5533. CEXIT VRE,HIGHR;
  5534. LTORG;
  5535. SUBTITLE 'SHOWCNTL';
  5536. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5537. % MODULE SHOWCNTL
  5538. % FUNCTION - VSEGS THE ASCII CONTROL FOR ITS BINARY CONTER PART
  5539. % INPUT - VR1 -> 1 BYTE HEX
  5540. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5541. SHOWCNTL: CENTER VRE,HIGHR,ENTRY=NO;
  5542. ZR XRA;
  5543. IC XRA,0(VR1);  % LOAD THE CHARACTER
  5544. %VSEG KERMVA,' (';
  5545. LA VR1,ASCCNTLC;  % POINT TO BEGINNING OF TABLE
  5546. MH XRA,=H'2';  % INDEX INTO TABLE
  5547. AR VR1,XRA;  % "
  5548. VSEG KERMVA,(VR1),2;  % PUT INTO VSEG
  5549. %ELSE VSEG KERMVA,(VR1),3;  % PUT INTO VSEG
  5550.  
  5551. %VSEG KERMVA,')';
  5552. CEXIT VRE,HIGHR;
  5553. LTORG;
  5554. SUBTITLE 'KERMVOUT';
  5555. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5556. %                   OUT PUT ROUTINE FOR VSEG
  5557. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5558. KERMVOUT: CENTER VRE,HIGHR,ENTRY=NO;
  5559.         TPUT (VR1),(VR0),R;  % OUTPUT IT
  5560. CEXIT VRE,HIGHR;
  5561. SUBTITLE 'ADSTATUS';
  5562. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5563. %  MOD: ADSTATUS
  5564. % FUNCTION : LINKS AN ENTRY INTO STATUS MESSAGE CHAIN
  5565. % INPUT : VR1-> BUFFER
  5566. %         VR0=  L'BUFFER
  5567. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5568. ADSTATUS:
  5569. CENTER VRE,HIGHR,ENTRY=NO;
  5570. LR XRA,VR0;
  5571. EXI XRA,MMVC,STATBUFF,0(VR1),*-*,INCR=YES,DECR=YES;
  5572. STH VR0,STATLEN;
  5573. CEXIT VRE,HIGHR;
  5574. LTORG;
  5575. EXORG;
  5576. SUBTITLE 'GETTABS';
  5577. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5578. % MODULE- GETTABS
  5579. % FUNCTION - COUNT THE NUMBER OF SPACES TO NEXT TAB PLACE
  5580. % INPUTS - NONE
  5581. % OUTPUT - VRF= NUMBER OF SPACES/BLANKS TO PUT
  5582. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5583. GETTABS:
  5584. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5585.  
  5586. ZR VRF;  % ZERO RETURN
  5587. LH XRA,BUFCNT;  % NUMBER OF CHARACTERS ALREADY IN OUT BUFFER
  5588. L VR1,TABTBLAD;  % TABLE OF TAB CHARACTERS
  5589. GETTABLK: UNTIL <MCLC 0(VR1),ZERO,2>
  5590. DO BEGIN  % TAB BLOCK
  5591. IF <CH XRA,0(,VR1); CC L> THEN BEGIN  % COUNT LESS THAN TAB
  5592. LH VRF,0(,VR1);  % LOAD THE TAB POINTER FROM CHAIN
  5593. SR VRF,XRA;  % SUBTRACT BUFCNT
  5594. SI VRF,1;  % ONE EXTRA FOR GOOD MEASURE
  5595. EXIT FROM GETTABLK IF <RP VRF>;  % LEAVE IF POSITIVE
  5596. END;  % OF FOUND THE TAB ENTRY
  5597. AI VR1,2;  % INCREMENT POINTER TO NEXT TAB ITEM
  5598. END;  % OUT OF TABTABLE
  5599.  
  5600. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5601.  
  5602. CEXIT VRE,HIGHR;
  5603. LTORG;
  5604. EXORG;
  5605. SUBTITLE 'ALIGN ';
  5606. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5607. %               ALIGNS TO 40 COLUMNS THE BUFFER IN VSEG IN SET
  5608. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5609. ALIGN: CENTER VRE,HIGHR,ENTRY=NO;
  5610. VTELL KERMVA;  % VR1 => KERMVA VR0=LENGTH
  5611. ZR XRA;
  5612. LI XRA,40;
  5613. SR XRA,VR0;
  5614. IF <RP XRA> THEN BEGIN
  5615. VSEG KERMVA,BLANKS,LA:0(,XRA);  % PUT BLANKS IN
  5616. END;
  5617. CEXIT VRE,HIGHR;
  5618. LTORG;
  5619.  
  5620.  
  5621. SUBTITLE 'TSOCMD';
  5622. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5623. %   MOD NAME - TSOCMD
  5624. %
  5625. %   FUNCTION - USE TSO SERVICE COMMAND TO PASS A TSO
  5626. %   STRING TO TSO
  5627. %
  5628. %   INPUTS - VR1 = ADDRESS OF STRING
  5629. %            VR0 = LENGTH OF STRING
  5630. %   RETURN - VR15 = 0 IF OK ELSE ADDRESS OF PARM4
  5631. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5632.  
  5633. TSOCMD:
  5634. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5635.  
  5636. LR XRA,VR0;  % LOAD REG FOR EXECUTE MOVE
  5637. ST VR0,PARM3;  % STORE OFF LENGTH FIELD
  5638.  
  5639.  
  5640. EXI XRA,MMVC,PARM2,0(VR1),*-*,DECR=YES,INCR=YES;
  5641. % THIS STATEMENT MOVES DATA TO PARM FIELD
  5642.  
  5643.  
  5644. BAL;
  5645.  
  5646.   L 15,TSOADD  LOAD ROUTINE ADDRESS
  5647.    CALL (15),(PARM1,PARM2,PARM3,PARM4,PARM5,PARM6),VL
  5648.  
  5649. ALP;
  5650. IF <RZ VRF> THEN BEGIN
  5651. LA VRF,PARM4;
  5652. END;
  5653. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5654.  
  5655. CEXIT VRE,HIGHR;
  5656. LTORG;
  5657. EXORG;
  5658. SUBTITLE 'KRPACK';
  5659. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5660. % MOD:  RPACK
  5661. % FUNCTION : GETS A PACKET OF DATA FROM REMOTE KERMIT
  5662. %            VIA ROUTINE KERMTGET - TIMEOUT ROUTINE
  5663. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5664. RPACK:   % RECEIVE PACKET FROM MICRO
  5665. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5666.  
  5667. LA XRC,RECPKT;
  5668. USE XRC AS PACKET IN BEGIN  % ADDRESSIBLE DSECT
  5669. RPACKBLK: DO BEGIN
  5670. ZR VRF;  % GOOD RETURN CODE
  5671. IF <TF TESTF> THEN BEGIN  % READ FROM FILE
  5672. GET TESTFILE;
  5673. ST VR1,TGETBUFA;  % STORE OFF ADDRESS
  5674. MZC TGETLEN,4;  % KLUDGE TO THE MOON
  5675. MMVC TGETLEN+2,0(VR1),2;  % KLUDGE TO THE MOON
  5676. %MTR 0(VR1),ETOA,130;  % KLUDGE CITY FOR READING TEST FILES
  5677. ZR VRF;
  5678. GOTO JUMPOVER;
  5679. END;
  5680.  
  5681. IF <TF TIMERF> | <TF SERVERF> THEN BEGIN  % ALWAYS NEED TIMER SERVER
  5682. % SET TIMER
  5683.  
  5684.  
  5685. STIMER REAL,TIMEEXIT,BINTVL=RTIMEOUT;
  5686. END;
  5687.  
  5688. IF <TF RTURNRND> THEN STIMER WAIT,BINTVL=RTURNTIM;  % TURNAROUND
  5689.  
  5690. POST ECBREAD,ECBTREAD;  % TELL ASYNC SUB TO GO FOR IT
  5691.  
  5692. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5693. TESTECB: WAIT ECB=ECBTGET;
  5694. MVI ECBTGET,0;  % ZERO HIGH ORDER
  5695. IF <CLI ECBTGET+3,ECBTREAD> THEN BEGIN  % TGET READ POSTED
  5696. IF <TF TIMERF> THEN TTIMER CANCEL;
  5697. ZR VRF;  % ZERO RETURN REGISTER
  5698. END
  5699. ELSE BEGIN
  5700. IF <CLI ECBTGET+3,ECBTIMER> THEN BEGIN  % TIMER-ECB POSTED
  5701. DETACH TASKADD;  % BLOW OFF TASK
  5702. MZC ECBREAD,4;  % ZERO OUT READ ECB
  5703. L XRB,TGETADD;  % ADDRESS OF TGET MODULE
  5704. IDENTIFY EP=KERMTGET,ENTRY=(XRB);
  5705.  
  5706. IF <RNZ  VRF> THEN BEGIN  % ERROR IN IDENTIFY
  5707. IF ^<CI VRF,4> THEN BEGIN
  5708. TPUT =C'ERROR IN IDENTIFY',17;
  5709.     DC F'0';  % BLOWUP
  5710. END;
  5711. END;
  5712. DELETE EP=KERMTGET   ;
  5713. % THEN REATTACH
  5714. ATTACH EP=KERMTGET,PARAM=((XRF));
  5715. IF <RNZ VRF> THEN BEGIN
  5716. END;
  5717. ST VR1,TASKADD;  % STORE OFF ADDRESS FOR DETACH
  5718. LI VRF,TIMERROR;  % TIME OUT LITERAL FOR RETURN CODE
  5719. EXIT FROM RPACKBLK;  % GET OUT
  5720. END
  5721. ELSE BEGIN
  5722. ERRORCON  'UNKNOWN POST VALUE ECB';
  5723. CCALL ERRPACK,A;  % PUT IN ERROR BUFFER
  5724. MVI TYPE,ACOMLIT;  % ABORT LITERAL
  5725. EXIT FROM RPACKBLK;
  5726. END;
  5727. END;
  5728.  
  5729.  
  5730.  
  5731. JUMPOVER: ;  % LABEL TO SKIP TO
  5732. L XRA,TGETBUFA;
  5733. IF <<MCLC 0(XRA),=C'stop',4> |
  5734. <MCLC 0(XRA),=C'STOP',4>> THEN BEGIN  % GET OUT user wants to stop
  5735. KLUDGCIT: IF <TF TIMERF> THEN TTIMER CANCEL;
  5736. SF STOPF;  % STOP
  5737. ERRORCON 'User entered STOP.  Transfer aborted.';
  5738. CCALL ERRPACK,A;
  5739. LI VRF,STOPFLAG;  % FOR RETURN CODE
  5740. EXIT FROM RPACKBLK;
  5741. END;
  5742. IF <TF SERVERF> THEN BEGIN
  5743.  % VIOLATE KERMIT HEURISTICS HERE BECAUSE THEY SAY TO
  5744.  
  5745. IF <<MCLC 0(XRA),=C'finish',6> |           % GET OUT IF SERVER
  5746. <MCLC 0(XRA),=C'FINISH',6>> THEN BEGIN  % GET OUT IF SERVER
  5747. ZF SERVERF;  % TURN OFF SERVER
  5748. ZR VRF;  % FOR RETURN CODE
  5749. EXIT FROM RPACKBLK;  % GET OUT IF SERVER
  5750. END;
  5751.  
  5752. END;  % OF SERVER FUNCTIONS
  5753. IF <MCLC 0(XRA),=C'ABORT',5> THEN DC XL4'00000000';
  5754. L VR1,TGETLEN;  % LENGTH OF STUFF GOTTEN
  5755. IF <RNP VR1> THEN BEGIN
  5756. LI VRF,TGETERR;  % ERROR FROM TGET
  5757. EXIT FROM RPACKBLK;
  5758. END;  % OF TGET ERROR
  5759. FOR VR1 DO BEGIN  % LOOP THROUGH LENGTH LOOKING FOR SOH
  5760. EXIT IF <MCLC (XRA),RSOH,1>;  % FOUND SOH
  5761. AI XRA,1;  % INCREMENT POINTER
  5762. IF <CI VR1,1> THEN BEGIN
  5763. ERRORCON 'No SOH on packet';
  5764. LI VRF,NOSOH;
  5765. EXIT FROM RPACKBLK;
  5766. END;
  5767. END;  % OF FOR LOOP
  5768.  
  5769. MMVC RECPKT,0(XRA),130;  % MOVE TO RECPACKET
  5770.  
  5771.  
  5772. IF <RNZ VRF> THEN BEGIN
  5773.  
  5774. ERRORCON 'Error in Tget from  Micro ';
  5775. CCALL ERRPACK,A;  % PUT IN ERROR BUFFER
  5776. MVI TYPE,ACOMLIT;  % ABORT LITERAL
  5777. EXIT FROM RPACKBLK;
  5778.  
  5779. END;  % OF ERROR OF TPUT
  5780.  L XRB,ETOAVCON; MTR LEN,0(XRB),1;  % TRANSLATE TO ASCII
  5781.  
  5782. ZR XRB;
  5783. IC XRB,LEN;  % GET LENGTH OF PACKET
  5784. UNCHAR XRB;  % MAKE PRINTABLE
  5785. L VR1,ATOEVCON; MTR LEN,0(VR1),1;  % TRANSLATE TO ASCII
  5786. LH XRA,BCCLEN;
  5787. AI XRA,2;  % MINIMAL PACKET SIZE
  5788. IF <CR XRB,XRA; CC L> | % ERROR PACKET TOO SMALL
  5789. <C XRB,MAXPACK; CC H> THEN BEGIN  % TOO LARGE
  5790. L VRF,LENERROR;
  5791. EXIT FROM RPACKBLK;
  5792. END;  % OF LENGTH ERROR ON RECEIVE
  5793. IF <OPENP DEBUG> THEN BEGIN  % DEBUGGING ON
  5794.  
  5795. MZC WRKBUFF,4;  % BLAST 1ST 4 BYTES
  5796. MVI WRKBUFF+1,19;
  5797. MMVC WRKBUFF+4,=C'TGET REC PACKET',15;
  5798.  
  5799. PUT   DEBUG,WRKBUFF;
  5800.  
  5801. AI XRB,2;  % BUMP LENGTH COUNTER TO INCLUDE HEADER
  5802.  
  5803. EXI XRB,MVC,WRKBUFF+4(*-*),PACKET,DECR=YES,INCR=YES;
  5804.  
  5805. AI XRB,4;  % FOR HEADER
  5806.  
  5807. STH XRB,WRKBUFF;
  5808. SI XRB,6;  % ADJUST LENGTH BACK TO ORIGINAL
  5809.  
  5810. PUT DEBUG,WRKBUFF;  % OUTPUT AGAIN
  5811.  
  5812. END;  % OF DEBUG BLOCK
  5813.  
  5814. AI XRB,2;  % BUMP LENGTH COUNTER
  5815. L VR1,ETOAVCON;
  5816. EXI XRB,TR,PACKET(*-*),0(VR1),DECR=YES,INCR=YES;  % CHANGE TO ASCII
  5817. SI XRB,1;  % RESTORE COUNTER
  5818.  
  5819. % SUBTRACT 1,2, OR 3 DUE TO BCC TYPE
  5820. SH XRB,BCCLEN;
  5821. LR VR0,XRB;  % GET LENGTH FIELD
  5822.  
  5823. CCALL BCCCALC,A,VR1=LEN;  % BCC COMPUTATION SUB
  5824.  
  5825. EXIT FROM RPACKBLK IF <C VRF,=X'FFFFFFFF'>;  % SOMETHING FUNNY
  5826. ZR VRF;  % OK RETURN WE HOPE
  5827.  
  5828. LA XRE,PACKET+1(XRB);  % CHECK THIS LATER
  5829. LH VR1,BCCLEN;
  5830. SI VR1,1;  % DECRMENT FOR EXECUTE\
  5831.  
  5832.  % %CHAR VRF;  % ASCII PRINTABLE
  5833. IF ^<EX VR1,CLMCOMP> THEN BEGIN
  5834.  
  5835. % ERROR IN BCC CHECK
  5836. % WRTERM ' BCC ERRROR CHECK IN RPACK ';
  5837. LI VRF,BCCERROR;
  5838. EXIT FROM RPACKBLK;
  5839. END;  % OF BCC ERROR
  5840.  
  5841.  
  5842. CCALL UNPACK,A,VR1=PACKET;
  5843.  
  5844.  
  5845. END;  % OF RPACKBLK
  5846. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5847. CEXIT VRE,HIGHR;
  5848. LTORG;
  5849. EXORG;
  5850. CLMCOMP: MCLC 0(XRE),BCC,*-*;
  5851. END;  % OF DSECT PACKET
  5852.  
  5853. TIMERROR:    EQU      4;  % EQUATE FOR TIME OUT RETURN
  5854.  
  5855. BCCERROR:   EQU    8;  % INCORRECT BCC
  5856. NOSOH:   EQU 12;
  5857. STOPFLAG:   EQU     16;  % INDICATE A STOP
  5858. TGETERR:   EQU 20;  % ERROR FROM TGET ROUTINE
  5859.               DS   0F;
  5860. SUBTITLE 'UNPACK';
  5861. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5862. % MODULE : UNPACK
  5863. % FUNCTION : TAKE A RECEIVE PACKET AND DECODES THE
  5864. %           PACKET LENGTH, SEQ NUMBER, AND DOES
  5865. % INPUT:    VR1-> SOH OF PACKET
  5866. %
  5867. %
  5868. % OUTPUT :  SEQ MVC TO RSEQ,L'RDATA STH IN RECLEN
  5869. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5870. UNPACK:
  5871. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5872. USE XRA AS PACKET IN BEGIN
  5873. LR XRA,VR1;  % POINT TO PACKET
  5874. ZR XRB;
  5875. IC XRB,SEQ;  % GET RECEIVE SEQ
  5876. UNCHAR XRB;  % MAKE IT AN INTEGER;
  5877. STH XRB,RPSEQ;  % STORE OFF RECEIVED SEQ NUMBER
  5878. ZR XRB;
  5879. IC XRB,LEN;  % GET LENGTH TO CALCULATE DATA
  5880. UNCHAR XRB; SI XRB,2;  % SUB SEQ AND TYPE BYTES
  5881. SH XRB,BCCLEN;  % SUB OFF BLOCK CHECK LENGTH
  5882. STH XRB,RECLEN;
  5883. LA XRB,DATABUFF;
  5884. ST XRB,RECPNTR;  % POINTER TO RECEIVED DATA
  5885. END;  % OF DSECT
  5886. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  5887.  
  5888. CEXIT VRE,HIGHR;
  5889. LTORG;
  5890. EXORG;
  5891.  
  5892.  
  5893. SUBTITLE 'TIMEEXIT';
  5894. TIMEEXIT:
  5895. BALR BASER,0;
  5896. USING *,BASER;  % ADDRESSIBLITY
  5897. L XRF,PARMACON;
  5898. POST ECBTGET,ECBTIMER;  % POST TIMER ECB
  5899. RGOTO 14;  % RETURN TO OS
  5900. PARMACON:   DC   A(PARMS);  % WORKING STORAGE
  5901. SUBTITLE 'PUT BUFFER ';
  5902. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5903. %   THIS ROUTINE PLACES INFO INTO OUTPUT BUFFER
  5904. %  CALLED BY KSEND
  5905. % VR1-> GET BUFFER
  5906. % VR0 = LENGTH OF GET BUFFER
  5907. % ROUTINE PUTS ALL INTO BUFFER AND CALLS SPACK
  5908. % WHEN NECESSARY
  5909. %
  5910. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5911. PUTBUFF:
  5912. CENTER VRE,HIGHR,ENTRY=NO;
  5913. ST VR1,GETADD;  % ADDRESS OF GET
  5914. STH VR0,GETLEN;  % LENGTH OF GETS
  5915. PUTBLCK:
  5916. L VR1,GETADD;
  5917. L XRB,PUTADD;
  5918. LH XRA,MAXPUT;  % GET DIFFERENCE
  5919. SH XRA,PUTLEN;  % NUMBER OF CHARACTERS IN PUT BUFF
  5920. LH XRD,GETLEN;  % LENGTH OF IN PUT
  5921.  
  5922. EXI XRD,MVC,0(*-*,XRB),0(VR1),DECR=YES,INCR=YES;
  5923. AR XRB,XRD;  % UPDATE PUT ADDRESS
  5924. ST XRB,PUTADD;  % STORE OFF NEW OUT ADDRESS
  5925. LH XRA,PUTLEN;
  5926. AR XRA,XRD;  % UPDATE LENGTH
  5927. STH XRA,PUTLEN;
  5928. ZR VR0;  % NO MORE CHARACTERS TO PUT DROP OUT
  5929. MZC GETLEN,2;  % ZERO GET LENGTH
  5930. CEXIT VRE,HIGHR;
  5931. LTORG;
  5932. EXORG;
  5933. SUBTITLE 'KRECEIVE';
  5934.  
  5935. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5936. %
  5937. %     MODULE NAME   -   KRECEIVE
  5938. %
  5939. %
  5940. %     FUNCTION-   DRIVER FOR REC COMMAND DYNAL, OPEN,
  5941. %     FORMATS PACKETS, FILE HEADER, EOF ETC
  5942. %
  5943. %
  5944. %     INPUTS -
  5945. %
  5946. %
  5947. %
  5948. %
  5949. %     OUTPUTS-
  5950. %
  5951. %
  5952. %     RETURN
  5953. %
  5954. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5955. KRECEIVE: ;
  5956. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  5957. LA XRC,SNDPKT;
  5958. USE XRC AS PACKET IN BEGIN  % DSECT FOR INIT
  5959. LA XRD,DATABUFF;
  5960. USE XRD AS SENDIDST IN BEGIN
  5961. RECBLCK: DO BEGIN  % GLOBAL REC BLOCK
  5962. MVI STATE,RECEIVE;
  5963. MZC STATLEN,2;  % ZERO OUT STATUS LENGTH
  5964. ZF WARNINGF;  % NO WARNINGS YET
  5965. MFC DSNAME,44;  % CLEAR OUT DATA SET NAME
  5966. BCCTYPE 1;  % 1 BCC BYTE AT END
  5967. IF <TF SERVERF> THEN <MZC DSNLEN,2; GOTO RGETINIT>;  % SERVER STUFF
  5968. SCERROR NEW=RECERR;  % SCAN OFF DSN
  5969.  
  5970.    SCAN *;
  5971.    SCKW ?,RECHELP;  % INFO
  5972.    SCKW ,REC1ST,B,LIMIT=AL1(44);  % DSN
  5973.    SCANEND;
  5974. %  IF HERE NO DSNAME
  5975. MZC DSNLEN,2;  % ZERO DATA SET NAME
  5976. GOTO RGETINIT;  % A GOTO I ADMIT
  5977.  
  5978.    EXIT FROM RECBLCK;  % LEAVE REC
  5979.  
  5980. RECHELP:
  5981. WRTERM 'RECEIVE receives a data set (file) from the microcomputer.';
  5982. WRTERM   'A corresponding SEND command must '_
  5983.        'be issued to the microcomputer';
  5984. WRTERM  'KERMIT after the RECEIVE is issued to TSO KERMIT.';
  5985. WRTERM 'The parameter is the data set name '_
  5986.    'to be used for the received data set.';
  5987. WRTERM 'If the parameter is omitted, the file name from the sender '_
  5988.    'is used as';
  5989. WRTERM 'the data set name.';
  5990.    EXIT FROM RECBLCK;  % LEAVE REC
  5991.  
  5992. RECERR:
  5993. SELECT FIRST;
  5994. <CI VRF,SCTCLXM>: WRTERM  'Data Set Name maximum 44 letters ';
  5995. ENDSEL
  5996. ELSE <WRTERM 'ERROR IN SCANNER IN REC MOD '>;
  5997.  
  5998. EXIT FROM RECBLCK;  % ERROR EXIT
  5999. REC1ST:  % THE BEEF
  6000. % STORE OFF POINTERS IN CASE MORE FILES
  6001. % SCBACK;  % BACK UP IN CASE A PDS MEMBER EXISTS
  6002. SCTELL;
  6003. DEBLANK VR1,VR0,XRA,TYPE=BOTH;  % STRIP OFF BLANKS
  6004. ST VR1,DSNADD;  % ADDRESS OF DSNAME
  6005. STH VR0,DSNLEN;  % LENGTH OF SCANNED NAME
  6006. LR XRA,VR0;  % FOR EXECUTE
  6007. CCALL CHKRDSN,A;  % ROUTINE CHECKS WHEATHER VALID DSN FOR RECEIVE
  6008. IF <RZ VRF> THEN CCALL OPENRDSN,A;  % OPEN THE FILE
  6009. IF <RZ VRF> THEN BEGIN  % GOOD DATA SET
  6010.  
  6011. RGETINIT: % GET INIT PACKET
  6012.  
  6013. IF ^<TF SERVERF> THEN WRTERM 'Ready to receive files';
  6014. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
  6015. %  CALL REC FILE SWITCH TABLE DRIVER
  6016. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6017.  
  6018. CCALL RECSW,A;
  6019.  
  6020. END
  6021. ELSE BEGIN  % COULDN'T OPENDSN
  6022. IF <TF SERVERF> THEN BEGIN
  6023. CCALL SABORT,A,LH:VR0=RPSEQ;
  6024. END
  6025. ELSE <LH VR0,STATLEN; TPUT STATBUFF,(VR0)>;
  6026. END;
  6027. END;  % OF RECBLCK
  6028.  
  6029.  
  6030.  
  6031.  
  6032. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6033.  
  6034. CEXIT VRE,HIGHR;
  6035. LTORG;
  6036. EXORG;
  6037. END;  % OF DSECT
  6038. END;  % OF DSECT RECINIT
  6039. SUBTITLE 'RECUNALLOCATE ';
  6040. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
  6041. % MOD: RECUNAL
  6042. % FUN: UNALLOCATES DSNAME FOR RECEIVE MOD
  6043. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6044. RECUNAL:
  6045. CENTER VRE,HIGHR,ENTRY=NO;
  6046.          LA XRB,DSNAME;  % GET ADDRESS OF DSNAME
  6047.          DALLIST BEGIN,MF=(E,UALLOCD2),INIT=NO; BEGIN
  6048.             DALLIST TEXT,DUNDSNAM,(0(XRB),DSNSIZE);  % DSNAME
  6049.             DALLIST TEXT,DUNUNALC,MF=L;  % FORCE UNALLOCATION
  6050.             DALLIST END; END;
  6051.          DATA BEGIN  % DYNAMIC ALLOCATION PARAMETER LIST FOR
  6052.             % UNALLOCATION BY DSNAME
  6053.  
  6054.             UALLOCD2:
  6055.             DALLIST BEGIN,S99VRBUN,MF=L; BEGIN
  6056.                DALLIST TEXT,DUNDSNAM,(,DSNSIZE);  % DSNAME
  6057.                DALLIST TEXT,DUNUNALC;  % FORCE UNALLOCATION
  6058.                DALLIST END; END;
  6059.             END;
  6060. CEXIT VRE,HIGHR;
  6061. LTORG;
  6062.  
  6063. SUBTITLE 'RECSW';
  6064. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6065. % MODULE : RECSW
  6066. % FUNCTION :  THIS ROUTINE DRIVES THE RECEIVE  MODULES,
  6067. %            EACH ROUTINE CHANGES THE STATE
  6068. % INPUT:
  6069. %
  6070. %
  6071. % OUTPUT :
  6072. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6073. RECSW:
  6074. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6075. %MVI HIGHBCC,3;  % INDICATE BLOCK CHECK TYPE
  6076. BCCTYPE 1;  % BLOCK CHECK TYPE
  6077. ZEROSEQ;  % ZERO SEQUENCE NUMBER
  6078. ZERORTRY;  % ZERO RETRY
  6079. MVI STATE,RISTATE;  % SEND INIT STATE
  6080. RSWTBLCK: DO BEGIN  % LOOP TILL EXIT
  6081. SELECT FIRST;
  6082. <TF STOPF>: <CCALL STOPPROC,A; EXIT FROM RSWTBLCK>;  % USER STOP
  6083. <CLI STATE,RISTATE>: CCALL RINIT,A;
  6084. <CLI STATE,RFSTATE>: CCALL RFILE,A;  % FILE HEADER PACKET
  6085. <CLI STATE,RDSTATE>: CCALL RDATAMOD,A;  % GET DATA PACKETS
  6086. <CLI STATE,SESTATE>: BEGIN  % ABORT
  6087. CCALL SABORT,A,VR0=LH:RPSEQ; EXIT FROM RSWTBLCK;  % ABORT
  6088. END;
  6089. <CLI STATE,RESTATE>: <CCALL RABORT,A; EXIT FROM RSWTBLCK>;  % ABORT
  6090. <CLI STATE,CSTATE>: EXIT FROM RSWTBLCK;  % COMPLETE STATE SPLIT
  6091. ENDSEL;
  6092. END FOREVER;
  6093. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6094.  
  6095. CEXIT VRE,HIGHR;
  6096. LTORG;
  6097. EXORG;
  6098. SUBTITLE 'RFILE';
  6099. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6100. % MODULE : RFILE
  6101. % FUNCTION : Receives the f packet and decodes it
  6102. %            changes states
  6103. % INPUT:     none
  6104. %
  6105. %
  6106. % OUTPUT :  state = either 'C' complete  || 'B' EOT
  6107. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6108. RFILE:
  6109. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6110. BUMPRTRY XRA;  % Increment retry counter
  6111. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  6112. MVI STATE,SESTATE  % Send abort state
  6113. ELSE RFILBLCK: DO BEGIN  % Receive file name
  6114. CCALL RPACK,A;
  6115. EXIT IF <TF STOPF>;  % Leave if user entered stop
  6116. IF <RNZ VRF> THEN BEGIN  % NACK if Timeout or Bad BCC
  6117. NACKPACK SEQNUM,VR0;  % NACK IT
  6118. EXIT FROM RFILBLCK;
  6119. END;  % OF ERROR
  6120. ZR XRA;  % clear for the case
  6121. MTRT RTYPE,COMMAND,1;  % Scan command type
  6122. DO BEGIN CASE XRA MAX SCASE MIN ECASE CHECK;
  6123.  
  6124. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6125. %   RECEIVED A SENDINIT PACKET
  6126. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6127.  
  6128. SCASE: BEGIN  % SEND INIT PACKET RECEIVED
  6129. BUMPOTRY VR0;
  6130. IF <MCLC OLDTRY,RETRY,4; CC NL>  % Retry exceeded
  6131. | ^<MCLC OLDSEQ,RPSEQ,2; CC NL> THEN  % MUST BE LAST SEQ
  6132. MVI STATE,SESTATE  % Send abort state
  6133. ELSE BEGIN  % Receive file name
  6134. CCALL SPAR,A,VR1=PDATA,VR0=LH:RECLEN;  % SET PARMS
  6135. SPSPACK AY,RPSEQ,RECLEN,VR0;
  6136. CCALL SPACK,A;
  6137. MZC NUMTRY,L'NUMTRY;  % % Zero retry counter
  6138. END;
  6139. END;  % OF REC INIT
  6140.  
  6141. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6142. %   RECEIVED A EOF PACKET
  6143. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6144.  
  6145. ZCASE: BEGIN  % EOF PACKET RECEIVED  - CLOSE OUT
  6146. BUMPOTRY VR0;
  6147. IF <MCLC OLDTRY,RETRY,4; CC NL>  % Retry exceeded
  6148. | ^<MCLC OLDSEQ,RPSEQ,2; CC NL> THEN  % MUST BE LAST SEQ
  6149. MVI STATE,SESTATE  % Send abort state
  6150. ELSE BEGIN  % Receive file name
  6151. SPSPACK AY,RPSEQ,ZERO,VR0;
  6152. CCALL SPACK,A;
  6153. MZC NUMTRY,L'NUMTRY;  % % Zero retry counter
  6154. CCALL CLOSERDS,A;  % CLOSE THE DATA SET
  6155. END;
  6156. END;  % OF REC EOF FOR THE SECOND TIME
  6157.  
  6158. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6159. %   RECEIVED A ERROR PACKET
  6160. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6161.  
  6162. ECASE: BEGIN  % Error abort
  6163. MVI STATE,RESTATE;  % RECEIVED ABORT
  6164. CCALL ERRPACK,A,VR1=RDATA,VR0=LH:RECLEN;
  6165. END;
  6166.  
  6167. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6168. %   RECEIVED A EOT PACKET
  6169. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6170.  
  6171. BCASE: BEGIN  % End of transmission
  6172. IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN  % MUST BE THE RIGHT PACKET
  6173. MVI STATE,SESTATE;  % SENDAN ABORT
  6174. ERRORCON 'Illegal packet sequence for eot in rfile- must abort';
  6175. CCALL ERRPACK,A;
  6176. END  % bad sequence number
  6177. ELSE BEGIN
  6178. ACKPACK SEQNUM,VR0;  % ACK IT
  6179. MVI STATE,CSTATE;  % LA FINE
  6180. END;
  6181. END;  % OF EOT
  6182.  
  6183. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6184. %   RECEIVED A FILE PACKET
  6185. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6186.  
  6187. FCASE: BEGIN  % f packet with file name - what we want
  6188. IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN  % MUST BE THE RIGHT PACKET
  6189. MVI STATE,SESTATE;  % SENDAN ABORT
  6190. ERRORCON 'Illegal sequence for f packet in rfile- must abort';
  6191. CCALL ERRPACK,A;
  6192. END  % bad sequence number
  6193. ELSE BEGIN
  6194. IF <MCLC DSNLEN,ZERO,2> THEN BEGIN  % GET NAME FROM PACKET
  6195. CCALL DSNPACK,A,VR1=RDATA,VR0=LH:RECLEN;  % DECODE NAME
  6196. IF <RZ VRF> THEN CCALL OPENRDSN,A;  % OPEN THE NEXT FILE
  6197. IF <RNZ VRF> THEN MVI STATE,SESTATE ; % ABORT ON BOARD
  6198. EXIT FROM RFILBLCK IF <RNZ VRF>;  % ERROR ON OPEN
  6199. END;
  6200. ACKPACK SEQNUM,VR0;  % ACK IT
  6201. MMVC OLDTRY,NUMTRY,4;  % KEEP OLD COUNTER
  6202. ZERORTRY;  % A GOOD PACKET
  6203. BUMPSEQ VR0;  % NEXT SEQ NUMBER
  6204. MZC BUFCNT,2;  % ZERO BUFFER COUNTER
  6205. MZC DSNLEN,2;  % ZERO LENGTH OF DSN FOR NEXT ONE
  6206. L VR1,ADDBUF;  % BEGINNING OF BUFFER
  6207. ST VR1,BUFADD;  % POINTER TO PLACE IN BUFFER
  6208. ZF CRFLAG,QUO8FLAG;
  6209. MVI STATE,RDSTATE;  % CHANGE DATA TO RECEIVE DATA
  6210. END;  % OF GOOD F PACKET
  6211. END;  % OF F PACKET
  6212. ENDCASE
  6213. ELSE BEGIN
  6214.  
  6215. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6216. %   RECEIVED AN ILLEGAL PACKET
  6217. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6218.  
  6219. ERRORCON 'Illegal packet type for rfile - transfer aborted';
  6220. CCALL ERRPACK,A;  % PUT IN BUFFERS
  6221. MVI STATE,SESTATE;  % SEND ABORT    STATE
  6222. END;
  6223. END;  % OK RETRY
  6224. END;  % of RFILBLCK
  6225. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6226.  
  6227. CEXIT VRE,HIGHR;
  6228. LTORG;
  6229. EXORG;
  6230.  
  6231. SUBTITLE 'RDATAMOD';
  6232. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6233. % MODULE : RDATAMOD
  6234. % FUNCTION : Receives data packet and decodes them
  6235. %            also receives eof
  6236. % INPUT:     none
  6237. %
  6238. %
  6239. % OUTPUT :  state = either 'C' complete  || 'B' EOT
  6240. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6241. RDATAMOD:
  6242. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6243. BUMPRTRY XRA;  % Increment retry counter
  6244. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  6245. MVI STATE,SESTATE  % Send abort state
  6246. ELSE RDATBLCK: DO BEGIN  % Receive file name
  6247. CCALL RPACK,A;
  6248. EXIT IF <TF STOPF>;  % Leave if user entered stop
  6249. IF <RNZ VRF> THEN BEGIN  % NACK if Timeout or Bad BCC
  6250. NACKPACK SEQNUM,VR0;  % NACK IT
  6251. EXIT FROM RDATBLCK;
  6252. END;  % OF ERROR
  6253. ZR XRA;  % clear for the case
  6254. MTRT RTYPE,COMMAND,1;  % Scan command type
  6255. DO BEGIN CASE XRA MAX FCASE MIN ECASE CHECK;
  6256.  
  6257. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6258. %   RECEIVED A FILE HEADER PACKET
  6259. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6260.  
  6261. FCASE: BEGIN  % FILE HEADER PACKET RECEIVED
  6262. BUMPOTRY VR0;
  6263. IF <MCLC OLDTRY,RETRY,4; CC NL>  % Retry exceeded
  6264. | ^<MCLC OLDSEQ,RPSEQ,2; CC NL> THEN  % MUST BE LAST SEQ
  6265. MVI STATE,SESTATE  % Send abort state
  6266. ELSE BEGIN  % Receive file name
  6267. SPSPACK AY,RPSEQ,ZERO,VR0;
  6268. CCALL SPACK,A;
  6269. MZC NUMTRY,L'NUMTRY;  % % Zero retry counter
  6270. END;
  6271. END;  % OF REC FILE HEADER
  6272.  
  6273. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6274. %   RECEIVED A ERROR PACKET
  6275. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6276.  
  6277. ECASE: BEGIN  % Error abort
  6278. MVI STATE,RESTATE;  % RECEIVED ABORT
  6279. CCALL ERRPACK,A,VR1=RDATA,VR0=LH:RECLEN;
  6280. END;
  6281.  
  6282. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6283. %   RECEIVED A EOF PACKET
  6284. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6285.  
  6286. ZCASE: BEGIN  % End of file
  6287. IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN  % MUST BE THE RIGHT PACKET
  6288. MVI STATE,SESTATE;  % SENDAN ABORT
  6289. ERRORCON 'Illegal packet sequence for eof in rdata- must abort';
  6290. CCALL ERRPACK,A;
  6291. END  % bad sequence number
  6292. ELSE BEGIN
  6293. ACKPACK SEQNUM,VR0;  % ACK IT
  6294. BUMPSEQ VR0;
  6295. IF <MCLC BUFCNT,=H'0',2; CC H> THEN BEGIN  % SOMETHING TO WRITE
  6296. CCALL WRITEFIL,A;
  6297. %IF <MCLC DATA,=C'BINARY',6> THEN CCALL WRITEFIL,A;  % old
  6298. END;  % OF SOMETHING TO WRITE
  6299. IF <TF RECVDSNF> THEN CCALL CLOSERDS,A;  % CLOSE THE FILE
  6300. MVI STATE,RFSTATE;  % WE'RE DONE HERE
  6301. END;
  6302. END;  % OF EOT
  6303.  
  6304. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6305. %   RECEIVED A DATA PACKET
  6306. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6307.  
  6308. DCASE: BEGIN  % D packet with data - what we want
  6309. IF ^<MCLC SEQNUM,RPSEQ,2> THEN BEGIN  % WRONG PACKET NUMBER
  6310. BUMPOTRY VR0;
  6311. IF <MCLC OLDTRY,RETRY,4; CC L> THEN BEGIN  % HAVEN'T EXCEED RETRY
  6312. IF <MCLC OLDSEQ,RPSEQ,2> THEN BEGIN  % PREVIOUS PACKNUM JUST ACK
  6313. ACKPACK RPSEQ,VR0;  % ACK OLD ONE
  6314. MZC NUMTRY,L'NUMTRY;
  6315. EXIT FROM RDATBLCK;
  6316. END;
  6317. END;
  6318. MVI STATE,SESTATE;  % SENDAN ABORT
  6319. ERRORCON 'sequence error for D packet in rdata- must abort';
  6320. CCALL ERRPACK,A;
  6321. END  % bad sequence number
  6322. ELSE BEGIN
  6323. CCALL KGETBUFF,A,VR1=RDATA,VR0=LH:RECLEN;  % DECODE PACKET
  6324. ACKPACK SEQNUM,VR0;  % ACK IT
  6325. MMVC OLDTRY,NUMTRY,4;  % KEEP OLD COUNTER
  6326. ZERORTRY;  % A GOOD PACKET
  6327. BUMPSEQ VR0;  % NEXT SEQ NUMBER
  6328. END;
  6329. END;  % OF GOOD F PACKET
  6330. ENDCASE
  6331. ELSE BEGIN
  6332.  
  6333. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6334. %   RECEIVED AN ILLEGAL PACKET
  6335. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6336.  
  6337. ERRORCON 'Illegal packet type for rdata - transfer aborted';
  6338. CCALL ERRPACK,A;  % PUT IN BUFFERS
  6339. MVI STATE,SESTATE;  % SEND ABORT    STATE
  6340. END;
  6341. END;  % OK RETRY
  6342. END;  % of RDATBLCK
  6343. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6344.  
  6345. CEXIT VRE,HIGHR;
  6346. LTORG;
  6347. EXORG;
  6348.  
  6349. SUBTITLE 'RINIT';
  6350. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6351. % MODULE : RINIT
  6352. % FUNCTION : Receives the Send init packet and decodes it
  6353. %            changes states
  6354. % INPUT:     none
  6355. %
  6356. %
  6357. % OUTPUT :  state = either 'C' complete  || 'B' EOT
  6358. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6359. RINIT:
  6360. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6361. BUMPRTRY XRA;  % Increment retry counter
  6362. IF <MCLC NUMTRY,RETRY,4; CC NL> THEN  % Retry exceeded
  6363. MVI STATE,SESTATE  % Send abort state
  6364. ELSE RINIBLCK: DO BEGIN  % Send end of transmisision block
  6365. BCCTYPE 1;  % LOOK FOR 1 BCC ON REC INIT PACKET
  6366. IF ^<TF SERVERF> THEN CCALL RPACK,A;
  6367. EXIT IF <TF STOPF>;  % Leave if user entered stop
  6368. IF <RNZ VRF> THEN BEGIN  % NACK if Timeout or Bad BCC
  6369. NACKPACK SEQNUM,VR0;  % NACK IT
  6370. EXIT FROM RINIBLCK;
  6371. END;  % OF ERROR
  6372. ZR XRA;  % clear for the case
  6373. MTRT RTYPE,COMMAND,1;  % Scan command type
  6374. DO BEGIN CASE XRA MAX SCASE MIN ECASE CHECK;
  6375. RSTATE: BEGIN  % SEND INIT PACKET RECEIVED
  6376. CCALL RPAR,A,VR1=RDATA,VR0=LH:RECLEN;  % GET PARMS
  6377. CCALL SPAR,A,VR1=PDATA,VR0=LH:RECLEN;  % SET PARMS
  6378. SPSPACK AY,SEQNUM,RECLEN,VR0;
  6379. CCALL SPACK,A;
  6380. SELECT FIRST;
  6381. <CLI TRFBCC,1>: BCCTYPE 1;
  6382. <CLI TRFBCC,2>: BCCTYPE 2;
  6383. <CLI TRFBCC,3>: BCCTYPE 3;
  6384. ENDSEL;
  6385. ZERORTRY;  % % Zero retry counter
  6386. BUMPSEQ VR0;  % Increment packet counter
  6387. MVI STATE,RFSTATE;  % NEXT STATE  REC FILE HEADER
  6388. END;  % OF ACK
  6389. ECASE: BEGIN  % Error abort
  6390. MVI STATE,RESTATE;  % RECEIVED ABORT
  6391. CCALL ERRPACK,A,VR1=RDATA,VR0=LH:RECLEN;
  6392. END;
  6393. ENDCASE
  6394. ELSE BEGIN
  6395. ERRORCON 'Illegal packet type for rec init - transfer aborted';
  6396. CCALL ERRPACK,A;  % PUT IN BUFFERS
  6397. MVI STATE,SESTATE;  % SEND ABORT    STATE
  6398. END;
  6399. END;  % OK RETRY
  6400. END;  % of RINIBLCK
  6401. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6402.  
  6403. CEXIT VRE,HIGHR;
  6404. LTORG;
  6405. EXORG;
  6406.  
  6407. SUBTITLE 'DSNPACK';
  6408. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6409. % MODULE : DSNPACK
  6410. % FUNCTION : Scans data set name from a received packet
  6411. %            calls scandsn to check if ok
  6412. % INPUT:     VR1-> DATA SET NAME
  6413. %            VR0=LENGTH OF DATA SET NAME
  6414. %
  6415. % OUTPUT :  VRF=0 A GOOD DSNAME ELSE INVALID NAME
  6416. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6417. DSNPACK:
  6418. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6419. IF <RP VR0> THEN BEGIN  % GET NAME FROM SENDER
  6420. LR XRA,VR0;
  6421. L XRB,ATOEVCON;
  6422. EXI XRA,TR,0((*-*),VR1),0(XRB),DECR=YES,INCR=YES;
  6423. EXI XRA,TR,0((*-*),VR1),UPPER,DECR=YES,INCR=YES;  % UPPER
  6424.  
  6425. LA XRB,0(XRA,VR1);  % SET UP TO SCAN OFF BAD CHARACTERS
  6426. SI XRB,1;  % ONE LESS
  6427. WHILE <<CLI 0(XRB),C' '> | <CLI 0(XRB),C'.'>> DO
  6428. BEGIN  SI XRA,1; SI XRB,1; END;
  6429.  
  6430. LR VR0,XRA;  % LENGTH
  6431. END;  % OF NON LENGTH
  6432. CCALL CHKRDSN,A;  % CHECK THE DSNAME
  6433. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6434.  
  6435. CEXIT VRE,HIGHR;
  6436. LTORG;
  6437. EXORG;
  6438.  
  6439. SUBTITLE 'CHKRDSN';
  6440. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6441. % MODULE : CHKRDSN
  6442. % FUNCTION : Checks for a valid  data set name for a received
  6443. %            file calls scandsn to check if ok
  6444. % INPUT:     VR1-> DATA SET NAME
  6445. %            VR0=LENGTH OF DATA SET NAME
  6446. %
  6447. % OUTPUT :  VRF=0 A GOOD DSNAME ELSE INVALID NAME
  6448. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6449. CHKRDSN:
  6450. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6451. CCALL SCANDSN,A;  % SET UP DATA SET NAME
  6452. CASE VRF MIN 0 MAX 20 CHECK;
  6453. 0: BEGIN  % A GOOD RETURN;
  6454. END;
  6455. 4: BEGIN  % GOOD RETURN PLUS PDS
  6456. ZR VRF;
  6457. END;
  6458. 8: BEGIN  % WILD CARD
  6459. ERRORCON 'Asterisk illegal on receive - just leave blank';
  6460. END;
  6461. 12: BEGIN  % NO LENGTH
  6462. ERRORCON 'No length on data set name';
  6463. END;
  6464. 16: BEGIN  % ILLEGAL NAME
  6465. ERRORCON 'Non-standard data set name  ';
  6466. % LR XRA,VR0 ;
  6467. % EXI XRA,MMVC,OUTMESS,0(VR1),*-*,INCR=YES,DECR=YES ;
  6468. % LA VR1,OUTMESS ; % SET UP BUFFER
  6469. % AR VR1,XRA ;
  6470. % LH XRA,DSNLEN ;
  6471. % L XRB,DSNADD ;
  6472. % EXI XRA,MMVC,0(VR1),0(XRB),*-*,INCR=YES,DECR=YES ;
  6473. % AR VR0,XRA ; % GET LENGHT
  6474. % LA VR1,OUTMESS ;
  6475. END;
  6476. 20: BEGIN  % NO MATCHING ENTRIES FROM WILD CARD
  6477. ERRORCON 'No matches in catalog for wildcard';
  6478. END;
  6479. ENDCASE ELSE
  6480. BEGIN  % ILLEGAL RETURN
  6481. ERRORCON 'Illegal data set name return';
  6482. END;
  6483. IF <RZ VRF> THEN BEGIN
  6484. LOCATE DATASET;  % DOES IT EXIT
  6485. IF <RZ VRF> THEN BEGIN  % DATASET EXISTS
  6486. IF ^<TF PDSF> THEN BEGIN  % PDS MUST EXIST
  6487. IF <TF SERVERF> THEN BEGIN
  6488. ERRORCON 'Data set exists - in server mode this causes termination';
  6489. CCALL ERRPACK,A;  % PUT IN OUTPUT BUFFER
  6490. MMVC TEMP,=C'NO',2;  % MAKE NEXT SECTION ABORT
  6491. END  % OF SERVER FUNCTION
  6492. ELSE BEGIN  % NON SERVER
  6493. WRTERM 'Data set exists - reply "YES" to destroy old file ';
  6494. TGET TEMP,3;
  6495. MTR TEMP,UPPER,3;  % UPSHIFT IT
  6496. END;  % OF NON SERVER
  6497. IF <MCLC TEMP,=C'YES',3> THEN BEGIN
  6498.  
  6499. SCRATCH DELDSN;  % DESTROY THE DATA SET
  6500.  
  6501. CATALOG UNCAT;  % UNCATALOGE IT
  6502. ZR VRF;  % GOOD RETURN
  6503. END  % OF NON PDS
  6504.  
  6505. ELSE BEGIN
  6506. ERRORCON 'Data set already exists';
  6507. CCALL ERRPACK,A;
  6508. MVI STATE,SESTATE;  % ABORT
  6509. LI VRF,4;  % ERROR RETURN
  6510. END;
  6511. END  % OF DELETION
  6512. ELSE BEGIN
  6513.    % ABORT THE SUCKER
  6514. % MVI STATE,SESTATE;
  6515. LI VRF,0;  %  GOOD  PDS - DO BUILDL HERE
  6516. END;  % OF NO
  6517. END  % OF EXISTIN G DATA SET
  6518. ELSE BEGIN
  6519. IF <TF PDSF> THEN BEGIN  % PDS'S MUST EXIST
  6520. ERRORCON 'PDS directory must exist - will create member -'_
  6521.          'must abort';
  6522. IF <TF SERVERF> THEN CCALL ERRPACK,A ELSE TPUT (VR1),(VR0);
  6523. MVI STATE,SESTATE;
  6524. LI VRF,4;  % NO GOOD
  6525. END  % PDS
  6526.  
  6527. ELSE ZR VRF;  % GOOD RETURN FOR NON-EXISTENT DATA SET
  6528. END;  % NON EXISTENT DATA SET
  6529. END  % GOOD VRF
  6530. ELSE BEGIN  % BAD DSN
  6531. CCALL ERRPACK,A;
  6532. END;
  6533. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6534.  
  6535. CEXIT VRE,HIGHR;
  6536. OUTMESS: DS CL92 ;
  6537. LTORG;
  6538. EXORG;
  6539.  
  6540. SUBTITLE 'KGETBUFF';
  6541.  
  6542. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6543. %
  6544. %     MODULE NAME   -   KGETBUFF
  6545. %
  6546. %
  6547. %     FUNCTION-   TAKES DATA VR1-> DATA
  6548. %            VR0=LENGTH    SEARCHES FOR QUOTE CHARACTES
  6549. %           UPDATES OUTPUT BUFFER, CALLS PUTEM WHICH WRITES FILE
  6550. %          AND PLACES ITEMS IN BUFFER
  6551. %     INPUTS -
  6552. %
  6553. %
  6554. %
  6555. %
  6556. %     OUTPUTS-
  6557. %
  6558. %
  6559. %     RETURN
  6560. %
  6561. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6562. KGETBUFF: ;
  6563. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6564.  
  6565.  
  6566. ST VR1,RDATAADD;
  6567. STH VR0,RDATALEN;
  6568.  
  6569. UNTIL <MCLC RDATALEN,=X'0000'> DO BEGIN
  6570.  
  6571. L XRB,RDATAADD;
  6572. LR VR1,XRB;
  6573. LH XRE,RDATALEN;
  6574. ZR XRA;  % ZERO FOR CASE IF NONE FOUND
  6575.  
  6576. EXI XRE,MTRT,0(XRB),RECTABLE,*-*,DECR=YES,INCR=YES;
  6577.  
  6578. % SEARCH FOR CONTROL CHARACTERS
  6579.  
  6580. CASELOOP: DO BEGIN
  6581. CASE XRA MAX CASEREPT MIN 0 CHECK;
  6582.  
  6583. 0: BEGIN  % MOVE EM ALL
  6584. LR VR0,XRE;
  6585. CCALL PUTEM,A;  % PUT ALL IN OUT BUFFER
  6586. MZC RDATALEN,2;  % ZERO COUNTER
  6587. END;
  6588.  
  6589. CASEQUO: BEGIN  % A QUOTE CHARACTER
  6590. IF ^<CR VR1,XRB> THEN MOVEALL;  % MOVE OTHER STUFF
  6591. %IF <MCLC RDATALEN,=X'0001',2> THEN <SF QUOFLAG; MZC RDATALEN,2>
  6592. DO BEGIN
  6593. AI VR1,1;  % POINT TO CHARACTER
  6594. IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
  6595. SELECT FIRST;
  6596. <CLI 0(VR1),X'4D'>: BEGIN
  6597. IF <MCLC 1(VR1),LFCR+2,2> |
  6598. <<CLI 1(VR1),X'26'> &  <MCLC 2(VR1),LFCR+2,2>> THEN BEGIN
  6599. CCALL WRITEFIL,A;
  6600. IF <CLI 1(VR1),X'26'> THEN DECRDATA VR0,5
  6601. ELSE DECRDATA VR0,4;
  6602. EXIT FROM CASELOOP;
  6603. END
  6604. ELSE BEGIN
  6605. CNTLLOC 0(VR1);  % PUT IT IN
  6606. ZR VR0;
  6607. LI VR0,1;
  6608. CCALL PUTEM,A;  % STICK IT IN BUFFER
  6609. IF <MCLC RDATALEN,=H'2',2> THEN SF CRFLAG ELSE ZF CRFLAG;
  6610. DECRDATA VR0,2;
  6611. EXIT FROM CASELOOP;
  6612. END;  % OF LFCR
  6613.  
  6614. END;
  6615. <CLI 0(VR1),X'4A'>: BEGIN
  6616. IF <TF CRFLAG> THEN BEGIN
  6617. LH VR0,BUFCNT;
  6618. SI VR0,1;  % CNTL LF LAST CHARACTER OMIT
  6619. STH VR0,BUFCNT;
  6620. CCALL WRITEFIL,A;
  6621. DECRDATA VR0,2;
  6622. EXIT FROM CASELOOP;
  6623. END
  6624. ELSE BEGIN
  6625. CNTLLOC 0(VR1);
  6626. LI VR0,1;
  6627. CCALL PUTEM,A;
  6628. DECRDATA VR0,2;
  6629. EXIT FROM CASELOOP;
  6630. END;  % OF ELSE
  6631.  
  6632. END;
  6633. <MCLC 0(VR1),TABCHAR#,1>:      BEGIN
  6634. IF <TF TABF> THEN BEGIN  % TAB FUNCTION
  6635.  
  6636.  
  6637. CCALL GETTABS,A;  % ROUTINE RETURNS NUMBER OF BLANKS NECESSARY
  6638. IF <RP VRF> THEN BEGIN
  6639. LR VR0,VRF;  % NUMBER OF BLANKS
  6640. CCALL PUTEM,A,VR1=ASCBLANK;  % PUT ASCII BLANKS IN FILE
  6641. END;  % OF TABBING EXISTS
  6642.  
  6643. DECRDATA VR0,2;  % DECREMENT BY TWO
  6644.  
  6645. EXIT FROM CASELOOP;
  6646.  
  6647. END;
  6648. END;  % OF SELECT
  6649.  
  6650. ENDSEL;
  6651. END;  % OF TEXT
  6652. SELECT FIRST;
  6653. <MCLC 0(VR1),QUOCHAR,1>: ;  % JUST DROP OUT CONTROL
  6654. <MCLC 0(VR1),BINQC,1>: ;  % DONT CNTL QUOTES
  6655. <MCLC 0(VR1),REPTCHAR,1>: DO IF ^<TF REPTF> THEN CNTLLOC 0(VR1);
  6656. ENDSEL
  6657.  
  6658. ELSE CNTLLOC 0(VR1);  % IT'S A CONTROL CHARACTER
  6659. LI VR0,1;
  6660. CCALL PUTEM,A;  % PUT IT IN BUFFER
  6661. AR VR1,VR0;
  6662. ST VR1,RDATAADD;  % NEW ADD ADDRESS
  6663. LH VR0,RDATALEN;
  6664. SI VR0,2;
  6665. STH VR0,RDATALEN;  % STORE OFF NEW LENGTH
  6666.  
  6667. END;  % OF ELSE SELECT
  6668. END;
  6669.  
  6670. CASE8BIT: BEGIN
  6671. IF ^<CR VR1,XRB> THEN MOVEALL;  % MOVE OTHER STUFF
  6672. EIGHTBLK: DO BEGIN
  6673. AI VR1,1;  % POINT TO CHARACTER
  6674. IF <MCLC DATA,=C'TEXT',4> THEN BEGIN
  6675. CCALL ATOE8BIT,A  ; % ERROR NO REAL HIGH ORDER BITS ON
  6676. DECRDATA VR0,1 ; %
  6677. EXIT FROM EIGHTBLK ; % LEAVE BLOCK
  6678. END ;
  6679.  
  6680. IF <MCLC 0(VR1),QUOCHAR,1> THEN BEGIN
  6681. IF <MCLC RDATALEN,=X'0003'; CC NL> THEN BEGIN
  6682. DECRDATA VR0,3;  % DECREMENT RDATA
  6683. AI VR1,1;
  6684. END
  6685. ELSE BEGIN
  6686. SF QUO8FLAG;
  6687. SF QUOFLAG;
  6688. MZC RDATALEN,2;  % OUTTA HERE
  6689. EXIT FROM CASELOOP;
  6690. END;  % OF ONLY 2 LEFT AND QUOTED
  6691. SELECT FIRST;
  6692. <MCLC 0(VR1),QUOCHAR,1>: ;  % JUST DROP OUT CONTROL
  6693. <MCLC 0(VR1),BINQC,1>: ;  % DONT CNTL QUOTES
  6694. <MCLC 0(VR1),REPTCHAR,1>: DO IF ^<TF REPTF> THEN CNTLLOC 0(VR1);
  6695. ENDSEL
  6696.  
  6697. ELSE CNTLLOC 0(VR1);  % IT'S A CONTROL CHARACTER
  6698. END  % OF QUOTE CHARACTER
  6699. ELSE BEGIN  % ANY OTHER CHARACTER DECR = 2
  6700. LH VR0,RDATALEN;
  6701. SI VR0,2;
  6702. STH VR0,RDATALEN;
  6703. END;
  6704. OI 0(VR1),X'80';  % OR TURN ON HIGH ORDER BIT
  6705. ZR VR0;
  6706. LI VR0,1;  % ONE CHARACTER
  6707. CCALL PUTEM,A;
  6708. AI VR1,1;  % INCREMENT TO NEXT
  6709. ST VR1,RDATAADD;  % POINTER TO NEX
  6710.  
  6711. END;  % OF ELSE
  6712. END;  % CASE8BIT
  6713.  
  6714. CASEREPT:   BEGIN  % REPEAT CHARACTER
  6715. IF <MCLC RDATALEN,=H'3'; CC L> THEN BEGIN  % NOT ENOUGH
  6716. WRTERM 'ERROR IN REPEAT COUNT IN RECEIVE';
  6717. END
  6718. ELSE BEGIN
  6719. IF ^<CR VR1,XRB> THEN MOVEALL;  % MOVE OTHER STUFF
  6720. AI VR1,1;  % POINT TO LENGTH CHARACTER
  6721. ZR VR0; IC VR0,0(VR1);
  6722. UNCHAR VR0;  % GET THE LENGTH
  6723. IF <CI VR0,94; CC H> | <RNP VR0> THEN BEGIN  % SIZE ERROR
  6724. WRTERM 'REPEAT COUNT TOO LARGE ON RECEIVE 94 MAXIMUM';
  6725. END;  % OF TOO LARGE
  6726. AI VR1,1;  % POINT TO NEXT
  6727. ZR XRA; LI XRA,3;  % DEFAULT LENGTH TO DECREMENT
  6728. ZF HIGHBITF;  % TURN OFF FLAG
  6729. SELECT;
  6730. <MCLC 0(VR1),BINQC,1>: BEGIN  % 8 BIT QUOTING
  6731. AI VR1,1;  % MOVE POINTER
  6732. AI XRA,1;  % DECREMENT LENGTH
  6733. SF HIGHBITF;  % SET 8 BIT INDICATOR
  6734. END;  % 8 BIT SELECT
  6735.  
  6736. <MCLC 0(VR1),QUOCHAR,1>: BEGIN  % A CNTRL CHARACTER
  6737. AI XRA,1;  % BUMP DECREMENT COUNTER
  6738. AI VR1,1;  % POINT TO CHARACTER
  6739. SELECT FIRST;
  6740. <CLI 0(VR1),X'7E'>: ;  % JUST DROP THROUGH DEL CHARACTER
  6741.  
  6742. <MCLC 0(VR1),QUOCHAR,1>: BEGIN  % JUST DROP OUT CONTROL
  6743. %IF <TF HIGHBITF> THEN CNTLLOC 0(VR1);  %
  6744. END;
  6745. <MCLC 0(VR1),BINQC,1>: BEGIN  % DONT CNTL QUOTES
  6746. %IF <TF HIGHBITF> THEN CNTLLOC 0(VR1);  %
  6747. END;
  6748. <MCLC 0(VR1),TABCHAR#,1>: BEGIN  % DONT CNTL QUOTES
  6749. IF ^<TF HIGHBITF> THEN BEGIN
  6750. IF <TF TABF> & <MCLC DATA,=C'TEXT',4> THEN BEGIN  % TAB FUNCTION
  6751. ZR XRB; LR XRB,VR0;  % LOAD COUNT FOR FOR STATEMENT
  6752. FOR XRB DO BEGIN  % LOOP THROUGH NUMBER OF TABS
  6753. CCALL GETTABS,A;  % ROUTINE RETURNS NUMBER OF BLANKS NECESSARY
  6754. IF <RP VRF> THEN BEGIN
  6755. LR VR0,VRF;  % NUMBER OF BLANKS
  6756. CCALL PUTEM,A,VR1=ASCBLANK;  % PUT ASCII BLANKS IN FILE
  6757. END;  % OF TABBING EXISTS
  6758. END;  % OF FOR LOOP FOR XRB TIMES
  6759. DECRDATA VR0,4;  % DECREMENT BY TWO
  6760.  
  6761. EXIT FROM CASELOOP;
  6762.  
  6763. END
  6764. ELSE CNTLLOC 0(VR1);  % CONTROL IT
  6765. END  % OF NON HIGH ORDER ON
  6766. ELSE CNTLLOC 0(VR1);  % CONTROL IT
  6767. END;  % END OF TAB
  6768. <MCLC 0(VR1),REPTCHAR,1>: DO IF ^<TF REPTF> THEN CNTLLOC 0(VR1);
  6769. ENDSEL
  6770. ELSE CNTLLOC 0(VR1);  % CONTROL IT
  6771. END;  % OF SECOND SELECT
  6772.  
  6773. ENDSEL;
  6774. IF <TF HIGHBITF> THEN BEGIN  % TURN ON HIGH BIT
  6775. IF ^<MCLC DATA,=C'TEXT',4> THEN OI 0(VR1),X'80'  % TURN ON HIGH BIT
  6776. ELSE CCALL ATOE8BIT,A;
  6777. END;  % CHECK FOR CONVERSION ERRORS
  6778. SELECT FIRST;
  6779. <CI XRA,3>: DECRDATA XRA,3;  % 3 CHARACTERS
  6780. <CI XRA,4>: DECRDATA XRA,4;  % 4 CHARACTERS
  6781. <CI XRA,5>: DECRDATA XRA,5;  % 5 CHARACTERS
  6782. ENDSEL;
  6783. LR XRA,VR0;  % LENGTH TO REPEAT
  6784. IF <RP XRA> THEN BEGIN
  6785. SI XRA,1;  % ONE LESS CAUSE ALREADY USED ONE
  6786. MMVC REPTBUFF,0(VR1),1;  % PUT IN FIRST CHARACTER
  6787. EXI XRA,MMVC,REPTBUFF+1,REPTBUFF,*-*,DECR=YES;  % PUT IN REPEATS
  6788. CCALL PUTEM,A,VR1=REPTBUFF;  % PUT EM IN OUTPUT BUFFER
  6789.  
  6790. END;
  6791. END;  % OF LONG ENOUGH
  6792. EXIT FROM CASELOOP;
  6793. END;  % OF REPEAT CASE
  6794.  
  6795.  
  6796. ENDCASE
  6797. ELSE BEGIN
  6798. WRTERM ' ERROR IN GETBUF SUB CASE ';
  6799. END;
  6800. END;  % OF CASE LOOP
  6801.  
  6802. LH VR0,RDATALEN;  % PICK UP LENGTH
  6803. END;  % OF UNTIL 0 DATA
  6804. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6805.  
  6806. CEXIT VRE,HIGHR;
  6807. LTORG;
  6808. EXORG;
  6809.  
  6810. %    SOME EQUATES
  6811. CASEQUO:    EQU  4;  % HASH FOR TABLE
  6812. CASE8BIT:    EQU  8;  % HASH FOR TABLE 8BIT
  6813. CASEREPT:    EQU  12;  % HASH FOR REPEAT CHARACTER
  6814. SUBTITLE 'PUTEM ';
  6815. %%%%%%%%%%%%%%%%%%%%%%%%%%
  6816. %   MODULE PUTEM
  6817. %%%%%%%%%%%%%%%%%%%%%%%%%%
  6818.  
  6819. PUTEM:
  6820. CENTER VRE,HIGHR,ENTRY=NO;
  6821.  
  6822. IF <TF QUO8FLAG> THEN <OI 0(VR1),X'80'; ZF QUO8FLAG>;  % QUOTE LAST
  6823. LR XRA,VR0;  % LOAD FOR EXECUTE AND LATER
  6824. L XRB,ADDBUF;  % ADDRESS OF BUFFER
  6825. AH XRB,BUFCNT;  % INCREMENT INTO BUFFER
  6826.  
  6827. LR XRE,VR0;  % LENGTH IF TOO LONG
  6828. DO BEGIN
  6829. IF <CLI XRE,255; CC H> THEN <LI XRA,255; SI XRE,255>
  6830. ELSE <LR XRA,XRE; ZR XRE;>;
  6831.  
  6832.  
  6833. EXI XRA,MMVC,0(XRB),0(VR1),*-*,INCR=YES,DECR=YES;
  6834.  
  6835. IF <MCLC DATA,=C'TEXT',4>  THEN  BEGIN
  6836. L XRC,ATOEVCON;
  6837. EXI XRA,MTR,0(XRB),0(XRC),*-*,INCR=YES,DECR=YES;  % TRANSLATE IT
  6838. END;  % OF TEXT
  6839. END;  % OF TRANSLATES
  6840. LR XRA,VR0;  % RESTORE
  6841. AH XRA,BUFCNT;  % INCREMENT BUFFER COUNTER
  6842.  
  6843. STH XRA,BUFCNT;
  6844.  
  6845. %SELECT FIRST;
  6846. IF <CH XRA,MAXWRITE; CC H> THEN  BEGIN  % MORE CHAR THAN LRECL SIZE
  6847.  
  6848. % IF BINARY WRITE - IF TEXT TRUNCATION ONLY RIGHT ON REQUEST
  6849.  
  6850. %IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
  6851. MMVC BUFCNT,MAXWRITE,2;  % WRITE MAXWRITE'S WORTH
  6852. CCALL WRITEFIL,A;  % OUTPUT THE RECORD
  6853. SH XRA,MAXWRITE;  % GET REMAINDER
  6854. L XRB,ADDBUF;
  6855. LR VR1,XRB;  % SET UP FOR MOVE
  6856. AH XRB,MAXWRITE;  % INDEX FOR MOVE
  6857. EXI XRA,MMVC,0(VR1),0(XRB),*-*,INCR=YES,DECR=YES;
  6858. % SH XRA,LRECL;  % SUB OFF LRECL
  6859. STH XRA,BUFCNT;  % UPDATE BUF COUNTER
  6860. %END;  % OF BINARY - TEXT JUST FALLS THROUGH
  6861. %
  6862. END;  % OF MORE CHARACTERS
  6863.  
  6864. %<CH XRA,MAXWRITE; CC =>: BEGIN  % MAXWRITE EQUALS CHARACTERS
  6865. %
  6866. %%IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
  6867. %CCALL WRITEFIL,A;  % OUTPUT THE RECORD
  6868. %MZC BUFCNT,2;  % ZERO COUNTER
  6869. %%END;  % OF BINARY - TEXT JUST FALLS THROUGH
  6870. %END;  % OF EQUAL SELECT
  6871. %
  6872. %<CH XRA,MAXWRITE; CC L>: ;  % NO OP JUST FALL THRU
  6873.  
  6874. %ENDSEL;
  6875. CEXIT VRE,HIGHR;
  6876. LTORG;
  6877. EXORG;
  6878. SUBTITLE 'OPENSDSN';
  6879. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6880. % MODULE : OPENSDSN
  6881. % FUNCTION :   OPENS AND ALLOCATES THE DATA SET KERIN
  6882. %              CALLED BY SEND FUNCTIONS
  6883. % INPUT:       NONE
  6884. %
  6885. %
  6886. % OUTPUT :     VRF=0 GOOD OPEN, VRF=4 ERROR
  6887. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6888. OPENSDSN:
  6889. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6890. KINBLCK: DO BEGIN
  6891.  
  6892. MMVC KERMDDNM,=C'KERIN   ',8;  % SET UP DDNAME
  6893. IF ^<TF PDSF> THEN  BEGIN  % A REGULAR DATA SET
  6894.    DALLIST BEGIN,MF=(E,KFILEIN),INIT=NO; BEGIN
  6895.       DALLIST TEXT,DALDDNAM,(KERMDDNM,8);  % DDNAME
  6896.       DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE);  % DSNAME
  6897.       DALLIST TEXT,DALSTATS,(X'08',1,'STC');  % STATUS SHARE
  6898.       DALLIST END; END;
  6899.       END
  6900.       ELSE  BEGIN  % A PDS MEMBER
  6901.    DALLIST BEGIN,MF=(E,KFPDSIN),INIT=NO; BEGIN
  6902.       DALLIST TEXT,DALDDNAM,(KERMDDNM,8);  % DDNAME
  6903.       DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE);  % DSNAME
  6904.       DALLIST TEXT,DALSTATS,(X'08',1,'STC');  % STATUS SHARE
  6905.       DALLIST TEXT,DALMEMBR,(DSMEMBER,8);  % MEMBER NAME
  6906.       DALLIST END; END;
  6907.       END;  % PDS
  6908. ST VRF,DACKRC;  % RETURN CODE FROM ALLOCATE
  6909.    IF <RNZ VRF> THEN BEGIN  % ERROR IN ALLOCATION?
  6910. IF <TF PDSF> THEN L VR1,KFPDSIN
  6911. ELSE L VR1,KFILEIN;  % POINT TO DYNAL BLOCK
  6912. IF <CI VRF,16> & <MCLC 4(VR1),=X'035C0002',4> THEN BEGIN
  6913. ERRORCON 'Non-Standard MVS data set name' ;
  6914. CCALL ERRPACK,A ;
  6915. MVI STATE,ASTATE ;
  6916. IF ^<TF SERVERF> THEN TPUT (VR1),(VR0) ;
  6917. END
  6918. ELSE CCALL DYNERR,A;  % CALL ERROR ROUTINE
  6919.  
  6920. EXIT FROM KINBLCK;
  6921.       END;
  6922. DATA BEGIN  % DYNAMIC ALLOCATION PARAMETER LIST FOR INPUT DATA SET
  6923.  
  6924.       KFILEIN:
  6925.       DALLIST BEGIN,S99VRBAL,_
  6926.       FLAGS1=(S99NOMNT),_
  6927.       ERROR=KERMERR,INFO=KERMINFO,MF=L; BEGIN
  6928.          DALLIST TEXT,DALDDNAM,(,8);  % DDNAME
  6929.          DOUDSNAM:
  6930.          DALLIST TEXT,DALDSNAM,(,DSNSIZE);  % DSNAME
  6931.          DALLIST TEXT,DALSTATS,X'08';  % STATUS
  6932.          DALLIST END; END;
  6933.       KFPDSIN:
  6934.       DALLIST BEGIN,S99VRBAL,_
  6935.       FLAGS1=(S99NOMNT),_
  6936.       ERROR=KPDSERR,INFO=KPDSINFO,MF=L; BEGIN
  6937.          DALLIST TEXT,DALDDNAM,(,8);  % DDNAME
  6938.          DALLIST TEXT,DALDSNAM,(,DSNSIZE);  % DSNAME
  6939.          DALLIST TEXT,DALSTATS,X'08';  % STATUS
  6940.         DALLIST TEXT,DALMEMBR,(,8);  % PDS MEMBER
  6941.          DALLIST END; END;
  6942.       END;
  6943.  
  6944. % MAKE SURE NON EDIT FORMAT
  6945.  
  6946. IF <MCLC DATA,=C'BINARY',6> THEN BEGIN
  6947. CALL EDSET,(EDCNTRL,EDRETURN,SIX,TWO,TEMP,EDLEN);
  6948.  
  6949. END ;
  6950. CALL EDOPEN,(EDCNTRL,EDRETURN,KERMDDNM,ONE);
  6951. IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN  % FILE OPEN FAIL
  6952. ZF SENDDSNF;  % INDICATE NOT OPEN
  6953. CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
  6954. L VR0,EDLENACT;
  6955. CCALL ERRPACK,A,VR1=EDLINE;  % OUTPUT IT
  6956. LI VRF,4;  % ABORT IT
  6957. EXIT FROM KINBLCK;
  6958. END
  6959. ELSE SF SENDDSNF;  % OPEN INDICATOR
  6960. ZF KINEOF;  % END OF FILE INDICATOR
  6961. CALL EDSHOW,(EDCNTRL,EDRETURN,ONEOONE,TEMP,EDLINE,EDLMAX2,EDLENACT);
  6962.  
  6963. SELECT FIRST;
  6964. <CLI EDLINE,C'V'>: MVI RRECFM,C'V';
  6965. <CLI EDLINE,C'F'>: MVI RRECFM,C'F';
  6966. <CLI EDLINE,C'U'>: MVI RRECFM,C'U';
  6967. ENDSEL
  6968. ELSE BEGIN
  6969.  
  6970. ERRORCON '  Only V, U  and F RECFM supported  ';
  6971. CCALL ERRPACK,A;  % PUT IN BUFFER
  6972. MVI STATE,ASTATE;  % ABORT IT
  6973. LI VRF,4;  % ERROR
  6974.  
  6975. END;  % ELSE SELECT
  6976. ZR VRF;  % INDICATE A GOOD OPEN
  6977. END;  % OF KINBLCK
  6978. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  6979.  
  6980. CEXIT VRE,HIGHR;
  6981. LTORG;
  6982. EXORG;
  6983.  
  6984.  
  6985.  
  6986. SUBTITLE 'OPENRDSN';
  6987. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6988. % MODULE : OPENRDSN
  6989. % FUNCTION :   OPENS   DATA SET KEROUT FOR DOWNLOAD TO MICRO
  6990. %              GETS SPACE FOR FILE BUFFER
  6991. % INPUT:       OPENS DSNAME AND IF PDS DSMEMBER
  6992. %
  6993. %
  6994. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6995. OPENRDSN:
  6996. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  6997.  
  6998. OPENOBLK: DO BEGIN  % BLOCK TO FALL OUT OF
  6999. MMVC KERMDDNM,=C'KEROUT  ',8;  % SET UP DDNAME
  7000.  
  7001. IF ^<TF PDSF> THEN BEGIN  % NON PDS
  7002.  
  7003. LH VR0,LRECL;
  7004. ST VR0,TEMP;
  7005. CALL EDSET,(EDCNTRL,EDRETURN,ONE,TEMP,TEMP,EDLEN);  % LRECL
  7006. LH VR0,BLKSIZE;
  7007. ST VR0,TEMP;
  7008. CALL EDSET,(EDCNTRL,EDRETURN,TWO,TEMP,TEMP,EDLEN);  % BLKSIZE
  7009. IF <TF EDITF> & ^<MCLC DATA,=C'BINARY',6> THEN BEGIN
  7010. CALL EDSET,(EDCNTRL,EDRETURN,SIX,ONE,TEMP,EDLEN);
  7011. END
  7012. ELSE  % NON EDIT FORMAT
  7013. CALL EDSET,(EDCNTRL,EDRETURN,SIX,TWO,TEMP,EDLEN);
  7014. IF <CLI RFM,C'U'> | <CLI RFM+1,C' '>  THEN  % UNDEFINED OR UNBLOCKED
  7015. CALL EDSET,(EDCNTRL,EDRETURN,ONEOONE,TEMP,RFM,ONE)
  7016. ELSE  CALL EDSET,(EDCNTRL,EDRETURN,ONEOONE,TEMP,RFM,TWO);
  7017.  
  7018. % CALL EDNGEN,(EDCNTRL,EDRETURN,TWO,ONE,ONE);  %
  7019. END;  % ON NON PDS
  7020. LOCATE DATASET;  % DOES IT EXIST
  7021. IF <RZ VRF> THEN BEGIN  % DATASET EXISTS
  7022. IF ^<TF PDSF> THEN BEGIN
  7023. ERRORCON 'Data set already exists';
  7024. CCALL ERRPACK,A;
  7025. MVI STATE,SESTATE;
  7026. EXIT FROM OPENOBLK;  % NO FILE
  7027. END;  % ON NON PDS
  7028. END;  % OF NO
  7029. IF <TF PDSF> THEN BEGIN
  7030. MVI OUTSTATS,X'01';  % ANOLD VOLUME
  7031. MVI OUTNDISP,X'08';  % DISPOSITION CATALOG
  7032. MVI OUTCDISP,X'08';  % DISPOSITION KEEP
  7033. END
  7034. ELSE BEGIN
  7035. MVI OUTSTATS,X'04';  % A NEW VOLUME
  7036. MVI OUTNDISP,X'02';  % DISPOSITION CATALOG
  7037. MVI OUTCDISP,X'02';  % DISPOSITION CATALOG
  7038. END;
  7039. IF <MCLC DATA,=C'BINARY'> THEN BEGIN  % NO LINE NUMBERS
  7040. CALL EDNCOL,(EDCNTRL,EDRETURN,ONE,EDCOL1,EDCOL2);
  7041. END  % OF BINARY FILE
  7042. ELSE BEGIN  % TEXT FILE
  7043. IF ^<TF EDITF> THEN
  7044. CALL EDNCOL,(EDCNTRL,EDRETURN,EDTYPE,EDCOL1,EDCOL2);
  7045. IF ^<MCLC EDTYPE,ONE,4> THEN BEGIN
  7046.  
  7047. CALL EDNGEN,(EDCNTRL,EDRETURN,TWO,ONETHOU,ONETHOU);
  7048. END;
  7049. END;  % OF TEXT FILE
  7050. CCALL KRDYNAL,A;  % CALL DYNAL SUB
  7051.  
  7052. IF <RNZ VRF> THEN BEGIN  % ERROR IN DYNAL
  7053. MVI STATE,SESTATE;
  7054. EXIT FROM OPENOBLK;  % NONE ZERO PROBLEM
  7055. END;  % OF DYNAL ERROR
  7056.  
  7057.  
  7058. CALL EDOPEN,(EDCNTRL,EDRETURN,KERMDDNM,ONEOONE);  % OUTPUT
  7059. IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN  % FILE OPEN FAIL
  7060. CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
  7061. L VR0,EDLENACT;  % LENGTH OF MESSAGE
  7062. CCALL ERRPACK,A,VR1=EDLINE;  % PUT IN OUTPUT BUFFER
  7063. MVI STATE,SESTATE;  % ABORT IT
  7064. EXIT FROM OPENOBLK;
  7065. END
  7066. ELSE SF RECVDSNF;  % OPEN FLAG INDICATOR
  7067.  
  7068. CALL EDSHOW,(EDCNTRL,EDRETURN,ONEOONE,TEMP,EDLINE,EDLMAX2,EDLENACT);
  7069. MMVC RRECFM,EDLINE,1;  % RETURNED REC FORMAT
  7070.  
  7071. CALL EDSHOW,(EDCNTRL,EDRETURN,THREE,TEMP,EDLINE,EDLMAX2,EDLENACT);
  7072. MMVC MAXWRITE,TEMP+2,2;  % SIZE OF BUFFER
  7073.  
  7074. AI XRA,200;  % EXTRA SPACE FOR BUFFER
  7075.  
  7076. GETMAIN RC,LV=32777,SP=7;  % GET MAIN FOR WORKBUFFER
  7077.  
  7078. IF <RNZ VRF> THEN BEGIN
  7079.  
  7080. ERRORCON ' GET MAIN ERROR - NO ENOUGH REGION FOR RECEIVE BUFFER ';
  7081. CCALL ERRPACK,A;
  7082. MVI STATE,SESTATE;
  7083. END;  % OF FAILED GETMAIN
  7084.  
  7085. ST VR1,ADDBUF;  % ADDRESS OF STORAGE
  7086.  
  7087. END;  % OF OPENOBLK
  7088.  
  7089. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  7090. CEXIT VRE,HIGHR;
  7091. LTORG;
  7092. SUBTITLE 'KRDYNAL';
  7093. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7094. %   MODULE - R DYNAL
  7095. %   FUNCTION - PERFORMS DYNAMIC ALLOCATION
  7096. % FOR RECEIVE MODULE
  7097. %
  7098. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7099. %
  7100. KRDYNAL:
  7101.  
  7102. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7103. ZR VRF;  % ZERO REGISTER
  7104. IF <TF PDSF> THEN BEGIN  % WE HAVE A PDS
  7105. MZC LTRK,4;  % TRACKS
  7106. MZC LPRIME,4;
  7107. MZC LSECND,4;
  7108. MZC LRLSE,4;
  7109. MZC LVLSER,4;
  7110. MMVC PDSMEM1,PDSMEM2,4;  % INDICATE MEMBER
  7111. MMVC PDSORG1,PDSORG2,4;
  7112. END  % OF PDS
  7113. ELSE BEGIN
  7114. MZC PDSMEM1,4;  % INDICATE NO MEMBER
  7115. MZC PDSORG1,4;
  7116. MMVC LTRK,TTRK,4;  % TRACKS
  7117. MMVC LPRIME,TPRIME,4;
  7118. MMVC LSECND,TSECND,4;
  7119. MMVC LRLSE,TRLSE,4;
  7120. L XRA,TMPDISKA;
  7121. LH XRB,TMPDISKL;
  7122. LA VR1,VOLUME;
  7123. IF <EXI XRB,MCLC,0(XRA),0(VR1),*-*,INCR=YES,DECR=YES> THEN BEGIN
  7124. AR VR1,XRB;  % POINT TO END
  7125. LI XRC,6;  % VOL LENGTH
  7126. SR XRC,XRB;  % REMAINING BLANKS
  7127. IF <EXI XRC,MCLC,0(VR1),BLANKS,*-*,INCR=YES,DECR=YES> THEN
  7128. MZC LVLSER,4      % LET SYSTEM FIND THE VOLUME
  7129. ELSE MMVC LVLSER,TVLSER,4;
  7130. END
  7131. ELSE MMVC LVLSER,TVLSER,4;
  7132. END;  % OF NON PDS
  7133. DO BEGIN
  7134.    DALLIST BEGIN,MF=(E,NOVOL),INIT=NO; BEGIN  % LET SYSTEM SELECT
  7135.       DALLIST TEXT,DALDDNAM,(KERMDDNM,8);  % DDNAME
  7136.       DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE);  % DSNAME
  7137.       DALLIST TEXT,DALMEMBR,(DSMEMBER,8);  % MEMBER NAME
  7138. %      DALLIST TEXT,DALUNIT,(OUTUNIT,8);  % UNIT ADDRESS
  7139.       DALLIST TEXT,DALSTATS,(OUTSTATS,1);  % STATUS
  7140.       DALLIST TEXT,DALNDISP,(OUTNDISP,1);  % NORMAL DISPOSITION
  7141.       DALLIST TEXT,DALCDISP,(OUTCDISP,1);  % CONDITIONAL DISPOSITION
  7142.       DALLIST TEXT,DALTRK,MF=L;  % SPACE IN TRACKS
  7143.       DALLIST TEXT,DALPRIME,(TRACK+1,3);  % PRIMARY SPACE
  7144.       DALLIST TEXT,DALSECND,(TRACK+1,3);  % SECONDARY SPACE
  7145.       DALLIST TEXT,DALRLSE,MF=L;  % RELEASE UNUSED SPACE (RLSE)
  7146.       DALLIST TEXT,DALRTVOL,(,6);  % VOLUME SERIAL NUMBER IS TO BE
  7147.       DALLIST TEXT,DALDSORG,(PO,2);
  7148.       DALLIST TEXT,DALVLSER,(VOLUME,6);  % VOLUME SERIAL NUMBER
  7149.       DALLIST END; END;
  7150.       END;
  7151.  
  7152. ST VRF,DACKRC;  % RETURN CODE FROM ALLOCATE
  7153.    DATA BEGIN  % DYNAMIC ALLOCATION PARAMETER LIST FOR OUTPUT DATA SET
  7154.  
  7155.       NOVOL:
  7156.       DALLIST BEGIN,S99VRBAL,_
  7157.       FLAGS1=(S99NOMNT),_
  7158.       ERROR=DEFERR,INFO=DEFINFO,MF=L; BEGIN
  7159.          DALLIST TEXT,DALDDNAM,(,8);  % DDNAME
  7160.          DALLIST TEXT,DALDSNAM,(,DSNSIZE);  % DSNAME
  7161. PDSMEM1:
  7162.         DALLIST TEXT,DALMEMBR,(,8);  % PDS MEMBER
  7163. %         DALLIST TEXT,DALUNIT,(,8);  % UNIT ADDRESS
  7164.          DALLIST TEXT,DALSTATS,(,1);  % STATUS
  7165.          DALLIST TEXT,DALNDISP,(,1);  % NORMAL DISPOSITION
  7166.          DALLIST TEXT,DALCDISP,(,1);  % CONDITIONAL DISPOSITION
  7167. LTRK:   % TRACKS
  7168.          DALLIST TEXT,DALTRK;  % SPACE IN TRACKS
  7169. LPRIME:
  7170.          DALLIST TEXT,DALPRIME,(,3);  % PRIMARY SPACE
  7171. LSECND:
  7172.          DALLIST TEXT,DALSECND,(,3);  % SECONDARY SPACE
  7173. LRLSE:
  7174.          DALLIST TEXT,DALRLSE,MF=L;  % RELEASE UNUSED SPACE (RLSE)
  7175. RECVOL:
  7176.          DALLIST TEXT,DALRTVOL,(,6);  % RETURN VOLUME SERIAL
  7177. PDSORG1:
  7178.         DALLIST TEXT,DALDSORG,(,2);
  7179. LVLSER:
  7180.          DALLIST TEXT,DALVLSER,(,6);  % VOLUME SERIAL NUMBER
  7181.          DALLIST END; END;
  7182.       END;
  7183. MMVC TSOVOL,RECVOL+6,6;  % RETURNED VOLUME NAME
  7184.  
  7185. %END;  % OF DEFAULT
  7186. DATA BEGIN  % A SPECIFIC VOLUME
  7187. DO BEGIN
  7188.    DALLIST BEGIN,MF=(E,MOVEOUT),INIT=NO; BEGIN
  7189.       DALLIST TEXT,DALDDNAM,(KERMDDNM,8);  % DDNAME
  7190.       DALLIST TEXT,DALDSNAM,(DSNAME,DSNSIZE);  % DSNAME
  7191.       DALLIST TEXT,DALMEMBR,(DSMEMBER,8);  % MEMBER NAME
  7192. %      DALLIST TEXT,DALUNIT,(OUTUNIT,8);  % UNIT ADDRESS
  7193.       DALLIST TEXT,DALVLSER,(VOLUME,6);  % VOLUME SERIAL NUMBER
  7194.       DALLIST TEXT,DALSTATS,(OUTSTATS,1);  % STATUS
  7195.       DALLIST TEXT,DALNDISP,(OUTNDISP,1);  % NORMAL DISPOSITION
  7196.       DALLIST TEXT,DALCDISP,(OUTCDISP,1);  % CONDITIONAL DISPOSITION
  7197.       DALLIST TEXT,DALTRK,MF=L;  % SPACE IN TRACKS
  7198.       DALLIST TEXT,DALPRIME,(TRACK+1,3);  % PRIMARY SPACE
  7199.       DALLIST TEXT,DALSECND,(TRACK+1,3);  % SECONDARY SPACE
  7200.       DALLIST TEXT,DALRLSE,MF=L;  % RELEASE UNUSED SPACE (RLSE)
  7201.       % FROM DATA SET ASSOCIATED WITH THIS DDNAME
  7202.       % RETURNED
  7203.       DALLIST END; END;
  7204.       END;
  7205.  
  7206. ST VRF,DACKRC;  % RETURN CODE FROM ALLOCATE
  7207.    DATA BEGIN  % DYNAMIC ALLOCATION PARAMETER LIST FOR OUTPUT DATA SET
  7208.  
  7209.       MOVEOUT:
  7210.       DALLIST BEGIN,S99VRBAL,_
  7211.       FLAGS1=(S99NOMNT),_
  7212.       ERROR=MOUTERR,INFO=MOUTINFO,MF=L; BEGIN
  7213.          DALLIST TEXT,DALDDNAM,(,8);  % DDNAME
  7214.          DALLIST TEXT,DALDSNAM,(,DSNSIZE);  % DSNAME
  7215. PDSMEM2:
  7216.         DALLIST TEXT,DALMEMBR,(,8);  % PDS MEMBER
  7217. %         DALLIST TEXT,DALUNIT,(,8);  % UNIT ADDRESS
  7218. TVLSER:
  7219.          DALLIST TEXT,DALVLSER,(,6);  % VOLUME SERIAL NUMBER
  7220.          DALLIST TEXT,DALSTATS,(,1);  % STATUS
  7221.          DALLIST TEXT,DALNDISP,(,1);  % NORMAL DISPOSITION
  7222.          DALLIST TEXT,DALCDISP,(,1);  % CONDITIONAL DISPOSITION
  7223. TTRK:
  7224.          DALLIST TEXT,DALTRK;  % SPACE IN TRACKS
  7225. TPRIME:
  7226.          DALLIST TEXT,DALPRIME,(,3);  % PRIMARY SPACE
  7227. TSECND:
  7228.          DALLIST TEXT,DALSECND,(,3);  % SECONDARY SPACE
  7229. TRLSE:
  7230.          DALLIST TEXT,DALRLSE,MF=L;  % RELEASE UNUSED SPACE (RLSE)
  7231. PDSORG2:
  7232.         DALLIST TEXT,DALDSORG,(,2);
  7233.          DALLIST END; END;
  7234.       END;
  7235.  
  7236.  
  7237.  
  7238.  
  7239.  
  7240.  
  7241. END;
  7242.  
  7243. ST VRF,TEMP+4;
  7244. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  7245. ST VRF,DACKRC;  % RETURN CODE FROM ALLOCATE
  7246.    IF <RNZ VRF> THEN BEGIN  % ERROR IN ALLOCATION?
  7247. L VR1,NOVOL;
  7248.  
  7249. CCALL DYNERR,A;  % CALL ERROR SUB
  7250.  
  7251. %WRTERM 'Error in Dynamic Allocation REC CMD '_
  7252. %'Unable to allocate file  ';
  7253. %CVBTX TEMP,4,TEMP+4;
  7254. %VSEG KERMVA,'Dynamic reg 15 return ';
  7255. %VSEG KERMVA,TEMP,4;
  7256. %VOUT KERMVA;
  7257. %VSEG KERMVA,'The dynamic error code = ';
  7258. %CVBTX TEMP,4,MOUTERR;
  7259. %VSEG KERMVA,TEMP,4;
  7260. %VOUT KERMVA;
  7261. %VSEG KERMVA,'The dynamic info code = ';
  7262. %CVBTX TEMP,4,MOUTINFO;
  7263. %VSEG KERMVA,TEMP,4;
  7264. %VOUT KERMVA;
  7265. %MVI STATE,ASTATE;  % ABORT IT
  7266.       END;
  7267.  
  7268. RDYNEXIT: CEXIT VRE,HIGHR;
  7269. LTORG;
  7270. EXORG;
  7271. PDSORGTL:   DC     X'003C0001';
  7272. PO:        DC     X'0200';  % PARTIONED DS
  7273.  
  7274. SUBTITLE 'DYNERR';
  7275. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7276. %   MODULE - DYNERR
  7277. %   FUNCTION - CALLS MACROS FOR DYNAL ROUTINES
  7278. %   INPUT VR1-> DYNAL REQUEST BLOCK
  7279. %   OUTPUT SCREEN INFORMATION
  7280. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7281. DYNERR:
  7282. CENTER VRE,HIGHR,ENTRY=NO;
  7283.  
  7284. ST VR1,TEMP;  % STORE OFF REGS
  7285. VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;
  7286.    DALMSG DALLIST=TEMP,RC=DACKRC,MF=(E,DALMSG);  % OBTAIN TEXT OF
  7287. DATA BEGIN
  7288.  
  7289. DALMSG: DALMSG MSG1=DAIRMSG1,MSG1LEN=DAIRLEN1,MSG2=DAIRMSG2,_
  7290. MSG2LEN=DAIRLEN2,MF=L;  % PARAMETER LIST FOR OBTAINING DYNAMIC
  7291. END;  % OF DATA
  7292.    % DYNAMIC ALLOCATION ERROR MESSAGE
  7293.    LH VR0,DAIRLEN1;  % GET LENGTH OF FIRST MESSAGE
  7294. LR XRA,VR0;  % SAVE THE REGISTER
  7295.    IF <RP VR0> THEN BEGIN  % ANY MESSAGE PRESENT?
  7296. LA VR1,DAIRMSG1;
  7297. UNTIL <CLI 0(VR1),C' '> DO <SI VR0,1; AI VR1,1>;
  7298. UNTIL <CLI 0(VR1),C' '; CC NE> DO <SI VR0,1; AI VR1,1>;
  7299. CCALL ERRPACK,A;
  7300. %IF ^<TF SERVERF> THEN VOUT KERMVA,DAIRMSG1,(VR0);  % OF FIRST DYNAMIC
  7301. %STH XRA,STATLEN;  % STATUS ROUTINE
  7302. %LR XRA,VR0;  % STATUS REGISTER
  7303. %EXI XRA,MMVC,STATBUFF,DAIRMSG1,*-*,INCR=YES,DECR=YES;
  7304. %CCALL ERRPACK,A,VR1=STATBUFF;  % PUT IT IN ERROR PACK
  7305.       % ALLOCATION ERROR MESSAGE
  7306.       END;
  7307.    LH VR0,DAIRLEN2;  % GET LENGTH OF SECOND MESSAGE
  7308.    IF <RP VR0> THEN BEGIN  % ANY MESSAGE PRESENT?
  7309. %IF ^<TF SERVERF> THEN VOUT KERMVA,DAIRMSG2,(VR0);  %TEXT SECOND DYNAMIC
  7310.       % ALLOCATION ERROR MESSAGE
  7311.       END;
  7312.  
  7313. CEXIT VRE,HIGHR;
  7314. LTORG;
  7315. EXORG;
  7316. SUBTITLE 'WRITEFIL';
  7317. WRITEFIL:
  7318. CENTER VRE,HIGHR,ENTRY=NO;
  7319.  
  7320. %%%%%%%%%%%%%% PUT TO FILE
  7321. LH XRB,BUFCNT;  % NUMBER TO PUT
  7322.  
  7323.  
  7324. IF <RNM XRB> THEN BEGIN  % IF WE HAVE SOMETHING TO PUT
  7325. ST XRB,EDLEN;  % NUMBER OF CHARACTERS TO PUT
  7326. L XRA,ADDBUF;  % ADDRESS OF BUFFER
  7327.  
  7328. CALL EDPUT,(EDCNTRL,EDRETURN,EDLINEN,EDLINER,(XRA),EDLEN);
  7329.  
  7330. IF ^<MCLC EDRETURN,ZERO,4> THEN BEGIN  % FILE OPEN FAIL
  7331. CALL EDMSG,(EDCNTRL,EDRETURN,EDLINE,EDLMAX2,EDLENACT);
  7332. CCALL ERRPACK,A,VR1=EDLINE,VR0=L:EDLENACT;  % OUTPUT IT
  7333. END;
  7334.  
  7335. IF <OPENP DEBUG> THEN BEGIN
  7336. DATA  BEGIN
  7337. DBMSG1:  DC C'QSAM PUT';
  7338.          DS 4CL1;  % INCLUDE FOR WORD SIZE
  7339. DBMSG1L: EQU *-DBMSG1;
  7340. END;
  7341. ZR VR1;
  7342. LI VR1,DBMSG1L;
  7343. STH VR1,WRKBUFF;
  7344. MZC WRKBUFF+2,2;  % ZERO REST
  7345. MMVC WRKBUFF+4,DBMSG1,8;
  7346. PUT DEBUG,WRKBUFF;  % OUT PUT IT
  7347. AI XRB,4;  % INCLUDE FOUR FOR HEADER
  7348. LR VR1,XRB;  % RESTORE LENGTH
  7349. IF <CH VR1,DEBUG+(DCBLRECL-IHADCB); CC H> THEN
  7350. LH VR1,DEBUG+(DCBLRECL-IHADCB);
  7351. IF <CI VR1,255; CC H> THEN <LI VR1,255>;
  7352. EXI VR1,MMVC,BUF,(XRA),0,INCR=YES,DECR=YES;  % MOVE IT OVER
  7353. STH VR1,BUF-4;  % STORE OFF LENGTH
  7354. MZC BUF-2,2;
  7355. PUT DEBUG,BUF-4;
  7356. LR VR1,XRB;  % RESTORE LENGTH
  7357. END;  % OF DEBUG
  7358.  
  7359. END;  % OF SOMETHING TO PUYT
  7360.  
  7361. IF <MCLC DATA,=C'TEXT',4> THEN MZC BUFCNT,2;  % ZERO BUFFER COUNT
  7362. L VR1,ADDBUF;
  7363. ST VR1,BUFADD;
  7364.  
  7365.  
  7366. CEXIT VRE,HIGHR;
  7367. LTORG;
  7368. EXORG;
  7369.  
  7370. SUBTITLE 'KSPACK';
  7371. SPACK:   % SEND PACKET TO MICRO
  7372. CENTER VRE,HIGHR,ENTRY=NO;
  7373.  
  7374.  
  7375. LA XRC,SNDPKT;
  7376. USE XRC AS PACKET IN BEGIN  % ADRESSABLE DSECT
  7377.  
  7378. SPACKBLK: DO BEGIN
  7379.  
  7380. MMVC MARK,SSOH,1;  % MOVE IN SEND START OF HEADER
  7381.  
  7382.  
  7383. LENCALC XRB;  % CALCULATE THE LENGTH
  7384. CHAR XRB;
  7385. STC XRB,LEN;  % PUT IN LENGTH
  7386. UNCHAR XRB;  % NUMERIC
  7387. AI XRB,1;  % ONE MORE FOR THE LENGTH BYTE
  7388. SH XRB,BCCLEN;  % GET RID OF BCC FOR SUB
  7389. LR VR0,XRB;  % SET UP FOR SUB
  7390.  
  7391. CCALL BCCCALC,A,VR1=LEN;  % BCC COMPUTATION SUB
  7392.  
  7393. EXIT FROM SPACKBLK IF <C VRF,=X'FFFFFFFF'>;  % SOMETHING FUNNY
  7394.  
  7395. LENCALC XRB;  % LENGTH
  7396. AI XRB,2;  % INCLUDE FIRST TWO BYTES
  7397. LA VR1,PACKET;
  7398. SH VR1,BCCLEN;
  7399. AR VR1,XRB;  % ONE LESS
  7400. LH XRA,BCCLEN;  % LENGTH FOR STM
  7401.  
  7402. SI XRA,1;  % DECREMENT FOR EXECUTE
  7403. EX XRA,STOREBCC;  % ST BCC
  7404. L VRF,ATOEVCON;
  7405. EXI XRB,MTR,PACKET,0(VRF),*-*,DECR=YES,INCR=YES;  % TRANSLATE TO EBCIDIC
  7406.  
  7407. IF <OPENP DEBUG> THEN BEGIN  % DEBUGGING ON
  7408.  
  7409. MZC WRKBUFF,4;  % BLAST 1ST 4 BYTES
  7410. MVI WRKBUFF+1,20;
  7411. MMVC WRKBUFF+4,=C'TPUT SEND PACKET',16;
  7412.  
  7413. PUT   DEBUG,WRKBUFF;
  7414.  
  7415. AI XRB,4;  % BUMP LENGTH COUNTER TO INCLUDE HEADER
  7416.  
  7417. STH XRB,WRKBUFF;
  7418. EXI XRB,MVC,WRKBUFF+4(*-*),PACKET,DECR=YES,INCR=YES;
  7419.  
  7420. SI XRB,4;  % ADJUST LENGTH BACK TO ORIGINAL
  7421.  
  7422. PUT DEBUG,WRKBUFF;  % OUTPUT AGAIN
  7423.  
  7424. END;  % OF DEBUG BLOCK
  7425.  
  7426.  LA XRA,SNDPKT;
  7427.  AR XRA,XRB;  % LENGTH OF PACKET
  7428.  MMVC 0(XRA),SEOL,1;  % PUT ON EOL CHARACTER
  7429. L VRF,ATOEVCON; MTR 0(XRA),0(VRF),1;  % TRANSLATE TO EBCIDIC FOR TCAM
  7430.  AI XRB,1;  % BUMP LENGTH FOR PUT
  7431. IF <TF STURNRND> THEN BEGIN
  7432. STIMER WAIT,BINTVL=STURNTIM;
  7433. END;
  7434.  
  7435. TPUT SNDPKT,(XRB),CONTROL;  % THE BEEF
  7436.  
  7437. IF <RNZ VRF> THEN BEGIN
  7438.  
  7439. ERRORCON 'Error in Tput to Micro ';
  7440. CCALL ERRPACK,A;
  7441.  
  7442. END;  % OF ERROR OF TPUT
  7443. L VRF,ETOAVCON;
  7444. EXI XRB,TR,PACKET(*-*),0(VRF),DECR=YES,INCR=YES;  % TRANSLATE TO EBCIDIC
  7445.  
  7446. END;  % OF SPACKBLK
  7447. CEXIT VRE,HIGHR;
  7448. LTORG;
  7449. EXORG;
  7450. STOREBCC: MMVC 0(VR1),BCC,*-*;  % ST BCC
  7451. END;  % OF DSECT PACKET
  7452.  
  7453. SUBTITLE 'BCCCALC';
  7454. BCCCALC:   % BCC CHECKING ROUTINE
  7455.  
  7456. %  VR1 = PACKET ADDRESS
  7457. %  VR0 = PACKET LENGTH LESS BCC
  7458. %  VRF = BCC CHECK RETURN
  7459.  
  7460. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7461. LH XRA,BCCLEN;  % LEVEL CHECKING
  7462.  
  7463. ZR VRF;  % ZERO REG TO HOLD BCC
  7464.  
  7465. SELECT FIRST;
  7466. <CI XRA,1>: BEGIN  % LEVEL 1 BCC CHECKING
  7467.  
  7468. DO BEGIN
  7469. ZR XRB;
  7470. IC XRB,0(VR1);  % OFFSET 1 FOR MARK
  7471. AR VRF,XRB;  % BUMP ACCUMULATOR
  7472. AI VR1,1;  % INCREMENT
  7473. END FOR VR0;
  7474.  
  7475. ST VRF,TEMP;  % STORE OFF FOR ADD
  7476. N VRF,=X'000000C0';  % MOD 192
  7477. M VRE,ONE;  % CARRY OVER SIGN BIT
  7478. D VRE,O1H;  % MOD 64
  7479. A VRF,TEMP;  % ADD THE TWO VALUES
  7480. N VRF,MOD64;  % MOD 64
  7481.  
  7482. CHAR VRF;
  7483. STC VRF,BCC;  % STORE IT OFF
  7484.  
  7485.             END;  % LEVEL 1
  7486.  
  7487. <CI XRA,2>: BEGIN  % LEVEL 2 BCC CHECKING
  7488. %SI XRB,2;  % SUB 2 FOR BCC
  7489. DO BEGIN
  7490. ZR XRB;
  7491. IC XRB,0(VR1);  % OFFSET 1 FOR MARK
  7492. AR VRF,XRB;  % BUMP ACCUMULATOR
  7493. AI VR1,1;  % INCREMENT
  7494. END FOR VR0;
  7495. LR XRB,VRF;  % SAVE OFF TOTAL
  7496. % FIRST CHARACTER IN BCC BITS 11-6 OF TOTAL
  7497. N XRB,=X'00000FFF';  % TURN OFF ALL BUT 12 BITS
  7498. SRL XRB,6;  % SHIFT OVER 6 BITS
  7499. CHAR XRB;  % MAKE IT PRINTALBE
  7500. STC XRB,BCC;  % STORE OFF 1ST CHARACTER
  7501.  
  7502. N VRF,=X'0000003F';  % ONLY LAST 6 BITS
  7503. CHAR VRF;  % THE CHARACTER FUNCTION
  7504. STC VRF,BCC+1;  % STORE IT OFF
  7505.  
  7506. LA VRF,BCC;  % RETURN ADDRESS OF BCC IN VRF
  7507.  
  7508.  
  7509.             END;  % LEVEL 2
  7510.  
  7511.  <CI XRA,3>: BEGIN  % LEVEL 3 CRC CHECKING
  7512.     ZR VRF;  % VRF CRC VALUE - ORIGINALLY 0
  7513.     DO BEGIN
  7514.        ZR XRB;
  7515.        LR XRC,VRF;  % GET SET UP FOR XOR
  7516.        N XRC,=X'000000FF';  % BLAST ALL BUT LAST BYTE
  7517.        IC XRB,0(VR1);  % OFFSET 1 FOR MARK
  7518.        XR XRC,XRB;  % X-OR CRC WITH BYTE
  7519.  
  7520.        SRL VRF,8;  % SHIFT CRC REG 8 BIT TO THE RIGHT
  7521.  
  7522.        L XRB,CRCCONAD;  % CRC CONSTANT TABLE CRC CCITT
  7523.  
  7524.        AR XRB,XRC;
  7525.        AR XRB,XRC;  % ADD INDEX TWICE SINCE ALL VALUES ARE HALFWORD
  7526.  
  7527.        ICM XRC,3,0(XRB);  % LOAD HALF WORD
  7528.  
  7529.        N XRC,=X'0000FFFF';  % TURN OFF HIGH ORDER
  7530.  
  7531.        XR VRF,XRC;  % REMAINING CRC VALUE
  7532.  
  7533.        AI VR1,1;  % INCREMENT
  7534.        END FOR VR0;
  7535.     LR XRB,VRF;  % SAVE OFF TOTAL
  7536.     % FIRST CHARACTER IN CRC BITS 11-6 OF TOTAL
  7537.     N XRB,=X'0000FFFF';  % TURN OFF ALL BUT 16 BITS
  7538.     SRL XRB,12;  % SHIFT OVER 12BITS
  7539.     CHAR XRB;  % MAKE IT PRINTALBE
  7540.     STC XRB,BCC;  % STORE OFF 1ST CHARACTER  (B12-B15)
  7541.  
  7542.     LR XRB,VRF;  % RESTORE REGISTER
  7543.     % SECOND CHARACTER IN CRC BITS 11-6 OF TOTAL
  7544.     N XRB,=X'00000FFF';  % TURN OFF ALL BUT 12 BITS
  7545.     SRL XRB,6;  % SHIFT OVER 6 BITS
  7546.     CHAR XRB;  % MAKE IT PRINTALBE
  7547.     STC XRB,BCC+1;  % STORE OFF 2ND CHARACTER
  7548.  
  7549.     N VRF,=X'0000003F';  % ONLY LAST 6 BITS
  7550.     CHAR VRF;  % THE CHARACTER FUNCTION
  7551.     STC VRF,BCC+2;  % STORE IT OFF
  7552.  
  7553.     LA VRF,BCC;  % RETURN ADDRESS OF BCC IN VRF
  7554.  
  7555.  
  7556.     END;  % LEVEL 3
  7557.  
  7558. ENDSEL;  % CRC SELECTION
  7559.  
  7560.  
  7561. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  7562. BCCEXIT: CEXIT VRE,HIGHR;
  7563.  
  7564. LTORG;
  7565. EXORG;
  7566. SUBTITLE 'CHKETOA';
  7567. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7568. % MOD: CHKETOA
  7569. % FUNCTION: CHECKS EBCDIC TEXT FILE FOR UNVALID ASCII CHARACTERS
  7570. % INPUT: VR1=>POINTS TO STRING
  7571. %        VR0= LENGTH OF STRING / ALWAYS LESS THAN 256
  7572. % OUTPUT: MESSAGE OUTPUT-FLAGS SET
  7573. %
  7574. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7575. CHKETOA:
  7576. CENTER VRE,HIGHR,ENTRY=NO;
  7577. LR XRB,VR0;  % LENGTH FOR EXECUTE
  7578. ZR XRA;
  7579. LR VRF,VR1;  % POINT OT STRING
  7580. L XRC,ETOAERRV;  % ADDRESS OF ETOA ERROR TABLE
  7581. EXI XRB,MTRT,0(VRF),0(XRC),*-*,INCR=YES,DECR=YES;
  7582. IF <RNZ XRA> THEN BEGIN
  7583. SF WARNINGF;
  7584. MVC WARNBUFF,=C'EDCDIC characterdoes not have ASCII equivalent.';
  7585. MMVC WARNLEN,=H'48',2;
  7586. END;  % OF TRANSLATE ERROR
  7587. CEXIT VRE,HIGHR;
  7588. LTORG;
  7589. EXORG;
  7590. SUBTITLE 'STOPPROC';
  7591. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7592. % MODULE : STOPPROC
  7593. % FUNCTION :   CLOSES OPENED  DATA SEST KERIN
  7594. %              OR KEROUT - USER ENTERED STOP
  7595. % INPUT:       NONE
  7596. %
  7597. %
  7598. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7599. STOPPROC:
  7600. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7601. IF <TF SENDDSNF> THEN CCALL CLOSESDS,A;
  7602. IF <TF RECVDSNF> THEN CCALL CLOSERDS,A;
  7603. ZF STOPF;  % RESET STOP FLAG
  7604. CEXIT VRE,HIGHR;
  7605. LTORG;
  7606.  
  7607.  
  7608. SUBTITLE 'SABORT';
  7609. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7610. % MODULE : SABORT
  7611. % FUNCTION :   SENDS AN ABORT PACKET TO THE OTHER KERMIT
  7612. %              DATA OF PACKET ALREADY ENTERED
  7613. % INPUT:       NONE
  7614. %
  7615. %
  7616. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7617. SABORT:
  7618. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7619. STH VR0,TEMP;
  7620. IF <MCLC OLDTRY,RETRY,4; CC NL> |
  7621. <MCLC NUMTRY,RETRY,4; CC NL> THEN BEGIN  % Retry exceeded
  7622. ERRORCON 'Retry count exceeded - transfer aborted';
  7623. CCALL ERRPACK,A;  % PUT IT IN BUFFER
  7624. END;  % OF EXCEEDED RETRY
  7625. SPSPACK AE,TEMP,PUTLEN,VR0;  % INIT SEND BUFFER
  7626. CCALL SPACK,A;  % FIRE AWAY
  7627. CCALL STOPPROC,A;  % CLOSES FILES
  7628. CEXIT VRE,HIGHR;
  7629. LTORG;
  7630.  
  7631.  
  7632. SUBTITLE 'RABORT';
  7633. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7634. % MODULE : RABORT
  7635. % FUNCTION :   ACKS AN ABORT PACKET RECEIVED FROM THE OTHER KERMIT
  7636. %              MOST DON'T REQUIRE THIS BUT JUST IN CASE
  7637. % INPUT:       NONE
  7638. %
  7639. %
  7640. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7641. RABORT:
  7642. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7643. SPSPACK AY,SEQNUM,ZERO,VR0;  % INIT SEND BUFFER
  7644. CCALL SPACK,A;  % FIRE AWAY
  7645. LH VR0,RECLEN;
  7646. IF <CI VR0,255; CC H> THEN LI VR0,255;
  7647. IF <RP VR0> THEN BEGIN
  7648. LR XRB,VR0;
  7649. L XRA,ATOEVCON; EXI XRB,MTR,RDATA,0(XRA),*-*,DECR=YES;
  7650. END;
  7651. IF <RP VR0> THEN CCALL ERRPACK,A,VR1=RDATA;  % PUT IN STATUS BUFFER
  7652.  
  7653.  
  7654. CCALL STOPPROC,A;
  7655. CEXIT VRE,HIGHR;
  7656. LTORG;
  7657.  
  7658. SUBTITLE 'CLOSESDS';
  7659. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7660. % MODULE : CLOSESDS
  7661. % FUNCTION :   CLOSES AND DEALLOCATES THE DATA SET KERIN
  7662. %              CALLED BY SEND FUNCTIONS AND ABORT PROCESSING
  7663. % INPUT:       NONE
  7664. %
  7665. %
  7666. % OUTPUT :     NONE
  7667. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7668. CLOSESDS:
  7669. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7670.  
  7671. IF <TF SENDDSNF> THEN BEGIN  % CLOSE INPUT FILE
  7672. CALL EDCLOS,(EDCNTRL,EDRETURN);  % CLOSE INPUT FILE
  7673. ZF SENDDSNF;  % OPEN FILE INDICATOR
  7674. END;  % OF CLOSE KERIN
  7675.          LA XRB,DSNAME;  % GET ADDRESS OF DSNAME
  7676.          DALLIST BEGIN,MF=(E,UALLOCDS),INIT=NO; BEGIN
  7677.       DALLIST TEXT,DALDDNAM,(KERMDDNM,8);  % DDNAME
  7678.             DALLIST TEXT,DUNUNALC,MF=L;  % FORCE UNALLOCATION
  7679.             DALLIST END; END;
  7680.          DATA BEGIN  % DYNAMIC ALLOCATION PARAMETER LIST FOR
  7681.             % UNALLOCATION BY DSNAME
  7682.  
  7683.             UALLOCDS:
  7684.             DALLIST BEGIN,S99VRBUN,MF=L; BEGIN
  7685.          DALLIST TEXT,DALDDNAM,(,8);  % DDNAME
  7686.                DALLIST TEXT,DUNUNALC;  % FORCE UNALLOCATION
  7687.                DALLIST END; END;
  7688.             END;
  7689. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  7690.  
  7691. CEXIT VRE,HIGHR;
  7692. LTORG;
  7693. EXORG;
  7694.  
  7695.  
  7696. SUBTITLE 'CLOSERDS';
  7697. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7698. % MODULE : CLOSERDS
  7699. % FUNCTION :   CLOSES THE DATA SET KEROUT USED BY RECEIVE
  7700. %              THE UPLOADED FILE, CALLS RECUNAL FOR DEALLOCATION
  7701. % INPUT:       NONE
  7702. %
  7703. %
  7704. % OUTPUT :     NONE
  7705. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7706. CLOSERDS:
  7707. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7708.  
  7709. IF <TF RECVDSNF> THEN BEGIN  % CLOSE INPUT FILE
  7710. CALL EDCLOS,(EDCNTRL,EDRETURN);  % CLOSE INPUT FILE
  7711. ZF RECVDSNF;
  7712. L XRA,TMPDISKA;
  7713. LH XRB,TMPDISKL;
  7714. IF <EXI XRB,MCLC,VOLUME,0(XRA),*-*,INCR=YES,DECR=YES> &
  7715. <MCLC STATLEN,=H'0',2> THEN DO BEGIN
  7716. %VINIT KERMVA,L:ADDSTATA,KERMBUFF,L'KERMBUFF;
  7717. %VSEG KERMVA,'Data set ';
  7718. MMVC TMPDSN,DSNAME,44;
  7719. EXIT IF <CLI STATE,SESTATE> | <CLI STATE,RESTATE>;
  7720. MMVC TMPVOL,TSOVOL,6;  % RETURN ED VOL SERIAL NUMBER
  7721. LI VR0,TMPMSL;
  7722. CCALL ADSTATUS,A,VR1=TMPDSMES;
  7723. %VOUT KERMVA;
  7724. END;  % OF DEFAULT
  7725.  
  7726. END;  % OF CLOSE KEROUT
  7727. CCALL RECUNAL,A;  % UNALLOCATE DS
  7728.  
  7729.  
  7730. FREEMAIN RU,SP=7;  % FREE THE BUFFER   ATTEMPT  % %NO; ON ORG CHECK
  7731. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  7732.  
  7733. CEXIT VRE,HIGHR;
  7734. LTORG;
  7735. EXORG;
  7736.  
  7737.  
  7738.  
  7739. SUBTITLE 'KERMTGET';
  7740. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7741. %  MODULE : KERMTGET
  7742. %  FUNCTION: TIMER ON ALL READS THIS SUB IS ATTACHED
  7743. %  ECB'S CONTROL TIMING FLOW
  7744. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7745.  
  7746. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7747. KERMTGET:
  7748. OSENTER (14,12);
  7749. L XRF,PARMADD2;  % SET UP BASE REGISTER
  7750. L XRB,STAXADD;  % PARMETER EXIT ROUTINE ADDRESS
  7751. L XRC,STAXLADD;  % PARM LIST  ADDRESS
  7752. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  7753. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  7754. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  7755. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  7756. STAX (XRB),DEFER=NO,REPLACE=NO,MF=(E,(XRC));
  7757. FOREVER DO BEGIN  % LOOP ALL DAY
  7758. WAIT ECB=ECBREAD;
  7759. MZC ECBREAD,4;  % ZERO ECB
  7760. L VR1,TGETBUFA;  % ADDRESS OF BUFFER TO PUT IN
  7761. LI VR0,32767;  % MAX VALUE OF TGET ( ALTHOUGH TCAM'S 4 K)
  7762. TGET (VR1),(VR0),ASIS;
  7763. IF <RZ VRF> | <CI VRF,18> THEN ST VR1,TGETLEN  % LENGTH OF RECEIVED
  7764. ELSE BEGIN  % ERROR
  7765. ZR VRF;
  7766. SI VRF,1;
  7767. ST VRF,TGETLEN;
  7768. END;
  7769. POST ECBTGET,ECBTREAD;  % TELL EM WE READ IT
  7770.  
  7771. END;  % OF FOREVER DO
  7772.  
  7773. OSEXIT (14,12);
  7774. LTORG;
  7775. PARMADD2:    DC   A(PARMS);  % ADDRESS OF STORAGE
  7776.  
  7777. SUBTITLE 'ERRPACK';
  7778. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7779. % MOD: ERRPACK
  7780. % FUNCTION: SEND ERROR PACKETS
  7781. % INPUT: R1-> MESSAGE STRING
  7782. %        VR0=LENGTH OF MESSAGE
  7783. % OUTPUT: PRESPARED AND SEND PACKET
  7784. %   MAYBE WAIT ONt( NACK THEN BLOCK OFF
  7785. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7786. ERRPACK:
  7787. CENTER VRE,HIGHR,ENTRY=NO;
  7788.  
  7789. IF <CH VR0,MAXPUT; CC H> THEN LH VR0,MAXPUT;  % IN CASE TOO BIG
  7790. DEBLANK VR1,VR0,XRA,BOTH;  % DEBLANK ERROR PACKET
  7791. % SET UP DSECT FOR SEND PACKET
  7792. LR XRA,VR0;  % LENGTH FOR EXECUTE
  7793. EXI XRA,MMVC,PDATA,0(VR1),*-*,INCR=YES,DECR=YES;
  7794. STH XRA,PUTLEN;
  7795. EXI XRA,MMVC,STATBUFF,PDATA,*-*,INCR=YES,DECR=YES;  % FINAL STATUS
  7796. STH XRA,STATLEN;  % LENGTH OF BUFFER
  7797. L XRB,ETOAVCON;
  7798. EXI XRA,TR,PDATA(*-*),0(XRB),DECR=YES,INCR=YES;  % TRANSLATE TO ASCII
  7799. MVI PTYPE,ACOMLIT;  % ABORT LITERAL INTO PACKET
  7800. %
  7801. CEXIT VRE,HIGHR;
  7802. LTORG;
  7803. EXORG;
  7804. SUBTITLE 'ATOEERRS';
  7805. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7806. % MOD: ATOEERRS
  7807. % FUNCTION: SETS ERROR BUFFER FOR ASCII TO EBCDIC CONVERSION MESSAGE
  7808. % INPUT: NONE
  7809. %
  7810. % OUTPUT: NONE
  7811. %
  7812. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7813. ATOEERRS:
  7814. CENTER VRE,HIGHR,ENTRY=NO;
  7815. SF WARNINGF;
  7816. MVC WARNBUFF,=C'Invalid characters for ASCII to EBCDIC translation.';
  7817. MMVC WARNLEN,=H'51',2;
  7818. SF WARNTPCK ;
  7819. CEXIT VRE,HIGHR;
  7820. LTORG;
  7821. EXORG;
  7822. SUBTITLE 'ATOE8BIT';
  7823. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7824. % MOD: ATOE8BIT
  7825. % FUNCTION: SETS ERROR BUFFER FOR ASCII TO EBCDIC CONVERSION MESSAGE
  7826. % INPUT: VR1=> CHARACTER
  7827. %
  7828. % OUTPUT: CHARACTER CONVERSION
  7829. %
  7830. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7831. ATOE8BIT:
  7832. CENTER VRE,HIGHR,ENTRY=NO;
  7833. SF WARNINGF;
  7834. MVC WARNBUFF,=C'Eighth bit on for ASCII to EBCDIC translation.';
  7835. MMVC WARNLEN,=H'47',2;
  7836. SF WARNTPCK ;
  7837.  
  7838. CEXIT VRE,HIGHR;
  7839. LTORG;
  7840. EXORG;
  7841. SUBTITLE 'CHKCNTL';
  7842. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7843. % MODULE : CHKCNTL
  7844. % FUNCTION :   CHECKS A NUMBER FOR A VALID QUOTE CHARACTER
  7845. %              CHECKS RANGE AND OTHER QUOTES
  7846. % INPUT:       VRF= NUMBER (BINARY) VR0=1 - CQUOTE
  7847. %              VR0=2 - BQUOTE  VR0=3   RQUOTE
  7848. %
  7849. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7850. CHKCNTL:
  7851. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7852. SELECT FIRST;
  7853. <CLM VRF,1,QUOCHAR>: % User entered same just fall through
  7854. BEGIN
  7855. IF ^<CI VR0,1> THEN  % QUOTE CHARACTER
  7856. WRTERM _
  7857.  'Character entered matches CQUOTE character.  Change it first.';
  7858. ZR VRF;
  7859. END;
  7860. <CLM VRF,1,BINQC>: BEGIN  % User entered Quote like other
  7861. IF ^<CI VR0,2> THEN  % BQUOTE CHARACTER
  7862. WRTERM _
  7863.  'Character entered matches BQUOTE character.  Change it first.';
  7864. ZR VRF;
  7865. END;
  7866. <CLM VRF,1,REPTCHAR>: BEGIN  % User entered Quote like other
  7867. IF ^<CI VR0,3> THEN  % CQUOTE CHARACTER
  7868. WRTERM _
  7869.  'Character entered matches RQUOTE character.  Change it first.';
  7870. ZR VRF;
  7871. END;
  7872. <<CI VRF,32; CC L> | % Check whether number is in range
  7873. <<CLI VRF,63; CC H> & <CLI VRF,95; CC L>>>: ;  % ILLEGAL JUST FALL OUT
  7874. ENDSEL
  7875. ELSE BEGIN  % We actually have a good quote character
  7876. % Now take old values out of tables
  7877. SELECT FIRST;  % NOW PICK UP CHARACTER THAT WE'RE QUOTING
  7878. <CI VR0,1>: LA XRA,QUOCHAR;
  7879. <CI VR0,2>: LA XRA,BINQC;
  7880. <CI VR0,3>: LA XRA,REPTCHAR;
  7881. ENDSEL;
  7882.  
  7883. LOADB VR0,0(XRA);
  7884. LA VR1,SENDTBL;
  7885. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  7886. MVI 0(VR1),0;  % QUOTE FOR HASH IN TABLE
  7887. AI VR1,X'80';  % POINT TO HIGH ORDER
  7888. MVI 0(VR1),ASCI8BIT;
  7889.  
  7890. LA VR1,RECTABLE;
  7891. AR VR1,VR0;  % POINT TO PLACE IN TABLE
  7892. MVI 0(VR1),0;  % QUOTE FOR HASH IN TABLE
  7893. STC VRF,0(XRA);  % STORE THE QUOTE CHARACTER
  7894. ZR VRF;  % INDICATE GOOD RETURN
  7895.  
  7896.  
  7897.  
  7898.  
  7899.  
  7900. END;
  7901. USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  7902.  
  7903. CEXIT VRE,HIGHR;
  7904. LTORG;
  7905. EXORG;
  7906. SUBTITLE 'KSTATUS ';
  7907. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7908. % MOD: KSTATUS
  7909. % FUNCTION: OUTPUT A MESSAGE TO THE TERM CONCERNING WARNINGS
  7910. %           AND THE FINAL COMPLETION CODE OF THE PROGRAM
  7911. %  INPUT:   STATBUFF CONTAINS THE MESSAGE
  7912. %           STATLEN IS THE LENGTH OF MESSAGE
  7913. %  OUTPUT:  SCREEN MESSAGE
  7914. % RETURN : NONE
  7915. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7916. KSTATUS:
  7917. CENTER VRE,HIGHR,ENTRY=NO;
  7918. VINIT KERMVA,L:KOUTADDR,KERMBUFF,OUTLEN;
  7919. VSEG KERMVA,'                        TSO KERMIT Status Report';
  7920. VOUT KERMVA;  % OUTPUT HEADER FOR STATUS REPORT
  7921. IF <TF WARNINGF> THEN BEGIN  % WARNINGS ISSUED
  7922. LA VR1,WARNBUFF;
  7923. LH VR0,WARNLEN;
  7924.  
  7925. VSEG KERMVA,(VR1),(VR0);
  7926. VOUT KERMVA;  % OUTPUT IT TO SCREEN
  7927. END;
  7928. LA VR1,STATBUFF;
  7929. LH VR0,STATLEN;
  7930. IF <RZ VR0> THEN VSEG KERMVA,SUCESSCC,L'SUCESSCC  % GOOD RETURN
  7931. ELSE VSEG KERMVA,(VR1),(VR0);
  7932. VOUT KERMVA;  % OUTPUT IT TO SCREEN
  7933. CEXIT VRE,HIGHR;
  7934. LTORG;
  7935. EXORG;
  7936. SUBTITLE 'SETCNTLS';
  7937. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7938. %  MOD: SETCNTLS
  7939. %  FUNCTION: SCAN FOR "^" FORMAT SET PARAMETERS
  7940. %             (E.G. ^A = =X'01'    )
  7941. %  INPUT: VR1=> STRING
  7942. %        VR0=LENGTH
  7943. %  OUTPUT: VRF= CONVERTED NUMBER - NEGATIVE NUMBERS= ILLEGAL
  7944. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7945. SETCNTLS:
  7946. CENTER VRE,HIGHR,WASIZE,ENTRY=NO;
  7947.   SCPUSH;
  7948. ZR VRF;
  7949. SCINIT (VR1),(VR0);  % REINITIALIZE SCANNER
  7950. SCAN *;
  7951.        SCKW ,STORCNTL,I,LIMIT=AL1(32);  % HIGHEST NUMBER
  7952.        SCKW  ^,CNTLETTR;  % A CNTL LETTER (E.G. ^A = X'01')
  7953.  
  7954.        SCKW NUL,*,CODE=AL1(0);
  7955.        SCKW SOH,*,CODE=AL1(1);
  7956.        SCKW STX,*,CODE=AL1(2);
  7957.        SCKW ETX,*,CODE=AL1(3);
  7958.        SCKW EOT,*,CODE=AL1(4);
  7959.        SCKW ENQ,*,CODE=AL1(5);
  7960.        SCKW ACK,*,CODE=AL1(6);
  7961.        SCKW BEL,*,CODE=AL1(7);
  7962.        SCKW BS,*,CODE=AL1(8);
  7963.        SCKW HT,*,CODE=AL1(9);
  7964.        SCKW LF,*,CODE=AL1(10);
  7965.        SCKW VT,*,CODE=AL1(11);
  7966.        SCKW FF,*,CODE=AL1(12);
  7967.        SCKW CR,*,CODE=AL1(13);
  7968.        SCKW SO,*,CODE=AL1(14);
  7969.        SCKW SI,*,CODE=AL1(15);
  7970.        SCKW DLE,*,CODE=AL1(16);
  7971.        SCKW DC1,*,CODE=AL1(17);
  7972.        SCKW DC2,*,CODE=AL1(18);
  7973.        SCKW DC3,*,CODE=AL1(19);
  7974.        SCKW DC4,*,CODE=AL1(20);
  7975.        SCKW NAK,*,CODE=AL1(21);
  7976.        SCKW SYN,*,CODE=AL1(22);
  7977.        SCKW ETB,*,CODE=AL1(23);
  7978.        SCKW CAN,*,CODE=AL1(24);
  7979.        SCKW EM,*,CODE=AL1(25);
  7980.        SCKW SUB,*,CODE=AL1(26);
  7981.        SCKW ESC,*,CODE=AL1(27);
  7982.        SCKW FS,*,CODE=AL1(28);
  7983.        SCKW GS,*,CODE=AL1(29);
  7984.        SCKW RS,*,CODE=AL1(30);
  7985.        SCKW US,*,CODE=AL1(31);
  7986.        SCKW ,*,CODE=AL1(-1);  % ILLEGAL VALUE
  7987. SCANEND;
  7988. DATA BEGIN  % START OF ANTHER SCAN
  7989. CNTLETTR: ;
  7990. SCPOP;
  7991. SCTELL;
  7992. IF <CI VR0,1> THEN BEGIN  % IS THERE ONE CHARACTER
  7993. SCINIT (VR1),(VR0);
  7994. SCAN *;
  7995.  
  7996.        SCKW @,*,CODE=AL1(0);
  7997.        SCKW A,*,CODE=AL1(1);
  7998.        SCKW B,*,CODE=AL1(2);
  7999.        SCKW C,*,CODE=AL1(3);
  8000.        SCKW D,*,CODE=AL1(4);
  8001.        SCKW E,*,CODE=AL1(5);
  8002.        SCKW F,*,CODE=AL1(6);
  8003.        SCKW G,*,CODE=AL1(7);
  8004.        SCKW H,*,CODE=AL1(8);
  8005.        SCKW I,*,CODE=AL1(9);
  8006.        SCKW J,*,CODE=AL1(10);
  8007.        SCKW K,*,CODE=AL1(11);
  8008.        SCKW L,*,CODE=AL1(12);
  8009.        SCKW M,*,CODE=AL1(13);
  8010.        SCKW N,*,CODE=AL1(14);
  8011.        SCKW O,*,CODE=AL1(15);
  8012.        SCKW P,*,CODE=AL1(16);
  8013.        SCKW Q,*,CODE=AL1(17);
  8014.        SCKW R,*,CODE=AL1(18);
  8015.        SCKW S,*,CODE=AL1(19);
  8016.        SCKW T,*,CODE=AL1(20);
  8017.        SCKW U,*,CODE=AL1(21);
  8018.        SCKW V,*,CODE=AL1(22);
  8019.        SCKW W,*,CODE=AL1(23);
  8020.        SCKW X,*,CODE=AL1(24);
  8021.        SCKW Y,*,CODE=AL1(25);
  8022.        SCKW Z,*,CODE=AL1(26);
  8023.        SCKW [,*,CODE=AL1(27);
  8024.        SCKW \,*,CODE=AL1(28);
  8025.        SCKW ],*,CODE=AL1(29);
  8026.        SCKW ,*,CODE=AL1(30);
  8027.        SCKW _,*,CODE=AL1(31);
  8028.        SCKW ,*,CODE=AL1(-1);
  8029. SCANEND;
  8030. END  % OF ONE CHARACTER TO SCAN
  8031. ELSE <ZR VRE; SI VRE,1>;  % ERROR RETURN
  8032. SCPUSH;
  8033. END;  % OF BLOCK
  8034.  
  8035. LR VRF,VRE;  % LOAD VALUE IN RETURN REGISTER
  8036. STORCNTL: USE WAR AS WA IN ST VRF,WAVRF;  % STORE VRF
  8037.  SCPOP;  % RESTORE SCANNER
  8038. CEXIT VRE,HIGHR;
  8039. LTORG;
  8040. SUBTITLE 'DSECTS AND BIG BUFFERS';
  8041. NOTOUCH: DC        F'0';  % WORD FOR LRECL
  8042. BUF:     DS        CL32000;  % DISK READ INTO HERE;
  8043. TGETBUFF:  DS    CL33000;  % LENTH OF TGET BUFFER
  8044. USERWORK: AREA H,DSECT=NO;
  8045. LENWK:     DC    H'32004';  % LENGTH OF WORKAREA
  8046. DATALEN:   DC    H'0';  % LENGTH OF RETURNED DATA
  8047. RETURNDS:  DS    CL32000;  % DATA SET NAME
  8048. VOLJUNK:   DC    15AL1(0);  % VOL INFO
  8049. AREAEND;
  8050. NOQUOTE: AREA F,DSECT=NO;
  8051. DC 256AL1(0);  % TABLE FOR NON QUOTED CHARACTERS
  8052. AREAEND;
  8053. % DSECTS FOR PACKETS
  8054. PACKET:  AREA F,DSECT=YES;
  8055. MARK:  DS     X;  % ^A SOH CHARACTER
  8056. LEN:   DS     X;  % LENGTH OF PACKET-2
  8057. SEQ:   DS     X;  % 0-63 (MOD 64) SEQUENCE NUMBER
  8058. TYPE:  DS     X;  % PACKET TYPE
  8059. DATABUFF:  DS     CL92;  % MAX PACKET DATABUFF
  8060. PACKETL: AREAEND;
  8061. SPACKET:  AREA F,DSECT=YES;
  8062. SMARK:  DS     X;  % ^A SOH CHARACTER
  8063. SLEN:   DS     X;  % LENGTH OF PACKET-2
  8064. SSEQ:   DS     X;  % 0-63 (MOD 64) SEQUENCE NUMBER
  8065. STYPE:  DS     X;  % PACKET TYPE
  8066. SDATABUF:  DS     CL92;  % MAX PACKET DATABUFF
  8067. SPACKETL: AREAEND;
  8068.  
  8069. SENDIDST: AREA H,DSECT=YES;
  8070. MAXL:  DS     X;  % MAX PACKET LENGTH MAX 94
  8071. TIME:  DS     X;  % TIMEOUT FOR RECIEVER
  8072. NPAD:  DS     X;  % NUMBER OF PAD CHARS (0)
  8073. PADC:  DS     X;  % THE CONTROL CHAR OF PAD
  8074. EOLCHAR:   DS     X;  % CHARACTER TO TERMINATE IN PACK
  8075. QCTL:  DS     X;  % ASCII QUOTE CHAR
  8076. QBIN:  DS     X;  % ASCII BIN QUOTE CHAR
  8077. CHKT:  DS     X;  % CHARACTER CHECKING
  8078. REPT:  DS     X;  % PREFIX REPEAT CHAR
  8079. CAPA1: DS     X;  % CAPABILITIES
  8080. SENDINIL: AREAEND;
  8081. %%DSECTS END
  8082. RECINIT: AREA H,DSECT=YES;
  8083. RMAXL:  DS     X;  % MAX PACKET LENGTH MAX 94
  8084. RTIME:  DS     X;  % TIMEOUT FOR RECIEVER
  8085. RNPAD:  DS     X;  % NUMBER OF PAD CHARS (0)
  8086. RPADC:  DS     X;  % THE CONTROL CHAR OF PAD
  8087. REOLCHAR:   DS     X;  % CHARACTER TO TERMINATE IN PACK
  8088. RQCTL:  DS     X;  % ASCII QUOTE CHAR
  8089. RQBIN:  DS     X;  % ASCII BIN QUOTE CHAR
  8090. RCHKT:  DS     X;  % CHARACTER CHECKING
  8091. RREPT:  DS     X;  % PREFIX REPEAT CHAR
  8092. RCAPA1: DS     X;  % CAPABILITIES
  8093. RECINIL: AREAEND;
  8094.  
  8095. DCBD: AREA F,DSECT=YES;
  8096. DCBD      DSORG=(PS),DEVD=DA;
  8097. DCBDL: AREAEND;
  8098. CATDSET: AREA ,DSECT=YES;
  8099. TYPEBYTE:   DS   XL1;  % TYPE BYTE WE WANT ONLY A'S
  8100. CATDNAME:   DS  44CL1;  % DATA SET NAME
  8101. AREAEND;
  8102.  
  8103. END;
  8104.