KERMIT TITLE 'KERMIT-CMS' 00001000 KERMIT CSECT 00002000 * KERMIT - 00003000 * 00004000 * Kermit CMS Version 2.01 00005000 * May 20, 1985 00006000 * 00007000 * This program is the IBM VM/CMS side of a file transfer system. 00008000 * It can be used to transfer files between a micro and a system 00009000 * running under VM/CMS. 00010000 * See the KERMIT User's Guide and Protocol manual for the complete 00011000 * program specifications to which this program and any other 00012000 * component of the system must adhere. 00013000 * 00014000 * Daphne Tzoar, Columbia University Center for Computing Activities 00015000 * March 1982 00016000 * 00016100 * Version 2.01 00016150 * 00016200 * [23] May 85: If virtual console is not a TTY, assume 3270. 00016250 * [24] May 85: If no repeat prefixing, reset all variables. 00016300 * [25] May 85: Fix problem of repeat prefixing of CR or LF. 00016350 * 00017000 * Version 2.0 00018000 * [1] Sept 83: Add 8-bit quoting to allow transfer of fixed format 00019000 * binary files. 00020000 * [2] Sept 83: Don't restrict incoming/outgoing record size to 256. 00021000 * [3] Aug 84: Print a version number upon startup. Improve handling 00022000 * of keywords. Maybe by the next release. 00023000 * [4] Aug 84: Pack as much data into a packet as possible. Clean 00024000 * things up a bit. 00025000 * [5] Aug 84: Use common routines SPAR and RPAR for init packets. 00026000 * [6] Aug 84: Re-write decoding routine. 00027000 * [7] Sept 84: Add repeat count prefixing. 00028000 * [8] Sept 84: Add support for two character checksum and three 00029000 * character CRC. 00030000 * [9] Oct 84: If no filetype supplied on incoming file, use "X" 00031000 * rather than fail. Default filemode to "*" on send. 00032000 * Remove redundant filename handling code from RDATA. 00033000 * Replace invalid letter in filename with "X". 00034000 * [10] Oct 84: Add SET/SHOW DEBUG mode. If OFF, ignore atten- 00035000 * tion if user types a BREAK. Don't ignore if ON. 00036000 * [11] Dec 84: If input supplied on command line, execute command 00037000 * and return to CMS (not to Kermit prompt mode). 00038000 * Allow several commands, separated by pound signs. 00039000 * [12] Feb 85: Add support for Series/1 front end. Bob Shields 00040000 * Temporarily turn off MSG, WNG, IMSG (if S/1 or TTY). 00041000 * [13] Mar 85: Add server support including only basic functions. Put 00042000 * send-error-packet code in one place only. Make packet 00043000 * numbers more meaningful (n -> spknum, num -> rpknum). 00044000 * [14] Mar 85: If debugging is on, log packets in a file. 00045000 * [15] Mar 85: Upon startup, read commands from two init files: SYSTEM 00046000 * KERMINI and (USERID) KERMINI. Lines with asterisk as 00047000 * the first character are comments. Add TAKE command. 00048000 * Lrecl for these files must be 130 or less. 00049000 * [16] Mar 85: Implement skip file or file group when sending. Ditto 00050000 * for receiving (discard incoming file). 00051000 * [17] Apr 85: Add a SHOW ALL command. 00052000 * [18] Apr 85: Add SET WARNING ON/OFF in case incoming file has the 00053000 * same name as an existing one. If ON, rename incoming 00054000 * file. If OFF, overwrite existing file. 00055000 * [19] Apr 85: Make ATOE table 256 characters long, as it should be. 00056000 * Modify SPACK and RPACK cosole I/O to use plists with 00057000 * flags to bypass user translate tables. Bob Shields 00058000 * Use prompt of XON. 00059000 * [20] Apr 85: Add SET ETOA and SET ATOE to allow user to modify 00060000 * the translate tables so they conform to his system. 00061000 * Display tables with new command: TDUMP. Have SET 00062000 * routines use common code to get decimal input. 00063000 * [21] Apr 85: Moved some code to different base register, 4K limit. 00064000 * [22] Apr 85: Encode outgoing filename, decode incoming one. Need 00065000 * a general routine to setup for encode/decode routines. 00066000 * 00067000 * Version 1.0 Updates: 00068000 * June 82:Only allow Kermit to run on an ASCII terminal. Else, stop 00069000 * execution. Also, check padding when receiving file in 00070000 * fixed format. If only pad one character, pad the balance 00071000 * via the "EX" option, else skip that command. 00072000 * Aug 82: Change "FSREAD" when sending to allow a maximum of 133, not 00073000 * the full buffer size since need two spaces for CRLF. 00074000 * Apr 83: Fix maximum number of tries on init (to 16), set timeout 00075000 * value to 8, and do "CTL" function to padding character 00076000 * in SINIT (not CHAR). 00077000 * Feb 84: Add fix so that when receive a file with RECFM = F, program 00078000 * does not abort with DISK FULL error. Changes are indicated 00079000 * by the phrase '[edit]' in the comment. Fix: Bill Small. 00080000 * 00081000 * Please address all comments and questions to: 00082000 * 716 Watson 00083000 * 612 W. 115th St. 00084000 * NY,NY, 10025 00085000 * (212) 280-3703 00086000 * 00087000 * Copyright (C) 1982,1983 Columbia University 00088000 * 00089000 * Permission is granted to any individual or institution to copy 00090000 * or use this program, except for explicitly commercial purposes. 00091000 * 00092000 * Note: If you find and correct problems in the program, please 00093000 * forward all changes to the author. 00094000 * 00095000 EJECT 00096000 * REGISTER USAGE - 00097000 * R1 - 00098000 * R2 - 00099000 * R3 - 00100000 * R4 - 00101000 * R5 - 00102000 * R6 - 00103000 * R7 - 00104000 * R8 - 00105000 * R9 - 00106000 * R10 - 00107000 * R11 - BASE REGISTER FOR GLOBAL DATA AREA 00108000 * R12 - PROGRAM BASE 00109000 * R13 - SAVE AREA 00110000 * R14 - SUBROUTINE LINKAGE 00111000 * R15 - SUBROUTINE LINKAGE 00112000 * 00113000 * EXTERNAL MACROS/MODULES CALLED - 00114000 * The following MACLIBs should be GLOBAL'd: 00115000 * DMSSP, CMSLIB, TSOMAC 00116000 * 00117000 * The following external routines are called: 00118000 * NEXTFST ASSEMBLE 00119000 * WILD ASSEMBLE 00120000 * 00121000 * 00122000 SPACE 00123000 PRINT NOGEN 00124000 REGEQU 00125000 FSTD DSECT WILL NEED FOR NEXTFST ROUTINE 00126000 ADT DSECT 00127000 NUCON DSECT USE IN TOKENIZER ROUTINE 00128000 EXTSECT DSECT USE WHEN TURNING BLIP OFF 00129000 SPACE 00130000 SOH EQU X'01' ^a FOR START OF HEADER CHAR 00131000 XON EQU X'11' XON [13] 00132000 AD EQU 68 DATA PACKET (ASCII 'D') 00133000 AN EQU 78 NAK 00134000 AZ EQU 90 EOF packet, skip file group [16] 00135000 AS EQU 83 INIT PACKET 00136000 AY EQU 89 ACK 00137000 AF EQU 70 FILE PACKET 00138000 AB EQU 66 BREAK PACKET 00139000 AE EQU 69 ERROR PACKET 00140000 AR EQU 82 Get packet "R" [13] 00141000 AG EQU 71 Generic server packet "G" [13] 00142000 AL EQU 76 Logout packet "L" [13] 00143000 AI EQU 73 Parameter init packet "I" [13] 00144000 AX EQU 88 Skip file when sending [16] 00145000 ACR EQU 13 Ascii CR [25] 00145100 ALF EQU 10 Ascii LF [25] 00145200 ERCOD EQU 12 MEANS EOF WITH 'FSREAD' 00146000 MAXTXT EQU 64536 Max output buffer is 64K [6] 00147000 MAXBIN EQU 80 Max output for binary files [1] 00148000 * Fields of variable FLAGS: 00149000 FLG1 EQU X'80' IS FILE THE FIRST OR NOT 00150000 FLG2 EQU X'40' OVERWRITE SENT FILENAME? 00151000 FLG3 EQU X'20' ONE = SENT ONLY PARTIAL RECORD 00152000 FLG4 EQU X'10' NAK FROM MICRO(0) OR RPACK(1)? 00153000 FLG5 EQU X'08' ALLOCATED MORE SPACE (DMSFREE) 00154000 BINF EQU X'04' ONE := BINARY DATA [1] 00155000 FLG7 EQU X'02' One := End-of-file [4] 00156000 DEBUG EQU X'01' Debug mode ON/OFF [10] 00157000 * Fields of variable LFLAGS: 00158000 FMSGON EQU X'80' CP SET MSG was ON [12] 00159000 FWNGON EQU X'40' CP SET WNG was ON [12] 00160000 FIMSGON EQU X'20' CP SET IMSG was ON [12] 00161000 SERVON EQU X'10' In SERVER mode [13] 00162000 TAKON EQU X'08' TAKE command [15] 00163000 ALLFL EQU X'04' SHOW ALL requested [17] 00164000 WARFL EQU X'02' Rename incoming file [18] 00165000 CMDL EQU X'01' Data on cmd line [11] 00166000 * 00167000 DSSIZ EQU X'50' Default send packet size [4] 00168000 DQUOTE EQU X'23' Default quote character = # [4] 00169000 D8QUO EQU X'26' Default 8-bit quochar=& [1][4] 00170000 DCHKLEN EQU X'01' Default checksum length [4] 00171000 DRPT EQU X'7E' Default repeat prefix TILDE [4] 00172000 DEOL EQU X'0D' Default end of packet (CR) [4] 00173000 DLRECL EQU X'50' Default lrecl size = 80 [4] 00174000 DRECFM EQU X'E5' Default is variable recfm [4] 00175000 DSTIM EQU X'08' Default send time out [4] 00176000 DRTIM EQU X'0D' Default receive time out [4] 00177000 DSPAD EQU X'00' Default send padding. [4] 00178000 DRPAD EQU X'00' Default receive padding. [4] 00179000 DSPADC EQU X'00' Default send padding char. [4] 00180000 DRPADC EQU X'00' Default rec padding char. [4] 00181000 SPMIN EQU X'14' Min send packet size (20) [5] 00182000 SPMAX EQU X'5E' Max send packet size (94) [5] 00183000 RPTMIN EQU X'03' Min repeats for quoting [7] 00184000 TAKMAX EQU 10 Max TAKE nesting level [15] 00185000 * 00186000 * For Series/1 [12 start] 00187000 ASCXON EQU X'91' X-ON (DC1) with hi order bit on 00188000 * Fields of variable S1FLAGS 00189000 S1INIT EQU X'80' Init for S/1 already done [13] 00190000 ISS1 EQU X'01' Console is S/1 00191000 * CCW flags: 00192000 CC EQU X'40' Chained CCW follows 00193000 SLI EQU X'20' Suppress Incorr Len Ind 00194000 * WCC flag bits and 3270 orders: 00195000 ALARM EQU X'04' ring alarm 00196000 UNLKKB EQU X'02' unlock keyboard 00197000 SBA EQU X'11' Set Buffer Address (3270) 00198000 IC EQU X'13' Insert Cursor (3270) 00199000 * CSW flag bits: 00200000 ATTN EQU X'80' attention 00201000 STATMOD EQU X'40' status modifier 00202000 CUEND EQU X'20' control unit end 00203000 BUSY EQU X'10' busy 00204000 CHEND EQU X'08' channel end 00205000 DEVEND EQU X'04' device end 00206000 UNCHK EQU X'02' unit check 00207000 UNXCPT EQU X'01' unit exception 00208000 CPBRK EQU ATTN+CHEND+DEVEND+UNCHK CP break-in [12 end] 00209000 * 00210000 EJECT 00211000 KERMIT CSECT 00212000 STM R14,R12,12(R13) 00213000 BALR R12,0 00214000 USING *,R12 00215000 LA R14,KSAVE 00216000 ST R13,4(R14) 00217000 ST R14,8(R13) 00218000 LR R13,R14 00219000 * 00220000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 00221000 L R11,=A(PARMS) 00222000 USING PARMS,R11 00223000 LR R6,R1 HOLD ON TO CONSOLE BUFFER 00224000 SR R2,R2 00225000 BCTR R2,0 Get info by using addr -1 00226000 DC X'83230024' GET LINESIZE DATA - DIAG 24 00227000 STH R2,CONSADDR Save console addr (CUU) [12] 00228000 XC LINSIZ,LINSIZ 00229000 STC R4,LINSIZ+3 SAVE THE LINESIZE 00230000 ST R4,TEMP Put here for compare [12] 00231000 MVI S1FLAGS,X'00' Clear S/1 flags [12] 00232000 CLC CONSTTY,TEMP Is console Ascii TTY? [12] 00233000 BE OKDEV Yes it's OK [12] 00234000 * CLC CONS772,TEMP Is console 3277 mod 2? [12][23] 00235000 * BNE BADDEV No fail [12] [23] 00236000 OI S1FLAGS,ISS1 Remember going via S/1 [12] 00237000 OKDEV LA R7,=C'TERM LINES 130' 00238000 LA R8,14 00239000 DIAG 7,8,8 SET TO HIGHEST POSSIBLE VALUE 00240000 USING NUCON,0 FOR TOKENIZER 00241000 L R7,AEXTSECT LOC OF CMS ROUTINE EXTSECT 00242000 USING EXTSECT,R7 00243000 MVC BLIP(1),TIMCHAR SAVE USER'S BLIP CHAR 00244000 DMSEXS MVI,TIMCHAR,X'00' TURN OFF BLIP FOR NOW 00245000 DROP R7 00246000 L R15,=A(INIT) 00247000 BALR R14,R15 CALL THE INITIALIZATION 00248000 L R15,=A(PACKLEN) 00249000 BALR R14,R15 Get max send packet size [4] 00250000 LA R1,1 Set flags for next call [12] 00251000 L R15,=A(SETMSGS) Turn off MSG, WNG, IMSG [12] 00252000 BALR R14,R15 [12] 00253000 * Get two 64K buffers for reading from and writing to files. [2] 00254000 * Should really be 64K+2 for the possible CRLF added to end of the 00255000 * send buffer. The overrun will go into the receive buffer which 00256000 * is OK since only one of send or receive is active at any time. 00257000 L R0,=F'16384' REQUEST 128K TOTAL [2 START] 00258000 DMSFREE DWORDS=(0),ERR=ERRBUF,MSG=NO 00259000 ST R1,ABUF ADDR OF FIRST BUFFER 00260000 A R1,=F'64536' SECOND BUFFER IS 64K ... 00261000 ST R1,ARBUF AWAY FROM FIRST [2 END] 00262000 MVI TAKLEV,X'00' TAKE file nesting [15 start] 00263000 LA R2,INFOBUF Put diag result here 00264000 L R3,=F'32' Get this much info 00265000 DC X'83230000' Issue the diagnose 00266000 LA R2,INFOBUF 00267000 MVC UNAME(8),16(R2) Move to our buffer 00268000 LA R2,UNAME Point to init filename 00269000 FSOPEN (R2) Look for init file 00270000 LTR R15,R15 Is it there 00271000 BNZ INIF0 Didn't find one 00272000 MVI TAKLEV,X'01' Increment to one 00273000 MVC TAKTAB(18),0(R2) Add to TAKE table 00274000 OI LFLAGS,TAKON Commands are from file 00275000 INIF0 LA R2,SYSTAK Now look for SYSTEM KERMINI 00276000 FSOPEN (R2) 00277000 LTR R15,R15 Is it there 00278000 BNZ INIF2 No 00279000 SR R5,R5 Clear to pick up byte 00280000 SR R4,R4 Offset into TAKE table 00281000 IC R5,TAKLEV Get current TAKE level 00282000 LTR R5,R5 Any levels so far 00283000 BZ INIF1 No so offset is OK 00284000 LA R4,18(R4) Bump to next spot in table 00285000 INIF1 LA R4,TAKTAB(R4) Where to add file 00286000 MVC 0(18,R4),0(R2) Add to TAKE table 00287000 LA R5,1(R5) Increment it 00288000 STC R5,TAKLEV 00289000 OI LFLAGS,TAKON Commands are from file [15 end] 00290000 INIF2 SR R15,R15 ZERO RC INITIALLY (IF EXIT) 00291000 MVI EXTFLG,X'00' Don't exit yet [11] 00292000 OI LFLAGS,CMDL Set if info on cmd line [11] 00293000 LA R6,8(R6) 00294000 CLC 0(8,R6),=8X'FF' ALL COMMAND ON ONE LINE? 00295000 BNE NOPRO NO PROMPT IF YES 00296000 NI LFLAGS,X'FF'-CMDL Nothing at command line [11] 00297000 LA R5,PROMSG Address of prompt string [3] 00298000 LA R4,L'PROMSG And it's length [3] 00299000 WRTERM (R5),(R4) Print it [3] 00300000 LA R5,HELPM Address of help string [3] 00301000 LA R4,L'HELPM And it's length [3] 00302000 WRTERM (R5),(R4) Print it [3] 00303000 WRTERM ' ' And leave a blank line [3] 00304000 PROMPT CLI EXTFLG,X'FF' Time to exit? [11] 00305000 BE LV2 Yup [11] 00306000 TM LFLAGS,CMDL Data on cmd line? [11] 00307000 BO PRO4 Yes go check [11] 00308000 TM LFLAGS,TAKON Using TAKE file? [15 start] 00309000 BNO PRO1 No go prompt 00310000 XC INPUT,INPUT Should be clear 00311000 SR R3,R3 00312000 IC R3,TAKLEV Get current TAKE level 00313000 BCTR R3,0 00314000 M R2,=F'18' Get offset into table 00315000 LA R2,TAKTAB(R3) Point to TAKE file name 00316000 FSREAD (R2),BUFFER=INPUT,BSIZE=130,FORM=E 00317000 TR INPUT(130),UPC Upcase the input 00318000 LTR R15,R15 Read in OK? 00319000 BZ PRO2 Yes go parse 00320000 C R15,=A(ERCOD) End of file 00321000 BE PRO3 00322000 WRTERM 'Error reading command from TAKE or INIT file' 00323000 PRO3 SR R2,R2 00324000 IC R2,TAKLEV Get TAKE level 00325000 BCTR R2,0 And decrement it 00326000 STC R2,TAKLEV 00327000 LTR R2,R2 Test level 00328000 BNZ PROMPT Not done with TAKE yet 00329000 NI LFLAGS,X'FF'-TAKON 00330000 B PROMPT Done with init/TAKE [15 end] 00331000 PRO1 WRTERM 'KERMIT-CMS>',EDIT=NO 00332000 PRO4 RDTERM INPUT No prompt [11] 00333000 PRO2 DMSKEY NUCLEUS 00334000 LA R1,INPUT R1 GETS ADDRESS OF STRING 00335000 * RDTERM and FSREAD return amount actually read in R0. 00336000 * L R0,=F'130' R0 GETS THE LENGTH 00337000 L R15,ASCANN 00338000 BALR R14,R15 DO TOKENIZING 00339000 LR R6,R1 SAVE ADDR OF TOKENIZED LIST 00340000 DMSKEY RESET 00341000 NOPRO MVI ERRNUM,X'FF' RESET ERROR FOR THIS TIME 00342000 MVC CHKLEN(1),CHKSET Reset checksum length 00343000 CLI 0(R6),C'E' CHECK FOR 'EXIT' COMMAND 00344000 BE LEAVE 00345000 CLI 0(R6),C'Q' CHECK FOR 'QUIT' COMMAND 00346000 BE LEAVE 00347000 CLC 0(8,R6),=8X'FF' No more input? [11] 00348000 BE NOPRO2 Go check [11] 00349000 CLI 0(R6),C'?' NEED HELP ? 00350000 BNE SETCHK 00351000 WRTERM 'Receive, Send, Help, Exit, Quit, Status, Set, Show' 00352000 WRTERM 'Server, Take, Tdump, CMS, CP' 00353000 B PROMPT 00354000 NOPRO2 TM LFLAGS,CMDL No more info on cmd line [11] 00355000 BO LV2 Yes so just exit [11] 00356000 B PROMPT No, blank line at prompt [11] 00357000 SETCHK CLC 0(3,R6),=CL3'SET' IS IT THE SET COMMAND ? 00358000 BE STSWITCH 00359000 CLC 0(6,R6),=C'STATUS' IS IT THE STATUS COMMAND? 00360000 BE STATSW 00361000 CLC 0(3,R6),=C'SHO' IS IT THE SHOW COMMAND? 00362000 BE SHOSW 00363000 CLC 0(5,R6),=C'TDUMP' Dump a table? [20] 00364000 BE TDSW [20] 00365000 CLC 0(4,R6),=C'HELP' NEED HELP ? 00366000 BE HELPSW 00367000 CLC 0(4,R6),=C'SERV' Server command [13] 00368000 BE SERVSW Yup [13] 00369000 CLC 0(4,R6),=C'TAKE' Take a command file? [15] 00370000 BE TAKSW [15] 00371000 CLI 0(R6),C'*' Is this a comment? [15] 00372000 BE PROMPT Yes ignore [15] 00373000 CLC 0(3,R6),=C'CMS' CMS COMMAND? 00374000 BE SYSCMD 00375000 CLC 0(2,R6),=C'CP' CP COMMAND? 00376000 BE SYSCMD 00377000 OI FLAGS,FLG1 SET FLG1 - IT'S THE FIRST FILE 00378000 NI FLAGS,X'FF'-FLG2 TURN OFF OVERWRITE FLAG (INIT) 00379000 XC NFSENT,NFSENT NUMBER OF FILES SENT (= 0) 00380000 CLC 0(3,R6),=C'REC' 00381000 BNE SS MAYBE IT'S A SEND COMMAND 00382000 L R15,=A(PRSFN) Parse filename [21] 00383000 BALR R14,R15 [21] 00384000 LTR R15,R15 Check retcode [21] 00385000 BNE PROMPT Bad so don't accept cmd [21] 00386000 L R15,=A(VERLET) Verify letters of fn [9] 00387000 BALR R14,R15 [9] 00388000 B RSWITCH Else go receive [21] 00389000 SS CLC 0(3,R6),=C'SEN' 00390000 BNE ERR UNRECOGNIZED COMMAND 00391000 LA R6,8(R6) PICK UP NEXT WORD 00392000 CLI 0(R6),C'?' NEED HELP? 00393000 BNE SS2 00394000 WRTERM 'Specify filename(s) with format: fn ft [fm]' 00395000 B PROMPT 00396000 SS2 CLC 0(8,R6),=8X'FF' NO MORE DATA ? 00397000 BNE SNAM 00398000 WRTERM 'Specify File Name' 00399000 B PROMPT TRY AGAIN 00400000 SNAM MVC NAME,=18X'20' BLANK IT OUT 00401000 MVC FILNAM,=18X'20' BLANK IT OUT TOO 00402000 MVC NAME(8),0(R6) PICK UP THE FNAME 00403000 LA R6,8(R6) MOVE TO NEXT TOKEN 00404000 CLC 0(8,R6),=8X'FF' NO MORE DATA ? 00405000 BNE STYP 00406000 WRTERM 'Specify File Type' 00407000 B PROMPT 00408000 STYP MVC NAME+8(8),0(R6) Pick up the ftype 00409000 MVC NAME+16(2),=C'* ' Default file mode [9] 00410000 LA R6,8(R6) Look for fmode 00411000 CLC 0(8,R6),=8X'FF' Is it there? 00412000 BE SSWITCH No use default 00413000 MVC NAME+16(2),0(R6) Get fmode user wants 00414000 B SSWITCH 00415000 ERR WRTERM 'Invalid command' 00416000 B PROMPT INVALID COMMAND - TRY AGAIN 00417000 SPACE 3 00418000 SSWITCH EQU * 00419000 LA 1,=C'SET LINEDIT OFF' 00420000 LA 0,15 15 CHAR COMMAND 00421000 DIAG 1,0,8 SHOW IT'S A CP COMMAND 00422000 TM FLAGS,DEBUG In DEBUG mode? [10] 00423000 BO SCALL Yes, then don't ignore attn [10] 00424000 STAX IGNATTN Else ignore attention [10] 00425000 SCALL L R15,=A(SEND) 00426000 BALR R14,R15 CALL SEND PORTION 00427000 LTR R5,R15 CHECK RETURN CODE 00428000 BNZ LINON 00429000 MVI ERRNUM,X'FF' WORKED OK 00430000 LINON LA 1,=C'SET LINEDIT ON' 00431000 LA 0,14 00432000 DIAG 1,0,8 00433000 STAX , Reset attn address [10] 00434000 MVC OLDERR(1),ERRNUM ERROR SETTING OF THIS RUN 00435000 TM FLAGS,FLG5 GOT EXTRA SPACE? 00436000 BNO SSW1 NOPE, JUST LEAVE 00437000 LA R0,4096/8 AMOUNT OF SPACE WE GOT 00438000 L R1,STORLOC FIND IT & FREE IT 00439000 DMSFRET DWORDS=(0),LOC=(1),ERR=*,MSG=NO 00440000 NI FLAGS,X'FF'-FLG5 TURN OFF EXTRA SPACE FLAG 00441000 SSW1 LTR R5,R5 CHECK THE RETCODE 00442000 BZ PROMPT ALL OKAY 00443000 WRTERM 'Error in sending file. Try again.' 00444000 B PROMPT ERROR - TRY AGAIN 00445000 RSWITCH EQU * 00446000 LA 1,=C'SET LINEDIT OFF' 00447000 LA 0,15 15 CHAR COMMAND 00448000 DIAG 1,0,8 SHOW IT'S A CP COMMAND 00449000 TM FLAGS,DEBUG In DEBUG mode? [10] 00450000 BO RCALL Yes, then don't ignore attn [10] 00451000 STAX IGNATTN Else ignore attention [10] 00452000 RCALL L R15,=A(RECEIVE) 00453000 BALR R14,R15 CALL RECEIVE PORTION 00454000 LTR R5,R15 CHECK RETURN CODE 00455000 BNZ LNON 00456000 MVI ERRNUM,X'FF' 00457000 LNON LA 1,=C'SET LINEDIT ON' 00458000 LA 0,14 00459000 DIAG 1,0,8 00460000 STAX , Reset attn address [10] 00461000 MVC OLDERR(1),ERRNUM ERROR SETTING OF THIS RUN 00462000 LTR R5,R5 CHECK THE RETCODE 00463000 BZ PROMPT ALL OKAY 00464000 WRTERM 'Error in receiving file. Try again.' 00465000 B PROMPT ERROR - TRY AGAIN 00466000 STSWITCH EQU * 00467000 L R15,=A(SET) 00468000 BALR R14,R15 CALL "SET" SUBROUTINE 00469000 LTR R15,R15 CHECK RETCODE 00470000 BZ PROMPT 00471000 WRTERM 'Invalid Set Command' 00472000 B PROMPT 00473000 SHOSW EQU * 00474000 L R15,=A(SHOW) 00475000 BALR R14,R15 CALL "SHOW" SUBROUTINE 00476000 LTR R15,R15 CHECK RETCODE 00477000 BZ PROMPT 00478000 WRTERM 'Invalid Show Command' 00479000 B PROMPT 00480000 SERVSW EQU * [13 start] 00481000 CLI 8(R6),C'?' Need help? 00482000 BNE SERVS0 No call server 00483000 WRTERM 'Confirm with a carriage return' 00484000 B PROMPT 00485000 SERVS0 L R15,=A(SERVER) 00486000 BALR R14,R15 Call server routine 00487000 B PROMPT Return to normal mode [13 end] 00488000 TAKSW EQU * Take a command file [15 start] 00489000 CLI 8(R6),C'?' Need help? 00490000 BNE TAKS0 00491000 WRTERM 'Specify filename with format: fn ft [fm]' 00492000 B PROMPT 00493000 TAKS0 CLI TAKLEV,TAKMAX At our max level? 00494000 BNH TAKS1 Below so we're OK 00495000 WRTERM 'Past maximum nesting level for TAKE command' 00496000 B PROMPT 00497000 TAKS1 LA R6,8(R6) Point to filename 00498000 CLC 0(8,R6),=8X'FF' File name given? 00499000 BNE TAKS2 Yes OK 00500000 WRTERM 'File name must be specified' 00501000 B PROMPT 00502000 TAKS2 SR R3,R3 00503000 IC R3,TAKLEV Get current TAKE level 00504000 M R2,=F'18' Offset for next file name 00505000 LA R2,TAKTAB(R3) 00506000 MVC 0(18,R2),=18X'40' Blank area for file name 00507000 MVC 0(8,R2),0(R6) Pick up file name 00508000 LA R6,8(R6) Point to file type 00509000 CLC 0(8,R6),=8X'FF' File type given? 00510000 BNE TAKS3 Yes OK 00511000 WRTERM 'File type must be specified' 00512000 B PROMPT 00513000 TAKS3 MVC 8(8,R2),0(R6) Pick up file type 00514000 LA R6,8(R6) Check for file mode 00515000 MVC 16(2,R2),=C'* ' Use any mode 00516000 CLC 0(8,R6),=8X'FF' File mode given? 00517000 BE TAKS4 No use default 00518000 MVC 16(2,R2),0(R6) Use what user typed 00519000 TAKS4 FSOPEN (R2) Does file exist? 00520000 LTR R15,R15 00521000 BZ TAKS5 Bad return code 00522000 WRTERM 'TAKE file not found' 00523000 B PROMPT 00524000 TAKS5 SR R3,R3 00525000 IC R3,TAKLEV Get current take level 00526000 LA R3,1(R3) And increment 00527000 STC R3,TAKLEV 00528000 OI LFLAGS,TAKON Say we're in TAKE mode 00529000 B PROMPT [15 end] 00530000 STATSW EQU * 00531000 CLI 8(R6),C'?' NEED HELP? 00532000 BNE GIVSTAT 00533000 WRTERM 'Confirm with a carriage return' 00534000 B PROMPT 00535000 GIVSTAT CLI OLDERR,X'FF' WAS THERE AN ERROR LAST TIME? 00536000 BNE FAIL 00537000 WRTERM 'Kermit completed successfully' 00538000 B PROMPT 00539000 FAIL SR R5,R5 00540000 IC R5,OLDERR GET OFFSET INTO ERROR TABLE 00541000 M R4,=F'20' OFFSET := ERRNUM * 20 00542000 LA R5,ERRTAB(R5) 00543000 WRTERM (R5),20 PRINT ERROR MSG ON SCREEN 00544000 B PROMPT AND LEAVE 00545000 IGNATTN BR R14 Ignore attention [10] 00546000 HELPSW CLI 8(R6),C'?' NEED HELP? 00547000 BNE GIVHLP 00548000 WRTERM 'Confirm with a carriage return' 00549000 B PROMPT 00550000 GIVHLP LA R1,HLPMSG GET LOCATION OF HELP MESSAGE 00551000 SVC 202 SUPERVISOR CALL 00552000 DC AL4(*+8) PRINT ERR MSG IF FAILED 00553000 B PROMPT RETURN IF NO 00554000 WRTERM 'No help available' 00555000 B PROMPT 00556000 TDSW L R15,=A(SHOW) Dump tables [20] 00557000 BALR R14,R15 Use the SHOW routine [20] 00558000 B PROMPT 00559000 SYSCMD CLI 8(R6),C'?' NEED HELP? 00560000 BNE GIVSYS 00561000 WRTERM 'Issue a CMS/CP command' 00562000 B PROMPT 00563000 GIVSYS CLC 8(8,R6),=8X'FF' ANY COMMAND? 00564000 BE SYSERR DIE IF NO 00565000 LA R1,0(R6) REST OF THE CMS COMMAND 00566000 CLC 0(3,R6),=C'CMS' CMS OR CP COMMAND? 00567000 BNE GIVSVC 00568000 LA R1,8(R6) IGNORE THE "CMS" PART 00569000 GIVSVC SVC 202 ISSUE THE COMMAND 00570000 DC AL4(*+8) PRINT ERR MSG IF FAILED 00571000 B PROMPT 00572000 LR R5,R15 GET RETCODE 00573000 LINEDIT TEXT='Command return code is ...',SUB=(DEC,(R5)) 00574000 B PROMPT 00575000 SYSERR WRTERM 'No command supplied' 00576000 B PROMPT 00577000 LEAVE CLI 8(R6),C'?' NEED HELP? 00578000 BNE LV2 00579000 WRTERM 'Confirm with a carriage return' 00580000 B PROMPT 00581000 * Return the two 64K buffers used for reading/writing. [2] 00582000 LV2 L R0,=F'16384' RETURN 128K [2] 00583000 L R1,ABUF STARTING ADDR [2] 00584000 DMSFRET DWORDS=(0),LOC=(1),ERR=*,MSG=NO [2] 00585000 SR R1,R1 Clear flags back to how [12] 00586000 L R15,=A(SETMSGS) the user had them set [12] 00587000 BALR R14,R15 [12] 00588000 FSCLOSE 'KER LOG A1' Close and ignore errors [14] 00589000 B KRET AND LEAVE [2] 00590000 BADDEV WRTERM 'Connection must be via a TTY line or the Series/1 *00591000 emulation controller.' [12] 00592000 B RET 00593000 ERRBUF WRTERM 'Unable to allocate read/write buffers' [2] 00594000 KRET EQU * 00595000 USING NUCON,0 USE TO RESET BLIP 00596000 L R7,AEXTSECT ADDR OF EXTSECT 00597000 USING EXTSECT,R7 RESTORE USER'S BLIP CHAR 00598000 DMSEXS MVC,TIMCHAR(1),BLIP 00599000 DROP R7 00600000 * RESTORE USER'S TERMINAL LINESIZE 00601000 LINEDIT TEXT='TERM LINES ........',SUB=(DECA,LINSIZ), *00602000 DOT=NO,DISP=CPCOMM 00603000 RET EQU * 00604000 L R13,4(R13) 00605000 L R14,12(R13) 00606000 LM R0,R12,20(R13) 00607000 BR R14 00608000 * 00609000 KSAVE DS 18F KERMIT'S SAVE AREA 00610000 LTORG 00611000 DROP R11 00612000 DROP R12 NO LONGER NEED THEM 00613000 EJECT 00614000 * Moved code because base register ran out on us. [21] 00615000 PRSFN BALR R7,0 New base register 00616000 USING *,R7 00617000 L R11,=A(PARMS) Point to data area 00618000 USING PARMS,R11 00619000 SR R15,R15 Retcode 00620000 LA R6,8(R6) Pick up next token 00621000 CLI 0(R6),C'?' Need help? 00622000 BNE PRSF0 00623000 WRTERM 'Specify filename with format: [fn ft [fm]]' 00624000 BCTR R15,0 00625000 B PRSRET 00626000 PRSF0 CLC 0(8,R6),=8X'FF' No more words? 00627000 BE PRSRET No so go receive 00628000 CLI 0(R6),C'=' Is it " = = FM" ? 00629000 BNE PRSF1 00630000 CLI 8(R6),C'=' Is FT also '=' ? 00631000 BNE PRSF3 Must be an '=' 00632000 CLI 16(R6),X'FF' No FM given - assume A1 00633000 BE PRSRET 00634000 MVC FM(2),16(R6) Use FM they specified 00635000 B PRSRET 00636000 PRSF1 CLI 0(R6),C'*' No wildcards here 00637000 BNE PRSF2 00638000 WRTERM 'Invalid file name' 00639000 BCTR R15,0 00640000 B PRSRET 00641000 PRSF2 MVC FILNAM,=18X'20' Blank it out 00642000 MVC FILNAM(8),0(R6) Get fn 00643000 LA R6,8(R6) Get next token 00644000 CLI 0(R6),C'*' Not allowed 00645000 BE PRSF3 00646000 CLI 0(R6),C'=' Not allowed 00647000 BE PRSF3 00648000 CLC 0(8,R6),=8X'FF' No more? 00649000 BNE PRSF4 00650000 PRSF3 WRTERM 'Invalid File Type' 00651000 BCTR R15,0 00652000 B PRSRET 00653000 PRSF4 MVC FILNAM+8(8),0(R6) Get ftype 00654000 OI FLAGS,FLG2 Overwrite received fname 00655000 MVC FILNAM+16(2),DFM Default fmode,just in case 00656000 LA R6,8(R6) Look for fmode 00657000 CLC 0(8,R6),=8X'FF' Is it there? 00658000 BE PRSRET No use default 00659000 CLI 0(R6),C'*' Not allowed in FM 00660000 BE PRSF5 00661000 MVC FILNAM+16(2),0(R6) Get fmode 00662000 B PRSRET Go to read portion 00663000 PRSF5 WRTERM 'Invalid file mode' 00664000 BCTR R15,0 00665000 PRSRET EQU * 00666000 DROP R7 Go back to old base 00667000 BR R14 Return to caller 00668000 LTORG 00669000 * 00670000 * Set the maximum data packet size. [4] 00671000 PACKLEN CSECT 00672000 STM R14,R12,12(R13) 00673000 BALR R12,0 00674000 USING *,R12 00675000 LA R14,PKSAV 00676000 ST R13,4(R14) 00677000 ST R14,8(R13) 00678000 LR R13,R14 00679000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST 00680000 L R11,=A(PARMS) 00681000 USING PARMS,R11 00682000 L R5,SPSIZ Maximum send packet size 00683000 S R5,=F'4' Minus control information 00684000 SR R7,R7 00685000 IC R7,CHKLEN 00686000 SR R5,R7 Minus checksum length 00687000 BCTR R5,0 00688000 BCTR R5,0 Minus two for possible #X 00689000 CLI EBQUOT,AN Doing 8-bit quoting? 00690000 BE PACK0 Nope 00691000 CLI EBQUOT,AY Not doing it in this case either 00692000 BE PACK0 00693000 BCTR R5,0 Another one for 8-bit quoting 00694000 PACK0 CLI RPTQ,X'00' Doing repeat char quoting 00695000 BE PACK1 Nope, so that's all for now 00696000 BCTR R5,0 00697000 BCTR R5,0 Minus two for repeat prefix 00698000 PACK1 ST R5,MAXDAT Save max length for data field 00699000 * Do standard linkage and return. 00700000 L R13,4(R13) 00701000 L R14,12(R13) 00702000 LM R0,R12,20(R13) 00703000 BR R14 00704000 PKSAV DS 18F 00705000 LTORG 00706000 DROP R11 00707000 DROP R12 00708000 EJECT 00709000 * 00710000 * Verify characters of FILNAM. [9] 00711000 VERLET CSECT 00712000 STM R14,R12,12(R13) 00713000 BALR R12,0 00714000 USING *,R12 00715000 LA R14,VRLSAV 00716000 ST R13,4(R14) 00717000 ST R14,8(R13) 00718000 LR R13,R14 00719000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST 00720000 L R11,=A(PARMS) 00721000 USING PARMS,R11 00722000 VER0 SR R1,R1 00723000 TRT FILNAM(18),VALLET Valid letters only 00724000 BZ VERRET 00725000 MVI 0(R1),C'X' Replace invalid char 00726000 B VER0 00727000 VERRET L R13,4(R13) 00728000 L R14,12(R13) 00729000 LM R0,R12,20(R13) 00730000 BR R14 00731000 VRLSAV DS 18F 00732000 VALLET DC 64X'01' 00733000 DC X'00' For 40 (space) 00734000 DC 13X'01' 00735000 DC X'00' For 4E (plus) 00736000 DC 12X'01' 00737000 DC X'00' For 5B (dollar sign) 00738000 DC 4X'01' 00739000 DC X'00' For 60 (dash) 00740000 DC 12X'01' 00741000 DC X'00' For 6D (underscore) 00742000 DC 12X'01' 00743000 DC 3X'00' For 7A-7C (colon ... 00744000 DC 68X'01' ... pound sign, at sign) 00745000 DC 9X'00' For C1-C9 (A-I) 00746000 DC 7X'01' 00747000 DC 9X'00' For D1-D9 (J-R) 00748000 DC 8X'01' 00749000 DC 8X'00' For E2-E9 (S-Z) 00750000 DC 6X'01' 00751000 DC 10X'00' For F0-F9 (0-9) 00752000 DC 6X'01' 00753000 LTORG 00754000 DROP R11 00755000 DROP R12 00756000 EJECT 00757000 * 00758000 INIT CSECT 00759000 STM R14,R12,12(R13) 00760000 BALR R12,0 00761000 USING *,R12 00762000 LA R14,ISAVE 00763000 ST R13,4(R14) 00764000 ST R14,8(R13) 00765000 LR R13,R14 00766000 * 00767000 * INITIALIZE VARIABLES THAT GET CHANGED DURING EXECUTION 00768000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA LIST 00769000 L R11,=A(PARMS) 00770000 USING PARMS,R11 00771000 XC SNDPKT,SNDPKT CLEAR OUT THESE BUFFERS 00772000 XC RECPKT,RECPKT 00773000 XC INPUT,INPUT 00774000 XC ABUF,ABUF ADDR OF READ BUFFER [2] 00775000 XC ARBUF,ARBUF ADDR OF WRITE BUFFER [2] 00776000 XC QSBUF,QSBUF For QUERY SET cmd [12] 00777000 XC FSENT,FSENT 00778000 XC SDAT,SDAT 00779000 XC RDAT,RDAT 00780000 XC SPKNUM,SPKNUM SET VARIABLES TO ZERO 00781000 XC RPKNUM,RPKNUM 00782000 XC LSDAT,LSDAT 00783000 XC LRDAT,LRDAT 00784000 MVI FLAGS,X'00' CLEAR ALL FLAGS 00785000 MVI LFLAGS,X'00' Local settings flags [12] 00786000 XC INBFPT,INBFPT 00787000 XC OUTBFPT,OUTBFPT 00788000 XC NUMTRY,NUMTRY 00789000 MVC FILNAM,=18X'20' BLANK OUT FILNAM & NAME 00790000 MVC NAME,=18X'20' 00791000 MVI PREV,X'00' 00792000 MVI ERRNUM,X'FF' SET TO NO ERROR FOR NOW 00793000 MVI OLDERR,X'FF' SAME HERE 00794000 MVC FST(4),=X'FF000000' 00795000 MVC ADT(4),=X'FF000000' 00796000 XC PKVAR,PKVAR ZERO IT OUT 00797000 XC OLDTRY,OLDTRY 00798000 XC TEMP,TEMP 00799000 XC NFSENT,NFSENT ZERO FILES SENT,INITIALLY 00800000 XC STORLOC,STORLOC 00801000 MVC LRECL,=A(DLRECL) Use default [2] [4] 00802000 MVI RFM,DRECFM 00803000 MVC FM(2),DFM 00804000 MVC MAXOUT,=A(MAXTXT) Max output buffer size [6] 00805000 MVI RQUOTE,DQUOTE Use default quote char [4] 00806000 MVI SQUOTE,DQUOTE Ditto [4] 00807000 MVI EBQUOT,D8QUO For 8-bit quoting [1][4] 00808000 MVI ORIG8Q,D8QUO For 8-bit quoting [1][4] 00809000 MVI REOL,DEOL Use default for now [4] 00810000 MVI SEOL,DEOL Ditto [4] 00811000 MVI STIME,DSTIM 00812000 MVI RTIME,DRTIM 00813000 MVI SPAD,DSPAD 00814000 MVI RPAD,DRPAD 00815000 MVI SPADCH,DSPADC 00816000 MVI RPADCH,DRPADC 00817000 MVI CHKLEN,DCHKLEN Checksum length [4] 00818000 MVI CHKSET,DCHKLEN Checksum length [4] 00819000 MVI RPTQ,DRPT Repeat char prefix [4] 00820000 MVI ORIGQ,DRPT Repeat char prefix [4] 00821000 MVI CXZ,X'00' Abort sending file(s) [16] 00822000 MVI STATE,C' ' 00823000 MVI STYPE,C' ' 00824000 MVI RTYPE,C' ' 00825000 * 00826000 INITRET L R13,4(R13) 00827000 L R14,12(R13) 00828000 LM R0,R12,20(R13) 00829000 BR R14 00830000 ISAVE DS 18F 00831000 LTORG 00832000 DROP R11 00833000 DROP R12 00834000 EJECT 00835000 PARMS CSECT GLOBAL DATA LIST 00836000 S1ORDS DS 0D Transparent R/W [12 start] 00837000 DC X'40',AL1(SBA),X'5D7F',AL1(SBA),X'0001' 00838000 S1ORDSL EQU *-S1ORDS [12 end] 00839000 SNDPKT DS CL130 SEND THIS TO MICRO 00840000 ORG SNDPKT 00841000 PHDR DS X 00842000 PLEN DS X 00843000 PNUM DS X 00844000 PTYPE DS X 00845000 PDATA DS 0C 00846000 ORG , 00847000 RECPKT DS CL130 RECEIVE THIS FROM MICRO 00848000 S1SCCW DS 0D CCW to write to S/1 [12 start] 00849000 DC X'29',AL3(S1ORDS),AL1(SLI),X'00' 00850000 S1SDATL DC H'0' Length of data to send 00851000 S1RCCW DS 0D CCW to read S/1 00852000 DC X'2A',AL3(RECPKT),AL1(SLI),X'80',AL2(L'RECPKT) 00853000 * Data from console interrupts are saved here: 00854000 CONSCSW DS 0D 00855000 CONSKEY DC X'00' storage key + cond code 00856000 CONSCCW DC AL3(0) CCW addr 00857000 CONSUNIT DC X'00' unit status 00858000 CONSCHAN DC X'00' channel status 00859000 CONSBYTC DC H'0' byte count 00860000 ERRCSW DS 1D copy of CSW in error 00861000 * 00862000 S1RDBYTC DC F'-1' READ MOD byte count residue 00863000 CONSADDR DC H'9' console addr (CUU) 00864000 CONSTTY DC X'8020' Class=TERM,type=TTY 00865000 CONS772 DC X'400402' Class=GRAF,type=3277,mod=2 00866000 S1FLAGS DC X'00' S/1 flags [12 end] 00867000 * 00868000 LSDAT DS F SEND PACKET SIZE 00869000 LRDAT DS F RECEIVE PACKET SIZE 00870000 MORENC DS F Encode refill routine [22] 00871000 MORDEC DS F Deocde dump routine [22] 00872000 FLAGS DC X'00' USE TO TEST OUR FLAGS 00873000 LFLAGS DC X'00' For local settings [12] 00874000 FILINFO DC A(NAME) DATA FOR "NEXTFST" ROUTINE 00875000 DC A(ADT) 00876000 DC X'80',AL3(FST) 00877000 HLPMSG DC CL8'HELP' USE FOR CMS 'HELP' COMMAND 00878000 DC CL8'KERMIT' TOKENIZE TO 8 CHARACTERS 00879000 DC 8X'FF' NO MORE INFO 00880000 NAME DC 18X'20' NAME OF FILE(S) TO SEND 00881000 DS 0F 00882000 FST DC X'FF',AL3(0) USE FOR "NEXTFST" ROUTINE 00883000 ADT DC X'FF',AL3(0) THIS TOO 00884000 DS 0F 00885000 INPUT DS CL130 INPUT BUFFER 00886000 DS 0F 00887000 ABUF DS F ADDR OF FSREAD BUFFER [2] 00888000 ARBUF DS F ADDR OF FSWRITE BUFFER [2] 00889000 PROMSG DC C'Kermit CMS Version 2.01' [3] 00890000 HELPM DC C'Enter ? for a list of valid commands' [3] 00891000 FILMSG1 DC C'File type is text.' [17] 00892000 FILMSG2 DC C'File type is binary.' [17] 00893000 DEBMSG1 DC C'Debug mode is off.' [17] 00894000 DEBMSG2 DC C'Debug mode is on.' [17] 00895000 SERMSG1 DC C'Series/1 mode is off.' [17] 00896000 SERMSG2 DC C'Series/1 mode is on.' [17] 00897000 WARMSG1 DC C'Warning is off.' [18] 00898000 WARMSG2 DC C'Warning is on.' [18] 00899000 FSENT DS CL160 TABLE OF FILES SENT SO FAR 00900000 DS 0F 00901000 TAKTAB DS CL160 Table of TAKE files [15] 00902000 QSBUF DS CL256 For QUERY SET response [12] 00903000 SPKNUM DC F'0' SEND PACKET NUMBER [13] 00904000 RPKNUM DC F'0' RECEIVE PACKET NUMBER [13] 00905000 NUMTRY DC F'0' TRIAL COUNTER FOR TRANSFERS 00906000 OLDTRY DS F COUNTER FOR PREVIOUS PACKET 00907000 NFSENT DC F'0' NUMBER OF FILES SENT 00908000 STORLOC DS F POINTER TO EXTRA STORAGE 00909000 RECL DS F RECORD LEN (IF RECFM = V) 00910000 RPSIZ DC F'94' MAX RECEIVE PACKET SIZE 00911000 SPSIZ DC F'80' SEND PACKET SIZE 00912000 MAXTRY DC F'5' NO. OF TIMES TO RETRY PACKET 00913000 IMXTRY DC F'16' NO. OF INITIAL TRIALS ALLOWED 00914000 DEL DC F'127' OCTAL 177 (DELETE CHAR) 00915000 ZERO DC F'0' 00916000 ONE DC F'1' 00917000 FIVE DC F'5' 00918000 TWO DC F'2' 00919000 SPACE DC F'32' ASCII SPACE 00920000 O1H DC F'64' OCTAL 100 00921000 O2H DC F'128' OCTAL 200 00922000 INBFPT DC F'0' Input buffer pointer 00923000 OUTBFPT DC F'0' Output buffer pointer 00924000 PAR DS F PARITY OF INCOMING CHARACTER [1] 00925000 EXTFLG DS X Exit flag [11] 00926000 SQUOTE DS X Micro's quote char 00927000 RQUOTE DS X QUOTE CHAR WE'LL SEND 00928000 EBQUOT DS X 8-BIT QUOTING CHAR [1] 00929000 ORIG8Q DS X ORIG 8-BIT QUOTE CHAR [1] 00930000 STIME DS X Send timeout [5] 00931000 RTIME DS X Receive timeout [5] 00932000 SPAD DS X Send padding [5] 00933000 RPAD DS X Receive padding [5] 00934000 SPADCH DS X Send pad char [5] 00935000 RPADCH DS X Receive pad char [5] 00936000 CXZ DS X Abort send/rec file(s) [16] 00937000 TMP DS X 00938000 TEMP DS F TEMPORARY SPACE 00939000 DS 0D 00940000 PKVAR DS D USE FOR PICKING UP INTEGER 00941000 SDAT DS CL130 TEMP PLACE FOR SEND DATA 00942000 RDAT DS CL130 TEMP PLACE FOR RECEIVE DATA 00943000 DS 0D 00944000 INFOBUF DS 32X'00' For diagnose x'00' [15] 00945000 FILNAM DS CL18 SEND/REC FILENAME 00946000 UNAME DS CL8 User for init file [15] 00947000 DC CL8'KERMINI ' File type expected [15] 00948000 DC CL2'* ' File mode [15] 00949000 SYSTAK DC CL8'SYSTEM ' System init file [15] 00950000 DC CL8'KERMINI ' File type [15] 00951000 DC CL2'* ' File mode [15] 00952000 STATE DS C OUR CURRENT STATE 00953000 DFM DC CL2'A1' DEFAULT FILEMODE 00954000 FM DS CL2 FILEMODE USER WANTS 00955000 CHKLEN DS X Checksum length [4] 00956000 CURCHK DS X Store chksum length here [8] 00957000 CHKSET DS X SET by user [8] 00958000 RPTQ DS X Repeat prefix [4] 00959000 ORIGQ DS X Original repeat prefix [7] 00960000 RPTVAL DS X Character to be repeated [7] 00961000 RPTCT DS X No. of times is repeated [7] 00962000 TAKLEV DS X TAKE file level [15] 00963000 REOL DS X EOL CHAR I NEED (CR) 00964000 SEOL DS X EOL I'LL SEND 00965000 LRECL DS F LRECL PROGRAM WILL USE [2] 00966000 RFM DS C RECFM PROGRAM WILL USE 00967000 PREV DS C PREVIOUS CHAR REC (IN PTCHR) 00968000 BLIP DS X SAVE USER'S BLIP CHAR 00969000 LINSIZ DS F SAVE USER'S CONSOLE LINESIZE 00970000 MAXDAT DS F Max packet size for send [4] 00971000 MAXOUT DS F Max output buffer [6] 00972000 ERRNUM DS X ERROR NUMBER,IN CASE WE DIE 00973000 OLDERR DS X ERROR OF PREVIOUS EXECUTION 00974000 STYPE DS C TYPE OF PACKET SENT 00975000 RTYPE DS C TYPE OF PACKET RECEIVED 00976000 * THIS IS THE ASCII TO EBCDIC TABLE [19] 00977000 ATOE DC X'00010203372D2E2F1605250B0C0D0E0F' 00978000 DC X'101112133C3D322618193F271C1D1E1F' 00979000 DC X'405A7F7B5B6C507D4D5D5C4E6B604B61' 00980000 DC X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F' 00981000 DC X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6' 00982000 DC X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D' 00983000 DC X'79818283848586878889919293949596' 00984000 DC X'979899A2A3A4A5A6A7A8A9C04FD0A107' 00985000 DC X'00010203372D2E2F1605250B0C0D0E0F' 00986000 DC X'101112133C3D322618193F271C1D1E1F' 00987000 DC X'405A7F7B5B6C507D4D5D5C4E6B604B61' 00988000 DC X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F' 00989000 DC X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6' 00990000 DC X'D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D' 00991000 DC X'79818283848586878889919293949596' 00992000 DC X'979899A2A3A4A5A6A7A8A9C04FD0A107' 00993000 *THIS IS THE EBCDIC TO ASCII CONVERSION TABLE 00994000 *CHARACTERS NOT REPRESENTABLE IN ASCII ARE REPLACED BY A NULL 00995000 ETOA DC X'000102030009007F0000000B0C0D0E0F' 00996000 DC X'1011121300000800181900001C1D1E1F' 00997000 DC X'00000000000A171B0000000000050607' 00998000 DC X'0000160000000004000000001415001A' 00999000 DC X'20000000000000000000002E3C282B7C' 01000000 DC X'2600000000000000000021242A293B5E' 01001000 DC X'2D2F00000000000000007C2C255F3E3F' 01002000 DC X'000000000000000000603A2340273D22' 01003000 DC X'00616263646566676869007B00000000' 01004000 DC X'006A6B6C6D6E6F707172007D00000000' 01005000 DC X'007E737475767778797A0000005B0000' 01006000 DC X'000000000000000000000000005D0000' 01007000 DC X'7B414243444546474849000000000000' 01008000 DC X'7D4A4B4C4D4E4F505152000000000000' 01009000 DC X'5C00535455565758595A000000000000' 01010000 DC X'303132333435363738397C0000000000' 01011000 * Table to convert EBCDIC text to upper case. [15] 01012000 UPC DC X'000102030405060708090A0B0C0D0E0F' 01013000 DC X'101112131415161718191A1B1C1D1E1F' 01014000 DC X'202122232425262728292A2B2C2D2E2F' 01015000 DC X'303132333435363738393A3B3C3D3E3F' 01016000 DC X'404142434445464748494A4B4C4D4E4F' 01017000 DC X'505152535455565758595A5B5C5D5E5F' 01018000 DC X'606162636465666768696A6B6C6D6E6F' 01019000 DC X'707172737475767778797A7B7C7D7E7F' 01020000 DC X'80C1C2C3C4C5C6C7C8C98A8B8C8D8E8F' 01021000 DC X'90D1D2D3D4D5D6D7D8D99A9B9C9D9E9F' 01022000 DC X'A0A1E2E3E4E5E6E7E8E9AAABACADAEAF' 01023000 DC X'B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF' 01024000 DC X'C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF' 01025000 DC X'D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF' 01026000 DC X'E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF' 01027000 DC X'F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF' 01028000 * Table to use for CRC calculation 01029000 CRCTAB DC X'0000' 01030000 DC X'1081' 01031000 DC X'2102' 01032000 DC X'3183' 01033000 DC X'4204' 01034000 DC X'5285' 01035000 DC X'6306' 01036000 DC X'7387' 01037000 DC X'8408' 01038000 DC X'9489' 01039000 DC X'A50A' 01040000 DC X'B58B' 01041000 DC X'C60C' 01042000 DC X'D68D' 01043000 DC X'E70E' 01044000 DC X'F78F' 01045000 * 01046000 CRCTB2 DC X'0000' 01047000 DC X'1189' 01048000 DC X'2312' 01049000 DC X'329B' 01050000 DC X'4624' 01051000 DC X'57AD' 01052000 DC X'6536' 01053000 DC X'74BF' 01054000 DC X'8C48' 01055000 DC X'9DC1' 01056000 DC X'AF5A' 01057000 DC X'BED3' 01058000 DC X'CA6C' 01059000 DC X'DBE5' 01060000 DC X'E97E' 01061000 DC X'F8F7' 01062000 * 01063000 * TABLE OF ERROR MESSAGES (IN CASE WE ABORT) 01064000 ERRTAB DC CL20'Bad send-packet size' ERR MSG #0 01065000 DC CL20'Bad message number' ERR MSG #1 01066000 DC CL20'Unrecognized state' ERR MSG #2 01067000 DC CL20'No SOH encountered' ERR MSG #3 01068000 DC CL20'Bad character count' ERR MSG #4 01069000 DC CL20'Bad checksum' ERR MSG #5 01070000 DC CL20'Disk is full' ERR MSG #6 01071000 DC CL20'Invalid packet type' ERR MSG #7 01072000 DC CL20'Lost a packet' ERR MSG #8 01073000 DC CL20'Micro sent a NAK' ERR MSG #9 01074000 DC CL20'Micro aborted' ERR MSG #10 01075000 DC CL20'Invalid file name' ERR MSG #11 01076000 DC CL20'Invalid lrecl' ERR MSG #12 01077000 DC CL20'Permanent I/O error' ERR MSG #13 01078000 DC CL20'Disk is read-only' ERR MSG #14 01079000 DC CL20'Recfm conflict' ERR MSG #15 01080000 DC CL20'Err allocating space' ERR MSG #16 01081000 DC CL20'Series/1 I/O error' ERR MSG #17 [12] 01082000 DC CL20'Unknown generic cmd' ERR MSG #18 [13] 01083000 DC CL20'Unknown server cmd' ERR MSG #19 [13] 01084000 DC CL20'Cannot rename file' ERR MSG #20 [18] 01085000 DC CL20'File not found' ERR MSG #21 [13] 01086000 DC CL20'Send cancelled' ERR MSG #22 [16] 01087000 DC CL20'Receive cancelled' ERR MSG #23 [16] 01088000 DC CL20'Cannot create file' ERR MSG #24 [18] 01089000 DC CL20'Error writing file' ERR MSG #25 [4] 01090000 S1ERRNUM EQU 17 Makes life easier [12] 01091000 LTORG 01092000 EJECT 01093000 SET CSECT 01094000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 01095000 BALR R12,0 ESTABLISH ADDRESSABILITY 01096000 USING *,R12 01097000 LA R14,SETSAVE ADDRESS OF MY SAVE AREA 01098000 ST R13,4(R14) SAVE CALLER'S 01099000 ST R14,8(R13) 01100000 LR R13,R14 01101000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA 01102000 L R11,=A(PARMS) 01103000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 01104000 LA R6,8(R6) PICK UP NEXT TOKEN 01105000 CLI 0(R6),C'?' NEED HELP ? 01106000 BNE NOQ 01107000 WRTERM 'File, Debug, Block, Series1, Warning, Recfm, Quote' 01108000 WRTERM 'Lrecl, End-of-line, Packet-size, Etoa, Atoe' 01109000 B SETOK 01110000 NOQ CLC 0(7,R6),=CL7'SERIES1' Series/1 mode [12 start] 01111000 BNE NOSER 01112000 LA R6,8(R6) Pick up operand 01113000 CLI 0(R6),C'?' Need help? 01114000 BNE CHKSR 01115000 WRTERM 'ON or OFF' 01116000 B SETOK 01117000 CHKSR CLC 0(2,R6),=CL2'ON' Set series/1 mode on 01118000 BNE STSR0 01119000 OI S1FLAGS,ISS1 01120000 B SETOK 01121000 STSR0 CLC 0(3,R6),=CL3'OFF' Set series/1 mode off 01122000 BNE STSR1 01123000 NI S1FLAGS,X'FF'-ISS1 01124000 B SETOK 01125000 STSR1 WRTERM 'Operand must be ON or OFF' 01126000 B SETERR [12 end] 01127000 NOSER CLC 0(4,R6),=CL4'WARN' Set fn renaming [18 start] 01128000 BNE NOWAR 01129000 LA R6,8(R6) Pick up operand 01130000 CLI 0(R6),C'?' Need help? 01131000 BNE CHKWR 01132000 WRTERM 'ON or OFF' 01133000 B SETOK 01134000 CHKWR CLC 0(2,R6),=CL2'ON' Set warning on? 01135000 BNE STWR0 01136000 OI LFLAGS,WARFL Yes 01137000 B SETOK 01138000 STWR0 CLC 0(3,R6),=CL3'OFF' Set warning off? 01139000 BNE STWR1 01140000 NI LFLAGS,X'FF'-WARFL 01141000 B SETOK 01142000 STWR1 WRTERM 'Operand must be ON or OFF' 01143000 B SETERR [18 end] 01144000 NOWAR CLC 0(4,R6),=CL4'FILE' Set file mode [1 start] 01145000 BNE NOBIN 01146000 LA R6,8(R6) Pick up operand 01147000 CLI 0(R6),C'?' Need help? 01148000 BNE CHKBN 01149000 WRTERM 'BINARY or TEXT' 01150000 B SETOK 01151000 CHKBN CLC 0(6,R6),=CL6'BINARY' Setting to BINARY? 01152000 BNE STBN0 No maybe it's TEXT 01153000 OI FLAGS,BINF Set binary on 01154000 MVC MAXOUT,LRECL Max output buffer size 01155000 B SETOK 01156000 STBN0 CLC 0(4,R6),=CL4'TEXT' Setting it off? 01157000 BNE STBN1 No then it's wrong 01158000 NI FLAGS,X'FF'-BINF Set it OFF 01159000 MVC MAXOUT,=A(MAXTXT) Max output buffer size 01160000 B SETOK 01161000 STBN1 WRTERM 'Invalid operand' 01162000 B SETERR [1 end] 01163000 NOBIN CLC 0(5,R6),=CL5'DEBUG' Set debug mode [10 start] 01164000 BNE NODEB No check something else 01165000 LA R6,8(R6) Pick up operand 01166000 CLI 0(R6),C'?' Need help? 01167000 BNE CHKDB 01168000 WRTERM 'ON or OFF' 01169000 B SETOK 01170000 CHKDB CLC 0(2,R6),=CL2'ON' Setting it on? 01171000 BNE STDEB3 No maybe it's OFF 01172000 OI FLAGS,DEBUG Set it ON 01173000 FSERASE 'KER LOG A1' In case exists already [14] 01174000 FSOPEN 'KER LOG A1',RECFM=V,FORM=E Keep a log [14] 01175000 LTR R15,R15 Check the return code [14] 01176000 BZ SETOK No problem [14] 01177000 C R15,=F'28' File not found [14] 01178000 BE SETOK That's OK too [14] 01179000 WRTERM 'Error creating file, no logging of packets.' [14] 01180000 B SETOK 01181000 STDEB3 CLC 0(3,R6),=CL3'OFF' Setting if off? 01182000 BNE STDEB4 No then it's wrong 01183000 NI FLAGS,X'FF'-DEBUG Set it OFF 01184000 FSCLOSE 'KER LOG A1' Done logging [14] 01185000 B SETOK 01186000 STDEB4 WRTERM 'Invalid operand' 01187000 B SETERR [10 end] 01188000 NODEB CLC 0(5,R6),=CL5'BLOCK' Set checksum len [8 start] 01189000 BNE NOBL 01190000 LA R6,8(R6) Pick up chksum type 01191000 CLI 0(R6),C'?' Need help? 01192000 BNE CHKBL 01193000 WRTERM '1, 2, or 3' 01194000 B SETOK 01195000 CHKBL CLI 0(R6),X'F1' Must be 1, 2 or 3 01196000 BL BLKERR Error if below 1 01197000 CLI 0(R6),X'F3' 01198000 BH BLKERR Error if above 3 01199000 CLI 1(R6),C' ' Should be one char long [20] 01200000 BNE BLKERR Else fail [20] 01201000 SR R4,R4 01202000 IC R4,0(R6) Pick it up 01203000 S R4,=F'240' Shouldn't be printable 01204000 STC R4,CHKLEN Pick up block check 01205000 STC R4,CHKSET Store here too 01206000 B SETOK 01207000 BLKERR WRTERM 'Must be 1, 2, or 3' 01208000 B SETERR 01209000 NOBL CLC 0(5,R6),=CL5'RECFM' Set recfm [8 end] 01210000 BNE NOREC 01211000 LA R6,8(R6) PICK UP RECORD FORMAT 01212000 CLI 0(R6),C'?' 01213000 BNE CHKFM 01214000 WRTERM 'f or v (default of v)' 01215000 B SETOK 01216000 CHKFM CLI 0(R6),C'V' REDUNDANT 01217000 BE FMSET 01218000 CLI 0(R6),C'F' FIXED FORMAT? 01219000 BNE RECERR 01220000 FMSET MVC RFM(1),0(R6) PICK UP RECFM 01221000 B SETOK 01222000 RECERR WRTERM 'Fixed and variable files only' 01223000 B SETERR 01224000 NOREC CLC 0(5,R6),=C'QUOTE' QUOTE CHARACTER 01225000 BNE NOQUO 01226000 LA R6,8(R6) GET NEXT TOKEN 01227000 CLI 0(R6),X'FF' VALUE NOT SUPPLIED? 01228000 BNE GIVQ 01229000 WRTERM '?not confirmed' 01230000 B SETERR 01231000 GIVQ CLC 0(2,R6),=C'? ' 01232000 BNE GETQUO 01233000 WRTERM 'a single character' 01234000 B SETOK 01235000 GETQUO MVC RQUOTE(1),0(R6) SET NEW QUOTE CHAR 01236000 TR RQUOTE(1),ETOA GET ASCII FORM 01237000 CLI 1(R6),C' ' IS IT ONLY ONE CHAR? 01238000 BE ISQOK 01239000 WRTERM 'one character only' 01240000 B SETERR 01241000 ISQOK CLI RQUOTE,X'21' CAN'T BE LESS THAN 32 01242000 BL BADQUO 01243000 CLI RQUOTE,X'7E' CAN'T BE LARGER THAN 126 01244000 BH BADQUO 01245000 CLI RQUOTE,X'3E' HAS TO BE BETWEEN 32-62 01246000 BNH SETOK 01247000 CLI RQUOTE,X'60' OR BETWEEN 96-126 01248000 BNL SETOK 01249000 BADQUO WRTERM 'Must fall between 33-62,96,or 123-126 (decimal).' 01250000 B SETERR 01251000 NOQUO CLC 0(5,R6),=C'LRECL' LRECL SIZE 01252000 BNE NORCL 01253000 LA R6,8(R6) PICK UP NEXT TOKEN 01254000 CLI 0(R6),C'?' HELP ? 01255000 BNE GETREC 01256000 WRTERM 'Logical record length of 1-65536 (default of 80).' 01257000 B SETOK 01258000 GETREC L R15,=A(GETNUM) Get decimal number [20] 01259000 BALR R14,R15 Use common routine [20] 01260000 LTR R7,R7 Result put here [20] 01261000 BM BADREC Below zero or no input [20] 01262000 BZ BADREC Must be above zero [20] 01263000 C R7,=F'65536' Max of 64K for lrecl [2] 01264000 BH BADREC 01265000 ST R7,LRECL Set the lrecl value [2] 01266000 MVC MAXOUT,LRECL Max output buffer size 01267000 B SETOK 01268000 BADREC WRTERM 'A number between 1 and 65536 (decimal).' 01269000 B SETERR 01270000 NORCL CLC 0(3,R6),=C'END' EOL CHARACTER 01271000 BNE NOEND 01272000 LA R6,8(R6) NEXT TOKEN 01273000 CLI 0(R6),C'?' NEED HELP? 01274000 BNE GETEOL 01275000 WRTERM 'A decimal number between 0 and 31.' 01276000 B SETOK 01277000 GETEOL L R15,=A(GETNUM) Get decimal number [20] 01278000 BALR R14,R15 Use common routine [20] 01279000 LTR R7,R7 Result is here [20] 01280000 BM BADEOL Below zero or no input [20] 01281000 C R7,=X'0000001F' MAX OF 31 DECIMAL 01282000 BH BADEOL 01283000 STC R7,SEOL SET SEND EOL VALUE 01284000 B SETOK 01285000 BADEOL WRTERM 'Must be a two digit value less than 31 (dec).' 01286000 B SETERR 01287000 NOEND CLC 0(3,R6),=C'PAC' CHANGE RECEIVE PACKET SIZE 01288000 BNE NOPAC [20] 01289000 LA R6,8(R6) GET NEXT TOKEN 01290000 CLI 0(R6),C'?' NEED HELP? 01291000 BNE GETPAC 01292000 WRTERM 'Receive packet size (range: 26-94 decimal).' 01293000 B SETOK 01294000 GETPAC L R15,=A(GETNUM) Get decimal number [20] 01295000 BALR R14,R15 Use common routine [20] 01296000 LTR R7,R7 Result is here [20] 01297000 BM BADPAC Below zero or no input [20] 01298000 C R7,=F'26' THIS IS MIN 01299000 BL BADPAC 01300000 C R7,=A(SPMAX) This is the max [5] 01301000 BH BADPAC 01302000 ST R7,RPSIZ USE THIS VALUE NOW 01303000 B SETOK 01304000 BADPAC WRTERM 'Must be between 26-94 (decimal).' 01305000 B SETERR 01306000 * Use common code to change ATOE or ETOA. R9 points to table to edit. 01307000 NOPAC CLC 0(4,R6),=C'ETOA' Change ETOA table? [20 start] 01308000 BNE NOET 01309000 LA R9,ETOA Address of table to change 01310000 ET0 LA R6,8(R6) Bump pointer 01311000 CLI 0(R6),C'?' Help? 01312000 BNE ET1 01313000 WRTERM 'Offset to change and new value (decimal)' 01314000 B SETOK 01315000 ET1 L R15,=A(GETNUM) Get table offset 01316000 BALR R14,R15 Use common routine 01317000 LTR R7,R7 Result is here 01318000 BM BADTRT Below zero or no input 01319000 C R7,=F'255' Max is 255 01320000 BH BADTRT 01321000 LR R2,R7 Save table offset here 01322000 LA R6,8(R6) Pick up next field 01323000 L R15,=A(GETNUM) Get value to change it to 01324000 BALR R14,R15 01325000 LTR R7,R7 01326000 BM BADTRT 01327000 C R7,=F'255' 01328000 BH BADTRT 01329000 AR R9,R2 Location of byte to change 01330000 STC R7,0(R9) Change value 01331000 B SETOK All done 01332000 BADTRT WRTERM 'Both numbers must be between 0-255 (decimal).' 01333000 B SETERR 01334000 NOET CLC 0(4,R6),=C'ATOE' Change ATOE 01335000 BNE SETERR 01336000 LA R9,ATOE Addr of table to edit 01337000 B ET0 Use common routine 01338000 * R6 points to input. Read and convert to binary. Return value 01339000 * in R7. Indicate error by returning -1. Also uses R4 and R3. 01340000 GETNUM SR R7,R7 01341000 BCTR R7,0 Set to -1, error condition 01342000 CLI 0(R6),X'FF' Any input? 01343000 BE GETN5 No, return negative value 01344000 XC PKVAR,PKVAR Clear it out 01345000 SR R4,R4 Length of input 01346000 LR R3,R6 Don't lose pointer to input 01347000 GETN0 CLI 0(R3),C' ' Any more input 01348000 BE GETN1 No, pick it data 01349000 CLI 0(R3),X'F0' Must be between 0-9 01350000 BL GETN5 01351000 CLI 0(R3),X'F9' 01352000 BH GETN5 01353000 LA R3,1(R3) Bump input pointer 01354000 LA R4,1(R4) Bump counter 01355000 C R4,=F'8' At our limit? 01356000 BNE GETN0 No go for more 01357000 GETN1 BCTR R4,0 Decrement for next call 01358000 EX R4,PCK Get the input 01359000 CVB R7,PKVAR Convert to binary 01360000 GETN5 BR R14 Return to caller 01361000 * [20 end] 01362000 SETERR MVI RQUOTE,DQUOTE Reset value, just in case [4] 01363000 LA R15,4 SET A NON-ZERO RETCODE 01364000 B SETRET 01365000 SETOK SR R15,R15 RETCODE OF 0 01366000 * 01367000 SETRET L R13,4(R13) 01368000 L R14,12(R13) 01369000 LM R0,R12,20(R13) 01370000 BR R14 01371000 SETSAVE DS 18F 01372000 PCK PACK PKVAR(8),0(0,R6) 01373000 LTORG 01374000 DROP R11 01375000 DROP R12 01376000 EJECT 01377000 * Change to allow SHOW ALL. 01378000 SHOW CSECT 01379000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 01380000 BALR R12,0 ESTABLISH ADDRESSABILITY 01381000 USING *,R12 01382000 LA R14,SHOWSAVE ADDRESS OF MY SAVE AREA 01383000 ST R13,4(R14) SAVE CALLER'S 01384000 ST R14,8(R13) 01385000 LR R13,R14 01386000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA 01387000 L R11,=A(PARMS) 01388000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 01389000 CLC 0(5,R6),=C'TDUMP' Show or tdump [20] 01390000 BE TDUMP 01391000 LA R6,8(R6) PICK UP NEXT TOKEN 01392000 CLI 0(R6),C'?' NEED HELP ? 01393000 BNE SHOA No check options 01394000 WRTERM 'File, Debug, Block, Series1, Warning, Recfm, Quote' 01395000 WRTERM 'Lrecl, End-of-line, Packet-size, All' 01396000 B SHOWOK 01397000 SHOA NI LFLAGS,X'FF'-ALLFL Turn off just in case 01398000 CLC 0(3,R6),=CL3'ALL' Show all options? 01399000 BNE SHO0 No find specific one 01400000 OI LFLAGS,ALLFL SHOW ALL requested 01401000 B SHO00 Jump to middle 01402000 SHO0 CLC 0(4,R6),=CL4'FILE' Show file value [1 start] 01403000 BNE SHO1 01404000 SHO00 LA R3,FILMSG1 Assume text mode 01405000 LA R4,L'FILMSG1 Get msg length 01406000 TM FLAGS,BINF Is text mode on? 01407000 BNO SHO01 Yes. 01408000 LA R3,FILMSG2 Mode is binary 01409000 LA R4,L'FILMSG2 01410000 SHO01 WRTERM (R3),(R4) Print mode 01411000 TM LFLAGS,ALLFL Do they want it all 01412000 BO SHO10 Yes give more 01413000 B SHOWOK [1 end] 01414000 SHO1 CLC 0(5,R6),=CL5'DEBUG' Show debug value [10 start] 01415000 BNE SHO2 01416000 SHO10 LA R3,DEBMSG2 Assume debug mode is on 01417000 LA R4,L'DEBMSG2 Get length 01418000 TM FLAGS,DEBUG Is debug mode on? 01419000 BO SHO11 Yes. 01420000 LA R3,DEBMSG1 01421000 LA R4,L'DEBMSG1 01422000 SHO11 WRTERM (R3),(R4) 01423000 TM LFLAGS,ALLFL More to show 01424000 BO SHO20 Yes 01425000 B SHOWOK Else end [10 end] 01426000 SHO2 CLC 0(5,R6),=CL5'BLOCK' Show checksum len [8 start] 01427000 BNE SHO3 01428000 SHO20 MVC TMP(1),CHKLEN Munge it here 01429000 OI TMP,X'F0' Make it printable 01430000 LINEDIT TEXT='Block check is ..',SUB=(CHARA,(TMP,1)) 01431000 TM LFLAGS,ALLFL More to show 01432000 BO SHO30 Yes 01433000 B SHOWOK 01434000 SHO3 CLC 0(7,R6),=CL7'SERIES1' Show series/1 mode [12 start] 01435000 BNE SHO4 01436000 SHO30 LA R3,SERMSG1 Assume S/1 mode is off 01437000 LA R4,L'SERMSG1 01438000 TM S1FLAGS,ISS1 S/1 mode on? 01439000 BNO SHO31 No 01440000 LA R3,SERMSG2 01441000 LA R4,L'SERMSG2 01442000 SHO31 WRTERM (R3),(R4) 01443000 TM LFLAGS,ALLFL 01444000 BO SHO40 01445000 B SHOWOK [12 end] 01446000 SHO4 CLC 0(4,R6),=CL4'WARN' Show fn warning? [18 start] 01447000 BNE SHO5 01448000 SHO40 LA R3,WARMSG1 Assume warning is off 01449000 LA R4,L'WARMSG1 Get length 01450000 TM LFLAGS,WARFL Is warning off? 01451000 BNO SHO41 Yes. 01452000 LA R3,WARMSG2 01453000 LA R4,L'WARMSG2 01454000 SHO41 WRTERM (R3),(R4) 01455000 TM LFLAGS,ALLFL More to show 01456000 BO SHO50 Yes 01457000 B SHOWOK Else end [18 end] 01458000 SHO5 CLC 0(5,R6),=CL5'RECFM' Show recfm 01459000 BNE SHO6 01460000 SHO50 LINEDIT TEXT='The record format is ..',SUB=(CHARA,(RFM,1)) 01461000 TM LFLAGS,ALLFL 01462000 BO SHO60 01463000 B SHOWOK 01464000 SHO6 CLC 0(5,R6),=C'QUOTE' 01465000 BNE SHO7 01466000 SHO60 TR RQUOTE(1),ATOE GET EBCDIC VERSION 01467000 LINEDIT TEXT='The quote character is ..', *01468000 SUB=(CHARA,(RQUOTE,1)) 01469000 TR RQUOTE(1),ETOA KEEP THE ASCII FORM AROUND 01470000 TM LFLAGS,ALLFL 01471000 BO SHO70 01472000 B SHOWOK 01473000 SHO7 CLC 0(5,R6),=C'LRECL' 01474000 BNE SHO8 01475000 SHO70 L R4,LRECL 01476000 LINEDIT TEXT='Lrecl is ........',SUB=(DEC,(R4)) 01477000 TM LFLAGS,ALLFL 01478000 BO SHO80 01479000 B SHOWOK 01480000 SHO8 CLC 0(3,R6),=C'END' 01481000 BNE SHO9 01482000 SHO80 SR R4,R4 ZERO IT OUT 01483000 IC R4,SEOL 01484000 LINEDIT TEXT='End-of-Line character is ...... (decimal)', *01485000 SUB=(DEC,(R4)) 01486000 TM LFLAGS,ALLFL 01487000 BO SHO90 01488000 B SHOWOK 01489000 SHO9 CLC 0(3,R6),=C'PAC' PACKET LENGTH ? 01490000 BNE SHOWERR 01491000 SHO90 LINEDIT TEXT='Receive packet size is ........ (decimal)', *01492000 SUB=(DECA,RPSIZ) 01493000 B SHOWOK 01494000 * Table dump routine [20 start] 01495000 TDUMP LA R6,8(R6) Bump pointer 01496000 CLI 0(R6),C'?' Need help? 01497000 BNE TD0 01498000 WRTERM 'Name of table to dump (ETOA or ATOE)' 01499000 B SHOWOK 01500000 TD0 SR R4,R4 01501000 CLC 0(4,R6),=C'ETOA' 01502000 BNE TD2 01503000 LA R3,ETOA 01504000 TD1 C R4,=F'16' 01505000 BE SHOWOK All lines displayed 01506000 LINEDIT TEXT='....................................', *01507000 SUB=(HEX4A,(R3)),DOT=NO 01508000 LA R4,1(R4) Increment counter 01509000 LA R3,16(R3) Point to next line 01510000 B TD1 01511000 TD2 CLC 0(4,R6),=C'ATOE' 01512000 BNE TD3 01513000 LA R3,ATOE 01514000 B TD1 01515000 TD3 WRTERM 'Only the ETOA or ATOE tables are displayed' 01516000 B SHOWOK 01517000 * [20 end] 01518000 SHOWERR LA R15,4 SET A NON-ZERO RETCODE 01519000 B SHOWRET 01520000 SHOWOK SR R15,R15 ZERO RETCODE 01521000 * 01522000 SHOWRET L R13,4(R13) 01523000 L R14,12(R13) 01524000 LM R0,R12,20(R13) 01525000 BR R14 01526000 SHOWSAVE DS 18F 01527000 LTORG 01528000 DROP R11 01529000 DROP R12 01530000 EJECT 01531000 * 01532000 * Add server support. [13 start] 01533000 SERVER CSECT 01534000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 01535000 BALR R12,0 ESTABLISH ADDRESSABILITY 01536000 USING *,R12 01537000 LA R14,SERVSAVE ADDRESS OF MY SAVE AREA 01538000 ST R13,4(R14) SAVE CALLER'S 01539000 ST R14,8(R13) 01540000 LR R13,R14 01541000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA 01542000 L R11,=A(PARMS) 01543000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 01544000 LA 1,=C'SET LINEDIT OFF' 01545000 LA 0,15 Command length of 15 01546000 DIAG 1,0,8 Say it's a CP command 01547000 OI LFLAGS,SERVON SERVER mode is on 01548000 WRTERM 'Entering server mode...' 01549000 TM S1FLAGS,ISS1 Is console a S/1? 01550000 BZ SERVA No, skip init stuff 01551000 LA R1,1 Initialize 01552000 L R15,=A(INTRINI) Trap CONS interrupts 01553000 BALR R14,R15 01554000 SERVA TM FLAGS,DEBUG In DEBUG mode? 01555000 BO SERV0 Yes, then don't ignore attn 01556000 STAX SRVATTN Else ignore attention 01557000 SERV0 MVI CHKLEN,DCHKLEN Set checksum length to one 01558000 XC NUMTRY,NUMTRY Trial counter 01559000 XC SPKNUM,SPKNUM Packet number we'll use 01560000 L 15,=A(RPACK) 01561000 BALR R14,R15 Read in a packet 01562000 CLI RTYPE,AS Other side sending us a file? 01563000 BNE SERV1 Nope 01564000 SERV01 L R15,=A(RECEIVE) Get the file 01565000 BALR R14,R15 01566000 MVC OLDERR(1),ERRNUM 01567000 MVI ERRNUM,X'FF' Reset error number 01568000 B SERV0 Go around again 01569000 SERV1 CLI RTYPE,AI Init packet 01570000 BNE SERV2 Nope 01571000 L R5,LRDAT Number of pieces of data 01572000 L R15,=A(SPAR) 01573000 BALR R14,R15 Read data from other host 01574000 L R15,=A(PACKLEN) Get max send packet size 01575000 BALR R14,R15 01576000 L R15,=A(RPAR) Our paramters to send 01577000 BALR R14,R15 01578000 ST R15,LSDAT Length of reply 01579000 MVI STYPE,AY Send an ACK 01580000 L R15,=A(SPACK) 01581000 BALR R14,R15 01582000 MVC OLDERR(1),ERRNUM 01583000 MVI ERRNUM,X'FF' Reset error number 01584000 B SERV0 Loop again no matter what 01585000 SERV2 CLI RTYPE,AG Generic command 01586000 BNE SERV3 01587000 LA R3,RDAT Point to first data char 01588000 CLI 0(R3),AF Finish command 01589000 BE SERV21 Yes go handle 01590000 CLI 0(R3),AL Logout command 01591000 BNE SERV24 No 01592000 SERV21 XC LSDAT,LSDAT No data 01593000 MVI STYPE,AY Send an ACK 01594000 L R15,=A(SPACK) 01595000 BALR R14,R15 01596000 CLI 0(R3),AL Logout? 01597000 BNE SERV22 No, reset things 01598000 FSCLOSE 'KER LOG A1' Ignore error messages [14] 01599000 MVI TEMP,XON Other guy expects this 01600000 WRTERM TEMP,1 So send it 01601000 WAITT 01602000 LA 1,=C'LOG' 01603000 LA 0,3 01604000 DIAG 1,0,8 Issue CP LOG command 01605000 SERV22 MVC OLDERR(1),ERRNUM 01606000 MVI ERRNUM,X'FF' Reset error number 01607000 MVI EXTFLG,X'FF' Set exit flag 01608000 TM S1FLAGS,ISS1 Is console a S/1? 01609000 BZ SERV23 No skip reset 01610000 SR R1,R1 Clear interrupt trapping 01611000 L R15,=A(INTRINI) 01612000 BALR R14,R15 01613000 SERV23 NI LFLAGS,X'FF'-SERVON SERVER mode is off 01614000 LA 1,=C'SET LINEDIT ON' 01615000 LA 0,14 01616000 DIAG 1,0,8 01617000 STAX , Reset attn address 01618000 B SERVRET 01619000 SERV24 MVI ERRNUM,X'12' Error message number 01620000 L R15,=A(ERRPACK) Send an error packet 01621000 BALR R14,R15 01622000 B SERV0 And wait for more 01623000 SERV3 CLI RTYPE,AR Other side did GET command 01624000 BNE SERV4 01625000 L R5,LRDAT File name size 01626000 LTR R5,R5 01627000 BZ SERV35 Fail on zero length 01628000 MVC FILNAM,=18X'20' Blank out filename 01629000 MVC NAME,=18X'20' 01630000 LR R6,R5 Length of data 01631000 LA R7,RDAT Location of data 01632000 SERV30 CLI 0(R7),X'2E' Is char a dot 01633000 BNE SERV31 No try next one 01634000 MVI 0(R7),X'20' Replace with space 01635000 SERV31 CLI 0(R7),X'61' Less than Ascii "a" 01636000 BL SERV312 Yes leave as is 01637000 CLI 0(R7),X'7A' Greater than Ascii "z" 01638000 BH SERV312 Yes leave as is 01639000 NI 0(R7),X'5F' Else capitalize 01640000 SERV312 LA R7,1(R7) Bump pointer 01641000 BCTR R6,0 Any more data? 01642000 LTR R6,R6 01643000 BNZ SERV30 Yes go check 01644000 TR RDAT(130),ATOE For tokenizer 01645000 DMSKEY NUCLEUS Tokenize input 01646000 LA R1,RDAT Buffer address 01647000 L R0,LRDAT Buffer length 01648000 L R15,ASCANN 01649000 BALR R14,R15 Let CMS do the work 01650000 LR R3,R15 Save retcode 01651000 LR R6,R1 Save pointer to tokenized list 01652000 DMSKEY RESET 01653000 LTR R3,R3 OK retcode? 01654000 BNZ SERV35 Nope complain 01655000 MVC NAME(8),0(R6) Remember fn here 01656000 MVC NAME+8(8),8(R6) And ft 01657000 MVC NAME+16(2),=C'* ' Default fm just in case 01658000 CLC 16(8,R6),=8X'FF' Look for fm 01659000 BE SERV32 Not there, just send file 01660000 MVC NAME+16(2),16(R6) Get fm 01661000 SERV32 OI FLAGS,FLG1 Sending first file 01662000 XC NFSENT,NFSENT No files sent yet 01663000 L R15,=A(SEND) 01664000 BALR R14,R15 01665000 MVC OLDERR(1),ERRNUM 01666000 MVI ERRNUM,X'FF' Reset error number 01667000 B SERV0 Go around again 01668000 SERV35 MVI ERRNUM,X'0B' Error message number 01669000 L R15,=A(ERRPACK) Send an error packet 01670000 BALR R14,R15 01671000 B SERV0 And wait for more 01672000 SERV4 CLI RTYPE,AE Error packet 01673000 BNE SERV5 01674000 B SERV0 Ignore it 01675000 SERV5 CLI RTYPE,AN Packet garbled? 01676000 BNE SERV6 01677000 MVI STYPE,AN Send a NAK 01678000 XC LSDAT,LSDAT No data 01679000 L R15,=A(SPACK) 01680000 BALR R14,R15 01681000 B SERV0 And try again 01682000 SERV6 CLI RTYPE,X'00' Series/1 error? 01683000 BNE SERV7 01684000 MVI ERRNUM,S1ERRNUM Try to send error packet 01685000 L R15,=A(ERRPACK) Send an error packet 01686000 BALR R14,R15 01687000 B SERV0 01688000 SERV7 MVI ERRNUM,X'13' Error message number 01689000 L R15,=A(ERRPACK) Send an error packet 01690000 BALR R14,R15 01691000 B SERV0 01692000 * 01693000 SRVATTN BR R14 Ignore attention 01694000 * 01695000 SERVRET L R13,4(R13) 01696000 L R14,12(R13) 01697000 LM R0,R12,20(R13) 01698000 BR R14 01699000 SERVSAVE DS 18F 01700000 LTORG 01701000 DROP R11 01702000 DROP R12 01703000 EJECT 01704000 * [13 end] 01705000 * 01706000 * Read parameters from other host. Size of data passed in R5. 01707000 * Use the default for any parameter not supplied. [5] 01708000 * 01709000 SPAR CSECT 01710000 STM R14,R12,12(R13) 01711000 BALR R12,0 01712000 USING *,R12 01713000 LA R14,SPARSV 01714000 ST R13,4(R14) 01715000 ST R14,8(R13) 01716000 LR R13,R14 01717000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 01718000 L R11,=A(PARMS) 01719000 USING PARMS,R11 01720000 SR R4,R4 Zero out register 01721000 LA R7,RDAT Pointer to data buffer 01722000 C R5,ZERO Any data 01723000 BH SPAR0 01724000 LA R4,DSSIZ Default send packet size 01725000 B SPAR02 01726000 SPAR0 IC R4,0(R7) Max send packet size 01727000 S R4,SPACE Subtract the space 01728000 C R4,=A(SPMIN) Can't be below minimum 01729000 BNL SPAR01 So far, so good 01730000 LA R4,SPMIN Else, use the min valuea 01731000 B SPAR02 01732000 SPAR01 C R4,=A(SPMAX) Max send packet size 01733000 BNH SPAR02 Can't be above max 01734000 LA R4,SPMAX 01735000 SPAR02 STC R4,SPSIZ+3 Save max send packet size 01736000 C R5,ONE More than one piece of data? 01737000 BH SPAR1 Send timeout supplied 01738000 LA R4,DSTIM Else, use default 01739000 B SPAR12 01740000 SPAR1 SR R4,R4 01741000 IC R4,1(R7) Get send timeout value 01742000 S R4,SPACE 01743000 C R4,ZERO Must be non-negative 01744000 BNL SPAR12 01745000 L R4,ZERO 01746000 SPAR12 STC R4,STIME Save send timeout value 01747000 C R5,TWO More than two pieces of data? 01748000 BH SPAR2 Yes, pick up pad char 01749000 LA R4,DSPAD No, use default 01750000 B SPAR22 01751000 SPAR2 SR R4,R4 01752000 IC R4,2(R7) Get number of pad chars 01753000 S R4,SPACE 01754000 C R4,ZERO Must be non-negative 01755000 BH SPAR22 01756000 L R4,ZERO Else, use zero 01757000 SPAR22 STC R4,SPAD 01758000 C R5,=F'3' More than 3 pieces of data 01759000 BH SPAR3 Yes, get pad char to use 01760000 LA R4,DSPADC 01761000 B SPAR32 01762000 SPAR3 IC R4,3(R7) Pad char other side wants 01763000 A R4,O1H Re-controllify it 01764000 N R4,=X'0000007F' 01765000 C R4,DEL Is it a delete? 01766000 BE SPAR32 Yes, then it's OK 01767000 C R4,ZERO Is it above zero 01768000 BNL SPAR31 Yes, then OK 01769000 L R4,ZERO Else, use null 01770000 B SPAR32 01771000 SPAR31 C R4,=F'31' Is it a control char 01772000 BNH SPAR32 Yes, then OK 01773000 L R4,ZERO No, so use null 01774000 SPAR32 STC R4,SPADCH 01775000 C R5,=F'4' More than 4 pieces of data 01776000 BH SPAR4 Yes, get EOL char 01777000 LA R4,DEOL Else, use default 01778000 B SPAR42 01779000 SPAR4 IC R4,4(R7) Get the EOL char 01780000 S R4,SPACE 01781000 SPAR42 STC R4,SEOL 01782000 C R5,=F'5' More than 5 pieces of data 01783000 BH SPAR5 01784000 LA R4,DQUOTE 01785000 B SPAR52 01786000 SPAR5 SR R4,R4 01787000 IC R4,5(R7) Get quote char 01788000 C R4,SPACE Less than a space? 01789000 BNL SPAR51 No, is OK so far 01790000 LA R4,DQUOTE Yes, so use default 01791000 B SPAR52 01792000 SPAR51 C R4,=F'126' Must be tilde or less 01793000 BNH SPAR52 01794000 LA R4,DQUOTE If higher than use default 01795000 SPAR52 STC R4,SQUOTE 01796000 C R5,=F'6' More than 6 pieces of data 01797000 BH SPAR6 01798000 MVI EBQUOT,AY Default (can do it but won't) 01799000 B SPAR7 01800000 SPAR6 SR R4,R4 01801000 IC R4,6(R7) 01802000 L R15,=A(DOQUO) Set 8-bit quote char [1] 01803000 BALR R14,R15 [1] 01804000 SPAR7 C R5,=F'7' More than 7 pieces of data 01805000 BH SPAR71 Yes get checksum length 01806000 MVI CHKLEN,X'01' Else use default of one 01807000 B SPAR8 01808000 SPAR71 SR R4,R4 01809000 IC R4,7(R7) Get checksum size they want 01810000 L R15,=A(DOCHK) Check what they sent 01811000 BALR R14,R15 01812000 SPAR8 C R5,=F'8' More than 8 pieces of data 01813000 BH SPAR81 Get repeat quote they want 01814000 MVI RPTQ,X'00' Else don't do repeat prefixing 01815000 MVI ORIGQ,X'00' Reset here too [24] 01815100 B SPAR9 01816000 SPAR81 SR R4,R4 01817000 IC R4,8(R7) Get prefix they want to use 01818000 L R15,=A(DORPT) Routine to check their value 01819000 BALR R14,R15 01820000 SPAR9 L R13,4(R13) 01821000 L R14,12(R13) 01822000 LM R0,R12,20(R13) 01823000 BR R14 01824000 * 01825000 * Set checksum length 01826000 DOCHK MVI TMP,X'31' 01827000 CLM R4,B'0001',TMP Must be the character 1,2 or 3 01828000 BL DOCHK0 Below 1 so fail 01829000 MVI TMP,X'33' 01830000 CLM R4,B'0001',TMP 01831000 BNH DOCHK1 Is in the limit 01832000 MVI TMP,X'31' 01833000 DOCHK0 IC R4,TMP Else use default 01834000 DOCHK1 S R4,=F'48' Don't want it printable 01835000 CLM R4,B'0001',CHKLEN Do we want the same thing? 01836000 BE DOCHK2 Yes then we're done 01837000 MVI CHKLEN,X'01' Else use single char checksum 01838000 DOCHK2 BR R14 Return 01839000 * Set repeat count quote character. It must be different from 01840000 * the control & eight-bit quote characters. Also, both sides must 01841000 * use the same character. 01842000 DORPT C R4,=F'33' Check if in valid range 01843000 BNL DORPT0 It's 33 or above 01844000 B DORPT4 Else fail 01845000 DORPT0 C R4,=F'62' 01846000 BH DORPT1 01847000 B DORPT3 And 62 or below - OK 01848000 DORPT1 C R4,=F'96' 01849000 BNL DORPT2 It's 96 or above 01850000 B DORPT4 Else fail 01851000 DORPT2 C R4,=F'126' 01852000 BH DORPT4 If above 126 then fail 01853000 DORPT3 CLM R4,B'0001',SQUOTE Same as send quote char 01854000 BE DORPT4 Yes so fail 01855000 CLM R4,B'0001',RQUOTE Same as receive quote char 01856000 BE DORPT4 Yes so fail 01857000 CLM R4,B'0001',EBQUOT Same as eight bit prefix 01858000 BE DORPT4 Yes so fail 01859000 CLM R4,B'0001',RPTQ We planning to use same char? 01860000 BNE DORPT4 No so fail 01861000 BR R14 Yes so its OK 01862000 DORPT4 MVI RPTQ,X'00' Don't do repeat prefixing 01863000 MVI ORIGQ,X'00' Reset here too [24] 01863100 BR R14 01864000 * 01865000 SPARSV DS 18F KERMIT'S SAVE AREA 01866000 LTORG 01867000 DROP R11 01868000 DROP R12 NO LONGER NEED THEM 01869000 EJECT 01870000 * 01871000 * Set up our parameters we will send to other host. Return size 01872000 * of data in R15. [5] 01873000 * 01874000 RPAR CSECT 01875000 STM R14,R12,12(R13) 01876000 BALR R12,0 01877000 USING *,R12 01878000 LA R14,RPARSV 01879000 ST R13,4(R14) 01880000 ST R14,8(R13) 01881000 LR R13,R14 01882000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 01883000 L R11,=A(PARMS) 01884000 USING PARMS,R11 01885000 L R5,RPSIZ Receive packet size 01886000 A R5,SPACE Make it printable 01887000 STC R5,SDAT Add size info to buffer 01888000 IC R5,RTIME Receive packet time out 01889000 A R5,SPACE 01890000 STC R5,SDAT+1 01891000 IC R5,RPAD Number of padding chars. 01892000 A R5,SPACE 01893000 STC R5,SDAT+2 01894000 IC R5,RPADCH Pad character 01895000 L R3,O1H 01896000 XR R5,R3 CTL function (xor with 64) 01897000 N R5,=X'0000007F' 01898000 STC R5,SDAT+3 01899000 IC R5,REOL EOL char I need 01900000 A R5,SPACE MAKE PRINTABLE 01901000 STC R5,SDAT+4 01902000 IC R5,RQUOTE My quote char 01903000 STC R5,SDAT+5 01904000 IC R5,EBQUOT 8-BIT QUOTE CHAR [1] 01905000 STC R5,SDAT+6 PUT INTO BUFFER [1] 01906000 IC R5,CHKLEN Length of checksum 01907000 A R5,=F'48' Make into a real digit 01908000 STC R5,SDAT+7 01909000 SR R5,R5 01910000 IC R5,RPTQ Repeat quote char 01911000 C R5,ZERO Null means no 01912000 BNE RPAR0 Branch if doing repeat quoting 01913000 L R5,SPACE If not, send a blank instead 01914000 RPAR0 STC R5,SDAT+8 01915000 L R15,=F'9' Return size of data 01916000 L R13,4(R13) 01917000 L R14,12(R13) 01918000 LM R0,R12,20(R13) 01919000 BR R14 01920000 * 01921000 RPARSV DS 18F KERMIT'S SAVE AREA 01922000 LTORG 01923000 DROP R11 01924000 DROP R12 NO LONGER NEED THEM 01925000 EJECT 01926000 * 01927000 * New routine to set the 8-bit quote character depending on my 01928000 * own capabilities and the other Kermit's request. [1] 01929000 * 01930000 DOQUO CSECT 01931000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 01932000 BALR R12,0 ESTABLISH ADDRESSABILITY 01933000 USING *,R12 01934000 LA R14,DQSAVE ADDRESS OF MY SAVE AREA 01935000 ST R13,4(R14) SAVE CALLER'S 01936000 ST R14,8(R13) 01937000 LR R13,R14 01938000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA 01939000 L R11,=A(PARMS) 01940000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 01941000 LA R7,RDAT Point to data buffer 01942000 CLI EBQUOT,AN Can I do 8-bit quoting? 01943000 BE DQRET No - so forget it 01944000 CLI EBQUOT,AY Can I do it if requested? 01945000 BNE DQ0 No - I must quote 01946000 MVC EBQUOT(1),6(R7) Set new 8-bit quote char 01947000 SR R3,R3 01948000 IC R3,EBQUOT 01949000 L R15,=A(PRECHK) Validate prefix 01950000 BALR R14,R15 01951000 LTR R15,R15 Check the return code 01952000 BNZ DQ1 Failed so don't do quoting 01953000 CLC EBQUOT(1),RQUOTE Same prefix 01954000 BE DQ1 Not allowed so no quoting 01955000 CLC EBQUOT(1),SQUOTE Same prefix 01956000 BE DQ1 Not allowed so no quoting 01957000 B DQRET And leave 01958000 DQ0 CLI 6(R7),AY I need quoting - can he do it? 01959000 BE DQRET Yes - then all is settled 01960000 CLI 6(R7),AN He can't do it - don't quote 01961000 BE DQ1 He needs quoting also 01962000 CLC EBQUOT(1),6(R7) The quote chars must match 01963000 BE DQRET We match - its ok 01964000 DQ1 MVI EBQUOT,AN Else, forget the quoting 01965000 DQRET L R13,4(R13) 01966000 L R14,12(R13) 01967000 LM R0,R12,20(R13) 01968000 BR 14 01969000 * 01970000 * Check if prefix in R3 is in valid range: 33-62, 96-126. If OK, 01971000 * R15 contains a zero, else -1. 01972000 * 01973000 PRECHK C R3,=F'33' 01974000 BNL PREC0 It's 33 or above 01975000 B PREC4 Else fail 01976000 PREC0 C R3,=F'62' 01977000 BH PREC1 01978000 B PREC5 And 62 or below - OK 01979000 PREC1 C R3,=F'96' 01980000 BNL PREC2 It's 96 or above 01981000 B PREC4 Else fail 01982000 PREC2 C R3,=F'126' 01983000 BNH PREC5 Is 126 or below - OK 01984000 PREC4 L R15,=F'-1' Bad rc means we failed 01985000 BR R14 01986000 PREC5 SR R15,R15 Zero rc means all is well 01987000 BR R14 01988000 * 01989000 DQSAVE DS 18F 01990000 LTORG 01991000 DROP R11 01992000 DROP R12 DON'T NEED THEM ANYMORE 01993000 EJECT 01994000 * 01995000 SEND CSECT 01996000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 01997000 BALR R12,0 ESTABLISH ADDRESSABILITY 01998000 USING *,R12 01999000 LA R14,SENDSAVE ADDRESS OF MY SAVE AREA 02000000 ST R13,4(R14) SAVE CALLER'S 02001000 ST R14,8(R13) 02002000 LR R13,R14 02003000 * USE R11 AS BASE REGISTER FOR 'PARMS' GLOBAL DATA AREA 02004000 L R11,=A(PARMS) 02005000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 02006000 MVC EBQUOT(1),ORIG8Q IF CHANGED IN LAST X-FER [1] 02007000 MVI CXZ,X'00' Just in case [16] 02008000 MVI STATE,C'S' 02009000 SR R3,R3 02010000 ST R3,SPKNUM 02011000 ST R3,NUMTRY 02012000 MVC FST(4),=X'FF000000' INITIALIZATION STUFF 02013000 MVC ADT(4),=X'FF000000' HERE TOO,IN CASE OF RETRY 02014000 NXTFIL CLI CXZ,AZ Stop file group send [16] 02015000 BE DIEOK Yes finish up [16] 02016000 LA R1,FILINFO STUFF NEED TO GET FNAME(S) 02017000 L R15,=V(NEXTFST) 02018000 BALR R14,R15 GET NEXT/FIRST FILE 02019000 LTR R5,R15 COPY RETCODE 02020000 BNZ NOFIND RETCODE OF ZERO = ALL OK 02021000 MVI CXZ,X'00' In case aborted last file [16] 02022000 L R9,FST GET INFO FROM FSTTABLE 02023000 USING FSTD,R9 02024000 MVC FILNAM(8),FSTFNAME GET FNAME 02025000 MVC FILNAM+8(8),FSTFTYPE 02026000 MVC FILNAM+16(2),FSTFMODE 02027000 L R9,ADT 02028000 USING ADTSECT,R9 02029000 LA R5,ADTM 02030000 MVC FILNAM+16(1),0(R5) GET CORRECT FMODE 02031000 LA R5,FSENT TABLE W/FILES SENT SO FAR 02032000 LR R7,R5 KEEP TRACK OF TABLE 02033000 LA R7,160(R7) HERE, WE'RE PAST THE TABLE 02034000 L R4,NFSENT HOW MANY SENT SO FAR 02035000 FILLOOP LTR R4,R4 02036000 BZ OKSND 02037000 BCTR R4,0 DECREMENT COUNTER 02038000 CLC 0(16,R5),FILNAM SENT ALREADY? 02039000 BE NXTFIL DON'T RESEND 02040000 LA R5,16(R5) CHECK NEXT FILE 02041000 CR R5,R7 02042000 BNE FILLOOP 02043000 L R5,STORLOC SEARCH HERE NOW 02044000 B FILLOOP 02045000 OKSND TM FLAGS,FLG1 IS THIS THE FIRST FILE? 02046000 BNO SLOOP ONLY WAIT 10 SECS IF YES 02047000 NI FLAGS,X'FF'-FLG1 Turn off first file flag [13] 02048000 TM LFLAGS,SERVON In server mode? [13] 02049000 BO SLOOP Yes so skip this stuff [13] 02050000 TM S1FLAGS,ISS1 Is console a S/1? [12] 02051000 BZ SNDX No, skip init stuff [12] 02052000 LA R1,1 Initialize [12] 02053000 L R15,=A(INTRINI) Trap CONS interrupts [12] 02054000 BALR R14,R15 [12] 02055000 SNDX LA 1,=C'SL 10 SEC' Sleep before sending [13] 02056000 LA 0,9 COMMAND LENGTH IS 9 02057000 DIAG 1,0,8 SHOW IT'S A CP COMMAND 02058000 SLOOP CLI STATE,C'D' SEND DATA STATE 02059000 BE SDATA 02060000 CLI STATE,C'F' SEND FILE STATE 02061000 BE SFILE 02062000 CLI STATE,C'S' SEND INIT STATE 02063000 BE SINIT 02064000 CLI STATE,C'Z' END OF FILE STATE 02065000 BE SEOF 02066000 CLI STATE,C'B' SEND BREAK STATE 02067000 BE SBREAK 02068000 CLI STATE,C'C' COMPLETE STATE 02069000 BE COMPLETE 02070000 CLI STATE,C'A' ABORT STATE 02071000 BE ABORT ERROR - GO TO ABORT STATE 02072000 MVI ERRNUM,X'02' UNRECOGNIZED STATE 02073000 B ABORT OTHERWISE, DIE 02074000 * 02075000 SINIT CLC NUMTRY,IMXTRY SEE IF CAN SEND 02076000 BL SINIT0 YES WE CAN 02077000 MVI STATE,C'A' NOPE, GO INTO ABORT STATE 02078000 B SLOOP 02079000 SINIT0 L R3,NUMTRY 02080000 LA R3,1(R3) INCREMENT TRIAL COUNTER 02081000 ST R3,NUMTRY 02082000 L R15,=A(RPAR) Our paramters to send [5] 02083000 BALR R14,R15 02084000 ST R15,LSDAT Size of packet [5] 02085000 MVI STYPE,AS PACKET TYPE = SEND INITIATE 02086000 MVC CURCHK(1),CHKLEN Save desired value [8] 02087000 MVI CHKLEN,X'01' Init uses 1 char chksum [8] 02088000 L R15,=A(SPACK) GET ADDRESS OF ROUTINE 'SPACK' 02089000 BALR R14,R15 SAVE * AND GO TO SPACK 02090000 CLI STATE,C'A' 02091000 BE ABORT 02092000 L 15,=A(RPACK) GET ADDRESS OF 'RPACK' 02093000 BALR R14,R15 SAVE * AND GO TO RPACK 02094000 MVC CHKLEN(1),CURCHK Restore desired chksum [8] 02095000 CLI RTYPE,AE ERROR PACKET? 02096000 BNE Y1 NO, THEN MAYBE AN ACK 02097000 MVI ERRNUM,X'0A' MICRO DIED 02098000 MVI STATE,C'A' AND DIE 02099000 B SLOOP 02100000 Y1 CLI RTYPE,AY SEE IF GOT ACK 02101000 BNE N1 MAYBE IT'S 'N' 02102000 CLC SPKNUM,RPKNUM CHECK MESSAGE NUMBERS 02103000 BE AOK1 02104000 MVI ERRNUM,X'08' PACKET LOST 02105000 B SLOOP 02106000 AOK1 L R5,LRDAT Number of pieces of data [5] 02107000 L R15,=A(SPAR) 02108000 BALR R14,R15 Read data from other host [5] 02109000 L R15,=A(PACKLEN) Get max send packet size [5] 02110000 BALR R14,R15 02111000 NOCHG MVI STATE,C'F' PUT INTO SEND FILE STATE 02112000 XC NUMTRY,NUMTRY RESET TO ZERO 02113000 L R3,SPKNUM 02114000 LA R3,1(R3) ADD ONE 02115000 ST R3,SPKNUM STORE VALUE INCREMENTED BY 1 02116000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 02117000 B SLOOP 02118000 N1 CLI RTYPE,AN SEE IF IT'S 'N' 02119000 BNE AB1 IF NOT, DIE 02120000 TM FLAGS,FLG4 DID MICRO NAK OR I REJECTED? 02121000 BO SLOOP LEAVE ERR MSG AS IS IF I DID 02122000 MVI ERRNUM,X'09' MICRO NAK'ED 02123000 B SLOOP 02124000 AB1 MVI STATE,C'A' ELSE, ABORT 02125000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 02126000 BE SLOOP Yes just return [12] 02127000 MVI ERRNUM,X'07' UNRECOGNIZED PACKET TYPE 02128000 B SLOOP 02129000 SFILE CLC NUMTRY,MAXTRY EXCEEDED NO. OF TRIES ALLOWED? 02130000 BL OK2 NOPE, STILL OK 02131000 MVI STATE,C'A' ABORT IF YES 02132000 B SLOOP 02133000 OK2 TR FILNAM,ETOA 02134000 LA R4,FILNAM BEGINNING OF BUFFER 02135000 SR R1,R1 02136000 TRT FILNAM(8),PARSE SEND A DOT INSTEAD OF SPACE 02137000 BNZ SP 02138000 L R4,=F'8' FUDGE THE LENGTH 02139000 B SP2 02140000 SP SR R1,R4 WHERE THE TRT STOPPED 02141000 LR R4,R1 HAVE LENGTH OF THE FN 02142000 SP2 LR R5,R4 COUNTER FOR LENTH OF FILNAM 02143000 BCTR R4,0 ONE LESS FOR 'EX' COMMAND 02144000 L R7,ABUF Put FN here for encode [22] 02145000 EX R4,FIRST PICK UP THE FN 02146000 LA R4,00(R5,R7) Put the dot here [22] 02147000 MVI 0(R4),X'2E' ADD AN ASCII DOT 02148000 LA R5,1(R5) ADD ONE TO COUNTER 02149000 LA R4,FILNAM 02150000 LA R4,8(R4) NEXT AREA OF THE FILNAM 02151000 SR R1,R1 02152000 TRT FILNAM+8(8),PARSE 02153000 BNZ SP3 02154000 L R4,=F'8' FUDGE THE LENGTH 02155000 B SP4 02156000 SP3 SR R1,R4 02157000 LR R4,R1 WHERE WE STOPPED 02158000 SP4 L R7,ABUF Where to put FT [22] 02159000 LA R7,00(R5,R7) Next free spot [22] 02160000 AR R5,R4 LENGTH OF NAME WITH DOT 02161000 BCTR R4,0 MINUS ONE FOR THE 'EX' 02162000 EX R4,SECOND PICK UP FT 02163000 L R3,NUMTRY 02164000 LA R3,1(R3) INCREMENT TRIAL COUNTER 02165000 ST R3,NUMTRY 02166000 MVI STYPE,AF PACKET TYPE = FILE HEADER 02167000 ST R5,LSDAT SET BUFFER SIZE 02168000 TR FILNAM,ATOE 02169000 L R3,NFSENT 02170000 LR R4,R3 SAVE VALUE 02171000 C R4,=F'10' NEED MORE SPACE? 02172000 BE ADDSP 02173000 BH ADDSP2 02174000 M R2,=F'16' GET OFFSET INTO TABLE 02175000 LA R3,FSENT(R3) POINTER INTO TABLE 02176000 MVC 0(16,R3),FILNAM SAVE FILENAME YOU'RE SENDING 02177000 LA R4,1(R4) INCREMENT NUMBER OF FILES SENT 02178000 ST R4,NFSENT 02179000 B SNDFIL 02180000 ADDSP LA R0,4096/8 GET 4K BLOCK 02181000 DMSFREE DWORDS=(0),ERR=ERRSP,MSG=NO 02182000 ST R1,STORLOC POINTS TO EXTRA DATA AREA 02183000 OI FLAGS,FLG5 GOT MORE SPACE (TURN ON FLAG) 02184000 ADDSP2 LR R3,R4 GET CORRECT LENGTH AGAIN 02185000 S R3,=F'10' GET PROPER POINTER 02186000 M R2,=F'16' OFFSET INTO TABLE 02187000 A R3,STORLOC LOC IN TABLE 02188000 MVC 0(16,R3),FILNAM SAVE FILENAME 02189000 LA R4,1(R4) INCREMENT FILE COUNTER 02190000 ST R4,NFSENT 02191000 B SNDFIL 02192000 ERRSP MVI ERRNUM,X'10' ERR ALLOCATING MORE SPACE 02193000 MVI STATE,C'A' ABORT NOW 02194000 B SLOOP 02195000 SNDFIL XC INBFPT,INBFPT Input buffer offset [22 start] 02196000 MVC RECL,LSDAT Input buffer length 02197000 L R2,=A(NULREF) Null refill routine 02198000 ST R2,MORENC 02199000 L R15,=A(ENCODE) 02200000 BALR R14,R15 Encode fn [22 end] 02201000 L R15,=A(SPACK) GET ADDRESS OF 'SPACK' 02202000 BALR 14,15 SAVE * AND GO TO SPACK 02203000 CLI STATE,C'A' 02204000 BE ABORT 02205000 L 15,=A(RPACK) GET ADDRESS OF 'RPACK' 02206000 BALR 14,15 SAVE * AND GO TO RPACK 02207000 CLI RTYPE,AE ERROR PACKET? 02208000 BNE Y2 MAYBE AN ACK 02209000 MVI ERRNUM,X'0A' MICRO DIED 02210000 MVI STATE,C'A' SO WE DO TOO 02211000 B SLOOP 02212000 Y2 CLI RTYPE,AY SEE IF GOT ACK 02213000 BNE N2 MAYBE GOT AN 'N' 02214000 CLC SPKNUM,RPKNUM DO WE HAVE THE CORRECT ACK? 02215000 BE AOK2 02216000 MVI ERRNUM,X'08' MISSING A PACKET SOMEWHERE 02217000 B SLOOP 02218000 AOK2 XC NUMTRY,NUMTRY RESET COUNTER 02219000 L R3,SPKNUM 02220000 LA R3,1(R3) ADD ONE 02221000 ST R3,SPKNUM STORE INCREMENTED VALUE 02222000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 02223000 LA R3,FILNAM GET ADDRESS OF 'FILNAM' [4] 02224000 FSOPEN (R3),FORM=E OPEN FILE FOR I/O [4] 02225000 NI FLAGS,X'FF'-FLG3 No data in input buffer [4] 02226000 NI FLAGS,X'FF'-FLG7 Not end of file yet [4] 02227000 XC LSDAT,LSDAT No data in output buffer [4] 02228000 L 15,=A(GTCHR) GET A BUFFER FULL OF DATA 02229000 BALR 14,15 DO GET-CHAR AND COME BACK 02230000 MVI STATE,C'D' Send data state [4] 02231000 C R15,ZERO Test the return code [4] 02232000 BE SLOOP Successful return code [4] 02233000 MVI STATE,C'A' Abort [4] 02234000 BH SLOOP Got read error - fail [4] 02235000 MVI STATE,C'Z' Send end-of-file state [4] 02236000 CLC LSDAT,ZERO Any data to send [4] 02237000 BE SLOOP No, goto eof state [4] 02238000 MVI STATE,C'D' Send the last packet [4] 02239000 B SLOOP 02240000 N2 CLI RTYPE,AN 02241000 BNE AB2 ELSE, DIE 02242000 TM FLAGS,FLG4 DID MICRO NAK OR I REJECTED? 02243000 BO SLOOP LEAVE ERR MSG AS IS IF I DID 02244000 MVI ERRNUM,X'09' MICRO NAK'ED 02245000 B SLOOP 02246000 AB2 MVI STATE,C'A' ELSE, ABORT 02247000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 02248000 BE SLOOP Yes just return [12] 02249000 MVI ERRNUM,X'07' UNRECOGNIZED PACKET TYPE 02250000 B SLOOP 02251000 SDATA CLC NUMTRY,MAXTRY CAN WE DO IT? 02252000 BL OK4 YES 02253000 MVI STATE,C'A' ELSE ABORT 02254000 B SLOOP 02255000 OK4 L R3,NUMTRY 02256000 LA R3,1(R3) INCREMENT COUNTER 02257000 ST R3,NUMTRY 02258000 MVI STYPE,AD PACKET TYPE = DATA 02259000 L R15,=A(SPACK) 02260000 BALR 14,15 GO TO SPACK AND RETURN 02261000 CLI STATE,C'A' 02262000 BE ABORT 02263000 L 15,=A(RPACK) 02264000 BALR 14,15 SAME FOR RPACK 02265000 CLI RTYPE,AE ERROR PACKET? 02266000 BNE Y4 MAYBE AN ACK 02267000 MVI ERRNUM,X'0A' MICRO DIED 02268000 MVI STATE,C'A' SO WE DO TOO 02269000 B SLOOP 02270000 Y4 CLI RTYPE,AY SEE IF GOT 'ACK' 02271000 BNE N4 SEE IF IT'S AN 'N' 02272000 CLC SPKNUM,RPKNUM DO WE HAVE THE CORRECT ACK? 02273000 BE AOK4 02274000 MVI ERRNUM,X'08' MISSING A PACKET 02275000 B SLOOP 02276000 AOK4 XC NUMTRY,NUMTRY RESET COUNTER 02277000 L R3,SPKNUM 02278000 LA R3,1(R3) INCREMENT COUNTER 02279000 ST R3,SPKNUM 02280000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 02281000 CLC LRDAT,ONE Data in ack? [16] 02282000 BNE BOK4 No just go on [16] 02283000 LA R3,RDAT Point to data [16] 02284000 CLI 0(R3),AX Abort sending file [16] 02285000 BE SDAB Yes [16] 02286000 CLI 0(R3),AZ Abort sending group [16] 02287000 BNE BOK4 No just ignore [16] 02288000 SDAB MVC CXZ(1),0(R3) Pick up data [16] 02289000 LA R3,FILNAM File we're sending [16] 02290000 FSCLOSE (R3) Close it [16] 02291000 MVI STATE,C'Z' Go send end of file [16] 02292000 MVI ERRNUM,X'16' Send cancelled [16] 02293000 B SLOOP And continue [16] 02294000 BOK4 L 15,=A(GTCHR) Get next buffer [16] 02295000 BALR 14,15 02296000 C R15,ZERO Test the return code [4] 02297000 BE SLOOP Successful return code [4] 02298000 MVI STATE,C'A' Abort [4] 02299000 BH SLOOP Got read error - fail [4] 02300000 MVI STATE,C'Z' Send end-of-file state [4] 02301000 CLC LSDAT,ZERO Any data to send [4] 02302000 BE SLOOP No, goto eof state [4] 02303000 MVI STATE,C'D' Send the last packet [4] 02304000 B SLOOP 02305000 N4 CLI RTYPE,AN 02306000 BNE AB4 02307000 TM FLAGS,FLG4 DID MICRO NAK OR I REJECTED? 02308000 BO SLOOP LEAVE ERR MSG AS IS IF I DID 02309000 MVI ERRNUM,X'09' MICRO NAK'ED 02310000 B SLOOP 02311000 AB4 MVI STATE,C'A' 02312000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 02313000 BE SLOOP Yes just return [12] 02314000 MVI ERRNUM,X'07' ILLEGAL PACKET TYPE 02315000 B SLOOP 02316000 SEOF CLC NUMTRY,MAXTRY CAN WE DO IT? 02317000 BL OK5 BRANCH IF YES 02318000 MVI STATE,C'A' ABORT IF NO 02319000 B SLOOP 02320000 OK5 L R3,NUMTRY 02321000 LA R3,1(R3) ADD ONE 02322000 ST R3,NUMTRY STORE INCREMENTED COUNTER 02323000 MVI STYPE,AZ PACKET TYPE = EOF 02324000 XC LSDAT,LSDAT LENGTH OF ZERO 02325000 L R15,=A(SPACK) 02326000 BALR 14,15 SAVE * AND GO TO SPACK 02327000 CLI STATE,C'A' 02328000 BE ABORT 02329000 L 15,=A(RPACK) 02330000 BALR 14,15 SAME FOR RPACK 02331000 CLI RTYPE,AE ERROR PACKET? 02332000 BNE Y5 MAYBE AN ACK 02333000 MVI ERRNUM,X'0A' MICRO DIED 02334000 MVI STATE,C'A' SO WE DO TOO 02335000 B SLOOP 02336000 Y5 CLI RTYPE,AY CHECK FOR 'ACK' 02337000 BNE N5 MAYBE WAS A 'NAK' 02338000 CLC SPKNUM,RPKNUM CORRECT ACK? 02339000 BE AOK5 02340000 MVI ERRNUM,X'08' LOST A PACKET 02341000 B SLOOP 02342000 AOK5 L R3,SPKNUM 02343000 LA R3,1(R3) ADD ONE 02344000 ST R3,SPKNUM STORE VALUE INCREMENTED BY 1 02345000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 02346000 MVI STATE,C'F' SET TO SEND FILE FOR NOW 02347000 B NXTFIL GET-NEXT-FILE 02348000 NOFIND TM FLAGS,FLG1 DID IT DIE ON FIRST TRY? 02349000 BNO DIEOK NO ONES == NOT FIRST 02350000 MVI STATE,C'A' ABORT THIS ONE 02351000 TM LFLAGS,SERVON Are we a server [13] 02352000 BO NOF2 Yes handle differently [13] 02353000 WRTERM 'File not found' 02354000 B SLOOP 02355000 NOF2 NI FLAGS,X'FF'-FLG1 Clear first file status [13] 02356000 MVI ERRNUM,X'15' Set msg for error packet [13] 02357000 B SLOOP And go abort now [13] 02358000 DIEOK MVI STATE,C'B' BREAK CONNECTION 02359000 B SLOOP 02360000 N5 CLI RTYPE,AN 02361000 BNE AB5 DIE IF NOT A NAK 02362000 TM FLAGS,FLG4 DID MICRO NAK OR I REJECTED? 02363000 BO SLOOP LEAVE ERR MSG AS IS IF I DID 02364000 MVI ERRNUM,X'09' MICRO NAK'ED 02365000 B SLOOP 02366000 AB5 MVI STATE,C'A' ELSE, ABORT 02367000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 02368000 BE SLOOP Yes just return [12] 02369000 MVI ERRNUM,X'07' UNRECOGNIZED PACKET TYPE 02370000 B SLOOP 02371000 SBREAK CLC NUMTRY,MAXTRY OVER OUR LIMIT? 02372000 BL OK6 BRANCH IF NO 02373000 MVI STATE,C'A' ABORT IF YES 02374000 B SLOOP 02375000 OK6 L R3,NUMTRY 02376000 LA R3,1(R3) ADD ONE 02377000 ST R3,NUMTRY INCREMEMTED TRIAL COUNTER 02378000 MVI STYPE,AB PACKET TYPE = BREAK 02379000 XC LSDAT,LSDAT LENGTH = ZERO 02380000 L R15,=A(SPACK) 02381000 BALR 14,15 SAVE * AND GO TO SPACK 02382000 CLI STATE,C'A' 02383000 BE ABORT 02384000 L 15,=A(RPACK) 02385000 BALR 14,15 SAVE * AND GO TO RPACK 02386000 CLI RTYPE,AE ERROR PACKET? 02387000 BNE Y6 MAYBE AN ACK 02388000 MVI ERRNUM,X'0A' MICRO DIED 02389000 MVI STATE,C'A' THEN WE DO TOO 02390000 B SLOOP 02391000 Y6 CLI RTYPE,AY CHECK FOR ACK 02392000 BNE N6 CHECK FOR 'N' 02393000 CLC SPKNUM,RPKNUM CORRECT ACK? 02394000 BE AOK6 02395000 MVI ERRNUM,X'08' LOST A PACKET 02396000 B SLOOP 02397000 AOK6 MVI STATE,C'C' COMPLETED STATE 02398000 CLI CXZ,X'00' Other guy stop x-fer? [16] 02399000 BE SLOOP No end OK [16] 02400000 MVI STATE,C'A' Remember error [16] 02401000 B SLOOP 02402000 N6 CLI RTYPE,AN CHECK FOR 'N' 02403000 BNE AB6 DIE IF NOT A NAK 02404000 TM FLAGS,FLG4 DID MICRO NAK OR I REJECTED? 02405000 BO SLOOP LEAVE ERR MSG AS IS IF I DID 02406000 MVI ERRNUM,X'09' MICRO NAK'ED 02407000 B SLOOP 02408000 AB6 MVI STATE,C'A' ELSE,ABORT 02409000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 02410000 BE SLOOP Yes just return [12] 02411000 MVI ERRNUM,X'07' UNRECOGNIZED PACKET TYPE 02412000 B SLOOP 02413000 * 02414000 ABORT LA R3,FILNAM 02415000 FSCLOSE (R3) CLOSE THE FILE 02416000 TM FLAGS,FLG1 DYING ON FILE-NOT-FOUND? 02417000 BO NOERRP IF SO, THEN NO ERROR PACKET 02418000 CLI ERRNUM,X'0A' DID THE MICRO DIE? 02419000 BE NOERRP NO ERROR PACKET IF SO 02420000 CLI ERRNUM,X'16' Other side cancel send [16] 02421000 BE NOERRP Yes no error packet [16] 02422000 * At least try to send an error packet. 02423000 * CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 02424000 * BE NOERRP No error packet if yes [12] 02425000 L R15,=A(ERRPACK) Send error packet [13] 02426000 BALR R14,R15 Error number in ERRNUM [13] 02427000 NOERRP LA R15,4 SET NON-ZERO RETCODE 02428000 B SENDRET PREPARE TO LEAVE 02429000 COMPLETE SR R15,R15 ZERO WILL BE RETCODE 02430000 SENDRET TM S1FLAGS,ISS1 Is console a S/1? [12] 02431000 BZ SENDRT2 No skip reset [12] 02432000 TM LFLAGS,SERVON In server mode? [13] 02433000 BO SENDRT2 Yes don't reset yet [13] 02434000 LR R2,R15 Save retcode [12] 02435000 SR R1,R1 Clear interrupt trapping [12] 02436000 L R15,=A(INTRINI) [12] 02437000 BALR R14,R15 [12] 02438000 LR R15,R2 Restore retcode [12] 02439000 SENDRT2 L R13,4(R13) 02440000 L R14,12(R13) 02441000 LM R0,R12,20(R13) 02442000 BR R14 02443000 SENDSAVE DS 18F 02444000 PARSE DC 32X'00' 02445000 DC X'01' STOP ON A SPACE 02446000 DC 223X'00' 02447000 FIRST MVC 0(0,R7),FILNAM Pick up the FN [22] 02448000 SECOND MVC 0(0,R7),FILNAM+8 PICK UP FT 02449000 LTORG 02450000 DROP R11 02451000 DROP R12 DON'T NEED THEM ANYMORE 02452000 EJECT 02453000 * 02454000 * Rewrite routine to pack as much data into the outgoing packet as 02455000 * possible (not just a record at a time). [4] 02456000 GTCHR CSECT 02457000 STM R14,R12,12(R13) Do standard linkage 02458000 BALR R12,0 02459000 USING *,R12 02460000 LA R14,GTSAV 02461000 ST R13,4(R14) 02462000 ST R14,8(R13) 02463000 LR R13,R14 02464000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 02465000 L R11,=A(PARMS) 02466000 USING PARMS,R11 02467000 L R2,=A(INBUF) Routine to call when [22] 02468000 ST R2,MORENC need to refill on input [22] 02469000 TM FLAGS,FLG3 Does input buffer have data? 02470000 BO GTCH0 One means yes. 02471000 L R15,=A(INBUF) Get a buffer full of data. 02472000 BALR R14,R15 02473000 LTR R15,R15 OK return code? 02474000 BNZ GTCH1 No, leave this routine. 02475000 GTCH0 L R15,=A(ENCODE) Encode the data 02476000 BALR R14,R15 02477000 GTCH1 L R13,4(R13) Return to caller 02478000 L R14,12(R13) 02479000 LM R0,R12,20(R13) Don't change retcode in R15 02480000 BR R14 02481000 GTSAV DS 18F 02482000 LTORG 02483000 EJECT 02484000 * 02485000 * Expects input buffer address in ABUF, writes to SDAT 02486000 * R8 - input buffer offset, R9 - output buffer offset, 02487000 * R10 - character count, R5 - quote character 02488000 * R3 - number of characters allowed in output buffer 02489000 * RECL - number of characters in input buffer (set in refill 02490000 * routine), MORENC has address of refill routine [22] 02491000 ENCODE CSECT 02492000 STM R14,R12,12(R13) Do standard linkage 02493000 BALR R12,0 02494000 USING *,R12 02495000 LA R14,ENCSAV 02496000 ST R13,4(R14) 02497000 ST R14,8(R13) 02498000 LR R13,R14 02499000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 02500000 L R11,=A(PARMS) 02501000 USING PARMS,R11 02502000 CLC RECL,ZERO Any data to encode? [7] 02503000 BE ENCOD6 No just return [7] 02504000 MVC RPTQ(1),ORIGQ Initialize repeat quote char [7] 02505000 MVI RPTVAL,X'00' Holds Char to be repeated [7] 02506000 MVI RPTCT,X'01' Number of repetitions [7] 02507000 L R3,MAXDAT Max packet size 02508000 LA R3,1(R3) Increment for BCT instruction 02509000 SR R9,R9 Initialize output buffer pointer 02510000 SR R10,R10 Ditto for character count 02511000 SR R5,R5 Will hold quote char 02512000 IC R5,RQUOTE 02513000 L R8,INBFPT Where we left off 02514000 ENCOD0 BCTR R3,0 Decr free space in output buffer 02515000 LTR R3,R3 Room left? 02516000 BP ENCOD1 Yes keep going 02517000 ST R8,INBFPT No, so save input buffer pointer 02518000 STC R10,LSDAT+3 Save char count 02519000 OI FLAGS,FLG3 Stuff in input buffer 02520000 SR R15,R15 OK retcode 02521000 B ENCOD6 02522000 * Room in output buffer. Now check if there's data in input buffer. 02523000 ENCOD1 C R8,RECL Any more input data? 02524000 BL ENCOD2 Yes go add to buffer 02525000 * L R15,=A(INBUF) No, get more data [22] 02526000 L R15,MORENC No, get more data [22] 02527000 BALR R14,R15 02528000 L R8,INBFPT Input buffer pointer 02529000 LTR R15,R15 OK return code? 02530000 BZ ENCOD2 Yes, there's more input 02531000 STC R10,LSDAT+3 Else, remember char count 02532000 XC INBFPT,INBFPT Reset input buffer pointer 02533000 NI FLAGS,X'FF'-FLG3 No more data in input buffer 02534000 B ENCOD6 02535000 * Input data exists. Add to buffer. 02536000 ENCOD2 SR R7,R7 02537000 L R1,ABUF ADDR OF BUFFER [2] 02538000 AR R1,R8 PLUS DISPLACEMENT [2] 02539000 IC R7,0(R1) PICK UP BYTE [2] 02540000 CLI RPTQ,X'00' Doing repeat quoting [7] 02541000 BE ENCOD23 No so skip this part [7] 02542000 L R6,RECL Get length of input record [7] 02543000 SR R6,R8 Minus chars processed [7] 02544000 C R6,ONE On last piece of input [7] 02545000 BE ENCOD21 Yes so write it out [7] 02546000 CLI RPTCT,X'5E' Max that can rep in a byte [7] 02547000 BE ENCOD21 Then that's it [7] 02548000 CLM R7,B'0001',1(R1) Current & next chars equal? [7] 02549000 BNE ENCOD21 No go write out chars [7] 02550000 SR R6,R6 Zero it out [7] 02551000 IC R6,RPTCT Number of times char appears [7] 02552000 LA R6,1(R6) Increment it [7] 02553000 STC R6,RPTCT Remember number of repeats [7] 02554000 STC R7,RPTVAL Remember repeated char [7] 02555000 LA R3,1(R3) Adjust output pointer [7] 02556000 LA R8,1(R8) Bump input pointer [7] 02557000 B ENCOD0 And get more data [7] 02558000 ENCOD21 CLI RPTCT,X'01' Were previous chars repeats [7] 02559000 BE ENCOD23 No so just add this char [7] 02560000 CLI RPTCT,RPTMIN Within bounds for prefixing [7] 02561000 BNL ENCOD22 Yes, use repeat prefixing [7] 02562000 SR R6,R6 Blank it out [7] 02563000 IC R6,RPTCT Not enough chars for repeats [7] 02564000 SR R8,R6 Adjust input buffer pointer [7] 02565000 LA R8,1(R8) Don't get prev char again [7] 02566000 LA R3,1(R3) Adjust output buffer counter [7] 02567000 MVI RPTVAL,X'00' Clear out repeated char [7] 02568000 MVC ORIGQ(1),RPTQ Save repeat quote char here [7] 02569000 MVI RPTQ,X'00' Pretend not doing prefixing [7] 02570000 B ENCOD0 Reprocess the data [7] 02571000 ENCOD22 IC R6,RPTQ Get the repeat prefix [7] 02572000 STC R6,SDAT(R9) Add to output buffer [7] 02573000 LA R9,1(R9) Bump output pointer [7] 02574000 LA R10,1(R10) Increment char count [7] 02575000 BCTR R3,0 Decrement for size [7] 02576000 IC R6,RPTCT Size of repeated sequence [7] 02577000 A R6,=F'32' Add space to make printable [7] 02578000 STC R6,SDAT(R9) Add size to output buffer [7] 02579000 LA R9,1(R9) Bump output pointer [7] 02580000 LA R10,1(R10) Increment char count [7] 02581000 BCTR R3,0 Decrement for char itself [7] 02582000 MVI RPTCT,X'01' Reset repeat count [7] 02583000 MVI RPTVAL,X'00' And this [7] 02584000 ENCOD23 CLI EBQUOT,AN DOING 8-BIT QUOTING? [1 START] 02585000 BE ENCOD3 NOPE, SO IGNORE 02586000 CLI EBQUOT,AY CAN DO IT BUT AREN'T? 02587000 BE ENCOD3 YUP 02588000 LR R6,R7 SAVE CHAR HERE 02589000 N R6,=X'0000007F' GET CHAR WITHOUT PARITY 02590000 N R7,=X'00000080' ISOLATE PARITY 02591000 LR R7,R6 RESET REGISTER 02592000 BZ ENCOD3 DON'T NEED 8-BIT QUOTING 02593000 LA R4,SDAT(R9) WHERE CHAR IS GOING 02594000 MVC 0(1,R4),EBQUOT Add 8-bit quote char to buffer 02595000 LA R9,1(R9) INCR POINTER IN OUTPUT BUFFER 02596000 LA R10,1(R10) Incr char count 02597000 BCTR R3,0 For 8-bit quote char [1 END] 02598000 ENCOD3 C R7,SPACE Is it a control character? 02599000 BL ENCOD5 Yes quote it and translate 02600000 C R7,DEL Is it a delete? 02601000 BE ENCOD5 Yes quote it and translate 02602000 CR R7,R5 Is it the quote character? 02603000 BE ENCOD51 Yes quote it 02604000 CLI EBQUOT,AN Doing 8-bit quoting [1 START] 02605000 BE ENCOD4 No how about repeat prefixing 02606000 CLI EBQUOT,AY Same question 02607000 BE ENCOD4 Not doing quoting 02608000 CLM R7,B'0001',EBQUOT Is char the 8-bit quote char? 02609000 BE ENCOD51 Yes output w/quote char [1 END] 02610000 ENCOD4 CLI ORIGQ,X'00' Doing repeat prefixing [7] 02611000 BE ENCOD52 No check for quote char [7] 02612000 CLM R7,B'0001',ORIGQ Is char repeat quote char [7] 02613000 BE ENCOD51 Yes then quote it [7] 02614000 B ENCOD52 Else don't quote it [7] 02615000 ENCOD5 A R7,O1H Add 64 to char 02616000 N R7,=X'0000007F' Get MOD 127 02617000 ENCOD51 LA R4,SDAT(R9) Next spot in output buffer [7] 02618000 MVC 0(1,R4),RQUOTE Add quote char [7] 02619000 LA R9,1(R9) Increment output buffer pointer 02620000 LA R10,1(R10) Increment character counter 02621000 BCTR R3,0 Less space in output buffer [7] 02622000 ENCOD52 STC R7,SDAT(R9) Add the character 02623000 LA R9,1(R9) Increment output buffer pointer 02624000 LA R8,1(R8) Increment input buffer pointer 02625000 LA R10,1(R10) Increment character counter 02626000 CLI RPTCT,X'01' One occurence of char [7] 02627000 BNE ENCOD53 No there's more [7] 02628000 MVC RPTQ(1),ORIGQ Restore repeat prefix [7] 02629000 B ENCOD0 Get more data 02630000 ENCOD53 SR R6,R6 Zero out for increment [7] 02631000 IC R6,RPTCT Number of repetitions [7] 02632000 BCTR R6,0 Decrement number left to do [7] 02633000 STC R6,RPTCT Store here [7] 02634000 B ENCOD0 Add char again [7] 02635000 ENCOD6 L R13,4(R13) 02636000 L R14,12(R13) 02637000 LM R0,R12,20(R13) Don't change retcode in R15 02638000 BR R14 02639000 NULREF SR R2,R2 [22 start] 02640000 BCTR R2,0 Get -1 here 02641000 ST R2,INBFPT Say no more data to encode 02642000 LR R15,R2 Error ret code 02643000 BR R14 That's it [22 end] 02644000 ENCSAV DS 18F 02645000 LTORG 02646000 EJECT 02647000 * 02648000 * Read the next line from the input file, and do EBCDIC to ASCII 02649000 * translation if requested. [4] 02650000 INBUF CSECT 02651000 STM R14,R12,12(R13) Do standard linkage 02652000 BALR R12,0 02653000 USING *,R12 02654000 LA R14,INBSAV 02655000 ST R13,4(R14) 02656000 ST R14,8(R13) 02657000 LR R13,R14 02658000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 02659000 L R11,=A(PARMS) 02660000 USING PARMS,R11 02661000 TM FLAGS,FLG7 Hit eof yet? [4] 02662000 BNO INBUFX If yes, return RC of -1 [4] 02663000 L R15,=F'-1' Error return code. 02664000 XC LSDAT,LSDAT No data to send [4] 02665000 B INBUF9 02666000 INBUFX L R4,ABUF READ INTO THIS BUFFER [2] 02667000 LA R3,FILNAM 02668000 FSREAD (R3),BUFFER=(R4),BSIZE=65536,FORM=E [2] 02669000 LTR R4,R15 PUT RESULT OF READ IN R4 02670000 BZ INBUF1 02671000 FSCLOSE (R3) CLOSE FILE 02672000 C R4,=A(ERCOD) Did we hit the end of file? 02673000 BNE INBUF0 No, it's something else. 02674000 OI FLAGS,FLG7 Set eof flag [4] 02675000 L R15,=F'-1' Error return code. 02676000 B INBUF9 02677000 INBUF0 L R15,=F'1' Error return code. 02678000 MVI ERRNUM,X'0C' INVALID RECORD LENGTH 02679000 C R4,=F'8' WAS OUR GUESS RIGHT? 02680000 BE INBUF9 IF YES, RETURN 02681000 MVI ERRNUM,X'0D' ELSE, GOT AN I/O ERROR 02682000 B INBUF9 02683000 INBUF1 LR R5,R0 GET NUMBER OF BYTES READ IN 02684000 TM FLAGS,BINF BINARY FILE X-FER [1] 02685000 BO INBUF8 YES, SKIP TRANSLATION [1] 02686000 LTR R5,R5 Any data at all [4] 02687000 BZ INBUF7 No skip translation [4] 02688000 LR R4,R5 SAVE ALSO IN R4 02689000 LR R7,R5 AND IN R7 [2] 02690000 L R3,ABUF WHERE TRANSLATING STARTS [2] 02691000 INBUF2 BCTR R4,0 SUBTRACT 1 FOR EX COMMAND 02692000 C R4,=F'255' MAX FOR TRANSLATE IS 256 [2] 02693000 BL INBUF3 IF IS UNDER MAX THEN IS OK [2] 02694000 LA R4,255 ELSE, SET TO MAX [2] 02695000 INBUF3 EX R4,TRANS EBCDIC TO ASCII TRANSLATION 02696000 C R7,=F'256' MORE CHARS LEFT TO X-LATE? [2] 02697000 BNH INBUF4 NOPE, WE'RE DONE [2] 02698000 LA R3,256(R3) X-LATE NEXT SET OF CHARS [2] 02699000 S R7,=F'256' DECR CHARS LEFT TO X-LATE [2] 02700000 LR R4,R7 NO. OF CHARS LEFT TO X-LATE [2] 02701000 B INBUF2 TRANSLATE SOME MORE [2] 02702000 INBUF4 L R8,ABUF GET LOC OF BUFFER INPUT [2] 02703000 LR R4,R5 GET BACK ORIG SIZE [2] 02704000 BCTR R4,0 [2] 02705000 L R9,ABUF HEAD OF BUFFER [2] 02706000 AR R9,R4 PLUS DISPLACEMENT [2] 02707000 INBUF5 CLI 0(R9),X'20' IS THIS A BLANK? 02708000 BNE INBUF6 NO, FOUND LAST CHAR OF LINE 02709000 BCTR R9,0 02710000 CR R9,R8 02711000 BNL INBUF5 FIND LAST CHAR 02712000 SR R5,R5 ALL BLANKS 02713000 B INBUF7 02714000 INBUF6 SR R9,R8 02715000 LR R5,R9 LENGTH OF LINE 02716000 LA R5,1(R5) Go past last char [2] 02717000 INBUF7 L R9,ABUF BUFFER HEAD [2] 02718000 AR R9,R5 PLUS DISPLACEMENT [2] 02719000 MVC 0(1,R9),=X'0D' ADD ASCII CR 02720000 LA R9,1(R9) INCREMENT POINTER 02721000 MVC 0(1,R9),=X'0A' AND ADD ASCII LF [1] 02722000 LA R5,2(R5) TWO EXTRA BYTES OF DATA NOW 02723000 INBUF8 ST R5,RECL LRECL + 2 (FOR CRLF) 02724000 XC INBFPT,INBFPT Zero input buffer pointer 02725000 SR R15,R15 Return code == success 02726000 INBUF9 L R13,4(R13) 02727000 L R14,12(R13) 02728000 LM R0,R12,20(R13) Don't change retcode in R15 02729000 BR R14 02730000 INBSAV DS 18F 02731000 TRANS TR 0(0,R3),ETOA EBCDIC TO ASCII TRANSLATION 02732000 LTORG 02733000 EJECT 02734000 * Add support for two character checksum and three character CRC. 02735000 * Expects input data to be in SDAT buffer. Registers used: R9 to 02736000 * calculate the checksum. [8] 02737000 SPACK CSECT 02738000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 02739000 BALR R12,0 ESTABLISH ADDRESSABILITY 02740000 USING *,R12 02741000 LA R14,SPSAVE ADDRESS OF MY SAVE AREA 02742000 ST R13,4(R14) SAVE CALLER'S 02743000 ST R14,8(R13) 02744000 LR R13,R14 02745000 * Use R11 as base register for 'PARMS' global data area 02746000 L R11,=A(PARMS) 02747000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 02748000 SR R9,R9 Zero out checksum register 02749000 MVI PHDR,SOH Add Control-A to packet 02750000 CLI LSDAT+3,SPMAX Data size below max? [4] 02751000 BNH SPACK0 Yup [4] 02752000 MVI ERRNUM,X'00' Data size exceeds max limit 02753000 MVI STATE,C'A' Abort on this 02754000 B SPRET 02755000 SPACK0 L R4,LSDAT Data size + space + two [8] 02756000 A R4,=F'34' for packet number and type [8] 02757000 SR R5,R5 Zero for next instruction [8] 02758000 IC R5,CHKLEN Get checksum length [8] 02759000 AR R4,R5 Account for it in pkt size [8] 02760000 STC R4,PLEN Add it to packet 02761000 AR R9,R4 And then add it to checksum 02762000 CLC SPKNUM,ZERO Check if packet number is valid 02763000 BNL SPACK01 OK if >= to 0 02764000 MVI ERRNUM,X'01' Illegal packet number 02765000 MVI STATE,C'A' 02766000 B SPRET 02767000 SPACK01 CLC SPKNUM,O1H See if is <= octal 100 02768000 BNH SPACK02 02769000 MVI ERRNUM,X'01' Illegal packet number 02770000 MVI STATE,C'A' 02771000 B SPRET 02772000 SPACK02 L R4,SPKNUM Get packet number 02773000 A R4,SPACE Add space to make it printable 02774000 STC R4,PNUM Add to buffer 02775000 AR R9,R4 And add to checksum 02776000 CLI STYPE,X'41' ASCII 'A' 02777000 BL SPACK03 Can't be less than this 02778000 CLI STYPE,X'5A' ASCII 'Z' 02779000 BNH SPACK04 Can't be greater 02780000 SPACK03 MVI ERRNUM,X'07' Illegal packet type 02781000 MVI STATE,C'A' Die on this 02782000 B SPRET 02783000 SPACK04 MVC PTYPE(1),STYPE Add message type to buffer 02784000 SR R2,R2 Zero it out 02785000 IC R2,STYPE 02786000 AR R9,R2 Add to checksum 02787000 L R6,LSDAT How much data 02788000 LTR R6,R6 Test it out 02789000 BZ SPACK3 02790000 SR R5,R5 Use to get data 02791000 SR R3,R3 Use to hold data 02792000 SPACK1 IC R3,SDAT(R5) Pick up char 02793000 AR R9,R3 Add to checksum 02794000 LA R5,1(R5) Bump pointer 02795000 CR R5,R6 Got all the data yet 02796000 BNE SPACK1 Nope get the rest 02797000 SPACK2 LR R7,R6 Munge size here 02798000 BCTR R7,0 Subtract 1 for EX function 02799000 EX R7,MOVE Get data to packet in one MOVE 02800000 SPACK3 LR R7,R9 Need copy of chksum [8] 02801000 CLI CHKLEN,X'02' What kind of checksum? [8] 02802000 BE SPACK5 2 char checkum [8] 02803000 BH SPACK4 3 char CRC [8] 02804000 ST R9,TEMP Else is one char checksum 02805000 N R9,=X'000000C0' Get MOD 192 02806000 SRL R9,6 Shift right by 6 02807000 A R9,TEMP Add the two values 02808000 N R9,=X'0000003F' Get MOD 64 of checksum 02809000 A R9,SPACE Make printable 02810000 STC R9,PDATA(R6) Add to buffer (after data) 02811000 B SPACK6 Go add EOL char 02812000 SPACK4 SR R5,R5 Zero out to get a NULL [8] 02813000 STC R5,PDATA(R6) Add NULL at end of data [8] 02814000 ST R6,TEMP Next free spot in buffer [8] 02815000 LA R5,PLEN Where checksum starts [8] 02816000 L R15,=A(CRCCLC) Calculate the CRC [8] 02817000 BALR R14,R15 Return CRC in R15 [8] 02818000 LR R7,R15 Keep in here [8] 02819000 LR R5,R7 Munge value in dif register [8] 02820000 N R5,=X'0000F000' Get bits 12-15 [8] 02821000 SRL R5,12 Shift right by 12 bits [8] 02822000 A R5,SPACE Make char printable [8] 02823000 L R6,TEMP Next free spot in buffer [8] 02824000 STC R5,PDATA(R6) Add to buffer [8] 02825000 LA R6,1(R6) Bump output pointer [8] 02826000 SPACK5 LR R5,R7 Munge in dif register [8] 02827000 N R5,=X'00000FC0' Get bits 6-11 [8] 02828000 SRL R5,6 Shift right 6 bits [8] 02829000 A R5,SPACE Make char printable [8] 02830000 STC R5,PDATA(R6) Add to buffer [8] 02831000 LA R6,1(R6) Bump pointer [8] 02832000 N R7,=X'0000003F' Get bits 0-5 [8] 02833000 A R7,SPACE Make printable [8] 02834000 STC R7,PDATA(R6) Add to buffer [8] 02835000 SPACK6 LA R6,1(R6) Bump pointer 02836000 IC R9,SEOL 02837000 STC R9,PDATA(R6) Add send end of packet char 02838000 L R6,LSDAT Amount of data [8] 02839000 A R6,=F'5' Control info and EOL char [8] 02840000 SR R5,R5 Zero for next instruction [8] 02841000 IC R5,CHKLEN Get checksum length [8] 02842000 AR R6,R5 Plus length of checksum 02843000 TM FLAGS,DEBUG Are we debugging? [14] 02844000 BNO SPACK61 No don't log packet [14] 02845000 MVC INPUT(130),SNDPKT Munge data here [14] 02846000 TR INPUT(130),ATOE Log in EBCDIC [14] 02847000 FSWRITE 'KER LOG A1',BUFFER=INPUT,BSIZE=(R6),FORM=E,RECFM=V 02848000 SPACK61 TM S1FLAGS,ISS1 is console a S/1? [12 start] 02849000 BZ SENDTTY no: do normal TTY output 02850000 OC SNDPKT,HIBITS set hi bit in each char 02851000 LA R7,S1ORDSL(,R6) incr by len of S/1 orders 02852000 STH R7,S1SDATL store len in CCW 02853000 LA R1,S1SCCW get addr of CCW 02854000 L R15,=A(SCRNIO) call routine to output via 02855000 BALR R14,R15 full-screen diagnose 02856000 LTR R15,R15 did it work? 02857000 BM S1SNDERR no: error 02858000 SS1WAIT EQU * 02859000 CLI CONSUNIT,ATTN was last intrpt an ATTN? 02860000 BE SS1READ yes: go read from console 02861000 WAITD CON1 no: wait for one 02862000 B SS1WAIT 02863000 SS1READ EQU * 02864000 XC RECPKT,RECPKT clear input buffer 02865000 LA R1,S1RCCW get CCW to read console 02866000 L R15,=A(SCRNIO) and do it now 02867000 BALR R14,R15 02868000 ST R15,S1RDBYTC save residue byte count 02869000 LTR R15,R15 did it work? 02870000 BNM SPRET yes: return to caller 02871000 S1SNDERR EQU * 02872000 MVI ERRNUM,S1ERRNUM no: flag error 02873000 MVI STATE,C'A' go into abort state 02874000 B SPRET ret to caller 02875000 SENDTTY EQU * [12 end] 02876000 TR SNDPKT(130),ATOE Send in EBCDIC 02877000 * WRTERM SNDPKT,(R6),EDIT=NO [19] 02878000 STH R6,TYLNLEN Store length in plist [19] 02879000 LA R1,TYLNPLST Point to plist [19] 02880000 SVC 202 Write to terminal [19] 02881000 DC AL4(1) See comments at plist [19] 02882000 SPRET L R13,4(R13) 02883000 L R14,12(R13) 02884000 LM R0,R12,20(R13) 02885000 BR 14 02886000 SPSAVE DS 18F 02887000 MOVE MVC PDATA(0),SDAT 02888000 * [19 begin] 02889000 * The following Plist is identical to a WRTERM macro one, 02890000 * except the macro can't gen a "2" flag which causes the 02891000 * output not to be translated with the user output translate 02892000 * table. The "8" specifies no Carriage Return is needed. 02893000 TYLNPLST DS 0D Terminal write Plist: 02894000 DC CL8'TYPLIN' Command name 02895000 DC X'01',AL3(SNDPKT) Buffer address 02896000 DC C'B',X'82' B->black, 82->no xlate or CR 02897000 TYLNLEN DC H'0' store buffer len here 02898000 * [19 end] 02899000 HIBITS DC (L'SNDPKT)X'80' Set hi bit in each char [12] 02900000 LTORG 02901000 DROP R11 02902000 DROP R12 DON'T NEED THEM ANYMORE 02903000 EJECT 02904000 * Calculate the CRC and return it in R15. Expects R5 to point to 02905000 * the start of the buffer on which the CRC is calculated. Stops 02906000 * when it reaches a NULL. [8] 02907000 CRCCLC CSECT 02908000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 02909000 BALR R12,0 ESTABLISH ADDRESSABILITY 02910000 USING *,R12 02911000 LA R14,CRCSAV ADDRESS OF MY SAVE AREA 02912000 ST R13,4(R14) SAVE CALLER'S 02913000 ST R14,8(R13) 02914000 LR R13,R14 02915000 * Use R11 as base register for 'PARMS' global data area 02916000 L R11,=A(PARMS) 02917000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 02918000 SR R3,R3 Initial CRC value is zero 02919000 CRC0 SR R4,R4 Clear out before read char 02920000 IC R4,0(R5) Get the next character 02921000 LTR R4,R4 Test it 02922000 BZ CRC1 If NULL then we're done 02923000 LA R5,1(R5) Else bump input pointer 02924000 LR R7,R3 Munge CRC here 02925000 N R7,=X'000000FF' Only want lo order byte 02926000 XR R4,R7 XOR input and CRC lo byte 02927000 LR R7,R4 Keep the original for later 02928000 N R7,=X'000000F0' Keep hi 4 bits of lowest byte 02929000 SRL R7,4 Shift it right by four 02930000 N R4,=X'0000000F' Get lo 4 bits of lowest byte 02931000 AR R4,R4 Double to get index into table 02932000 LH R4,CRCTB2(R4) Get low portion 02933000 AR R7,R7 Double to get another index 02934000 LH R7,CRCTAB(R7) Get high portion 02935000 N R4,=X'0000FFFF' Don't want propogated sign 02936000 N R7,=X'0000FFFF' Ditto 02937000 XR R4,R7 Add the two 02938000 SRL R3,8 Shift 8 bits to right 02939000 XR R3,R4 XOR table value and CRC 02940000 B CRC0 And get some more 02941000 CRC1 LR R15,R3 Return CRC in R15 02942000 L R13,4(R13) 02943000 L R14,12(R13) 02944000 LM R0,R12,20(R13) 02945000 BR 14 02946000 CRCSAV DS 18F 02947000 LTORG 02948000 DROP R11 02949000 DROP R12 DON'T NEED THEM ANYMORE 02950000 EJECT 02951000 * 02952000 * Add support for two character checksum and three character CRC. 02953000 * Expects input data to be in RECPKT buffer. Writes data out to 02954000 * RDAT buffer. Registers used: R5 to calculate checksum, R8 as 02955000 * pointer in input buffer. R9 as output buffer pointer. [8] 02956000 RPACK CSECT 02957000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 02958000 BALR R12,0 ESTABLISH ADDRESSABILITY 02959000 USING *,R12 02960000 LA R14,RPSAVE ADDRESS OF MY SAVE AREA 02961000 ST R13,4(R14) SAVE CALLER'S 02962000 ST R14,8(R13) 02963000 LR R13,R14 02964000 * Use R11 as base register for 'PARMS' global data area 02965000 L R11,=A(PARMS) 02966000 USING PARMS,R11 ESTABLISH ADDRESSABILITY 02967000 TM S1FLAGS,ISS1 is console a S/1? [12 start] 02968000 BZ RECTTY no: skip 02969000 L R0,S1RDBYTC get residue cnt from read 02970000 LTR R0,R0 check if one has been done 02971000 BNM RPS1MOV non-neg->it has: skip 02972000 MVI SNDPKT,ASCXON send micro X-ON to prod it 02973000 LA R1,S1ORDSL+1 and init S/1 "write/read" 02974000 STH R1,S1SDATL data len = orders + 1 char 02975000 LA R1,S1SCCW point to CCW for this I/O 02976000 L R15,=A(SCRNIO) call routine to do I/O 02977000 BALR R14,R15 02978000 LTR R15,R15 did it work? 02979000 BM RPACK9 no: an err occurred 02980000 RPWAIT EQU * 02981000 CLI CONSUNIT,ATTN was last intrp an ATTN? 02982000 BE RPS1RD yes: go read console 02983000 WAITD CON1 no: wait for ATTN intrpt 02984000 B RPWAIT 02985000 RPS1RD EQU * 02986000 XC RECPKT,RECPKT clear input buffer 02987000 LA R1,S1RCCW get CCW for READ MODIFIED 02988000 L R15,=A(SCRNIO) 02989000 BALR R14,R15 perform read 02990000 LTR R0,R15 copy byte cnt & test status 02991000 BM RPACK9 len < 0 -> error: skip 02992000 RPS1MOV EQU * 02993000 * The format of the incoming buffer is: 02994000 * X'E8',X'????',, 02995000 * where the '????' is an SBA-type cursor address which would 02996000 * point to the end of the data on the screen (if it were 02997000 * really there). 02998000 MVC RECPKT(L'RECPKT-3),RECPKT+3 shift over leadin 02999000 NC RECPKT,NOHIBITS clear all hi bits 03000000 LA R6,L'RECPKT-4 get size of buf - overhead 03001000 SR R6,R0 subt residue cnt from read 03002000 BM RPACK9 data len < 0: error 03003000 LA R2,RECPKT(R6) point past last data char 03004000 MVC 0(4,R2),=X'00000000' clr ovhd after MVC 03005000 LR R0,R6 save correct data len 03006000 TM FLAGS,DEBUG Are we debugging? [14] 03007000 BNO RPACKA No don't log packet [14] 03008000 MVC INPUT(130),RECPKT Munge here [14] 03009000 TR INPUT(130),ATOE Log in EBCDIC [14] 03010000 FSWRITE 'KER LOG A1',BUFFER=INPUT,BSIZE=(R0),FORM=E,RECFM=V 03011000 B RPACKA re-join common code 03012000 RECTTY EQU * normal TTY-type read [12 end] 03013000 * RDTERM RECPKT,EDIT=NO Read in a buffer [19] 03014000 LA R1,WTRDPLST Point to Plist for read [19] 03015000 SVC 202 Read from terminal [19] 03016000 DC AL4(1) See comments at Plist [19] 03017000 LH R0,WTRDLEN Number of chars recv'd [19] 03018000 TM FLAGS,DEBUG Are we debugging? [14] 03019000 BNO RPACKB No don't log packet [14] 03020000 FSWRITE 'KER LOG A1',BUFFER=RECPKT,BSIZE=(R0),FORM=E,RECFM=V 03021000 RPACKB TR RECPKT(130),ETOA Translate to ASCII 03022000 RPACKA EQU * [12] 03023000 NI FLAGS,X'FF'-FLG4 Make guess about type of error 03024000 SR R8,R8 Index register for RECPKT 03025000 SR R5,R5 Checksum register 03026000 RPACK0 LA R7,RECPKT(R8) Address of next input char 03027000 CLI 0(R7),SOH Is it Control-A 03028000 BE RPACK1 Yes, so far so good 03029000 LA R8,1(R8) Try next character 03030000 C R8,=F'130' See if exceed buffer size 03031000 BL RPACK0 No, can keep checking 03032000 MVI ERRNUM,X'03' Yes so no "SOH" error 03033000 B RPACK71 03034000 RPACK1 SR R9,R9 Zero output buffer pointer 03035000 LA R8,1(R8) Increment input buffer pointer 03036000 LA R7,RECPKT(R8) Get loc of char count 03037000 CLI 0(R7),SOH Is it Control-A 03038000 BE RPACK1 Yes start over 03039000 CLI 0(R7),DQUOTE Equal or above the min 03040000 BNL RPACK11 Continue if yes 03041000 MVI ERRNUM,X'04' Bad packet length 03042000 B RPACK71 03043000 RPACK11 IC R5,0(R7) Start checksum 03044000 LR R7,R5 Get size field 03045000 STC R7,LRDAT+3 Data field & control info 03046000 LA R8,1(R8) Increment input pointer 03047000 SR R7,R7 Zero it out 03048000 IC R7,RECPKT(R8) Pick up packet number 03049000 C R7,=A(SOH) Is it Control-A 03050000 BE RPACK1 Yes restart packet 03051000 AR R5,R7 Add to checksum 03052000 S R7,SPACE Subtract the space 03053000 STC R7,RPKNUM+3 RPKNUM := received packet number 03054000 LA R8,1(R8) Increment input counter 03055000 IC R7,RECPKT(R8) Pick up message type 03056000 C R7,=A(SOH) Is it Control-A 03057000 BE RPACK1 Yes restart 03058000 STC R7,RTYPE Save value here 03059000 AR R5,R7 Add to checksum 03060000 LA R8,1(R8) Go to next byte 03061000 * Start of change. 03062000 * Now determine block check type for this packet. Here we violate the 03063000 * layered nature of the protocol by inspecting the packet type in 03064000 * order to detect when the two sides get out of sync. Two heuristics 03065000 * allow us to resync here: 03066000 * a. An S packet always has a type 1 checksum. 03067000 * b. A NAK never contains data, so its block check type is 03068000 * PACKET LEN-2. 03069000 L R4,LRDAT Get back the size 03070000 S R4,=F'34' Unchar(len)-2 (for SEQ & TYPE) 03071000 SR R3,R3 03072000 IC R3,CHKLEN Checksum length we expect 03073000 CLI RTYPE,AS Is this an "S" packet? 03074000 BNE RPK0 Nope 03075000 L R3,ONE Yes, use 1 char checksum 03076000 RPK0 CLI RTYPE,AN Is this a NAK? 03077000 BNE RPK1 Nope 03078000 LR R3,R4 Yes so len-2 is checksum type 03079000 RPK1 STC R3,CHKLEN Then this is chksum length 03080000 SR R4,R3 Real size of data 03081000 ST R4,LRDAT Save correct size 03082000 * End of change. 03083000 LTR R4,R4 How much data did we get 03084000 BZ RPACK3 None so that's it 03085000 RPACK2 XC TEMP,TEMP Zero it out 03086000 LA R7,RECPKT(R8) Next location in buffer 03087000 MVC TEMP+3(1),0(R7) Pick up next byte 03088000 CLI TEMP+3,SOH Is it Control-A 03089000 BE RPACK1 Yes start over 03090000 LA R7,RDAT(R9) Where the data's going 03091000 MVC 0(1,R7),TEMP+3 And move it 03092000 A R5,TEMP Add to checksum 03093000 LA R8,1(R8) Bump input buffer pointer 03094000 LA R9,1(R9) Bump output buffer pointer 03095000 BCTR R4,0 Decrement amount of input 03096000 LTR R4,R4 Any left? 03097000 BNZ RPACK2 Yes get another character 03098000 RPACK3 SR R7,R7 Zero out register 03099000 IC R7,RECPKT(R8) Get checksum 03100000 LA R8,1(R8) Bump input pointer 03101000 C R7,=A(SOH) Is it Control-A 03102000 BE RPACK1 Yes start over 03103000 S R7,SPACE Turn char back into a number 03104000 LR R4,R5 Keep copy here [8] 03105000 CLI CHKLEN,X'02' Using what checksum length 03106000 BE RPACK5 Two character checksum 03107000 BH RPACK4 Three character CRC 03108000 ST R5,TEMP Else is a 1 char checksum 03109000 N R5,=X'000000C0' Get two hi order bits 03110000 SRL R5,6 Shift it right by 6 03111000 A R5,TEMP Add the two values 03112000 N R5,=X'0000003F' Get mod 64 03113000 CR R5,R7 Computed vs received checksum 03114000 BE RPACK8 Successful 03115000 B RPACK7 We failed 03116000 RPACK4 LA R5,RECPKT Address of input buffer 03117000 LA R5,1(R5) Skip over the ^A 03118000 SR R6,R6 Use for NULL 03119000 BCTR R8,0 Go back one char 03120000 STC R6,RECPKT(R8) Next spot in output buffer 03121000 LA R8,1(R8) Next char to pick up 03122000 L R15,=A(CRCCLC) Calculate the CRC 03123000 BALR R14,R15 03124000 LR R4,R15 Keep it here 03125000 LR R5,R4 Munge while here 03126000 N R5,=X'0000F000' Get bits 12-15 03127000 SRL R5,12 Shift right by 12 03128000 CR R5,R7 Rec'v checksum = calculated one? 03129000 BNE RPACK7 No then we fail 03130000 SR R7,R7 Zero out register 03131000 IC R7,RECPKT(R8) Get next char of checksum 03132000 LA R8,1(R8) Bump input pointer 03133000 C R7,=A(SOH) Is it Control-A 03134000 BE RPACK1 Yes start over 03135000 S R7,SPACE Get real value 03136000 RPACK5 LR R5,R4 Get back the CRC 03137000 N R5,=X'00000FC0' Get bits 6-11 03138000 SRL R5,6 Shift right by six 03139000 CR R5,R7 Recv chksum = calc one? 03140000 BNE RPACK7 No 03141000 SR R7,R7 Zero out register 03142000 IC R7,RECPKT(R8) Get checksum 03143000 LA R8,1(R8) Bump input pointer 03144000 C R7,=A(SOH) Is it Control-A 03145000 BE RPACK1 Yes start over 03146000 S R7,SPACE Get back real value 03147000 N R4,=X'0000003F' Get bits 0-5 03148000 CR R4,R7 Do the last chars match 03149000 BE RPACK8 Yes 03150000 RPACK7 EQU * 03151000 * Uncomment next two lines when debugging to get first char of chksum. 03152000 * A R5,SPACE 03153000 * LINEDIT TEXT='CHK SB ...',SUB=(HEX,(R5)) 03154000 MVI ERRNUM,X'05' Bad checksum error 03155000 RPACK71 MVI RTYPE,AN Return a NAK 03156000 OI FLAGS,FLG4 RPACK NAK'ed the packet 03157000 RPACK8 L R13,4(R13) 03158000 L R14,12(R13) 03159000 LM R0,R12,20(R13) 03160000 BR 14 03161000 RPACK9 EQU * S/1 I/O error occurred [12] 03162000 MVI ERRNUM,S1ERRNUM Set error type [12] 03163000 MVI RTYPE,X'00' Set an invalid pkt type [12] 03164000 B RPACK8 Return to caller [12] 03165000 RPSAVE DS 18F 03166000 * [19 begin] 03167000 * The following Plist is identical to a RDTERM macro one, 03168000 * except the macro can't gen a "Y" code which causes the 03169000 * input not to be translated with the user input translate 03170000 * table and the buffer is blank filled. Use prompt of XON. 03171000 WTRDPLST DS 0D Terminal read Plist: 03172000 DC CL8'WAITRD' Command name 03173000 DC X'01',AL3(RECPKT) Buffer addr 03174000 DC C'Y',C'P' Y->no xlate, P->prompt 03175000 WTRDLEN DC AL2(0) Rec'd chr count ret'd here 03176000 DC AL4(XONPRO) Prompt Address 03177000 DC AL4(LXONPRO) Prompt length 03178000 DS 0D 03179000 XONPRO DC X'11' Prompt is XON 03180000 LXONPRO EQU *-XONPRO 03181000 * [19 end] 03182000 NOHIBITS DC (L'RECPKT)X'7F' Clear hi bit of each char [12] 03183000 LTORG 03184000 DROP R11 03185000 DROP R12 DON'T NEED THEM ANYMORE 03186000 EJECT 03187000 RECEIVE CSECT 03188000 STM R14,R12,12(R13) SAVE CALLER'S REGISTERS 03189000 BALR R12,0 ESTABLISH ADDRESSABILITY 03190000 USING *,R12 03191000 LA R14,RECSAVE ADDRESS OF MY SAVE AREA 03192000 ST R13,4(R14) SAVE CALLER'S 03193000 ST R14,8(R13) 03194000 LR R13,R14 03195000 * USE R11 AS BASE REGISTER FOR THE GLOBAL DATA AREA, 'PARMS' 03196000 L R11,=A(PARMS) 03197000 USING PARMS,R11 03198000 TM S1FLAGS,ISS1 Is console a S/1? [12] 03199000 BZ RECINI No, skip init stuff [12] 03200000 LA R1,1 Initialize [12] 03201000 L R15,=A(INTRINI) Trap CONS interrupts [12] 03202000 BALR R14,R15 [12] 03203000 RECINI MVC EBQUOT(1),ORIG8Q IF CHANGED IN LAST X-FER [1] 03204000 SR R6,R6 GET ZERO 03205000 ST R6,NUMTRY ZERO THIS OUT 03206000 ST R6,SPKNUM HERE TOO 03207000 MVI STATE,C'R' SET TO RECEIVE STATE 03208000 RLOOP CLI STATE,C'D' RECEIVE DATA STATE 03209000 BE RDATA 03210000 CLI STATE,C'F' RECEIVE FILE STATE 03211000 BE RFILE 03212000 CLI STATE,C'R' RECEIVE INIT STATE 03213000 BE RINIT 03214000 CLI STATE,C'C' COMPLETE STATE 03215000 BE RCOMP 03216000 CLI STATE,C'A' ABORT STATE 03217000 BE RABORT 03218000 MVI ERRNUM,X'02' UNRECOGNIZED STATE 03219000 B RABORT ELSE, DIE 03220000 RINIT CLC NUMTRY,IMXTRY SEE IF CAN RECEIVE 03221000 BL ROK1 YES, WE CAN 03222000 MVI STATE,C'A' NOPE, GO INTO ABORT STATE 03223000 B RLOOP 03224000 ROK1 L R3,NUMTRY 03225000 LA R3,1(R3) INCREMENT TRIAL COUNTER 03226000 ST R3,NUMTRY 03227000 TM LFLAGS,SERVON In server mode? [13] 03228000 BO RY1 Already read in packet [13] 03229000 MVC CURCHK(1),CHKLEN Save desired value [8] 03230000 MVI CHKLEN,X'01' Init uses 1 char chksum [8] 03231000 L R15,=A(RPACK) GET INIT INFORMATION 03232000 BALR R14,R15 03233000 MVC CHKLEN(1),CURCHK Restore desired chksum [8] 03234000 CLI RTYPE,AE ERROR PACKET? 03235000 BNE RY1 ALL OK 03236000 MVI ERRNUM,X'0A' MICRO DIED 03237000 MVI STATE,C'A' SO WE DO TOO 03238000 B RLOOP 03239000 RY1 CLI RTYPE,AS IS IT A SEND-INIT PACKET 03240000 BNE RN1 MAYBE IT GOT CLOBBERED 03241000 L R5,LRDAT Number of pieces of data [5] 03242000 L R15,=A(SPAR) Read his parameters [5] 03243000 BALR R14,R15 03244000 MVC SPKNUM(4),RPKNUM SYNCH PACKET NUMBERS 03245000 MVI STYPE,AY SET MESSAGE TYPE TO ACK 03246000 L R15,=A(RPAR) Make packet of our values [5] 03247000 BALR R14,R15 03248000 ST R15,LSDAT Size of packet [5] 03249000 MVC CURCHK(1),CHKLEN Save desired value [8] 03250000 MVI CHKLEN,X'01' Init uses 1 char chksum [8] 03251000 L R15,=A(SPACK) ADDRESS OF SPACK 03252000 BALR R14,R15 SAVE * AND GO TO SPACK 03253000 MVC CHKLEN(1),CURCHK Restore desired chksum [8] 03254000 CLI STATE,C'A' 03255000 BE RABORT 03256000 MVI STATE,C'F' SET TO RECEIVE FILE STATE 03257000 MVC OLDTRY(4),NUMTRY SAVE TRIAL COUNTER 03258000 XC NUMTRY,NUMTRY RESET COUNTER TO ZERO 03259000 L R3,SPKNUM 03260000 LA R3,1(R3) ADD ONE 03261000 ST R3,SPKNUM STORE VALUE INCREMENTED BY 1 03262000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 03263000 B RLOOP 03264000 RN1 CLI RTYPE,AN NAK (bad chksum)? 03265000 BNE RSELSE 03266000 MVI STYPE,AN SEND A NAK PACKET 03267000 XC LSDAT,LSDAT NO DATA 03268000 MVC CURCHK(1),CHKLEN Save desired value [8] 03269000 MVI CHKLEN,X'01' Init uses 1 char chksum [8] 03270000 L R15,=A(SPACK) 03271000 BALR R14,R15 03272000 MVC CHKLEN(1),CURCHK Restore desired chksum [8] 03273000 B RLOOP 03274000 RSELSE MVI STATE,C'A' ELSE,ABORT 03275000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 03276000 BE RLOOP Yes just return [12] 03277000 MVI ERRNUM,X'07' ILLEGAL PACKET TYPE 03278000 B RLOOP 03279000 RFILE CLC NUMTRY,MAXTRY EXCEEDED NO. OF TRIALS ALLOWED 03280000 BL ROK2 NOPE, STILL OK 03281000 MVI STATE,C'A' ABORT IF YES 03282000 B RLOOP 03283000 ROK2 L R3,NUMTRY 03284000 LA R3,1(R3) INCREMENT TRIAL COUNTER 03285000 ST R3,NUMTRY 03286000 L R15,=A(RPACK) GET ADDRESS OF RPACK 03287000 BALR R14,R15 GO THERE AND RETURN WHEN DONE 03288000 CLI RTYPE,AE ERROR PACKET? 03289000 BNE RY2 MAYBE AN ACK 03290000 MVI ERRNUM,X'0A' MICRO DIED 03291000 MVI STATE,C'A' SO WE DO TOO 03292000 B RLOOP 03293000 RY2 CLI RTYPE,AS STILL IN INIT STATE? 03294000 BNE RNZ TRY FOR AN EOF 03295000 CLC OLDTRY,IMXTRY CAN WE TRY AGAIN? [5] 03296000 BL ROLD 03297000 MVI STATE,C'A' ELSE, ABORT 03298000 B RLOOP 03299000 ROLD L R3,OLDTRY 03300000 LA R3,1(R3) INCREMENT COUNTER 03301000 ST R3,OLDTRY 03302000 L R3,SPKNUM GET PACKET NUMBER SENT 03303000 BCTR R3,0 SUBTRACT ONE FROM IT 03304000 C R3,RPKNUM RPKNUM MUST EQUAL SPKNUM-1 03305000 BE RNUM 03306000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03307000 B RNAK SEND A NAK 03308000 RNUM MVI STYPE,AY ACK PACKET 03309000 ST R3,SPKNUM MAKE SEND SEQ NO. = SPKNUM-1 03310000 L R15,=A(RPAR) Get packet with our values [5] 03311000 BALR R14,R15 03312000 ST R15,LSDAT Size of packet [5] 03313000 L R15,=A(SPACK) 03314000 BALR R14,R15 GO TO SPACK AND RETURN 03315000 CLI STATE,C'A' 03316000 BE RABORT 03317000 L R4,SPKNUM 03318000 LA R4,1(R4) ADD ONE 03319000 ST R4,SPKNUM RESTORE N TO PROPER VALUE 03320000 XC NUMTRY,NUMTRY RESET COUNTER TO ZERO 03321000 B RLOOP 03322000 RNZ CLI RTYPE,AZ 03323000 BNE RNF MAYBE IT'S AN 'F' 03324000 CLC OLDTRY,MAXTRY CAN WE TRY AGAIN? 03325000 BL ROLD2 03326000 MVI STATE,C'A' ELSE,ABORT 03327000 B RLOOP 03328000 ROLD2 L R3,OLDTRY 03329000 LA R3,1(R3) INCREMENT COUNTER 03330000 ST R3,OLDTRY 03331000 L R3,SPKNUM GET PACKET NUMBER SENT 03332000 BCTR R3,0 SUBTRACT ONE FROM IT 03333000 C R3,RPKNUM RPKNUM MUST EQUAL SPKNUM-1 03334000 BE RNUM2 03335000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03336000 B RNAK SEND A NAK 03337000 RNUM2 MVI STYPE,AY ACK PACKET 03338000 ST R3,SPKNUM SEND SEQ := SPKNUM-1 03339000 XC LSDAT,LSDAT NO DATA 03340000 L R15,=A(SPACK) 03341000 BALR R14,R15 03342000 CLI STATE,C'A' 03343000 BE RABORT 03344000 L R4,SPKNUM 03345000 LA R4,1(R4) ADD ONE 03346000 ST R4,SPKNUM RESTORE SPKNUM TO PROPER VALUE 03347000 XC NUMTRY,NUMTRY RESET COUNTER TO ZERO 03348000 B RLOOP 03349000 RNF CLI RTYPE,AF 03350000 BNE RNB WELL, IT'S NOT A FNAME 03351000 CLC RPKNUM,SPKNUM THEY HAVE TO BE EQUAL 03352000 BE RNUM3 03353000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03354000 B RNAK SEND A NAK 03355000 RNUM3 MVI STYPE,AY ACK PACKET 03356000 XC LSDAT,LSDAT NO DATA 03357000 MVI CXZ,X'00' Clear each time [16] 03358000 TM FLAGS,FLG2 OVERWRITE THE NAME SENT? 03359000 BO OVER YUP,WE DO 03360000 L R5,LRDAT Data len to decode [22] 03361000 LTR R5,R5 CHECK LENGTH 03362000 BZ SAYNO DIE IF NO FILENAME 03363000 L R2,=A(NULDMP) Null dump routine [22] 03364000 ST R2,MORDEC [22] 03365000 XC OUTBFPT,OUTBFPT Output buffer offset [22] 03366000 MVC TEMP,MAXOUT Save max here [22] 03367000 MVC MAXOUT,=A(MAXTXT) Use big number [22] 03368000 L R15,=A(DECODE) Decode the input [22] 03369000 BALR R14,R15 [22] 03370000 MVC MAXOUT,TEMP Reset [22] 03371000 L R5,OUTBFPT Len of decoded data [22] 03372000 ST R5,LRDAT Keep length here [22] 03373000 MVC FILNAM,=18X'20' Initialize to blanks 03374000 * LA R9,RDAT Location of first char 03375000 L R9,ARBUF Location of first char [22] 03376000 LR R8,R9 Points to buffer head [22] 03377000 REMDOT CLC 0(1,R9),=X'2E' LOOK FOR THE DOT 03378000 BE DOT FOUND IT 03379000 LA R9,1(R9) NEXT POSITION 03380000 LR R10,R9 03381000 SR R10,R8 GET LENGTH OF NAME SO FAR 03382000 CR R10,R5 AT END OF FN? 03383000 BL REMDOT NO,KEEP LOOKING 03384000 C R5,=F'8' Get FN (max of 8 chars) [9] 03385000 BNH DOT1 Size is OK [9] 03386000 L R5,=F'8' Truncate to 8 [9] 03387000 DOT1 BCTR R5,0 Decrement for next instr [9] 03388000 EX R5,GETFN Copy FN from buffer [9] 03389000 B DOT4 Set ft to "X" [9] 03390000 DOT LR R5,R9 SAVE OUR PLACE 03391000 LA R5,1(R5) NEXT CHARACTER 03392000 SR R9,R8 GET LENGTH OF FNAME 03393000 LR R4,R9 SAVE LENGTH ATTRIBUTE 03394000 BCTR R4,0 03395000 C R9,=F'8' MAX OF 8 CHARACTERS 03396000 BNH DOT2 03397000 L R9,=F'8' TRUNCATE EXTRA LETTERS 03398000 DOT2 BCTR R9,0 FOR EX COMMAND 03399000 LTR R9,R9 CHECK LENGTH 03400000 BM SAYNO DIE IF IT'S ZERO 03401000 EX R9,GETFN GET FILNAM 03402000 L R7,LRDAT GET LENGTH OF WHOLE NAME 03403000 SR R7,R4 AND GET LENGTH OF FTYPE 03404000 S R7,=F'3' Minus dot, fn char, ft char 03405000 LTR R7,R7 CHECK LENGTH 03406000 BM DOT4 Set ft to "X" [9] 03407000 C R7,=F'7' MAX IS 8 (7 + 1 FOR 'EX') 03408000 BNH DOT3 03409000 L R7,=F'7' TRUNCATE EXTRA LETTERS 03410000 DOT3 EX R7,GETFT GET FTYPE 03411000 B DOT5 Do translation [9] 03412000 DOT4 MVI FILNAM+8,X'58' Set FT to Ascii "X" [9] 03413000 DOT5 TR FILNAM(18),ATOE NEED IT IN EBCDIC 03414000 MVC FILNAM+16(2),FM ADD DEFAULT FMODE 03415000 OVER LA R3,FILNAM Point to fn 03416000 OC FILNAM,=CL18' ' Uppercase filename 03417000 L R15,=A(VERLET) Verify letters of fn [9] 03418000 BALR R14,R15 [9] 03419000 TM LFLAGS,WARFL Doing fn collision? [18 start] 03420000 BNO OVER3 No just delete it 03421000 LR R6,R3 Char we'll change, if needed 03422000 LA R7,FILNAM+16 Where FM starts 03423000 OVER1 FSSTATE (R3),FORM=E Does it exist already? 03424000 LTR R15,R15 03425000 BNZ OVER4 No just go on 03426000 CR R6,R7 Any more chars to work with? 03427000 BE OVER2 No so fail 03428000 MVI 0(R6),C'$' Replace char with "$" 03429000 LA R6,1(R6) Bump pointer 03430000 B OVER1 And try again 03431000 OVER2 MVI ERRNUM,X'14' Unable to rename file 03432000 MVI STATE,C'A' So abort 03433000 B RLOOP 03434000 OVER3 FSERASE (R3) Erase in case exists 03435000 OVER4 FSOPEN (R3),FORM=E Open before ACK 03436000 C R15,=F'28' File should not be found 03437000 BE RENOK Worked OK 03438000 MVI ERRNUM,X'18' No - unable to create file 03439000 MVI STATE,C'A' So we die 03440000 B RLOOP [18 end] 03441000 RENOK L R15,=A(SPACK) 03442000 BALR R14,R15 SEND ACK 03443000 CLI STATE,C'A' 03444000 BE RABORT 03445000 MVC OLDTRY(4),NUMTRY KEEP NUMTRY FOR LATER 03446000 XC NUMTRY,NUMTRY RESET TO ZERO 03447000 L R3,SPKNUM 03448000 LA R3,1(R3) ADD ONE 03449000 ST R3,SPKNUM INCREMENT COUNTER 03450000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 03451000 MVI STATE,C'D' DATA RECEIVE STATE 03452000 XC OUTBFPT,OUTBFPT Init output buffer pointer [6] 03453000 B RLOOP 03454000 RNB CLI RTYPE,AB SEE IF IT'S A BREAK 03455000 BNE RNN MAYBE GOT A NAK 03456000 CLC RPKNUM,SPKNUM 03457000 BE RNUM4 03458000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03459000 B RNAK SEND A NAK 03460000 RNUM4 MVI STYPE,AY ACK PACKET 03461000 XC LSDAT,LSDAT NO DATA 03462000 L R15,=A(SPACK) 03463000 BALR R14,R15 03464000 CLI STATE,C'A' 03465000 BE RABORT 03466000 MVI STATE,C'C' COMPLETE STATE 03467000 CLI CXZ,X'00' Other side kill x-fer? [16] 03468000 BE RLOOP No end OK [16] 03469000 MVI STATE,C'A' Else remember error [16] 03470000 B RLOOP 03471000 RNN CLI RTYPE,AN SEE IF GOT A NAK 03472000 BNE RNELSE 03473000 RNAK MVI STYPE,AN SEND A NAK PACKET 03474000 XC LSDAT,LSDAT NO DATA 03475000 L R15,=A(SPACK) 03476000 BALR R14,R15 03477000 B RLOOP DO NOTHING ON A NAK 03478000 RNELSE MVI STATE,C'A' ABORT OTHERWISE 03479000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 03480000 BE RLOOP Yes just return [12] 03481000 MVI ERRNUM,X'07' ILLEGAL PACKET TYPE 03482000 B RLOOP 03483000 RDATA CLC NUMTRY,MAXTRY HAVE WE EXCEEDED OUR LIMIT? 03484000 BL ROK3 03485000 MVI STATE,C'A' ELSE, ABORT 03486000 B RLOOP 03487000 ROK3 L R4,NUMTRY 03488000 LA R4,1(R4) INCREMENT 03489000 ST R4,NUMTRY SAVE INCREMENTED COUNTER 03490000 L R15,=A(RPACK) 03491000 BALR R14,R15 CALL RPACK 03492000 CLI RTYPE,AE ERROR PACKET? 03493000 BNE RY3 MAYBE AN ACK 03494000 MVI ERRNUM,X'0A' MICRO DIED 03495000 MVI STATE,C'A' WE ABORT TOO 03496000 B RLOOP 03497000 RY3 CLI RTYPE,AD IS THIS A DATA PACKET? 03498000 BNE RDF MAYBE IT'S AN FNAME PACKET 03499000 CLC SPKNUM,RPKNUM CHECK FOR RIGHT PACKET 03500000 BNE DIF 03501000 L R15,=A(PTCHR) 03502000 BALR R14,R15 PUT CHARACTERS INTO FILE 03503000 LTR R15,R15 CHECK FOR NO ERROR [6] 03504000 BZ OKWR NO ERROR 03505000 MVI STATE,C'A' ABORT ON FILE SYSTEM ERROR 03506000 B RLOOP 03507000 OKWR MVI STYPE,AY ACK PACKET 03508000 XC LSDAT,LSDAT NO DATA 03509000 L R15,=A(SPACK) 03510000 BALR R14,R15 03511000 CLI STATE,C'A' 03512000 BE RABORT 03513000 MVC OLDTRY(4),NUMTRY SAVE NUMTRY'S VALUE IN OLDTRY 03514000 XC NUMTRY,NUMTRY RESET NUMTRY 03515000 L R3,SPKNUM 03516000 LA R3,1(R3) 03517000 ST R3,SPKNUM INCREMENT COUNTER 03518000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 03519000 B RLOOP 03520000 DIF CLC OLDTRY,MAXTRY CAN WE DO IT? 03521000 BL DIFNUM 03522000 MVI STATE,C'A' AND ABORT 03523000 B RLOOP 03524000 DIFNUM L R4,OLDTRY 03525000 LA R4,1(R4) 03526000 ST R4,OLDTRY INCREMENT THIS COUNTER 03527000 L R4,SPKNUM 03528000 BCTR R4,0 03529000 C R4,RPKNUM RPKNUM MUST EQUAL SPKNUM-1 03530000 BE DIFOK 03531000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03532000 B RDN1 SEND A NAK 03533000 DIFOK XC NUMTRY,NUMTRY RESET COUNTER TO ZERO 03534000 MVI STYPE,AY ACK PACKET 03535000 XC LSDAT,LSDAT NO DATA 03536000 ST R4,SPKNUM DECREMENT TO RESEND PACKET 03537000 L R15,=A(SPACK) 03538000 BALR R14,R15 SEND THE PACKET 03539000 CLI STATE,C'A' 03540000 BE RABORT 03541000 L R4,SPKNUM 03542000 LA R4,1(R4) ADD ONE 03543000 ST R4,SPKNUM RESTORE TO PROPER VALUE 03544000 B RLOOP AND RETURN 03545000 RDF CLI RTYPE,AF SENDING FILENAME AGAIN? 03546000 BNE RDZ 03547000 CLC OLDTRY,MAXTRY CAN WE DO IT? 03548000 BL FILOVER TRYING IT AGAIN 03549000 MVI STATE,C'A' IF NO, ABORT 03550000 B RLOOP 03551000 FILOVER L R4,OLDTRY 03552000 LA R4,1(R4) 03553000 ST R4,OLDTRY SAVE INCREMENTED VALUE 03554000 L R4,SPKNUM 03555000 BCTR R4,0 NEED VALUE OF N-1 03556000 C R4,RPKNUM SPKNUM-1 MUST EQUAL RPKNUM 03557000 BE FILOK 03558000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03559000 B RDN1 SEND A NAK 03560000 FILOK XC NUMTRY,NUMTRY RESET TO ZERO 03561000 XC LSDAT,LSDAT NO DATA 03562000 MVI STYPE,AY ACK PACKET AGAIN 03563000 ST R4,SPKNUM DECREMENT FOR NOW 03564000 L R15,=A(SPACK) 03565000 BALR R14,R15 03566000 CLI STATE,C'A' 03567000 BE RABORT 03568000 L R4,SPKNUM 03569000 LA R4,1(R4) ADD ONE 03570000 ST R4,SPKNUM RESTORE TO PROPER VALUE 03571000 B RLOOP AND RETURN 03572000 RDZ CLI RTYPE,AZ IS THIS AN EOF PACKET? 03573000 BNE RDN 03574000 CLC SPKNUM,RPKNUM ARE THEY EQUAL 03575000 BE RDOK 03576000 MVI ERRNUM,X'08' PREVIOUS PACKET MISSING 03577000 B RDN1 SEND A NAK 03578000 RDOK CLC LRDAT,ONE One piece of data [16] 03579000 BNE RDWR No go write out file [16] 03580000 LA R3,RDAT Point to data [16] 03581000 CLI 0(R3),AD "D" for discard [16] 03582000 BNE RDWR No write out file [16] 03583000 LA R3,FILNAM Else get filename [16] 03584000 FSCLOSE (R3) Close the file [16] 03585000 FSERASE (R3) And delete file [16] 03586000 MVI ERRNUM,X'17' Receive cancelled [16] 03587000 MVI CXZ,X'FF' Remember that [16] 03588000 B RDXX Pick up later on [16] 03589000 * If data left in buffer when get EOF packet, write remaining 03590000 * data out to the file. [1] 03591000 RDWR CLC OUTBFPT,ZERO HOW MUCH DATA LEFT [1] 03592000 BE BUFMT NONE LEFT, SEND ACK [1] 03593000 L R9,OUTBFPT NUMBER OF CHARS IN BUFFER [1] 03594000 L R15,=A(OUTBUF) WRITE OUT BUFFER [1] [6] 03595000 BALR R14,R15 GO TO IT [1] 03596000 LTR R15,R15 CHECK RETCODE [1] 03597000 BZ BUFMT WORKED OK [1] 03598000 MVI STATE,C'A' FILE SYSTEM ERROR [1] 03599000 B RLOOP SO DIE [1] 03600000 BUFMT LA R3,FILNAM 03601000 FSCLOSE (R3) 03602000 RDXX MVI STYPE,AY ACK THE PACKET [1] 03603000 XC LSDAT,LSDAT NO DATA 03604000 L R15,=A(SPACK) 03605000 BALR R14,R15 03606000 MVC OLDTRY(4),NUMTRY SAVE NUMTRY'S VALUE HERE 03607000 XC NUMTRY,NUMTRY AND RESET COUNTER 03608000 L R3,SPKNUM 03609000 LA R3,1(R3) 03610000 ST R3,SPKNUM STORE VALUE INCREMENTED BY 1 03611000 NC SPKNUM(4),=X'0000003F' MASK TO GET MOD 64 03612000 MVI STATE,C'F' TRY FOR ANOTHER FILE 03613000 NI FLAGS,X'FF'-FLG2 Only change first file [9] 03614000 B RLOOP 03615000 RDN CLI RTYPE,AN DO WE NEED TO SEND A NAK? 03616000 BNE RDELSE 03617000 RDN1 MVI STYPE,AN SEND A NAK 03618000 XC LSDAT,LSDAT NO DATA 03619000 L R15,=A(SPACK) 03620000 BALR R14,R15 03621000 B RLOOP 03622000 RDELSE MVI STATE,C'A' UNRECOGNIZED PACKET - ABORT 03623000 CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 03624000 BE RLOOP Yes just return [12] 03625000 MVI ERRNUM,X'07' ILLEGAL PACKET TYPE 03626000 B RLOOP 03627000 SAYNO MVI STYPE,AN SEND A NAK PACKET 03628000 XC LSDAT,LSDAT NO DATA 03629000 MVI ERRNUM,X'0B' ILLEGAL FILENAME ERROR 03630000 L R15,=A(SPACK) 03631000 BALR R14,R15 03632000 B RLOOP 03633000 * 03634000 RABORT LA R3,FILNAM 03635000 FSCLOSE (R3) CLOSE OPEN FILE 03636000 CLI ERRNUM,X'0A' DID THE MICRO DIE? 03637000 BE RNOERRP NO ERROR PACKET IF SO 03638000 CLI ERRNUM,X'17' Other side cancel receive [16] 03639000 BE RNOERRP Yes no error packet [16] 03640000 * At least try to send an error packet. 03641000 * CLI ERRNUM,S1ERRNUM Was it a S/1 I/O error [12] 03642000 * BE RNOERRP Yes just return [12] 03643000 L R15,=A(ERRPACK) Send error packet [13] 03644000 BALR R14,R15 Error number in ERRNUM [13] 03645000 RNOERRP LA R15,4 SET A NON-ZERO RETCODE 03646000 B RECRET PREPARE TO LEAVE 03647000 RCOMP SR R15,R15 RETCODE OF ZERO 03648000 RECRET TM S1FLAGS,ISS1 Is console a S/1? [12] 03649000 BZ RECRET2 No skip reset [12] 03650000 TM LFLAGS,SERVON In server mode? [13] 03651000 BO RECRET2 Yes don't reset yet [13] 03652000 LR R2,R15 Save retcode [12] 03653000 SR R1,R1 Clear interrupt trapping [12] 03654000 L R15,=A(INTRINI) [12] 03655000 BALR R14,R15 [12] 03656000 LR R15,R2 Restore retcode [12] 03657000 RECRET2 L R13,4(R13) 03658000 L R14,12(R13) 03659000 LM R0,R12,20(R13) 03660000 BR 14 03661000 RECSAVE DS 18F 03662000 GETFN MVC FILNAM(0),0(R8) Pick up FNAME [22] 03663000 GETFT MVC FILNAM+8(0),0(R5) PICK UP FTYPE 03664000 LTORG 03665000 DROP R11 03666000 DROP R12 DON'T NEED THEM ANYMORE 03667000 EJECT 03668000 * 03669000 * Write data out to a file. [6] 03670000 PTCHR CSECT 03671000 STM R14,R12,12(R13) Do standard linkage 03672000 BALR R12,0 03673000 USING *,R12 03674000 LA R14,PTSAV 03675000 ST R13,4(R14) 03676000 ST R14,8(R13) 03677000 LR R13,R14 03678000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 03679000 L R11,=A(PARMS) 03680000 USING PARMS,R11 03681000 L R2,=A(OUTBUF) Routine to call to [22] 03682000 ST R2,MORDEC dump decoded data [22] 03683000 L R5,LRDAT Amount of input data 03684000 L R15,=A(DECODE) 03685000 BALR R14,R15 03686000 L R13,4(R13) 03687000 L R14,12(R13) 03688000 LM R0,R12,20(R13) Don't change retcode in R15 03689000 BR R14 03690000 PTSAV DS 18F 03691000 LTORG 03692000 DROP R11 03693000 DROP R12 DON'T NEED THEM ANYMORE 03694000 EJECT 03695000 * 03696000 * Expects R5 to contain size of input data. Other registers used: 03697000 * R4 - quote character, R8 - input buffer pointer, R9 - output 03698000 * buffer pointer (get value from OUTBFPT). Expects input to be in 03699000 * buffer RDAT and write out to buffer whose address in in ARBUF. [6] 03700000 DECODE CSECT 03701000 STM R14,R12,12(R13) Do standard linkage 03702000 BALR R12,0 03703000 USING *,R12 03704000 LA R14,DECSAV 03705000 ST R13,4(R14) 03706000 ST R14,8(R13) 03707000 LR R13,R14 03708000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 03709000 L R11,=A(PARMS) 03710000 USING PARMS,R11 03711000 SR R4,R4 Use to hold quote char 03712000 IC R4,SQUOTE 03713000 SR R8,R8 Input buffer pointer 03714000 L R9,OUTBFPT Output buffer pointer 03715000 DECOD0 MVI RPTCT,X'00' Reset each time [7] 03716000 MVI RPTVAL,X'00' Ditto [7] 03717000 SR R7,R7 Use to pick up char 03718000 LTR R5,R5 Any more data left? 03719000 BNZ DECOD1 Leave if all done 03720000 ST R9,OUTBFPT Save place in output buffer 03721000 SR R15,R15 OK return code 03722000 B DECOD8 And return to caller 03723000 DECOD1 C R9,MAXOUT Below max limit [2] 03724000 BNL DECOD7 No, write it out 03725000 CLI RPTCT,X'00' Doing a repeat [7] 03726000 BE DECOD11 No so get a char [7] 03727000 XC PAR,PAR Clear the parity flag [7] 03728000 IC R7,RPTVAL Get char we're repeating [7] 03729000 TM FLAGS,BINF In binary mode? [25] 03729100 BO DECOD6 Yes no check for eol [25] 03729200 CLI RPTVAL,ACR Ascii CR [25] 03729300 BE DECOD7 Yes, write another record [25] 03729400 CLI RPTVAL,ALF Ascii LF [25] 03729500 BE DECOD7 Yes, write another record [25] 03729600 B DECOD6 Write out to file [7] 03730000 DECOD11 BCTR R5,0 Decrement char counter 03731000 IC R7,RDAT(R8) Pick up a character 03732000 XC PAR,PAR Assume hi bit=0 [1 start] 03733000 CLI RPTQ,X'00' Doing repeat quoting [7] 03734000 BE DECOD12 No so skip next part [7] 03735000 CLM R7,B'0001',RPTQ Picked up repeat quote char? [7] 03736000 BNE DECOD12 No continue processing [7] 03737000 LA R8,1(R8) Bump input pointer [7] 03738000 BCTR R5,0 Modify buffer count [7] 03739000 SR R7,R7 Zero it out [7] 03740000 IC R7,RDAT(R8) Pick up the size [7] 03741000 S R7,=F'32' Was made printable [7] 03742000 STC R7,RPTCT Remember no. of repetitions [7] 03743000 LA R8,1(R8) Bump input pointer [7] 03744000 BCTR R5,0 Modify buffer count [7] 03745000 IC R7,RDAT(R8) Pick up repeated char [7] 03746000 DECOD12 CLI EBQUOT,AN Are we doing 8-bit quoting? 03747000 BE DECOD2 Nope 03748000 CLI EBQUOT,AY Can we do it but aren't? 03749000 BE DECOD2 Yes - so just forget it 03750000 CLM R7,B'0001',EBQUOT Did we get 8-bit quote char? 03751000 BNE DECOD2 No - continue as usual 03752000 BCTR R5,0 Decrement no. of chars left 03753000 LA R8,1(R8) Bump input pointer 03754000 IC R7,RDAT(R8) Get quoted char 03755000 MVI PAR+3,X'80' Set hi order bit on [1 end] 03756000 DECOD2 CR R7,R4 Is it the quote character? 03757000 BNE DECOD6 No it's a regular char 03758000 BCTR R5,0 Else decrement char count 03759000 LA R8,1(R8) Bump input pointer 03760000 IC R7,RDAT(R8) Pick up special char 03761000 CLC PAR,ZERO If PAR <> 0 don't check [1] 03762000 BNE DECOD4 For CR/LF (it's 8A,8D) [1] 03763000 TM FLAGS,BINF No check if binary mode [1] 03764000 BO DECOD4 Just skip it [1] 03765000 C R7,=X'0000004D' Is it a CR? (CHAR(CR)) 03766000 BNE DECOD3 No, check for LF 03767000 MVI PREV,X'4D' Yes, remember we saw a CR 03768000 LA R8,1(R8) Bump input pointer 03769000 MVI RPTVAL,ACR Set in case of repeats [25] 03769100 B DECOD7 Write out record 03770000 DECOD3 C R7,=X'0000004A' Should we write out on LF? 03771000 BNE DECOD4 No keep going 03772000 LA R8,1(R8) Bump input pointer 03773000 CLI PREV,X'4D' Was last char CR? 03774000 BE DECOD0 Yes, so ignore LF 03775000 MVI RPTVAL,ALF Set in case of repeats [25] 03775100 B DECOD7 Nope, so write out record 03776000 DECOD4 CR R7,R4 Is it the quote char 03777000 BE DECOD6 Don't convert if yes 03778000 CLI EBQUOT,AN Doing 8-bit quoting [1 start] 03779000 BE DECOD5 No don't check for quote char 03780000 CLI EBQUOT,AY Can do it but aren't? 03781000 BE DECOD5 Yup-don't check for quote char 03782000 CLM R7,B'0001',EBQUOT Is char the 8-bit quote char? 03783000 BE DECOD6 Yes - so don't convert 03784000 CLI RPTQ,X'00' Doing repeat counts 03785000 BE DECOD5 No check for quote char [7] 03786000 CLM R7,B'0001',RPTQ Is it the repeat quote char [7] 03787000 BE DECOD6 Yes, don't convert [7] 03788000 DECOD5 A R7,O1H Else add ^O100 03789000 N R7,=X'0000007F' Get modulo ^O200 03790000 DECOD6 O R7,PAR OR in the parity bit [1] 03791000 L R1,ARBUF Output buffer address [2] 03792000 AR R1,R9 Plus displacement [2] 03793000 STC R7,0(R1) Store char in buffer [2] 03794000 LA R9,1(R9) Bump output buffer pointer 03795000 LA R8,1(R8) Bump input buffer pointer 03796000 MVI PREV,X'00' Reset 03797000 SR R3,R3 Clear out for subtract [7] 03798000 IC R3,RPTCT Get no. of repetitions [7] 03799000 BCTR R3,0 Decrement repeat count [7] 03800000 LTR R3,R3 More repeats to do [7] 03801000 BNP DECOD0 Not positive, get new char [7] 03802000 STC R3,RPTCT Save modified count [7] 03803000 BCTR R8,0 Re-adjust input buf pointer [7] 03804000 STC R7,RPTVAL Remember repeated char [7] 03805000 B DECOD1 And write it out again [7] 03806000 *DECOD7 L R15,=A(OUTBUF) Routine to write out record [22] 03807000 DECOD7 L R15,MORDEC Routine to write out record [22] 03808000 BALR R14,R15 03809000 LTR R15,R15 Check the return code 03810000 BNZ DECOD8 Return if failed 03811000 XC OUTBFPT,OUTBFPT Reset output buffer pointer 03812000 SR R9,R9 Reset output buffer pointer 03813000 SR R3,R3 Clear out for subtract [7] 03814000 IC R3,RPTCT Get no. of repetitions [7] 03815000 CLI RPTVAL,ACR Ended with CR or LF? [25] 03815100 BE DECOD71 Yes do something else [25] 03815200 CLI RPTVAL,ALF Or did we end 'cause [25] 03815300 BE DECOD71 hit max lrecl [25] 03815400 LTR R3,R3 More repeats to do [7] 03816000 BP DECOD1 03817000 B DECOD0 And get more input 03818000 DECOD71 BCTR R3,0 One down [25] 03818100 LTR R3,R3 Any more to go? [25] 03818200 BNP DECOD0 No, all done [25] 03818300 STC R3,RPTCT Remember new count [25] 03818400 B DECOD1 And get new char [25] 03818500 DECOD8 L R13,4(R13) 03819000 L R14,12(R13) 03820000 LM R0,R12,20(R13) Don't change retcode in R15 03821000 BR R14 03822000 NULDMP BR R14 Null routine [22] 03823000 DECSAV DS 18F 03824000 LTORG 03825000 DROP R11 03826000 DROP R12 DON'T NEED THEM ANYMORE 03827000 EJECT 03828000 * 03829000 * Write out a buffer full of data. Expects R9 to contain the number 03830000 * of characters in the record. [6] 03831000 OUTBUF CSECT 03832000 STM R14,R12,12(R13) Do standard linkage 03833000 BALR R12,0 03834000 USING *,R12 03835000 LA R14,OUTSAV 03836000 ST R13,4(R14) 03837000 ST R14,8(R13) 03838000 LR R13,R14 03839000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 03840000 L R11,=A(PARMS) 03841000 USING PARMS,R11 03842000 L R6,LRECL Use to hold lrecl [2] 03843000 LTR R10,R9 Any data or bare CR? 03844000 BNZ OUTBF0 Yes, there's data 03845000 L R1,ARBUF Else, get addr of buffer [2] 03846000 MVI 0(R1),X'20' Make first char a space [2] 03847000 LA R10,1(R10) Length of one (fake blank line) 03848000 OUTBF0 TM FLAGS,BINF Binary data file? [1] 03849000 BO OUTBF3 If so skip translation [1] 03850000 LR R7,R10 Save size in R7 [2] 03851000 LR R1,R10 Here too [2] 03852000 L R3,ARBUF Where translating starts [2] 03853000 OUTBF1 BCTR R1,0 Subtract 1 for EX command 03854000 C R1,=F'255' Max for TRANSLATE is 256 [2] 03855000 BL OUTBF2 If is under max then is OK [2] 03856000 LA R1,255 Else, set to max [2] 03857000 OUTBF2 EX R1,TRNS EBCDIC to ASCII translation 03858000 C R7,=F'256' Chars left to translate? [2] 03859000 BNH OUTBF3 Nope, we're done [2] 03860000 LA R3,256(R3) X-late next group of chars [2] 03861000 S R7,=F'256' Decr chars left to x-late [2] 03862000 LR R1,R7 No. of chars left to x-LATE [2] 03863000 B OUTBF1 Translate some more [2] 03864000 OUTBF3 LA R3,FILNAM 03865000 CLI RFM,C'V' Is it variable format? 03866000 BE OUTBF5 Yes so leave data as is 03867000 CR R10,R6 If fixed, cannot exceed lrecl 03868000 BH OUTBF4 Ignore data after lrecl value 03869000 BE OUTBF5 Nope, it's just right 03870000 LR R2,R6 Else, get lrecl size 03871000 SR R2,R10 Pad with this many spaces 03872000 L R0,ARBUF Start of buffer [2] 03873000 AR R0,R10 Where to start padding [2] 03874000 LR R1,R2 Amount to pad by [2] 03875000 L R15,=X'00000040' Pad with spaces [2] 03876000 TM FLAGS,BINF In binary mode [1] 03877000 BNO OUTBF31 No so just pad [1] 03878000 SR R15,R15 Pad with nulls [1] 03879000 OUTBF31 MVCL R0,R14 Do it [2] 03880000 OUTBF4 LR R10,R6 Length has to be this size 03881000 OUTBF5 SR R6,R6 03882000 IC R6,RFM RECFM has to be in a register 03883000 L R7,ARBUF Addr of data buffer [2] 03884000 FSWRITE (R3),BUFFER=(R7),BSIZE=(R10),RECFM=(R6),FORM=E [2] 03885000 LTR R7,R15 Check retcode 03886000 BZ OUTBF7 Is OK so get next record 03887000 L R15,=F'-1' Bad retcode 03888000 C R7,=A(ERCOD) Is the disk read-only? 03889000 BNE OUTBF6 No check different error 03890000 MVI ERRNUM,X'0E' Yes, set error type 03891000 B OUTBF7 03892000 OUTBF6 MVI ERRNUM,X'0F' Assume a RECFM conflict 03893000 C R7,=F'16' File exists w/dif RECFM 03894000 BE OUTBF7 03895000 MVI ERRNUM,X'06' Maybe disk full error 03896000 C R7,=F'13' Yup that's it 03897000 BE OUTBF7 03898000 MVI ERRNUM,X'19' General write error 03899000 OUTBF7 L R13,4(R13) 03900000 L R14,12(R13) 03901000 LM R0,R12,20(R13) Don't change retcode in R15 03902000 BR R14 03903000 OUTSAV DS 18F 03904000 TRNS TR 0(0,R3),ATOE BACK FROM ASCII TO EBCDIC 03905000 LTORG 03906000 DROP R11 03907000 DROP R12 DON'T NEED THEM ANYMORE 03908000 * 03909000 * Send error packet. Error number is in variable errnum. [13] 03910000 ERRPACK CSECT 03911000 STM R14,R12,12(R13) Do standard linkage 03912000 BALR R12,0 03913000 USING *,R12 03914000 LA R14,ERPSAV 03915000 ST R13,4(R14) 03916000 ST R14,8(R13) 03917000 LR R13,R14 03918000 * USE R11 AS BASE REGISTER FOR THE SHARED DATA AREA 03919000 L R11,=A(PARMS) 03920000 USING PARMS,R11 03921000 MVI STYPE,AE Error packet 03922000 MVC LSDAT(4),=F'20' All msgs are this long 03923000 MVC SPKNUM(4),RPKNUM Synch packet numbers 03924000 SR R5,R5 03925000 IC R5,ERRNUM Get right message number 03926000 M R4,=F'20' Offset := ERRNUM * 20 03927000 LA R5,ERRTAB(R5) 03928000 MVC SDAT(20),0(R5) Put data here 03929000 TR SDAT(20),ETOA 03930000 L R15,=A(SPACK) 03931000 BALR R14,R15 Send error packet 03932000 L R13,4(R13) 03933000 L R14,12(R13) 03934000 LM R0,R12,20(R13) Don't change retcode in R15 03935000 BR R14 03936000 ERPSAV DS 18F 03937000 LTORG 03938000 DROP R11 03939000 DROP R12 DON'T NEED THEM ANYMORE 03940000 * 03941000 * Handle screen I/O if going via Series/1 [12 start] 03942000 SCRNIO CSECT 03943000 USING SCRNIO,R15 establish addressability 03944000 STM R0,R14,SCRNSAV save caller's reg 03945000 LR R12,R15 switch base reg 03946000 DROP R15 03947000 USING SCRNIO,R12 03948000 L R11,=A(PARMS) point to data area 03949000 USING PARMS,R11 03950000 LH R2,CONSADDR get console addr 03951000 CLRSTAT EQU * 03952000 TIO 0(R2) any previous business? 03953000 BC 6,CLRSTAT busy: loop 03954000 BC 1,SCRNERR not operational: error 03955000 DODIAG EQU * 03956000 DIAG R1,R2,X'0058' start I/O via diagnose 03957000 BC 8,WAITCOMP ok: wait for completion 03958000 BC 2,DODIAG busy: try again 03959000 B SCRNERR CSW stored or error 03960000 WAITCOMP EQU * 03961000 WAITD CON1 wait for I/O to complete 03962000 CLI CONSCHAN,X'00' did an error occur? 03963000 BNE SCRNERR yes: skip 03964000 CLI CONSUNIT,CHEND just a channel end? 03965000 BE WAITCOMP yes: wait for device end 03966000 CLI CONSUNIT,CPBRK did CP break in? 03967000 BE SCRNERR yes: we're stuck now 03968000 LH R15,CONSBYTC get I/O byte count 03969000 CLI CONSUNIT,DEVEND is it a device end? 03970000 BE SCRNRET yes: return okay 03971000 CLI CONSUNIT,CHEND+DEVEND chan end & dev end? 03972000 BE SCRNRET yes: return okay 03973000 CLI CONSUNIT,ATTN attention? 03974000 BE SCRNRET yes: return okay 03975000 SCRNERR EQU * some type of err occurred 03976000 MVC ERRCSW,CONSCSW copy CSW in error 03977000 SR R15,R15 return error code of -1 03978000 BCTR R15,0 03979000 SCRNRET EQU * 03980000 LM R0,R14,SCRNSAV restore caller's regs 03981000 BR R14 return to caller 03982000 * 03983000 SCRNSAV DS 15F reg save area 03984000 * 03985000 LTORG 03986000 DROP R12 03987000 DROP R11 [12 end] 03988000 * [12 start] 03989000 * If R1 is non-zero, get values user has set for MSG, WNG and IMSG 03990000 * and then set them off for the duration of the program. If R1 is 03991000 * zero, then reset to the values the user originally had. 03992000 SETMSGS CSECT 03993000 USING SETMSGS,R15 03994000 STM R0,R14,MSGSAV save caller's regs 03995000 LR R12,R15 switch addressability 03996000 DROP R15 03997000 USING SETMSGS,R12 03998000 L R11,=A(PARMS) point to data area 03999000 USING PARMS,R11 04000000 LTR R1,R1 Setting or clearing 04001000 BZ SETM5 Go to clearing 04002000 LA R2,QSET point to CP QUERY command 04003000 LA R4,L'QSET get length of command 04004000 ICM R4,B'1000',=X'40' flag we want resp in buff 04005000 LA R3,QSBUF Put response here 04006000 LA R5,L'QSBUF its long enough for what we 04007000 DIAG R2,R4,X'0008' need here 04008000 LR R1,R5 get length of response and 04009000 LA R2,QSBUF addr of response 04010000 BZ SETM0 skip if response fit in buf 04011000 LA R1,L'QSBUF else get length of buffer 04012000 SR R1,R5 and subt num overflow 04013000 SETM0 LA R3,MSG3 get len-1,chars of token 04014000 BAL R10,GETSET we're looking for 04015000 CLC CON,0(R4) is following one "ON"? 04016000 BNE SETM1 no: skip 04017000 OI LFLAGS,FMSGON yes: flag SET MSG ON 04018000 SETM1 LA R3,WNG3 get len-1,chats of token 04019000 BAL R10,GETSET we're looking for 04020000 CLC CON,0(R4) is following one "ON"? 04021000 BNE SETM2 no: skip 04022000 OI LFLAGS,FWNGON yes: flag SET WNG ON 04023000 SETM2 LA R3,IMSG4 get len-1,chars of token 04024000 BAL R10,GETSET we're looking for 04025000 CLC CON,0(R4) is following one "ON"? 04026000 BNE SETM3 no: skip 04027000 OI LFLAGS,FIMSGON yes: flag SET IMSG ON 04028000 SETM3 LA R2,MSGOFF Turn off MSG's 04029000 LA R4,L'MSGOFF via diagnose X'08' 04030000 DIAG R2,R4,X'0008' 04031000 LA R2,WNGOFF Ditto for WNG's 04032000 LA R4,L'WNGOFF 04033000 DIAG R2,R4,X'0008' 04034000 LA R2,IMSGOFF Ditto for IMSG's 04035000 LA R4,L'IMSGOFF 04036000 DIAG R2,R4,X'0008' 04037000 SETM4 LM R0,R12,MSGSAV restore caller's regs 04038000 BR R14 return 04039000 * 04040000 SETM5 TM LFLAGS,FMSGON was CP SET MSG ON? 04041000 BZ SETM6 no: skip 04042000 LA R2,MSGON yes: turn it ON via 04043000 LA R4,L'MSGON diagnose X'08' 04044000 DIAG R2,R4,X'0008' 04045000 SETM6 TM LFLAGS,FWNGON was CP SET WNG ON? 04046000 BZ SETM7 no: skip 04047000 LA R2,WNGON yes: turn it ON via 04048000 LA R4,L'WNGON diagnose X'08' 04049000 DIAG R2,R4,X'0008' 04050000 SETM7 TM LFLAGS,FIMSGON was CP SET IMSG ON? 04051000 BZ SETM4 no: done 04052000 LA R2,IMSGON yes: turn it ON via 04053000 LA R4,L'IMSGON diagnose X'08' 04054000 DIAG R2,R4,X'0008' 04055000 B SETM4 And return 04056000 * 04057000 * Parse the "CP Q SET" response string: 04058000 * On entry: R1 = remaining length of resp 04059000 * R2 = addr of next char in resp 04060000 * R3 = ptr to 04061000 * On exit: R1 = remaining length of resp 04062000 * R2 = addr of char past sub-resp string 04063000 * R4 = addr of token AFTER find (ON|OFF|...) 04064000 GETSET EQU * 04065000 BAL R9,SKPWHITE scan over white space 04066000 SR R4,R4 clear for char load 04067000 IC R4,0(,R3) get len-1 of target 04068000 EX R4,VARLCLC is it right one? 04069000 BE GETSETF yes: skip 04070000 BAL R9,SKP2EOS no: skip past sub-resp 04071000 B GETSET string and loop 04072000 GETSETF EQU * 04073000 LA R2,1(R4,R2) scan past matched token 04074000 BAL R9,SKPWHITE scan past white space 04075000 LA R4,0(,R2) ret addr of next token 04076000 BAL R9,SKP2EOS but bump ptr past end of 04077000 BR R10 sub-resp string 04078000 SKPWHITE EQU * 04079000 CLI 0(R2),C' ' is it a blank? 04080000 BE SKPWNXT yes: scan over it 04081000 CLI 0(R2),X'15' is it a NewLine? 04082000 BNER R9 no - at token: return 04083000 SKPWNXT EQU * 04084000 LA R2,1(,R2) bump ptr to next char 04085000 BCT R1,SKPWHITE decr count and loop 04086000 LA R4,=X'FF' none left: ret ptr to 04087000 BR R10 unmatchable string 04088000 SKP2EOS EQU * 04089000 CLI 0(R2),C',' is it a comma? 04090000 BE SKP2EOSB yes: skip 04091000 CLI 0(R2),X'15' is it a NewLine? 04092000 BE SKP2EOSB yes: skip 04093000 LA R2,1(,R2) no: scan over char 04094000 BCT R1,SKP2EOS decr count and loop 04095000 LA R4,=X'FF' none left: ret ptr to 04096000 BR R10 unmatchable string 04097000 SKP2EOSB EQU * reached end of sub-resp 04098000 LA R2,1(,R2) point 1 past sub-resp 04099000 BCTR R1,R9 decr count and return 04100000 LA R4,=X'FF' none left: ret ptr to 04101000 BR R10 unmatchable string 04102000 * 04103000 VARLCLC CLC 0(*-*,R2),1(R3) 04104000 * 04105000 MSGSAV DS 15F save caller's regs here 04106000 QSET DC C'QUERY SET' CP QUERY SET command 04107000 CON DC C'ON' check is SET xxx is "ON" 04108000 MSG3 DC AL1(3-1),C'MSG' len-1, token name 04109000 WNG3 DC AL1(3-1),C'WNG' ditto 04110000 IMSG4 DC AL1(4-1),C'IMSG' ditto 04111000 MSGOFF DC C'SET MSG OFF' CP commands to alter 04112000 MSGON DC C'SET MSG ON' SET MSG value 04113000 WNGOFF DC C'SET WNG OFF' 04114000 WNGON DC C'SET WNG ON' 04115000 IMSGOFF DC C'SET IMSG OFF' 04116000 IMSGON DC C'SET IMSG ON' 04117000 LTORG 04118000 DROP R11 04119000 DROP R12 04120000 EJECT [12 end] 04121000 * 04122000 * Initialize for going via Series/1. [12 start] 04123000 INTRINI CSECT 04124000 USING INTRINI,R15 establish addressability 04125000 STM R0,R14,INTRSAV save caller's regs 04126000 LR R12,R15 04127000 DROP R15 04128000 USING INTRINI,R12 04129000 L R11,=A(PARMS) get base for data area 04130000 USING PARMS,R11 04131000 LTR R1,R1 anything in R1? 04132000 BZ INTRCLR no: do clean up 04133000 TM S1FLAGS,S1INIT Initialized already? [13] 04134000 BO INTRRET Yes just leave [13] 04135000 OI S1FLAGS,S1INIT Else init and flag as done [13] 04136000 XC CONSCSW,CONSCSW clear any previous data 04137000 SR R2,R2 and any prev byte count 04138000 BCTR R2,0 (set len to -1) 04139000 ST R2,S1RDBYTC 04140000 WAITT Clear screen so don't get put 04141000 SR R0,R0 04142000 LH R0,CONSADDR Get console address 04143000 N 0,=F'255' 04144000 LA 1,CLRCCW into "HOLDING" on first I/O 04145000 DIAG 1,0,X'58' if there are any CP msgs on 04146000 WAITT the screen 04147000 HNDINT SET,(CON1,CHNDLR,009,WAIT) 04148000 LA R1,CLRRDY This I/O puts the screen 04149000 TM LFLAGS,SERVON into MORE or HOLDING 04150000 BNO INTX0 with a ready or server 04151000 LA R1,CLRSRV message 04152000 INTX0 L R15,=A(SCRNIO) 04153000 BALR R14,R15 04154000 B INTRRET 04155000 INTRCLR EQU * 04156000 HNDINT CLR,(CON1) 04157000 NI S1FLAGS,X'FF'-S1INIT Turn off flag [13] 04158000 INTRRET EQU * 04159000 LM R0,R14,INTRSAV restore caller's regs 04160000 BR R14 return to caller 04161000 DS 0D CCW's to clear screen 04162000 CLRRDY DC X'29',AL3(RDYMSG),AL1(SLI),X'80',AL2(LRDYMSG) 04163000 RDYMSG DC AL1(X'C0'+ALARM),AL1(SBA),X'4040' 04164000 DC C'Ready for file transfer...' 04165000 LRDYMSG EQU *-RDYMSG 04166000 DS 0D CCW's to clear screen 04167000 CLRSRV DC X'29',AL3(SRVMSG),AL1(SLI),X'80',AL2(LSRVMSG) 04168000 SRVMSG DC AL1(X'C0'+ALARM),AL1(SBA),X'4040' 04169000 DC C'Entering server mode .....' 04170000 LSRVMSG EQU *-SRVMSG 04171000 DS 0D 04172000 CLRCCW DC X'19',AL3(0),X'20',X'FF',AL2(1) 04173000 INTRSAV DS 15F reg save area 04174000 DROP R11 04175000 DROP R12 04176000 * 04177000 * Console interrupt routine: 04178000 CHNDLR DS 0H 04179000 USING CHNDLR,R15 estab address. 04180000 STM R10,R12,CHNDSAV save only reg's we need to 04181000 LR R12,R15 04182000 DROP R15 04183000 USING CHNDLR,R12 04184000 L R11,=A(PARMS) point to data area 04185000 USING PARMS,R11 04186000 STM R2,R3,CONSCSW save CSW from interrupt 04187000 LA R2,0(,R2) display CCW addr in PER 04188000 SRL R3,16 isolate unit & chan status 04189000 LA R3,0(,R3) so they show up in PER 04190000 SR R15,R15 R15=0-> intrpt proc complete 04191000 CLI CONSUNIT,CHEND was it only a channel end? 04192000 BNE CHNDRET no: exit 04193000 LA R15,1 yes: flag we expect another 04194000 CHNDRET EQU * 04195000 LM R10,R12,CHNDSAV restore reg's 04196000 BR R14 return to CMS intrpt handler 04197000 CHNDSAV DS 3F reg save area 04198000 LTORG 04199000 DROP R12 04200000 DROP R11 [12 end] 04201000 END KERMIT 04202000