home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
archives
/
ckccompass.zip
/
cybker.asm
next >
Wrap
Assembly Source File
|
1988-08-16
|
138KB
|
3,782 lines
IDENT KERMIT,XSTORE,KERMIT
ABS
ENTRY KERMIT
TITLE KERMIT -- FILE TRANSFER UTILITY
SYSCOM B1
OPL XTEXT COMCMAC
OPL XTEXT COMCCMD
KERMIT SPACE 4,10
***** SUMMARY
*
* CYBER KERMIT IS A PROGRAM TO TRANSFER FILES TO AND FROM A MACHINE
* RUNNING NOS, USING THE KERMIT FILE TRANSFER PROTOCOL AS DEFINED AT
* COLUMBIA UNIVERSITY.
KERMIT SPACE 4,10
*** REVISION HISTORY
*
* WRITTEN BY A. V. LE BLANC, UMRCC, FEB. 1986
*
* COPYRIGHT, UNIVERSITY OF MANCHESTER.
*
* THIS PROGRAM IS AVAILABLE TO ANYONE; ANYONE MAY COPY OR DISTRIBUTE
* IT, PROVIDED THERE IS NO CHARGE EXCEPT MEDIUM AND SHIPPING COSTS.
EXTERN SPACE 4,10
*** EXTERNAL INTERFACE
*
* CONTROL CARD FORMAT: KERMIT
*
* ANY PARAMETERS ARE IGNORED.
EXTERN SPACE 4,10
*** DAYFILE MESSAGES
*
* OCCASION: ERROR MESSAGE:
*
* INPUT IS MASS STORAGE INPUT AND OUTPUT MUST BE TERMINAL FILES
* OUTPUT IS MASS STORAGE INPUT AND OUTPUT MUST BE TERMINAL FILES
* ZZZKHLP NOT ASSIGNED FILE ZZZKHLP IS MISSING
* ZZZKDAT DOES NOT CONTAIN
* EXACTLY 12 WORDS FILE ZZZKDAT IS CORRUPT
CONSTANT SPACE 4,10
**** ASSEMBLY CONSTANTS
*
PARIT EQU 2 PARITY: 0 = ZERO, 1 = ODD, 2 = EVEN
TBUFL EQU 301B BUFFER LENGTH FOR TERMINAL FILES
WBUFL EQU 501B BUFFER LENGTH FOR MASS STORAGE FILES
LBUFL EQU 301B BUFFER LENGTH FOR LOG FILE
DEFPLEN EQU 94 DEFAULT PACKET LENGTH TO REQUEST
DEFESCA EQU 3 DEFAULT (ASCII CODE) LOCAL ESCAPE CHAR
DEFTIME EQU 20 DEFAULT TIMEOUT TO REQUEST IN SECONDS
DEFRETR EQU 5 DEFAULT RETRIES ALLOWED PER PACKET
****
DESIGN SPACE 4,10
** THE DESIGN OF CYBER KERMIT
*
* CYBER KERMIT WAS DESIGNED BY THE METHOD OF ABSTRACTION FROM DETAIL.
* AT MOST TIMES WHEN THIS PROGRAM IS RUNNING, DATA PASSES IN A STREAM
* FROM A PRODUCER OF SOME KIND TO A CONSUMER OF SOME KIND. GENERALLY
* THE PRODUCER MAKES USE OF REGISTERS B2, B3, B4, AND X3, WHILE THE
* CONSUMER USES REGISTERS B5, B6, B7, AND X7. REGISTER X5 IS COMMON
* TO BOTH HALVES OF THIS PROCESS, BEING THE PLACE DATA IS TRANSFERRED
* FROM THE PRODUCER TO THE CONSUMER. BOTH CONSUMPTION AND PRODUCTION
* CONTAIN SEVERAL LAYERS OF SUBROUTINES, EACH DESIGNED TO HIDE SOME
* UNSIGHTLY DETAILS FROM THE HIGHER LEVELS.
*
* THIS PROGRAM TOOK TWO WEEKS TO WRITE AND DEBUG, AND ANOTHER WEEK TO
* DOCUMENT AND ANNOTATE. OBVIOUSLY IN SUCH A SHORT PERIOD OF TIME I
* WAS MUCH LESS CONCERNED WITH GARNISH AND TRIMMINGS, AND VERY LITTLE
* INTERESTED IN POTENTIAL USERS OF CYBER KERMIT OUTSIDE MANCHESTER.
* NEVERTHELESS, I HOPE SOME OTHER SITES MAY FIND THIS VERSION USEFUL,
* OR AT LEAST MORE USEFUL THAN THE UNIVERSITY OF TEXAS'S KERMIT 170,
* WHICH WE WERE UTTERLY UNABLE TO RUN -- OR EVEN INTERPRET, SINCE THE
* COPY WE RECEIVED IS IN A CHARACTER SET UNKNOWN TO US.
*
* THE PROGRAM CODE CONTAINS CONDITIONS WHICH SHOULD DETERMINE DURING
* ASSEMBLY WHETHER THE SITE IS A 63- OR 64-CHARACTER SITE AND PRODUCE
* AN APPROPRIATE BINARY.
IOSTORE TITLE STORAGE, CONSTANTS, TABLES, AND OTHER DATA
** I/O STORAGE AND FILE ENVIRONMENT TABLES
*
* XSTORE AND REGIST ARE USED TO SAVE VARIOUS REGISTER CONTENTS DURING
* I/O OPERATIONS. ALSO THE TERMINAL BUFFER TBUF MAY OCCASIONALLY
* UNDERFLOW INTO THE TOP WORD OF REGIST DURING READ OPERATIONS -- THE
* INPUT SUBROUTINE SREAD STORES A ZERO IN THIS WORD UNDER CERTAIN
* CIRCUMSTANCES. SIMILARLY THE MASS STORAGE BUFFER WBUF IS ALLOWED
* TO UNDERFLOW ONE WORD, WHICH EXPLAINS WHY TBUF HAS AN EXTRA WORD
* AT THE TOP. THE BUFFER LBUF IS RESERVED EXCLUSIVELY FOR THE LOG
* FILE ZZZKLOG. THE BUFFER CBUF IS ACTUALLY A PAIR OF BUFFERS USED
* TO STORE PACKETS BEFORE SENDING THEM AND AFTER RECEIVING THEM.
*
* LOFS IS THE LIST-OF-FILES TABLE. IT SERVES TWO PURPOSES: IF KERMIT
* IS INTERRUPTED, THIS TABLE ENSURES THAT THE LAST PART OF ZZZKLOG
* GETS WRITTEN TO THE FILE BEFORE THE PROGRAM ABORTS, IN CASE THE LOG
* IS NEEDED TO SHED LIGHT ON THE PROBLEM. ORDINARILY THE LOFS TABLE
* ENSURES THAT THE OUTPUT BUFFER GETS FLUSHED AUTOMATICALLY WHENEVER
* INPUT IS READ. FOR THIS REASON, CYBER KERMIT NEVER WRITES OUTPUT
* EXPLICITLY EXCEPT WHEN RESPONDING TO A GENERIC LOGOUT COMMAND.
*
* IN MOST CASES THE FILE ENVIRONMENT TABLE IS EXTENDED BACKWARDS BY
* TWO WORDS. THE FIRST OF THESE CONTAINS THE NEGATIVE SHIFT COUNT,
* WHICH REACHES 0 WHEN AN INPUT WORD HAS BEEN EMPTIED OR AN OUTPUT
* WORD HAS BEEN FILLED; THE SECOND WORD CONTAINS THE WORD CURRENTLY
* BEING FILLED OR EMPTIED.
*
* HELPLOC IS USED TO RECORD THE CURRENT POSITION OF THE STRUCTURED
* HELP FILE ZZZKHLP. IT IS 0 WHEN ZZZKHLP HAS NOT BEEN OPENED, AND
* OTHERWISE CONTAINS THE NUMBER OF THE RECORD WHICH WOULD BE READ BY
* A READ MACRO AT THE MOMENT -- THAT IS, ONE MORE THAN THE NUMBER
* OF THE LAST RECORD READ.
*
* THE DUMMY FET IS A TEMPLATE FROM WHICH THE FILE FET IS CONSTRUCTED
* WHEN A FILE IS TO BE TRANSFERRED.
*
* INFI AND OUTFI ARE POINTERS TO CURRENTLY ACTIVE FET'S, SIMPLIFYING
* I/O OPERATIONS SUCH AS BUFFER FILLING AND FLUSHING.
IOSTORE SPACE 4,12
ORG 110B
XSTORE BSS 6 TEMPORARY STORAGE WHEN GETTNG ACK FOR
REGIST BSS 6 PACKETS, AND DURING CIO CALLS
TBUF BSS TBUFL+1 INPUT, OUTPUT
WBUF BSS WBUFL FILE, ZZZKHLP, ZZZKDAT
LBUF BSS LBUFL ZZZKLOG
CBUF BSS 192 ASCII CODED PACKETS
LOFS VFD 30/LOFS+1,30/0,42/0,18/4
VFD 42/0ZOUTPUT,18/OUTPUT
VFD 42/0ZZZZKLOG,18/ZZZKLOG,60/0
BSSZ 2
INPUT FILEB TBUF,TBUFL
BSSZ 2
OUTPUT FILEB TBUF,TBUFL
HELPLOC DATA 0
ZZZKHLP FILEB WBUF,WBUFL
ZZZKDAT FILEB WBUF,WBUFL
DATA -9,45 THIS INITIALISES THE LOG FILE
ZZZKLOG FILEB LBUF,LBUFL
BSSZ 2
FILE FILEB WBUF,WBUFL
DUMMY FILEB WBUF,WBUFL
INFI DATA 0 ADDRESS OF FET OF FILE BEING READ
OUTFI DATA 0 ADDRESS OF FET OF FILE BEING WRITTEN
CONSVARS SPACE 4,15
* CONSTANTS AND VARIABLES
CONSVARS SPACE 3,10
CURN DATA 0 CURRENT PACKET NUMBER
FILNAM DATA 0,0 TENTATIVE AND PREVIOUS NAMES OF FILES
KMODE DATA 0 SERVER OR NOT; SEND, RECEIVE, OR COMMAND
NPAD DATA 0,0 NUMBER OF PAD CHARS TO SEND, PAD CHAR
EOLN DATA -1 HIS REQUESTED EOLN
BITPREF DATA 38 DEFAULT BIT-PREFIX
QBIN DATA 0 CURRENT BIT-PREFIX
DEBUGW DATA 0 0 = DEBUG IS OFF; 1 = DEBUG IS ON
DEFAULF DATA 1 NUMBER TO CONSTRUCT DEFAULT FILE NAME
ESCAPEC CON DEFESCA INTERNAL ESCAPE CHAR (LITERAL)
FILETYP DATA 0,0 0 ASC, 1 BIN, 2 KER, 3 DIS, 4 ASC8
SYNCM DATA 1 PACKET START (LITERAL)
PLENGTH CON DEFPLEN PACKET LENGTH TO REQUEST
SLENGTH DATA 80 MAXIMUM PACKET LENGTH TO SEND
QUOTEC DATA 35 DEFAULT QUOTE CHAR
QCTL DATA 0 QUOTE CHAR BEING USED
RPCH DATA 0 REPEAT CHAR BEING USED
REPETC DATA 126 DEFAULT REPEAT CHAR
TIMEOUT CON DEFTIME TIMEOUT TO REQUEST FROM LOCAL KERMIT
FILETOT DATA 0 FILES TRANSFERRED
PSENT DATA 0 PACKETS SENT
PRECD DATA 0 PACKETS RECEIVED
PKERRS DATA 0 ERRORS IN RECEIVED PACKETS
RETRYT DATA 0 TOTAL RETRIES
RETRYC DATA 0 CURRENT NO OF RETRIES
RETRYN CON DEFRETR MAXIMUM RETRIES TO HAVE
TIMWORD DATA 0 CURRENT TIME
UPDAT DATA 0 TEMPORARY STORAGE
TABLES SPACE 4,10
** TABLES
*
* THE TABLE PTYPES IS USED TO SELECT C, E, G, I, K, R, AND S PACKETS
* FOR SPECIAL TREATMENT.
*
* ILLEGIT IS USED TO SELECT CONTROL CHARACTERS WHICH ARE FORBIDDEN AS
* PACKET SYNC MARKERS AND AS LOCAL ESCAPE CHARACTERS BECAUSE OF THEIR
* SPECIAL SIGNIFICANCE TO THE OPERATING SYSTEM. IN GENERAL, A BIT N
* IS SET WHEN THE CHARACTER WITH ASCII VALUE N IS FORBIDDEN. HERE
* IN MANCHESTER THE VALUES 8 (BACKSPACE), 10 (LINEFEED), 13 (CARRIAGE
* RETURN), 16 (INTERRUPT), 17 (XOFF), 19 (XON), 20 (TERMINATION), AND
* 24 (CANCEL LINE) ARE FORBIDDEN.
*
* DITAB IS USED FOR CHARACTER CODE CONVERSION FROM DISPLAY CODE AND
* FROM 6/12 ASCII CODE TO ASCII PROPER; ATTAB IS ALSO USED FOR THE
* LATTER CONVERSION. ASCTAB IS USED TO CONVERT FROM ASCII PROPER TO
* DISPLAY CODE OR TO 6/12 ASCII.
*
* THE TABLES BEGINNING AT THE WORD AFTER KNAME ARE USED BY CREAD,
* THE CYBER KERMIT COMMAND PROCESSOR. EACH TABLE CONTAINS ONE ENTRY
* FOR EACH ACCEPTABLE COMMAND AND ENDS WITH A 0. EACH TABLE ALSO HAS
* ONE ENTRY EACH FOR THE LONGEST (AMBIGUOUS) EXPRESSION COMMON TO TWO
* OR MORE COMMANDS (PROVIDED THE ACTION TO BE TAKEN ACTUALLY DIFFERS)
* AND PRECEDING THE COMMANDS IN QUESTION. THE TABLES ARE SEARCHED IN
* SEQUENCE, SO THE ALPHABETICAL ORDER IS COINCIDENTAL.
*
* THE EXPRESSION TPARAMS IS A CODED INSTRUCTION THAT REDIFINES THE
* TERMINAL CHARACTERISTICS WHEN KERMIT EXECUTES. THE CODES ARE:
*
* 0016 REDEFINE TERMINAL CHARACTERISTICS (CONTROL BYTE)
* 40624002 SET PARITY EVEN
* 40454000 TURN OFF PAGING
* 40434377 SET PAGE WIDTH TO 255 CHARACTERS
TABLES SPACE 4,10
PTYPES DATA 3005250B SPECIAL PACKET TYPES TO SELECT
ILLEGIT DATA 106622400B SPECIAL CONTROL CHARACTERS TO AVOID
DITAB DATA 43,45,42,47,40,41,36,61,32
IFEQ 1R:,0
DATA 44,46,35,91,93,37,34,95,33
ELSE 1
DATA 44,46,35,91,93,58,34,95,33
DATA 38,39,63,60,62,64,92,94,59
IFEQ 1R:,0
ATTAB DATA 32,64,94,32,58,32,32,96
ASCTAB DATA 54,52,48,43,51,55,56,41,42,39,37
DATA 46,38,47,40,00,63,58,44,59,57,60
ELSE 3
ATTAB DATA 32,64,94,32,37,32,32,96
ASCTAB DATA 54,52,48,43,40,55,56,41,42,39,37
DATA 46,38,47,40,51,63,58,44,59,57,60
DATA 49,61,50,62,53,56,49,61,50,62,45
KNAME DATA 0ZKERMIT,0ZO,0ZOFF,0ZON
COMTAB DATA 0,0ZEXIT,0ZPUSH,0ZQUIT,0ZRECEIVE,0ZSE
DATA 0ZSEND,0ZSERVER,0ZSET,0ZSHOW,0ZSTATUS
SETTAB DATA 0,0ZBITPREFIX,0ZDE,0ZDEBUG,0ZDELAY,0ZESCAPE
DATA 0ZFILETYPE,0ZMARKER,0ZPACKETLEN,0ZQUOTECHAR
DATA 0ZRE,0ZREPEATCHA,0ZRETRY
IFEQ 1R:,0
FTYPES DATA 0,0ZASCII64,0ZASCII8,0ZBINARY,0ZDISPLAY,0ZDIS64
ELSE 1
FTYPES DATA 0,0ZASCII63,0ZASCII8,0ZBINARY,0ZDISPLAY,0ZDIS63
DATA 0ZEIGHT,0ZKERMIT,0ZNORMAL,0Z8
SERVTAB DATA 0,0ZS,0ZSETFILETY,0ZSHOW,0ZSTATUS,0ZTYPE,0
TPARAMS VFD 27/1640624B,9/PARIT,24/40454000B
DATA 40434377000000000000B
MESSAGES SPACE 4,19
** MESSAGES AND TEXTS
*
* THE SPECIAL TEXTS OFFLIST, CMDLIST, FTLIST, AND SETLIST ARE USED
* BY THE LIST FORMATTER LWRITE AND BY VARIOUS OTHER ROUTINES. LWRITE
* IS DISCUSSED IN DETAIL LATER. THE FORMAT PRESCRIBED BY LWRITE OC-
* CASIONALLY REQUIRES AN APPARENTLY SUPERFLUOUS BLANK.
MESSAGES SPACE 3,9
IFEQ 1R:,0
OFFLIST DIS ,/D^E^B^U^G ^M^A^Y ^B^E ^S^E^T ^T^O@D/
ELSE 1
OFFLIST DIS ,/D^E^B^U^G ^M^A^Y ^B^E ^S^E^T ^T^O:/
VFD 60/0,24/4LOF^F,12/23,24/0,12/2LON,48/0,12/1,48/0
IFEQ 1R:,0
CMDLIST DIS ,/T^H^E K^E^R^M^I^T ^C^O^M^M^A^N^D^S ^A^R^E@D/
ELSE 1
CMDLIST DIS ,/T^H^E K^E^R^M^I^T ^C^O^M^M^A^N^D^S ^A^R^E:/
VFD 60/0,42/7LE^X^I^T,12/22,6/0,60/10LR^E^C^E^I^
VFD 18/3LV^E,12/19,30/0,60/0LSET
VFD 42/7LP^U^S^H,12/22,6/0,30/5LSEN^D,12/22,18/0
VFD 60/6LSH^O^W,42/7LQ^U^I^T,12/22,6/0
VFD 60/10LSER^V^E^R ,12/19,48/0,60/10LST^A^T^U^S
VFD 60/0,12/1,48/0
IFEQ 1R:,0
FTLIST DIS ,/F^I^L^E^S ^M^A^Y ^B^E@D/
ELSE 1
FTLIST DIS ,/F^I^L^E^S ^M^A^Y ^B^E:/
VFD 60/0,60/10LA^S^C^I^I ,12/20,48/0
VFD 60/10LE^I^G^H^T ,60/0,60/10LB^I^N^A^R^
VFD 6/0LY,12/19,42/0,60/10LK^E^R^M^I^,6/0LT,54/0
VFD 60/10LD^I^S^P^L^,18/3LA^Y,42/0,12/1,48/0
IFEQ 1R:,0
SETLIST DIS ,/Y^O^U ^M^A^Y ^S^E^T@D/
ELSE 1
SETLIST DIS ,/Y^O^U ^M^A^Y ^S^E^T: /
VFD 60/0,60/10LB^I^T-^P^R,48/8L^E^F^I^X,12/16
VFD 60/10LF^I^L^E-^T,36/6L^Y^P^E,12/17,12/0
DIS ,/Q^U^O^T^E-^C^H^A^R/
VFD 42/7LDEB^U^G,12/21,6/0,60/10LM^A^R^K^E^
VFD 6/0LR,12/20,42/0
DIS ,/REP^E^A^T-^C^H^A^R/
VFD 42/7LDEL^A^Y,12/21,6/0,60/10LP^A^C^K^E^
VFD 60/10LT-^L^E^N^G,24/4L^T^H,12/13,24/0
DIS ,/RET^R^Y/
DIS ,/E^S^C^A^P^E/
VFD 12/1,48/0
TRANSFM DIS ,/ F^I^L^E^S ^T^R^A^N^S^F^E^R^R^E^D/
DIS ,/ P^A^C^K^E^T^S ^S^E^N^T/
DIS ,/ P^A^C^K^E^T^S ^R^E^C^E^I^V^E^D/
DIS ,/ D^A^T^A ^E^R^R^O^R^S/
DIS ,/ R^E^P^E^T^I^T^I^O^N^S/
KPROMPT DIS ,/ C^Y^B^E^R K^E^R^M^I^T> /
BLOCKM DIS ,/^B^L^O^C^K ^C^H^E^C^K^S 1-^C^H^A^R/
DEFAULM DIS ,/^D^E^F^A^U^L^T ^F^I^L^E ^N^A^M^E /
CTRLHYP DIS ,/CTRL-/
IFEQ PARIT,0,1
PAREVEN DIS ,/^P^A^R^I^T^Y ^Z^E^R^O/
IFEQ PARIT,1,1
PAREVEN DIS ,/^P^A^R^I^T^Y ^O^D^D/
IFEQ PARIT,2,1
PAREVEN DIS ,/^P^A^R^I^T^Y ^E^V^E^N/
INTERM DIS ,/I^N^T^E^R^R^U^P^T^E^D/
RETRYM DIS ,/T^O^O ^M^A^N^Y ^R^E^P^E^T^I^T^I^O^N^S/
NOTHIGM DIS ,/N^O^T^H^I^N^G/
IFEQ 1R:,0
RECEIVM DIS ,/R^E^C^E^I^V^E@D /
CON 10LS^E^N^D@D
ELSE 2
RECEIVM DIS ,/R^E^C^E^I^V^E: /
CON 10LS^E^N^D:
PACKNUM DIS ,/P^A^C^K^E^T ^N^U^M^B^E^R /
CKERRM DIS ,/C^H^E^C^K^S^U^M ^E^R^R^O^R/
FNCHGM DIS ,/C^H^A^N^G^E ^F^I^L^E ^N^A^M^E ^T^O /
FRABTM DIS ,/T^R^A^N^S^F^E^R ^A^B^O^R^T^E^D/
BREAKM DIS ,/B^R^E^A^K. /
ERRORM DIS ,/E^R^R^O^R. /
IFEQ 1R:,0
LASTFM DIS ,/ L^A^S^T ^F^I^L^E@D/
ELSE 1
LASTFM DIS ,/ L^A^S^T ^F^I^L^E:/
BINERM DATA 10LB^I^T ^P^R,10L^E^F^I^X ^,10LI^S ^R^E^Q
DIS ,/^U^I^R^E^D ^F^O^R ^B^I^N^A^R^Y ^F^I^L^E^S/
OPENFM DIS ,/R^E^C^E^I^V^I^N^G ^F^I^L^E /
DISCARM DIS ,/I^N^S^T^R^U^C^T^E^D ^T^O ^D^I^S^C^A^R^D ^F^I^L^E/
EOFM DIS ,/E^N^D ^O^F ^F^I^L^E /
KDATERM DIS ,/F^A^T^A^L ^P^R^O^T^O^C^O^L ^V^I^O^L^A^T^I^O^N/
NONEXTM DIS ,/T^H^I^S ^F^I^L^E ^D^O^E^S ^N^O^T ^E^X^I^S^T/
LOGOUTM DIS ,/L^O^G^O^U^T/
FINISHM DIS ,/F^I^N^I^S^H/
NOTIMP DIS ,/N^O^T ^I^M^P^L^E^M^E^N^T^E^D/
TYPEM DIS ,/T^Y^P^E/
TYPERM DIS ,/Y^O^U ^C^A^N^N^O^T T^Y^P^E ^B^I^N^A^R^Y ^F^I^L^E^S/
HELPM DIS ,/H^E^L^P/
EOPMSG DIS ,/(EOP)/
BADTERM DIS ,/ INPUT AND OUTPUT MUST BE TERMINAL FILES/
NOHELPM DIS ,/ FILE ZZZKHLP IS MISSING/
BADKDAT DIS ,/ FILE ZZZKDAT IS CORRUPT/
DEBACL SPACE 4,21
** DEALING WITH FATAL ERRORS
*
* IF WE LEARN THAT THE LINK FILE WRITTEN BY A PUSH COMMAND HAS BEEN
* CORRUPTED, OR THAT THE HELP FILE ZZZKHLP IS MISSING, OR THAT EITHER
* INPUT OR OUTPUT IS NOT ASSIGNED TO A TERMINAL, WE HAVE NO CHOICE
* BUT TO ABORT. DEBACLD IS THE ENTRY POINT FOR CORRUPT LINK FILES,
* DEBACL - 2 FOR NONEXISTENCE OF ZZZKHLP, AND DEBACL-1 WHEN INPUT OR
* OUTPUT IS A MASS STORAGE FILE.
DEBACL SPACE 3,9
DEBACLD RETURN ZZZKDAT DESTROY THE INFAMOUS THING!
SX1 BADKDAT THEN CONFESS
EQ DEBACL
SX1 NOHELPM A USER HAS BEEN TAMPERING WITH FILES
EQ DEBACL
SX1 BADTERM OR WITH FANCY 'ASSIGN' STATEMENTS
DEBACL MESSAGE X1,4
ABORT
NCONV TITLE SUBROUTINES THAT MANIPULATE DATA
** SUBROUTINES THAT MANIPULATE DATA
*
* THESE ELEMENTARY ROUTINES ARE CALLED FREQUENTLY BY SEVERAL LATER,
* MORE COMPLEX ROUTINES.
*
* NCONV CONVERTS A BINARY NUMBER IN X3 TO DISPLAY CODE IN X5, USING
* B2 FOR UNPACKING AND SHIFT OPERATIONS. X5 MUST BE 0 ON ENTRY.
NCONV SPACE 3,10
NCONV PS
SX0 10
PX1 X0 X1 := FLOATING POINT 10
NX1 X1 NORMALISE X1
PX2 X3 CONVERT X3 TO FLOATING POINT
FX2 X2/X1 DIVIDE
SX4 X3+27 THIS WILL LEAVE A PRINTABLE DIGIT
UX3 B2,X2
LX3 B2,X3 X3 NOW CONTAINS THE INTEGER QUOTIENT
IX2 X3*X0
IX4 X4-X2 THIS IS THE RIGHTMOST DIGIT FROM X3
BX5 X5+X4 ADD IT TO X5
LX5 54 SHIFT IT INTO THE UPPER END OF X5
NZ X2,*-2
EQ NCONV
DEFFILE SPACE 4,18
** DEFFILE PREPARES THE CURRENT DEFAULT FILE NAME IN X6 USING NCONV.
* AT EXIT A3 CONTAINS DEFAULF, THE ADDRESS OF THE SEQUENCE NUMBER OF
* THE DEFAULT FILE, WHILE X6 CONTAINS THE CURRENT DEFAULT FILE NAME,
* LOGICALLY ADDED TO THE CODE FOR A BINARY FET.
DEFFILE SPACE 3,10
SA0 B2 SAVE CONTENTS OF B2 (USED BY NCONV)
BX5 X5-X5 X5 := 0
RJ NCONV CONVERT X3 TO DISPLAY CODE
SB2 A0 RESTORE CONTENTS OF B2
MX0 24 4-CHARACTER MASK
SX4 3RKER START OF DEFAULT FILE NAME
BX2 -X0*X5 X2 SHOULD BE 0
ZR X2,*+2 UNLESS THE NUMBER IS TOO LARGE
BX6 X6-X6 IN WHICH CASE USE 0
SA6 A3 AND SAVE IT (A3 STILL = DEFAULF)
SX5 27
LX5 54 SHIFT TO AVOID OVERLAP
BX6 X4+X5 AND COMBINE TWO PARTS OF FILE NAME
LX6 42 SHIFT INTO POSITION
SX5 3 AND ADD BINARY FET CODE
BX6 X6+X5 TO FILE NAME
DEFFILE PS
SA3 DEFAULF X3 := DEFAULT FILE NUMBER
EQ DEFFILE-6
PUTVAL SPACE 4,23
** PUTVAL STORES THE NEXT 8-BIT VALUE FROM X5 INTO A PACKET BEING
* PREPARED FOR SENDING. IT ACTUALLY KEEPS THE LAST VALUE IN X7, FOR
* WE SOMETIMES WISH TO STRIP ONE OR MORE VALUES. B5 HOLDS THE COUNT
* OF THE NUMBER OF TIMES THE VALUE IN X7 HAS BEEN REPEATED, AND B6
* HOLDS THE OFFSET OF THE CURRENT STORAGE ADDRESS, WHICH IS A SHORT
* DISTANCE FROM END-OF-PACKET TO BE SAFE. THIS 'PADDED' ADDRESS IS
* IN B7. PUTVAL MAY RETURN WITHOUT COMPLETING THE 'PUTTING' WHEN
* B6 GOES POSITIVE. THE 'PUTTING' IS COMPLETE WHENEVER B6 < 0, AND
* IF B6 >= 0, THE PUTTING IS COMPLETE IF X5 = X7.
PUTVAL SPACE 3,10
PUTVAL PS
BX4 X7-X5 IS THIS A NEW VALUE, OR DOES IT REPEAT
NZ X4,*+2 X4 = 0 IF THIS IS NOT A NEW VALUE
SB5 B5+B1 NEW VALUE = LAST; INCREMENT COUNT
EQ PUTVAL
SA1 RPCH
SB5 B5-B1 B5 := ONE LESS THAN THE REPEAT COUNT
MX0 53
LE B5,B1,*+6 WE NEED AT LEAST 3 TO USE REPEAT
MI X1,*+6 AND WE CAN'T REPEAT WITH NO RPCH
BX6 X1
SA6 B6+B7 SEND THE REPEAT PREFIX
SX6 B5+34
BX2 X0*X6 TEST FOR OVERLARGE COUNTS
ZR X2,*+1 X2 = 0 IF THE COUNT IS <= 126
BX6 -X0 OTHERWISE LIMIT THEM TO 126
BX4 -X6
SX4 X4+B1
BX6 -X4 X6 := REPEAT COUNT TO BE SENT
SB5 X4+B5 B5 := REMAINING REPEAT COUNT
SB5 B5+33 THEN CORRECT THE TOTAL
SB6 B6+B1
SA6 B6+B7 STORE CODED REPEAT COUNT
SB6 B6+B1
+ SX0 B1
LX0 7 X0 := 128
SA2 BITPREF
BX6 X7
BX4 X0*X7 TEST TO SEE IF BIT 8 IS SET
ZR X4,*+2
BX6 X2
SA6 B6+B7 BIT-PREFIX
SB6 B6+B1
BX6 X0-X7
SA4 QUOTEC QUOTE PREFIX
BX1 X1-X6
BX0 X6
ZR X1,*+5 RPCH REQUIRES A PREFIX
SX1 B1
LX1 6 X1 := 64
BX2 X2-X6
ZR X2,*+4 QBIN REQUIRES A PREFIX
BX2 X4-X6
ZR X2,*+3 QCTL REQUIRES A PREFIX
MX2 53
BX2 -X2-X6
ZR X2,*+1 DEL REQUIRES A PREFIX AND DECONTROL
MX2 55
BX2 X2*X6
NZ X2,*+2 CHARS LESS THAN 32 REQUIRE PREFIX
BX0 X0-X1
+ BX6 X4
SA6 B6+B7 PUT QUOTE PREFIX
SB6 B6+B1
BX6 X0
SA6 B6+B7 FINALLY, STORE THE CHAR
SB6 B6+B1
ZR B5,*+2 DONE IF B5 = 0
MI B6,PUTVAL+3
EQ PUTVAL WE CANNOT GO ON IN THIS PACKET
BX7 X5
SB5 B1
EQ PUTVAL
UNPACK SPACE 4,17
** UNPACK GETS THE NEXT 8-BIT VALUE FROM A PACKET INTO X5. X5 < 0 AT
* END-OF-PACKET, IN WHICH CASE ANOTHER PACKET MAY BE REQUESTED WHEN
* MORE DATA IS EXPECTED.
UNPACK SPACE 3,10
MX3 47
UNPACK PS
BX5 X3 X3 CONTAINS NEXT CHARACTER IN THE PACKET
MI X3,UNPACK OR A NEGATIVE NUMBER IF PACKET IS EMPTY
SB2 B2-B1 B2 CONTAINS THE REPEAT COUNT
GT B2,B0,UNPACK IF THIS WAS > 1 AND IS > 0, THEN DONE
SA3 B4 OTHERWISE TRY TO GET NEXT CHAR
SB2 B1 WHICH PROBABLY OCCURS ONLY ONCE
MI X3,UNPACK X3 < 0 AT END OF PACKET
SA1 QCTL
SA2 A1+B1 RPCH
BX0 X2-X3 IS THIS A REPEATED VALUE
NZ X0,*+3 IF X2 = X3, THEN NEXT VALUE FOLLOWS COUNT
SA3 A3+B1
SB2 X3-32 B2 := REPEAT COUNT
SA3 A3+B1 AND X3 := VALUE
MI X3,UNPACK JUST IN CASE THERE IS A DATA ERROR
LE B2,B0,UNPACK-1 WE LEAVE THIS ROUTINE WITH NO ERROR
SA4 QBIN
BX0 X3-X4
BX6 X6-X6 IS THE EIGHTH BIT TRUE
NZ X0,*+2 IF X6 = 0, THIS IS A BIT PREFIX
SA3 A3+B1 IN WHICH CASE, GET THE VALUE
SX6 B1
MI X3,UNPACK THIS SHOULD NEVER OCCUR (BUT WHO KNOWS?)
LX6 7 X6 := 128
+ BX0 X3-X1 IS IT A QUOTED CHARACTER
NZ X0,*+4
SA3 A3+B1
BX0 X1-X3 IS IT QCTL
ZR X0,*+3
BX0 X4-X3 IS IT QBIN
ZR X0,*+2
BX0 X2-X3 IS IT RPCH
SX4 B1
ZR X0,*+1
LX4 6 X4 := 64
BX3 X3-X4
BX3 X3+X6
SB4 A3+B1
EQ UNPACK
PREAD SPACE 4,18
** PREAD 'READS' ONE CHARACTER FROM A 6/12 TEXT AND TRANSLATES IT INTO
* ASCII CODE. IT USES THE SUBROUTINE PREADSUB TO GET THE NEXT 6 BITS
* OF THE TEXT. NOTE THAT PREAD MAKES NO ATTEMPT TO DETECT ERRORS IN
* SUCH A TEXT.
PREAD SPACE 3,10
MX0 54
LX3 6
BX5 -X0*X3 GET NEXT SIX BITS OF WORD INTO X5
SB2 B2+B1 AND INCREMENT CHARACTER COUNT
PREADSB PS
MI B2,*-2 B2 < 0 IF THERE IS MORE IN THIS WORD
SA3 B3 GET NEXT WORD
SB3 B3+B1 (INCREMENTING THE POINTER)
SB2 -10 WHICH CONTAINS 10 6-BIT CHARACTERS
EQ *-3
*
PREAD PS
RJ PREADSB GET THE NEXT SIX BITS
ZR X5,PREAD WHICH ARE 0 AT END OF TEXT
SX4 X5-62 TEST FOR UP-ARROW
ZR X4,PREAD1 WHICH IS HANDLED AT PREAD1
SX4 X4+B1
SX4 X4+B1
NZ X4,*+2 NOW TEST FOR AT-SIGN
RJ PREADSB
SA5 X5+ATTAB AND CONVERT USING TABLE
EQ PREAD
SX5 X5-27 TEST FOR UPPER-CASE LETTER
PL X5,*+2 X5 >= 0 UNLESS CHAR IS LETTER
SX5 X5+91
EQ PREAD
SX5 X5-10 TEST FOR DIGIT
PL X5,*+2 X5 >= 0 UNLESS CHAR IS DIGIT
SX5 X5+58
EQ PREAD
SA5 X5+DITAB CONVERT USING TABLE
EQ PREAD
PREAD1 RJ PREADSB AFTER UP-ARROW, GET NEXT SIX BITS
SX5 X5-32 IF THESE ARE >= 32, ASCII VALUE IS
PL X5,PREAD BITS - 32
SX5 X5+128 OTHERWISE ASCII VALUE IS BITS + 96
EQ PREAD
PACKTEX SPACE 4,13
** THE PACKTEX UTILITY ROUTINE WORKS WITH PREAD TO PACK TEXT INTO A
* PACKET. IT IS USEFUL WHEN SENDING ERROR MESSAGES AND OTHER SHORT
* COMMUNICATIONS.
PACKTEX SPACE 3,6
PACKTEX PS
RJ PREAD UNPACK NEXT CHARACTER OF MESSAGE
ZR X5,*-2 IT IS 0 AT END-OF-TEXT
RJ PUTVAL STORE IT IN THE PACKET
MI B6,*-2 AND REPEAT IF B6 < 0
EQ *-3 B6 >= 0 WHEN PACKET IS FULL
MAKEFN SPACE 4,17
** THE ROUTINE MAKEFN BUILDS A FILE NAME ONE CHARACTER AT A TIME FROM
* ASCII CODED CHARACTERS INPUT IN X5. OUTPUT IS LEFT-JUSTIFIED FILE
* NAME IN DISPLAY CODE IN X7.
MAKEFN SPACE 3,10
SX2 X4-26 TEST FOR LOWER-CASE LETTER
PL X2,*+3 X2 >= 0 IF NOT A LETTER
SX4 X4+B1 CONVERT LETTERS TO DISPLAY CODE
LX7 6
BX7 X7+X4 AND ADD TO FILE NAME
SB5 B5+B1
MI B5,*+1 IF B5 < 0, THEN FILE NAME IS NOT FULL
LX7 18 IF FULL, JUSTIFY IT
MAKEFN PS
PL B5,*-1 B5 >= 0 WHEN FILE NAME IS COMPLETE
PL X5,*+3 X5 < 0 WHEN THERE IS NO MORE INPUT
LX7 6 IF THERE IS NO MORE INPUT, THEN
SB5 B5+B1 JUSTIFY THE FILE NAME IN X7
MI B5,*
LX7 18
EQ MAKEFN
SX4 X5-65 DIVIDE ASCII CHARS; LETTERS >= 65
MI X4,*+3 TREAT NON-LETTERS LATER
SX2 X4-32 TEST FOR LOWER-CASE LETTERS
MI X2,MAKEFN-3 AND TREAT THEM ELSEWHERE
BX4 X2
EQ MAKEFN-3 TREAT UPPER-CASE LETTERS
ZR X7,MAKEFN DO NOT STORE NON-LETTERS AS 1ST CHAR
SX4 X5-22 CONVERT DIGITS TO DISPLAY CODE
SX2 X4-26 TEST THAT THEY ARE IN FACT DIGITS
MI X2,MAKEFN IF X2 < 0 THEN THEY ARE NOT DIGITS
SX2 X2-10
MI X2,MAKEFN-2 IF X2 < 0 HERE, THEY ARE DIGITS
EQ MAKEFN OTHERWISE THEY ARE NOT
UNPCFIL SPACE 4,17
** UNPCFIL EXTRACTS A FILE NAME FROM A PACKET. IT PRESUMES THAT X3 =
* 0 AND THAT THE FILE NAME BEGINS AT THE FOURTH WORD OF THE RECEIVED
* PACKET; HENCE THIS ROUTINE CANNOT EXTRACT FILE NAMES FROM PACKETS
* CARRYING REMOTE COMMANDS TO 'TYPE' A FILE.
UNPCFIL SPACE 3,10
UNPCFIL PS
BX7 X7-X7 X7 := 0
SB5 -7 7 CHARS IN FILE NAME
SB2 B1 FIRST CHAR WILL BE REPEATED ONCE
SB4 CBUF+99
RJ UNPACK GET DUMMY FIRST CHAR
RJ UNPACK GET A CHAR OUT OF THE PACKET
RJ MAKEFN AND TRY TO ADD IT TO THE FILE NAME
MI B5,*-2 REPEAT UNTIL FILE NAME IS COMPLETE
EQ UNPCFIL
FREAD TITLE PRIMARY INPUT ROUTINES
** PRIMARY INPUT ROUTINES
*
* FREAD FILLS A FILE BUFFER. NOTE: INFI MUST CONTAIN ADDRESS OF FET
* OF FILE BEING READ, AS DOES X2 ON ENTRY. THIS ALWAYS RETURNS X6 =
* 0 AND SETS B4 AND B3 TO END-OF-INPUT AND OFFSET ADDRESS OF THE 1ST
* WORD READ.
FREAD SPACE 3,10
FREAD PS
SA7 REGIST REGIST CONTAINS X7
MX0 42
SX1 B2 PREPARE TO SAVE CONTENTS OF B REGISTERS
SX4 B5
SX6 B6
SX7 B7
BX1 -X0*X1 MASK OFF ALL SIGN EXTENSIONS
BX4 -X0*X4
BX6 -X0*X6
BX7 -X0*X7
LX6 18 AND PREPARE TO COMBINE
LX7 18
BX6 X6+X1
BX7 X7+X4
SA6 A7+B1 REGIST + 1 CONTAINS B6, B2
SA7 A6+B1 REGIST + 2 CONTAINS B7, B5
BX7 X3
BX6 X5
SA7 A7+B1 REGIST + 3 CONTAINS X3
SA6 A7+B1 REGIST + 4 CONTAINS X5
SA1 X2+B1 FET + 1
BX6 -X0*X1 X6 CONTAINS START OF BUFFER
SA6 A1+B1 IN
SA6 A6+B1 OUT
READ X2,R
SA1 REGIST X7
SA2 A1+B1 B6, B2
SA4 A2+B1 B7, B5
SA3 A4+B1 X3
SA5 A3+B1 X5
BX7 X1
SB2 X2
SB5 X4
LX2 42
LX4 42
SB6 X2
SB7 X4
SA2 INFI X2 = FET ADDRESS
SB3 X2+B1
SA1 B3+B1 IN
SA4 A1+B1 OUT
SB4 X1 END OF DATA
IX4 X4-X1
SB3 X4 OFFSET
BX6 X6-X6
EQ FREAD
WREAD SPACE 4,18
* WREAD READS ONE WORD FROM AN INPUT FILE; IT IS USED BY ALL INPUT
* ROUTINES. NOTE THAT INFI MUST CONTAIN ADDRESS OF THE FET OF FILE
* BEING READ. WREAD RETURNS X1 = 0 WHEN DATA IS READ, WITH DATA READ
* IN X6, OR X1 <> 0 WHEN NO DATA IS READ, WITH X6 = 0.
WREAD SPACE 3,10
SA4 B3+B4 X4 = NEXT WORD
SB3 B3+B1
BX6 X4
BX1 X1-X1 SIGNAL THAT DATA WAS READ
WREAD PS
MI B3,*-2 B3 < 0 WHEN BUFFER IS NOT YET EMPTY
SA2 INFI X2 := FET ADDRESS
SA1 X2 X1 := I/O STATUS
LX1 55 X1 > 1 WHEN THIS RECORD IS NOT FINISHED
BX6 X6-X6
MI X1,WREAD X1 < 0 AT EOR, EOF, EOI
RJ FREAD FILL BUFFER
MI B3,WREAD-1 B3 < 0 WHEN DATA WAS READ
EQ WREAD
SREAD SPACE 4,18
** SREAD READS ONE SIX-BIT CHARACTER FROM A FILE. ALL TEXTUAL INPUT
* WHETHER FROM THE TERMINAL OR FROM MASS STORAGE USES SREAD. EXITS
* WITH NEXT 6 BITS IN X5 OR WITH X5 < 0 AT EOLN AND EOR. B2 = 0 AT
* EOLN, B2 > 0 AT EOR, EOF, EOI, AND B2 < 0 WHEN DATA IS IN X5.
SREAD SPACE 3,10
MI B3,SREAD
RJ WREAD FILL BUFFER
SB3 B3-B1
ZR X1,*+1 X1 = 0 IF DATA WAS READ
SA6 B3+B4 INSERT MISSING END-OF-LINE
SREAD PS
PL B2,SREAD1 EOLN OR EOR
SB2 B2+B1
MX0 54
BX5 -X0*X3 GET NEXT CHAR
LX3 6
MI B2,SREAD B2 < 0 WHEN X3 HOLDS MORE CHARS
SA3 B3+B4 GET NEXT WORD
SB3 B3+B1
ZR X3,SREAD EOLN IS NEXT
MX1 48
SB2 -10
BX6 -X1*X3 TEST FOR END OF LINE
ZR X6,*+5 X6 = 0 WHEN WORD ENDS WITH EOLN
BX6 -X0*X3 TEST FOR POSSIBLE END OF LINE
LX3 6
NZ X6,SREAD-2 NO POSSIBLE END OF LINE
RJ WREAD GET NEXT WORD
SB3 B3-B1
ZR X1,*+1 X1 = 0 WHEN THERE IS MORE DATA
SA6 B3+B4 OTHERWISE ADD MISSING EOLN
NZ X6,SREAD X6 <> 0 WHEN THERE IS NO EOLN
SB2 B2+B1 B2 = -9; 9 CHARS ARE IN WORD IN X3
EQ SREAD
SB2 B2+B1 B2 = -9
BX2 X3 EXTRA COPY OF DATA
SB3 B3-B1
SA6 B3+B4 SAVE EOLN
LX2 54
BX4 -X1*X2 TEST EXTENT OF EOLN IN WORD
SB2 B2+B1
ZR X4,*-1 X4 = 0 WHEN THIS IS PART OF THE EOLN
LX3 6
EQ SREAD
SREAD1 SX5 -B1 NO CHAR MESSAGE
NZ B2,SREAD B2 > 0 AT EOR, EOF, OR EOI
SB2 B1
RJ WREAD
NZ X1,SREAD X1 <> 0 AT EOR, EOF, EOI
SB2 B0
BX3 X6
ZR X6,SREAD EOLN
MX0 54
EQ SREAD+4 TEST FOR EOLN
BREAD SPACE 4,19
** BREAD READS EIGHT BITS FROM A BINARY FILE. THESE ARE RETURNED IN
* X5; X5 < 0 AT EOR, EOI, EOF. BREAD ALLOWS ITS INPUT TO CROSS WORD
* BOUNDARIES. IF THE LAST DATA IN THE FILE IS ONLY FOUR BITS, BREAD
* PADS THIS WITH ZEROS, UNLESS THE FOUR BITS ARE 0, IN WHICH CASE IT
* DROPS THEM.
BREAD SPACE 3,10
SX5 -B1 RETURN END OF FILE
EQ BREAD
SB2 B1 FLAG EOF
ZR X5,*-1
LX5 4 AND FILL WITH 0
BREAD PS
PL B2,*-3 END OF FILE?
MX0 56
BX5 -X0*X3 GET NEXT 4 BITS
SB2 B2+B1
MI B2,*+3 B2 < 0 IF THERE IS MORE IN THIS WORD
SB2 -15 1 WORD = 15 * 4 BITS
RJ WREAD GET NEXT WORD
NZ X1,BREAD-1 ADD 0 AT END OF FILE
MX0 56
BX3 X6 TRANSFER WORD READ TO X3
LX3 4
BX4 -X0*X3 GET SECOND FOUR BITS
SB2 B2+B1 UPDATE SHIFT COUNT
LX5 4
BX5 X5+X4 COMBINE TWO PARTS OF 8-BIT DATUM
LX3 4
MI B2,BREAD B2 < 0 UNLESS WE MUST READ A WORD
SB2 B1 PREPARE IN ADVANCE FOR EOR
RJ WREAD
NZ X1,BREAD X1 <> 0 AT EOR, EOF, OR EOI
SB2 -15 15 4-BIT PARCELS PER WORD
BX3 X6 X3 := WORD READ
LX3 4
EQ BREAD
KREAD SPACE 4,19
** KREAD READS FROM A KERMIT-FORMAT BINARY FILE. THE UPPER FOUR BITS
* OF EACH WORD OF SUCH A FILE SHOULD CONTAIN SEVEN MINUS THE NUMBER
* OF 8-BIT BYTES IN THE REST OF THE WORD. HENCE IT IS AN ERROR FOR
* THIS NUMBER TO BE GREATER THAN 6, BUT WE IGNORE SUCH ERRORS. DATA
* ARE RETURNED IN X5; X5 < 0 AT EOR, EOF, EOI.
KREAD SPACE 3,10
MX0 52 MASK OFF EIGHT BITS
LX3 8
BX5 -X0*X3 PUT THEM IN X5
SB2 B2+B1 UPDATE SHIFT COUNT
KREAD PS
MI B2,*-2 B2 < 0 IF MORE BYTES IN THIS WORD
RJ WREAD
NZ X1,*+3 X1 <> 0 AT EOR, EOF, EOI
BX3 X6 X3 := WORD READ
LX3 4
MX0 56
BX5 -X0*X3 X5 := 7 - NUMBER OF BYTES IN THIS WORD
SB2 X5-7 B2 := - NUMBER OF BYTES
EQ *-3
MX5 45 SEND EOR MESSAGE
EQ KREAD
ISAVE SPACE 4,16
** ISAVE SAVES ALL REGISTERS ASSOCIATED WITH AN INPUT FILE; FET - 2
* RECEIVES THE SHIFT COUNT, FET - 1 THE WORD BEING READ, AND FET + 3
* THE ADDRESS OF THE NEXT WORD TO BE READ.
ISAVE SPACE 3,9
SX6 B2
SA6 X1-2 SHIFT COUNT
BX6 X3
SA6 A6+B1 SAVE WORD BEING READ
SX6 B3+B4
SA6 X1+3 OUT
ISAVE PS
SA1 INFI GET FET ADDRESS
EQ ISAVE-2
IREST SPACE 4,18
** IREST RESTORES ALL REGISTERS ASSOCIATED WITH AN INPUT FILE; SHIFT
* COUNT IN B2, B4 := ADDRESS OF WORD AFTER LAST WORD TO BE READ, B3
* IS THE OFFSET FROM B4 OF THE NEXT WORD TO BE READ, AND X3 := WORD
* CURRENTLY BEING READ.
IREST SPACE 3,10
IREST PS
SB2 X1 SHIFT COUNT
SA3 A1+B1 WORD BEING READ
SA2 A3+3 IN
SA4 A2+B1 OUT
SX6 A3+B1 FET ADDRESS
SA6 INFI
SB4 X2 END OF DATA
IX4 X4-X2 OFFSET
SB3 X4
EQ IREST
INSTART SPACE 4,19
** INSTART READS NEW INPUT FROM THE TERMINAL, STORING THE FET ADDRESS
* OF INPUT IN INFI, CALLING FREAD, AND PREPARING THE OUTPUT FET FOR
* NEW OUTPUT, SINCE IT HAS JUST BEEN FLUSHED BY READING FROM INPUT.
* IT RETURNS WITH X7 = 0.
INSTART SPACE 3,11
INSTART PS
SB2 B0
SX2 INPUT ADDRESS OF FET
BX6 X2
SA6 INFI
RJ FREAD FILL BUFFER
SX7 TBUF
RJ SREAD READ DUMMY EOLN
SA7 OUTPUT+2 IN
SA7 A7+B1 OUT; HENCE OUTPUT BUFFER IS EMPTY
BX7 X7-X7
EQ INSTART
TESTFIL SPACE 4,18
** TESTFIL CHECKS WHETHER A LOCAL FILE EXISTS OR NOT. NO REGISTERS
* ARE PRESERVED. ON ENTRY X6 = THE ADDRESS OF THE FET OF THE FILE.
* ON EXIT, X6 CONTAINS THE FILE STATUS: X6 = 0 IF NO FILE WAS FOUND;
* X6 > 0 IF A FILE WAS FOUND.
TESTFIL SPACE 3,10
TESTFIL PS
SA6 UPDAT SAVE FET ADDRESS
STATUS X6
SA2 UPDAT
SA1 X2 GET FET + 0
MX0 42
BX6 X0*X1 X6 := FILE NAME
SX5 B1+B1
SX5 X5+B1 X5 := 3 = BINARY FET FLAG
BX6 X6+X5
SA6 A1 RESTORE FET TO NORMAL
MX0 48
BX6 -X0*X1
AX6 1 X6 CONTAINS DESIRED STATUS
EQ TESTFIL
WWRITE TITLE PRIMARY OUTPUT ROUTINES
** PRIMARY OUTPUT ROUTINES
*
* WWRITE WRITES ONE WORD TO A FILE. IF THIS FILLS THE FILE BUFFER,
* WWRITE FLUSHES IT. THE WORD TO BE WRITTEN IN IN X7; X7 STILL CON-
* TAINS THIS WORD UPON EXIT FROM THIS ROUTINE.
WWRITE SPACE 3,10
WWRITE PS
SA7 B6+B7
SB6 B6+B1
MI B6,WWRITE
SA7 REGIST REGIST CONTAINS X7
MX0 42
SX2 B2
SX4 B3
SX6 B4
SX7 B5
BX2 -X0*X2 REMOVE SIGN EXTENSIONS FROM B REGISTERS
BX4 -X0*X4
BX6 -X0*X6
BX7 -X0*X7
LX6 18
LX7 18
BX6 X6+X2
BX7 X7+X4
SA6 A7+B1 REGIST + 1 CONTAINS B4, B2
SA7 A6+B1 REGIST + 2 CONTAINS B5, B3
BX7 X3
BX6 X5
SA7 A7+B1 REGIST + 3 CONTAINS X3
SA6 A7+B1 REGIST + 4 CONTAINS X5
SA2 OUTFI X2 = FET ADDRESS
SA1 X2+B1
BX6 -X0*X1 X6 = START OF BUFFER
SX7 B7
SA7 A1+B1 IN
SA6 A7+B1 OUT
WRITE X2,R
SA2 OUTFI X2 := FET ADDRESS
MX0 42
SA1 X2+B1
SA3 A1+B1 IN
SA4 A3+B1 OUT
SA5 A4+B1
BX6 -X0*X1 FIRST
BX5 -X0*X5 LIMIT
SA6 A4 SAVE FIRST AS OUT
SB7 X5 END OF BUFFER
SB7 B7-B1
SB6 X6
IX5 X4-X3
PL X5,*+3 X5 > 0 IF THE BUFFER WAS EMPTIED
SA1 X4 OTHERWISE GET NEXT WORD IN BUFFER
BX7 X1
SA7 B6 AND TRANSFER IT TO START OF BUFFER
SX4 X4+B1 UPDATING SOURCE ADDRESS
SB6 B6+B1 AND DESTINATION ADDRESS
SX5 X5+B1 AND WORD COUNT (WHICH SHOULD BECOME 0)
MI X5,*-1 THIS SHOULD NEVER HAPPEN, BUT ...
SB6 B6-B7
SA4 REGIST X4 = (X7)
SA1 A4+B1 X1 = (B4, B2)
SA2 A1+B1 X2 = (B5, B3)
SA3 A2+B1 X3 = (X3)
SA5 A3+B1 X5 = (X5)
BX7 X4
SB2 X1
SB3 X2
LX1 42
LX2 42
SB4 X1
SB5 X2
EQ WWRITE
SWRITE SPACE 4,16
** SWRITE WRITES ONE 6-BIT CHARACTER FROM X5 TO THE CURRENT OUTPUT
* FILE.
SWRITE SPACE 3,10
LX7 6
BX7 X7+X5 ADD CHAR TO OUTPUT WORD
SB5 B5+B1
MI B5,*+1 B5 < 0 IF THE WORD IS NOT YET FULL
RJ WWRITE
SWRITE PS
MI B5,SWRITE-2 B5 < 0 WHEN THE WORD IS NOT FULL
SB5 -9 THERE WILL BE 9 MORE CHARACTERS
BX7 X5 AFTER THIS ONE
EQ SWRITE
SLINE SPACE 4,17
** SLINE WRITES AN END-OF-LINE ON AN ASCII OR DISPLAY CODE FILE, ADD-
* ING A BLANK CHARACTER TO EMPTY LINES AND TO LINES ENDING WITH ANY
* CHARACTER WHOSE LAST SIX BITS ARE ZERO.
SLINE SPACE 3,10
LX7 6 LOOP TO ADD ZEROS
SB5 B5+B1
MI B5,*
RJ WWRITE AND WRITE THE WORD
SLINE PS
MX0 54
BX4 -X0*X7 TEST THE LAST CHAR WRITTEN
NZ X4,*+5 IF IT <> 0 THEN JUST ADD EOLN;
SX4 45 OTHERWISE ADD A BLANK
MI B5,*+2 B5 < 0 IF THE BLANK FITS IN THIS WORD
BX7 X4 THE BLANK IS THE ONLY CHARACTER
LX7 54 ADD NINE ZEROS
EQ SLINE-1 AND WRITE THE WORD
LX7 6
BX7 X7+X4 ADD THE BLANK
SB5 B5+B1
MI B5,*+1 B5 < 0 IF BLANK DOES NOT FILL THIS WORD
RJ WWRITE
PL B5,*+2 B5 >= 0 IF X7 CONTAINS NO CHARACTERS
LX7 6
SB5 B5+B1
MI B5,SLINE-2 B5 < 0 IF END-OF-LINE FITS IN THIS WORD
RJ WWRITE
BX7 X7-X7 WRITE A WORD OF ZEROS
EQ SLINE-1
OSAVE SPACE 4,18
** OSAVE INTERRUPTS WRITING TO A FILE AND SAVES 4 OUTPUT REGISTERS IN
* THE FET AND ITS EXTENSION. AFTER FLUSHING THE WORD BEING WRITTEN,
* CALL THIS ROUTINE TO PREPARE TO CLOSE A FILE. X6 = 0 ON EXIT.
OSAVE SPACE 3,11
OSAVE PS
SA1 OUTFI GET FET ADDRESS
SX6 B6+B7
SB6 B1+B1
SB7 -B6
SA6 X1+B6 IN
SX6 B5
SA6 X1+B7 WORD SHIFT
SA7 A6+B1 OUTPUT WORD
BX6 X6-X6
EQ OSAVE
OREST SPACE 4,17
** OREST PREPARES TO RESUME WRITING TO A FILE BY RESTORING THE OUTPUT
* REGISTERS SAVED BY OSAVE. ON ENTRY X7 CONTAINS THE FET ADDRESS.
* ON EXIT, X6 IS GUARANTEED NOT TO BE ZERO.
OREST SPACE 3,10
OREST PS
SA7 OUTFI SAVE FET ADDRESS AT OUTFI
SB6 B1+B1
SB7 -B6
SA1 X7+B7 SHIFT COUNT
SA2 A1+B1 WORD BEING WRITTEN
SB5 X1
SA1 X7+B6 IN
BX7 X2
SA4 A1+B6
MX0 42
BX4 -X0*X4 ADDRESS OF END OF BUFFER
SB7 X4
IX4 X1-X4 OFFSET
SB6 X4+B1
SB7 B7-B1
SX6 B1 ENSURE THAT X6 <> 0
EQ OREST
OUTSTRT SPACE 4,17
** OUTSTRT PREPARES TO WRITE ON THE FILE OUTPUT; IT ASSUMES THERE IS
* NO TEXT ALREADY WRITTEN TO THIS FILE.
OUTSTRT SPACE 3,11
OUTSTRT PS
SB7 WBUF-2 END OF OUTPUT BUFFER
SB6 1-TBUFL SIZE OF OUTPUT BUFFER
SX7 OUTPUT
SA7 OUTFI
SX6 B6+B7
SA6 OUTPUT+2 IN
SA6 A6+B1 OUT
BX7 X7-X7 NO CHARACTERS WRITTEN
SB5 B0
EQ OUTSTRT
NREAD TITLE SECONDARY INPUT: TRANSLATION AND UTILITIES
** SECONDARY INPUT: TRANSLATION AND UTILITIES
*
* NREAD READS A NUMBER FROM TERMINAL INPUT. IT IS USED WITH THE SET
* COMMAND AND THE OPTIONS DELAY, PACKET-LENGTH, AND RETRY. ON EXIT,
* B5 SHOWS THAT AN END-OF-LINE WAS READ (0) OR A NUMBER (1) OR INPUT
* OF SOME OTHER KIND (-1); THE NUMBER IS IN X7.
NREAD SPACE 3,10
SB5 -B1 ERROR
NREAD PS
BX7 X7-X7
SB5 B0
RJ SREAD GET A CHAR
MI X5,NREAD X5 < 0 AT EOLN
SX4 X5-45 TEST FOR BLANK
ZR X4,*-2 IGNORE LEADING BLANKS
+ SX5 X5-1R0
MI X5,NREAD-1 ALPHABETIC INPUT
SX4 X5-10
PL X4,NREAD-1 NON-DIGIT
SB5 B1 SET DATA FLAG; SOMETHING WAS READ
LX4 B1,X7 X4 := X7 * 2
LX7 3 X7 := X7 * 8
IX7 X7+X4
IX7 X7+X5
RJ SREAD GET NEXT CHAR
MI X5,NREAD EOLN
SX4 X5-45 TEST FOR BLANK
NZ X4,NREAD+4 NO BLANK
EQ NREAD STOP AT BLANK
DREAD SPACE 4,15
** DREAD READS FROM A DISPLAY CODE FILE BUT PRODUCES AN ASCII VALUE.
DREAD SPACE 3,10
DREAD PS
RJ SREAD
MI X5,DREAD EOLN
NZ X5,*+2
IFEQ 1R:,0
SX5 58 COLON
ELSE 2
SX5 B1
LX5 5 BLANK
EQ DREAD
SX5 X5-27 TEST ALPHABETIC
PL X5,*+2 X5 > 0 UNLESS ALPHABETIC
SX5 X5+91
EQ DREAD
SX5 X5-10 TEST FOR DIGITS
PL X5,*+2 X5 > 0 FOR SYMBOLS WHICH ARE NOT DIGITS
SX5 X5+58
EQ DREAD
SA5 X5+DITAB USE TABLE TO CONVERT
EQ DREAD
AREAD SPACE 4,15
** AREAD READS FROM A 6/12 ASCII FILE AND YIELDS STANDARD ASCII CODE.
AREAD SPACE 3,10
RJ SREAD
MI X5,AREAD IGNORE @ + EOLN
SX4 X5-8
PL X4,AREAD1-1 WHEN X4 > 0, @ + X4 IS UNPRINTABLE
SA5 X5+ATTAB
AREAD PS
RJ SREAD GET NEXT CHAR
MI X5,AREAD X5 < 0 AT EOLN, EOR, EOF
SX4 X5-62 TEST FOR UP-ARROW
ZR X4,AREAD1 PROCESS THEM AT AREAD1
SX4 X4+B1
SX4 X4+B1 TEST FOR @
ZR X4,AREAD-3 TEST @ ELSEWHERE
NZ X5,*+2
IFEQ 1R:,0
SX5 58 COLON
ELSE 2
SX5 B1
LX5 5 BLANK SPACE
EQ AREAD
SX5 X5-27 TEST FOR UPPER CASE LETTERS
PL X5,*+2
SX5 X5+91 CONVERT LETTERS
EQ AREAD
SX5 X5-10 TEST FOR DIGITS
PL X5,*+2
SX5 X5+58 CONVERT DIGITS
EQ AREAD
SA5 X5+DITAB CONVERT OTHER SYMBOLS
EQ AREAD
SX5 B1
LX5 5 BLANK
EQ AREAD
AREAD1 RJ SREAD GET NEXT CHAR
MI X5,AREAD IGNORE ^ + EOLN
ZR X5,AREAD1-1 UNDEFINED COMBINATION
SX5 X5-32
PL X5,AREAD UNPRINTABLE CHARACTER
SX5 X5+128
EQ AREAD
EREAD SPACE 4,15
** EREAD READS ASCII CODE FROM AN ASCII8 FILE.
EREAD SPACE 3,10
RJ SREAD GET NEXT CHAR
EREAD PS
RJ SREAD GET NEXT CHAR
MI X5,EREAD EOLN
ZR X5,EREAD-1
MX0 58
BX4 X0*X5 TEST FOR LEGITIMATE ASCII8 CHAR
ZR X4,*+3 X4 = 0 IF OK
PL B2,EREAD-1 GET EOLN NEXT
RJ SREAD
SX5 B1
LX5 5 BLANK
EQ EREAD
MX0 59
BX5 -X0*X5 MASK OFF EIGHTH BIT
ZR X5,EREAD-1
PL B2,*+2 ASSUME THERE SHOULD HAVE BEEN A BLANK
RJ SREAD
SX5 X5+64 RESTORE MISSING BIT
EQ EREAD
LX5 6 X5 := 64
EQ EREAD
SETCHAR SPACE 4,16
** SETCHAR IS USED BY SET WITH OPTIONS BIT-PREFIX, QUOTE-CHAR AND RE-
* PEAT-CHAR.
SETCHAR SPACE 3,10
MX7 58 RETURN ERROR VALUE
SETCHAR PS
MI X5,*-1 END-OF-LINE
RJ AREAD
SX4 X5-32
MI X4,*-3 X4 < 0 FOR UNPRINTABLE CHARACTERS
ZR X4,*-2 X4 - 0 FOR BLANK SPACE
MI B2,*-4 B2 < 0 WHEN MORE INPUT FOLLOWS
SX4 X5-63 PREPARE FOR LEGITIMACY TEST
MI X4,*+3 CONSIDER VALUES < 63 ELSEWHERE
SX4 X5-96
MI X4,*-6 X4 < 0 FOR '?' AND CTRL-POSSIBLES
MX0 53
BX4 -X0-X5
ZR X4,*-7 X4 = 0 FOR DEL
BX7 X5
EQ SETCHAR
SETCTRL SPACE 4,15
** SETCTRL IS USED TO SET ESCAPE AND PACKET-MARKER.
SETCTRL SPACE 3,10
MX7 40
SETCTRL PS
MI X5,*-1 END-OF-LINE
RJ AREAD
SX4 X5-32
MI X4,*-3 LITERAL CONTROL CHARACTERS NOT ALLOWED
ZR X4,*-2 LEADING BLANKS IGNORED
MI B2,*-4 TWO CHARACTERS NOT ALLOWED
SX7 X5-64
MI X7,*-4 CHARS LESS THAN 64 NOT ALLOWED
SX5 X7-32
MI X5,*+3 NEITHER ARE CHARS GREATER THAN 126
ZR X5,*-7
BX7 X5
SX5 X5-27 EXCEPT FOR LOWER CASE LETTERS
PL X5,*-8
SB5 X7
SX5 B1
SA4 ILLEGIT TEST FOR CHARS WITH SPECIAL MEANING
LX5 B5,X5
BX5 X4*X5
ZR X5,SETCTRL X5 = 0 IF THE CHARACTER READ IS GOOD
EQ SETCTRL-1
AWRITE TITLE SECONDARY OUTPUT: TRANSLATION AND UTILITIES
** SECONDARY OUTPUT: TRANSLATION AND UTILITIES
*
* AWRITE WRITES AN ASCII CODE TO A 6/12 FILE.
AWRITE SPACE 3,10
RJ SWRITE
AWRITE PS
MX0 53
BX5 -X0*X5 MASK OFF ANY EIGHTH BITS SET
SX4 X5-13
NZ X4,*+2 TEST FOR CARRIAGE RETURN
RJ SLINE IN WHICH CASE, WRITE END-OF-LINE
EQ AWRITE
SX5 X5-32
PL X5,*+2 IF X5 < 0 THE CHAR IS NOT PRINTABLE
SX5 X5+91 AND NEEDS A CODE AFTER UP-ARROW
EQ AWRITE1
SX5 X5-1
PL X5,*+2 X5 >= 0 IF CHAR IS NOT BLANK
SX5 45
EQ AWRITE-1
SX4 X5-15 X4 IS < 0 FOR SOME NONALPHANUMERIC
IFEQ 1R:,0
MI X4,AWRITE1-1
ELSE 1
MI X4,AWRITE1-4
SX4 X4-10
PL X4,*+2 X4 < 0 FOR DIGITS
SX5 X5+12 WHICH WE CONVERT TO DISPLAY CODE
EQ AWRITE-1
IFEQ 1R:,0,1
ZR X4,AWRITE1-3 COLON
SX5 X5-10
SX4 X5-22
PL X4,*+4 X4 < 0 FOR SOME NONALPHANUMERIC
SX4 X4+B1
MI X4,AWRITE1-1 X4 = 0 FOR AT SYMBOL
SX5 60
RJ SWRITE
SX5 B1
EQ AWRITE-1
SX4 X4-26
PL X4,*+2 X4 < 0 FOR UPPER CASE LETTERS
SX5 X4+27
EQ AWRITE-1
SX5 X5-26
SX4 X5-28
PL X4,AWRITE1 X4 > 0 FOR CHARACTERS WITH UP-ARROW
SX4 X4+B1
MI X4,*+3 X4 = 0 FOR GRAVE ACCENT
SX5 60
RJ SWRITE
SX5 7
EQ AWRITE-1
SX4 X4+B1
SX4 X4+B1
NZ X4,AWRITE1-1 X4 = 0 FOR UP-ARROW SYMBOL
SX5 60
RJ SWRITE
SX5 B1+B1
EQ AWRITE-1
IFNE 1R:,0,2
SX4 X5-5
NZ X4,*+3 X4 = 0 FOR PERCENT SYMBOL
SX5 60
RJ SWRITE
SX5 B1
LX5 2
EQ AWRITE-1
SA5 X5+ASCTAB LOOK UP VALUE IN TABLE
EQ AWRITE-1
AWRITE1 MI B5,*+2 B5 < 0 IF X7 IS NOT YET FULL
SX7 X5+3941
SB5 -8 EIGHT CHARACTERS TO GO IN X7
EQ AWRITE
SX4 62 ADD UP-ARROW TO X7
LX7 6
BX7 X7+X4
SB5 B5+B1
SX5 X5-27 CONVERT X5 TO HOLD APPROPRIATE CODE
MI B5,AWRITE-1 B5 < 0 IF X7 IS NOT YET FULL
RJ WWRITE
BX7 X5
SB5 -9 NINE CHARS TO GO IN X7
EQ AWRITE
ELINE SPACE 4,17
** ELINE WRITES AN END-OF-LINE ON AN ASCII8 FILE. IT ADDS A BLANK
* SPACE TO EMPTY LINES AND TO LINES ENDING WITH ANY CHARACTER WHOSE
* LAST SIX BITS ARE ZERO (NUL AND AT-SYMBOL).
ELINE SPACE 3,10
LX7 12 FILL WORD WITH ZEROS
SB5 B5+B1
MI B5,*
RJ WWRITE THEN WRITE IT
ELINE PS
MX0 54
BX4 -X0*X7
NZ X4,*+5 IF X4 = 0 A BLANK MUST BE ADDED
SX4 B1
LX4 53 X4 CONTAINS LEFT JUSTIFIED ASCII BLANK
MI B5,*+2 B5 < 0 IF THIS WORD IS NOT FULL
BX7 X4
EQ ELINE-1
BX7 X7+X4 ADD THE BLANK TO X7
LX7 12
SB5 B5+B1
MI B5,ELINE-2 B5 < 0 IF EOLN FITS IN THIS WORD
RJ WWRITE
MI B5,ELINE-2
BX7 X7-X7 OTHERWISE WRITE A WORD OF ZEROS
EQ ELINE-1
ZWRITE SPACE 4,16
** ZWRITE COPIES A (DISPLAY OR 6/12 CODE) TEXT WHICH IS TERMINATED BY
* SIX ZERO BITS. ON ENTRY B3 MUST CONTAIN THE ADDRESS OF THE TEXT.
ZWRITE SPACE 3,10
ZWRITE PS
SA3 B3 GET 1ST WORD OF TEXT
SB3 B3+B1
SB2 -10 SHIFT COUNT = 10
MX0 54
LX3 6
BX5 -X0*X3 X5 := NEXT CHAR OF TEXT
SB2 B2+B1
ZR X5,ZWRITE X5 = 0 WHEN THE TEXT IS FINISHED
RJ SWRITE
MI B2,*-2 B2 < 0 WHEN THE NEXT CHAR IS IN X3
EQ *-3 OTHERWISE GET THE NEXT WORD
NWRITE SPACE 4,17
** NWRITE CONVERTS A NUMBER TO DISPLAY CODE AND WRITES IT TO A FILE.
* ON INPUT THE NUMBER MUST BE IN X3 AND THE FILE PARAMETERS IN OUTFI
* AND THE REGISTERS B5, B6, B7, AND X7.
NWRITE SPACE 3,10
MX0 54
LX3 6
BX5 -X0*X3 GET NEXT CHARACTER
BX3 X3-X5 AND REMOVE IT FROM X3
RJ SWRITE
NZ X3,*-2
RJ SLINE WRITE END-OF-LINE
NWRITE PS
SA0 B2 SAVE B2 (USED BY NCONCV)
BX5 X5-X5 AND MAKE X5 := 0
RJ NCONV CONVERT THE NUMBER TO DISPLAY CODE
SB2 A0 RESTORE B2
BX3 X5
EQ NWRITE-3
XWRITE SPACE 4,12
** XWRITE WRITES A SPECIFIED NUMBER OF BLANKS TO A FILE. ON ENTRY B2
* MUST CONTAIN 1 LESS THAN THE NUMBER OF BLANKS DESIRED.
XWRITE SPACE 3,6
RJ SWRITE WRITE ONE BLANK
SB2 B2-B1 DECREMENT COUNT
PL B2,*-1 UNTIL DONE
XWRITE PS
SX5 45 DISPLAY CODE BLANK
EQ XWRITE-2
ZLINE SPACE 4,10
** ZLINE WRITES AN END-OF-LINE, THEN THE ZERO-TERMINATED TEXT WHOSE
* ADDRESS IS IN B3 ON ENTRY.
ZLINE SPACE 3,4
ZLINE PS
RJ SLINE
RJ ZWRITE
EQ ZLINE
NZLINE SPACE 4,10
** NZLINE WRITES THE NUMBER CONTAINED IN X3, THEN AN END-OF-LINE, AND
* THEN THE TEXT WHOSE ADDRESS IS CONTAINED IN B3 ON ENTRY.
NZLINE SPACE 3,4
NZLINE PS
RJ NWRITE THIS WRITES BOTH THE NUMBER AND THE EOLN
RJ ZWRITE PRINT THE TEXT
EQ NZLINE
BCTRLW SPACE 4,18
** BCTRLW IS DESIGNED TO REPORT THAT SOMETHING IS OR BECOMES CTRL-X,
* WHERE 'X' IS AN ASCII CODE LETTER. FIRST IT WRITES THE TEXT WHOSE
* ADDRESS IS IN B3, THEN 14 SPACES, THEN THE TEXT 'CTRL-', THEN THE
* LETTER WHOSE ADDRESS IS IN B4.
BCTRLW SPACE 3,10
SX5 X5+64 CONVERT TO PRINTABLE CHARACTER
RJ AWRITE
BCTRLW PS
RJ ZWRITE PRINT THE TEXT
SB2 13
RJ XWRITE WRITE BLANKS
SB3 CTRLHYP
RJ ZWRITE WRITE 'CTRL-'
SA5 B4
EQ BCTRLW-1
WSTATS SPACE 4,16
** WSTATS WRITES TRANSFER STATISTICS REQUIRED BY THE STATUS COMMAND;
* IT ALSO RECORDS PACKET TRAFFIC IN THE LOG AT END-OF-FILE.
WSTATS SPACE 3,10
WSTATS PS
SB3 TRANSFM+4
RJ ZLINE
SB2 9
RJ XWRITE
SA3 PSENT NUMBER OF PACKETS SENT
RJ NZLINE
SB2 5
RJ XWRITE
SA3 PRECD NUMBER OF PACKETS RECEIVED
RJ NZLINE
SB2 10
RJ XWRITE
SA3 PKERRS NUMBER OF INPUT ERRORS
RJ NZLINE
SB2 10
RJ XWRITE
SA3 RETRYT NUMBER OF RETRIES
RJ NWRITE
RJ SLINE
EQ WSTATS
WFILTYP SPACE 4,16
** WFILTYP WRITES THE NAME OF THE CURRENT FILE TYPE AND END-OF-LINE.
* THE NAME OF THE FILE TYPE FOLLOWS A BLANK SPACE.
WFILTYP SPACE 3,10
SB3 X4+FTLIST+4
RJ ZWRITE WRITE NAME OF FILE TYPE
RJ SLINE WRITE EOLN
WFILTYP PS
SX5 45
RJ SWRITE WRITE BLANK
SA4 FILETYP+1
MX0 58
BX0 -X0*X4
ZR X0,*+1
SX4 X4+B1
LX4 2
AX4 1
EQ *-6
LOGLIN SPACE 4,18
** LOGLIN STARTS A NEW SECTION OF THE LOG. IT DOES NOT PRESERVE ANY
* REGISTER CONTENTS EXISTING AT ENTRY. IT WRITES AN EOLN IF THE LOG
* DID NOT HAVE ONE AFTER THE LAST LINE, THE TIME, AND A SPACE. THE
* OUTPUT REGISTERS ARE SET UP ON EXIT FOR WRITING TO THE LOG.
LOGLIN SPACE 3,10
LOGLIN PS
CLOCK TIMWORD
SX7 ZZZKLOG
RJ OREST PREPARE TO WRITE ON LOG
MI B5,*+1 OREST RETURNS WITH X6 <> 0
MX0 48
BX6 -X0*X7
ZR X6,*+1 X6 = 0 AFTER AN END-OF-LINE
RJ SLINE OTHERWISE WRITE ONE
SA3 TIMWORD
SB5 -9
BX7 X3
RJ WWRITE WRITE THE TIME
SX7 55B AND A BLANK SPACE
EQ LOGLIN
LOGSET SPACE 4,13
** LOGSET STARTS TO LOG A SET COMMAND; IT STARTS A NEW LOG ENTRY AND
* WRITES THE WORD 'SET' FOLLOWED BY A BLANK SPACE.
LOGSET SPACE 3,7
LOGSET PS
RJ LOGLIN SET UP LOG FOR WRITING
SB3 CMDLIST+9 SET
RJ ZWRITE
SX5 45 BLANK
RJ SWRITE
EQ LOGSET
UNIQUE SPACE 4,17
** UNIQUE ENSURES THAT NO FILE HAS A GIVEN NAME (IN X6 ON ENTRY); IF
* THERE IS SUCH A FILE, THE NAME IS REPLACED BY ANOTHER. ANY NAME
* CHANGES ARE LOGGED. THE PROCESS CREATES A FILE ENVIRONMENT TABLE.
UNIQUE SPACE 3,10
UNIQUE PS
SX6 3 BINARY FILE CODE (ALL FILES ARE BINARY)
SA1 DUMMY+1
SA2 A1+B1
BX6 X6+X3 FILE NAME + TYPE
SX5 WBUF ADDRESS OF BUFFER ('IN' AND 'OUT')
BX7 X1
SA6 FILE
SA7 A6+B1
BX7 X5
SA7 A7+B1
SA7 A7+B1
BX7 X2
SA7 A7+B1 LAST (5TH) WORD OF FET
SX5 3RZZZ
LX5 42
BX5 X5-X6 TEST FOR AN ILLEGAL FILE NAME
AX5 42
ZR X5,*+2 X5 = 0 IF THE NAME BEGINS WITH ZZZ
SX6 FILE
RJ TESTFIL TEST FOR EXISTENCE OF FILE
ZR X6,*+3 X6 IS 0 IF THE FILE DOES NOT EXIST
RJ DEFFILE OTHERWISE CREATE A NEW FILE NAME
SA6 FILE
SA2 A3
SX6 X2+B1 AND INCREMENT THE DEFAULT FILE NUMBER
SA6 A2
EQ *-3
SA1 FILE
SA2 FILNAM
BX2 X2-X1 HAS THE NAME BEEN CHANGED?
AX2 18
ZR X2,UNIQUE X2 = 0 IF THE NAME HAS NOT BEEN CHANGED
BX6 X1
SA6 A2
RJ LOGLIN
SB3 FNCHGM NAME OF FILE CHANGED TO
RJ ZWRITE
SB3 FILE
RJ ZWRITE FILENAME
RJ OSAVE
EQ UNIQUE
MAINPRG TITLE MAINPRG -- MAIN COMMAND PROCESSOR
** THE MAIN COMMAND PROCESSOR, MAINPRG, HAS TWO ENTRY POINTS: MAINPRG
* ITSELF IS USED WHEN THE OUTPUT BUFFER CONTAINS DATA AND THE OUTPUT
* REGISTERS ARE SET; MAINPRG-1 IS USED WHEN NEITHER OF THESE CONDI-
* TIONS IS TRUE.
MAINPRG SPACE 3,10
RJ OUTSTRT
MAINPRG SB3 KPROMPT
RJ ZWRITE WRITE THE CYBER KERMIT PROMPT
LX7 12
SX6 B1 AND PREVENT CARRIAGE RETURN
BX7 X7+X6
SB5 B5+B1
SB5 B5+B1
RJ SLINE
RJ OSAVE UPDATE OUTPUT FET FOR AUTOMATIC FLUSHING
SB7 COMTAB PREPARE TO READ ONE OF THE MAIN COMMANDS
RJ INSTART AND FILL THE INPUT BUFFER
CREAD SPACE 4,22
** CREAD UNITES THE TWO COMMAND PROCESSORS. ONE READS TERMINAL INPUT
* AND ONE READS COMMANDS SENT IN PACKETS; KMODE (ARE WE A SERVER) IS
* THE DISTINGUISHING FLAG. BOTH PROCESSORS KEEP THE INPUT REGISTERS
* FOR GETTING DATA FROM THEIR SOURCE. ON ENTRY B7 HOLDS THE ADDRESS
* OF THE WORD BEFORE THE FIRST ACCEPTABLE COMMAND IN A TABLE. AMBI-
* GUOUS COMMANDS REQUIRE AN ENTRY FOR AN AMBIGUOUS STRING; OTHERWISE
* THE FIRST WILL BE CHOSEN. COMMANDS MAY HAVE AT MOST NINE LETTERS.
* SELECTING A COMMAND CAUSES A JUMP TO A LOCATION IN COMSEL.
CREAD SPACE 3,10
CREAD SB6 B7+COMDIFF WHERE TO GO
SB5 -9 MAX CHARS TESTED IN A COMMAND
BX7 X7-X7
SA1 KMODE ARE WE A SERVER
ZR X1,CREAD1 IF NOT, READ
EQ CREAD3
CREAD5 SX4 X5-32 TEST FOR BLANK
NZ X4,*+2
NZ X7,CREAD1+3 A BLANK TERMINATES A COMMAND
EQ CREAD3 UNLESS NOTHING WAS READ
SX4 X5-45 TEST FOR HYPHEN
NZ X4,*+2
NZ X7,CREAD3 A HYPHEN IS IGNORED
JP B6 UNLESS NOTHING WAS READ
SX4 X5-44 TEST FOR COMMAS
ZR X4,CREAD1+2 COMMA, LIKE EOLN, ALWAYS TERMINATES
SX4 X5-58 TEST FOR DIGITS
MI X4,*+6
SX5 X5-64
SX4 X5-27
MI X4,*+1
SX5 X5-32 CHANGE LOWER CASE TO UPPER CASE
MI X5,*+2
ZR X5,*+2
SX4 X5-27 TEST FOR LETTERS
MI X4,*+4
JP B6
SX4 X4+10
MI X4,*-1
SX5 X5-21 CONVERT DIGITS
+ PL B5,CREAD3 IGNORE CHARS BEYOND 9
LX7 6
BX7 X7+X5
SB5 B5+B1
CREAD3 RJ UNPACK GET THE NEXT CHARACTER FROM THE PACKET
MX0 54
PL X5,CREAD5
NZ X7,CREAD1+3
JP B6
CREAD4 SX4 X5-45 TEST FOR BLANK
NZ X4,*+2
NZ X7,CREAD1+3 A BLANK TERMINATES A COMMAND
EQ CREAD1 PROVIDED SOMETHING WAS READ
SX4 X5-1R- TEST FOR A HYPHEN
NZ X4,*+2
NZ X7,CREAD1 IGNORE HYPHENS IN A COMMAND
JP B6 BUT DO NOT ALLOW ONE BEFORE IT
SX4 X5-1R, TEST FOR A COMMA
ZR X4,CREAD1+2 COMMA, LIKE EOLN, ALWAYS TERMINATES
SX4 X5-1R^ TEST FOR UP-ARROW
NZ X4,*+4
RJ SREAD
SX4 X5-27 TEST FOR ALPHABETIC
MI X4,*+3 ERROR UNLESS ALPHABETIC
JP B6
SX4 X5-37 TEST FOR ALPHANUMERIC
PL X4,*-1 ERROR IF NOT
PL B5,CREAD1 IGNORE LETTERS BEYOND 9
LX7 6
BX7 X7+X5 ADD THE LETTER TO THE WORD
SB5 B5+B1
CREAD1 RJ SREAD READ THE NEXT SIX-BIT CHARACTER
MX0 54
PL X5,CREAD4 NOT EOLN
NZ X7,*+1 X7 = 0 IF NO COMMAND WAS READ
JP B6
LX7 6
SB5 B5+B1
LE B5,B0,* LEFT-JUSTIFY COMMAND IN X7
SA1 B5+B7 GET WORD FROM TABLE
ZR X1,CREAD1-4 X1 = 0 WHEN NO COMMAND HAS MATCHED
BX6 X7 MAKE AN EXTRA COPY OF THE COMMAND
LX6 6
BX4 -X0*X6 GET NEXT CHAR FROM COMMAND
NZ X4,*+2 IF THERE IS NONE, MATCH IS FOUND
SB6 B6+B5
JP B6
LX1 6
BX2 -X0*X1 GET NEXT CHAR FROM TABLE
BX2 X2-X4 AND COMPARE IT WITH X4
ZR X2,*-3 KEEP GOING IF THEY MATCH
SB5 B5+B1 OTHERWISE TRY THE NEXT TABLE ENTRY
EQ *-5
LOGPACK TITLE PACKET HANDLING ROUTINES
** LOGPACK IS USED BY THE DEBUG FACILITY TO LOG PACKET DATA. B4 CON-
* TAINS ON ENTRY THE ADDRESS OF THE FIRST WORD IN THE PACKET (AFTER
* THE PACKET SYNC-MARKER). THE END OF THE DATA IS MARKED BY A NEGA-
* TIVE CHARACTER.
LOGPACK SPACE 3,10
RJ AWRITE WRITE THE CHARACTER IN THE LOG
SB4 B4+B1
SA5 B4 AND GET THE NEXT CHARACTER
PL X5,*-1
SB3 EOPMSG MARK POSITION OF END-OF-PACKET
RJ ZWRITE
SB4 B4-B1
RJ SLINE
SX6 -B1
SA6 B4 CANCEL CHECKSUM CHARACTER
RJ SLINE
RJ OSAVE
LOGPACK PS
SA5 B4
PL X5,*-7 X5 <= 0 WHEN NO DATA FOLLOWS SYNCM
SB3 NOTHIGM
RJ ZWRITE
SB4 B4+B1
EQ LOGPACK-3
SENDPACK SPACE 4,18 X
** SENDPACK IS USED TO SEND A PACKET. IT SETS UP OUTPUT, WRITES ANY
* PADDING CHARACTERS REQUIRED BY THE PROTOCOL, SENDS A SYNC MARKER,
* COMPUTES AND SENDS A CHECKSUM CHARACTER, SENDS ANY REQUIRED TERMI-
* NATION CHARACTER, AND LOGS THE PACKET IF DEBUG IS SET ON.
SENDPACK SPACE 3,10
SENDPACK PS
SA4 NPAD WRITE PADDING CHARACTERS?
RJ OUTSTRT
ZR X4,*+3 X4 = 0 IF THERE ARE NO PAD CHARACTERS
SA3 A4+B1
SB2 X4 USE B2 TO COUNT THEN
BX5 X3
RJ AWRITE WRITE A PAD CHARACTER
SB2 B2-B1
NZ B2,*-1 B2 <> 0 IF WE NEED MORE PAD CHARS
SA5 SYNCM
RJ AWRITE WRITE THE PACKET SYNCHRONISATION MARKER
SA5 CBUF
SB4 X5-32
SB3 B1-B4
SB2 X5
SB4 A5+B4
RJ AWRITE WRITE THE FIRST CHARACTER
SA5 B3+B4 GET A CHARACTER
SB2 X5+B2 UPDATE THE CKECKSUM
RJ AWRITE WRITE THE CHARACTER
SB3 B3+B1 INCREMENT THE OFFSET
MI B3,*-1
MX0 52 COMPUTE THE CHECKSUM
SX5 B2
BX5 -X0*X5
BX4 X5
AX4 6
IX6 X5+X4
MX1 54
BX6 -X1*X6
SX4 B1
LX4 5
IX6 X6+X4 AND THE CHECKSUM CHARACTER
SA6 B7
BX5 X6
SA6 B4
SX6 -B1
SA6 A6+B1 ENSURE THAT BUFFER CONTENTS END WITH -1
RJ AWRITE WRITE THE CHECKSUM
SA1 PSENT
SX6 X1+B1
SA6 A1 INCREMENT COUNT OF PACKETS SENT
SA5 EOLN
MI X5,*+2
RJ AWRITE SEND HIS EOLN IF NECESSARY
RJ SLINE
SA3 DEBUGW
RJ OSAVE
ZR X3,SENDPACK X3 = 0 IF THE PACKET NEED NOT BE LOGGED
RJ LOGLIN
SB3 PACKNUM-1 WRITE 'SEND PACKET NUMBER'
RJ ZWRITE
SB4 CBUF
SA3 B4+B1
SX3 X3-32
RJ NWRITE WRITE PACKET NUMBER
SB2 10
RJ XWRITE
RJ LOGPACK COPY PACKET
EQ SENDPACK
ACKIT SPACE 4,15
** ACKIT SENDS ACKNOWLEDGEMENT FOR A PACKET RECEIVED.
ACKIT SPACE 3,10
SA7 CBUF
SA1 CURN ACKNOWLEDGEMENT HAS CURRENT PACK NUMBER
SX7 X1+32
SX6 89 Y = ACK
SA7 A7+B1
SA6 A7+B1
RJ SENDPACK
ACKIT PS
SX7 35 PACKET = 3 WORDS LONG
EQ ACKIT-3
TERMIN SPACE 4,16
** TERMIN SENDS ACK FOR LAST PACKET RECEIVED, THEN WRITES IN THE LOG
* THE TEXT WHOSE ADDRESS IS IN X6 ON ENTRY.
TERMIN SPACE 3,10
TERMIN SA6 UPDAT STORE TERMINATING MESSAGE
RJ ACKIT
SA1 RETRYT UPDATE TOTAL RETRY COUNT
SA2 A1+B1
IX6 X1+X2
SA6 A1
BX7 X7-X7
SA7 CURN SET PACKET NUMBER TO 0
SA7 A2
RJ LOGLIN WRITE IN LOG
SA3 UPDAT AFTER RECOVERING ADDRESS OF MESSAGE
SB3 X3
RJ ZWRITE WRITE END-OF-LINE
TERMIN1 RJ OSAVE AND SAVE PLACE IN OUTPUT FILE
SA1 FILETYP+1
BX6 X1 RESTORE FILE TYPE (NEEDED ONLY RARELY)
SA6 A1-B1
SA1 KMODE
NZ X1,RECCOM2 IF X1 <> 0, YOU ARE A SERVER
SX7 OUTPUT OTHERWISE PREPARE TO WRITE ON OUTPUT
RJ OREST (CAN'T USE MAINPRG-1 IF ACK IS SENT)
EQ MAINPRG
MYPARM SPACE 4,18
** MYPARM SENDS A PACKET CONTAINING THE CYBER KERMIT (MY) PARAMETERS.
* ON ENTRY X7 CONTAINS THE TYPE OF PARAMETER (SEND-INIT OR ACK), AND
* X0 MUST = 32. ON EXIT A7 CONTAINS THE ADDRESS BEFORE THAT OF THE
* REPEAT PREFIX IN THE OUTGOING PACKET.
MYPARM SPACE 3,10
MYPARM PS
SX6 44 LENGTH OF MY PACKET
SA6 CBUF
SA1 PLENGTH MAXIMUM LENGTH I WANT TO RECEIVE
BX6 X0
SA6 A6+B1 SEQUENCE NUMBER
SA7 A6+B1 YES OR SEND
IX7 X0+X1
SA1 TIMEOUT
SA7 A7+B1 MY MAXL
IX7 X0+X1
SA7 A7+B1 REQUESTED TIMEOUT LIMIT
SA6 A7+B1 NUMBER OF PAD CHARS
LX6 1
SA6 A6+B1 DEFAULT PAD CHARACTER
SX6 45
SA6 A6+B1 END-OF-PACKET IS END-OF-LINE
SA1 QUOTEC
SA2 BITPREF
BX6 X1
BX7 X2
SA6 A6+B1 MY QCTL
SA7 A6+B1 MY QBIN
SX7 49
SA7 A7+B1 DEFAULT CHECKSUM TYPE
EQ MYPARM
YOURPAR SPACE 4,16
** YOURPAR PROCESSES THE MICRO KERMIT'S (YOUR) PARAMETERS. ON ENTRY
* X0 MUST BE 32. ON EXIT X2 CONTAINS THE VALUE OF YOUR REPEAT-CHAR.
YOURPAR SPACE 3,10
SA7 QBIN
YOURPAR PS
SA1 CBUF+96 HOW LONG IS YOUR PACKET
IX1 X1-X0
SB6 X1
SX7 -B1
SB7 -10
SA7 A1+B6
SA7 A7+B1
SB7 B7+B1
MI B7,* ENSURE WE DON'T GET BAD DATA
SA1 CBUF+99 CHAR (HIS MAXL)
IX1 X0-X1
BX7 -X1
MI X1,*+1
SX7 80 DEFAULT PACKET LENGTH
SA7 SLENGTH
SA0 A1+B1 IGNORE HIS TIME
SA2 A0+B1 CHAR (HIS NPAD)
IX3 X0-X2
LX7 B1,X0 X7 := 64
SA2 A2+B1 CTRL (HIS PADC)
BX7 X7-X2
BX6 -X3
MI X1,*+1
BX6 X6-X6 DEFAULT NUMBER OF PAD CHARS
IX2 X0-X2
MI X2,*+1
BX7 X7-X7 DEFAULT PAD CHAR
SA6 NPAD AMOUNT OF PADDING
SA7 A6+B1 CONTENT OF PADDING
SA2 A2+B1 CHAR (HIS EOLN)
IX2 X0-X2
BX7 -X2
SX5 13 DEFAULT EOLN
SA1 A2+B1 HIS QCTL
MI X2,*+1
BX7 X5
BX5 X5-X7
NZ X5,*+1
MX7 44
SA7 A7+B1 HIS EOLN
BX6 X1
IX5 X0-X1
SA1 A1+B1 HIS QBIN
MI X5,*+1
SX6 35 DEFAULT QCTL
SA6 QCTL
BX7 X1
SA0 A1+B1 IGNORE HIS CHECKSUM TYPE
SA2 A0+B1 HIS RPCH
BX6 X2
SX3 X7-89 TEST FOR AFFIRMATION
NZ X3,*+1
SX7 38 DEFAULT QBIN
IX1 X0-X1
MI X1,*+1
MX7 49 SET QBIN TO NO BIT-PREFIX
SX3 X7-78 CHECK FOR REFUSAL
ZR X3,*-1 IF SO, USE DEFAULT
PL X7,YOURPAR-1
SA3 FILETYP+1
ZR X3,YOURPAR-1
MX1 58 X1 := -3
IX1 X1+X3
PL X1,YOURPAR-1
SX6 BINERM BINARY FILES MUST USE BIT-PREFIXING
SENDERR SPACE 4,16
** SENDERR TERMINATES A PROCESS BY SENDING AN ERROR PACKET CONTAINING
* THE MESSAGE WHOSE ADDRESS IS IN X6 ON ENTRY.
SENDERR SPACE 3,10
SENDERR SA6 UPDAT
SX7 69 ERROR MESSAGE
SA4 SLENGTH
SB7 X4+CBUF-5 LIMIT OF PACKET SIZE (PLUS SAFE MARGIN)
SA7 CBUF+2
SB6 A7-B7
SB6 B6+B1
SB5 B1
SB3 X6
SB2 B0
BX7 X7-X7
SA7 CURN
RJ PREAD GET 1ST CHAR OF ERROR MESSAGE
BX7 X5
RJ PACKTEX PUT REST OF MESSAGE INTO PACKET
SX5 B1
LX5 5
RJ PUTVAL INCLUDING LAST CHAR (UNLESS BLANK)
SX6 B1
SX7 B6+B7
SX7 X7+32-CBUF 1ST CHAR OF PACKET
LX6 5 X6 := 32
SA7 CBUF
SA6 A7+B1 SEQUENCE
RJ SENDPACK
EQ TERMIN+1
RETRINC SPACE 4,14
** RETRINC INCREMENTS THE RETRY COUNT AND ABORTS IF TOO MANY OCCUR.
RETRINC SPACE 3,9
RETRINC PS
SA2 RETRYC CURRENT RETRIES
SA1 A2+B1 MAXIMUM ALLOWED RETRIES
SX6 X2+B1
SA6 A2
IX2 X2-X1
MI X2,RETRINC X2 < 0 UNTIL THE LIMIT IS REACHED
SX6 RETRYM
EQ SENDERR IN THAT CASE, ABORT
INTTEST SPACE 4,14
** INTTEST TESTS (PACKET) TERMINAL INPUT FOR THE CYBER KERMIT INTER-
* RUPT SEQUENCE; IT SHOULD BE CALLED ONLY IF THE CHAR (IN X5) < 32.
INTTEST SPACE 3,8
INTTEST PS
SA4 ESCAPEC
BX6 X4-X5
NZ X6,INTTEST X6 <> 0 IF THE INPUT CHAR IS NOT ESCAPEC
SA6 KMODE
SX6 INTERM
SA6 UPDAT
EQ TERMIN+1
GETPACK SPACE 4,21
** GETPACK READS AND CHECKS OUT A PACKET 'INTERNALLY', THAT IS, WITH
* NO ATTEMPT TO VERIFY THAT THIS PARTICULAR PACKET IS APPROPRIATE AT
* THIS POINT IN THE PROTOCOL. IF A PUTATIVE PACKET STARTS WITH THE
* SYNC MARKER, CONTAINS THE NUMBER OF CHARACTERS CODED IN ITS NEXT
* ELEMENT, HAS TYPE AND SEQUENCE CODES IN THE CORRECT RANGES, ALL
* INTERNAL CHARACTERS PRINTABLE, AND THE CORRECT CHECKSUM, THEN X1 =
* 0 ON RETURN; OTHERWISE X1 <> 0.
GETPACK SPACE 3,10
NORECP SA1 DEBUGW
ZR X1,*+4 X1 = 0 IF DEBUG IS NOT ON
SX7 -B1
SA7 B6+B7 TERMINATE THE FAILURE FOR LOGGING
RJ LOGLIN
SB3 RECEIVM 'RECEIVED'
RJ ZWRITE
SB4 CBUF+96
RJ LOGPACK PRINT WHAT WAS RECEIVED
SA1 CBUF+96
MI X1,*+2 INCREMENT ERROR COUNT ONLY IF DATA READ
SA1 PKERRS
SX6 X1+B1
SA6 A1
RJ RETRINC INCREMENT RETRY COUNT
GETPACK PS
SB6 CBUF+96
RJ INSTART READ SOMETHING
SX6 -B1 ENSURE END OF BUFFER IS FLAGGED
SA6 B6
SA4 SYNCM GET SYNC MARKER
BX7 X4
SB7 B0
SB5 CBUF+64
RJ AREAD GET NEXT ASCII CHAR INPUT
MI X5,NORECP X5 < 0 AT END-OF-INPUT
BX4 X5-X7 IS IT A SYNC MARKER
ZR X4,*+2 X4 = 0 IF IT IS A SYNC MARKER
RJ INTTEST IF NOT, IS IT ESCAPE
EQ *-3
RJ AREAD GET LENGTH OF PACKET
SX4 X5-32
PL X4,*+3 X4 > 0 WHEN CHARACTER IS PRINTABLE
GETPCK1 MI X5,NORECP X5 < 0 AT END-OF-INTPUT
RJ INTTEST IS IT AN INTERRUPT
EQ NORECP IF NOT, NO PACKET RECEIVED
MX0 53
BX0 -X0-X5 TEST FOR DEL
ZR X0,NORECP X0 = 0 WHEN 'DEL' IS READ
BX7 X5
SA7 B6
SB7 X5+B5 ADDRESS OF LAST CHAR
SB6 B6-B7
SB6 B6+B1 OFFSET
SX4 B6+B1
PL X4,NORECP NOT LONG ENOUGH FOR A PACKET
SB5 X5 START CHECKSUM
RJ AREAD GET SEQUENCE NUMBER
SX4 X5-32
MI X4,GETPCK1 INTERRUPT OR ERROR
SX4 X5-96 TEST FOR LEGITIMATE SEQUENCE NUMBER
PL X4,NORECP (IN THE REANGE 32 - 95)
BX7 X5
SA7 B6+B7
SB6 B6+B1
SB5 X5+B5 ADD TO CHECKSUM
RJ AREAD GET PACKET TYPE
SX4 X5-65
MI X4,GETPCK1 ACCORDING TO THE PROTOCOL,
SX4 X4-26 PACKET TYPES MUST BE
PL X4,NORECP IN THE RANGE 65 -- 90
BX7 X5
SA7 B6+B7
SB6 B6+B1
SB5 X5+B5
PL B6,*+4 TIME FOR CHECKSUM
RJ AREAD GET NEXT CHARACTER IN PACKET
SX4 X5-32
MI X4,GETPCK1 IT MUST BE PRINTABLE
MX0 53
BX0 -X0-X5 TEST FOR DEL
NZ X0,*-3
EQ NORECP
RJ AREAD GET CHECKSUM
MX0 52 AND COMPUTE CHECKSUM OF DATA RECEIVED
SX7 B5
BX7 -X0*X7
BX4 X7
AX4 6
IX7 X7+X4
MX1 54
BX7 -X1*X7
SX7 X7+32
BX4 X5-X7
BX7 X5
SA1 DEBUGW
NZ X1,*+4 X1 <> 0 IF DEBUGGING IS TO BE DONE
MX6 57
SA6 B7
NZ X4,GETPACK-2 THERE WAS AN ERROR IN THE CHECKSUM
SA2 PRECD THERE WAS NO ERROR; SUCCESS IS OURS!
SX6 X2+B1
SA6 A2
EQ GETPACK (NOTE THAT X1 IS ALREADY = 0)
MX6 57
SA7 B7
SA6 A7+B1
NZ X4,GETPCK2 X4 <> 0 IF THERE WAS A CHECKSUM ERROR
RJ LOGLIN
SB3 RECEIVM
RJ ZWRITE 'RECEIVED'
SB3 PACKNUM
RJ ZWRITE 'PACKET NUMBER'
SB4 CBUF+96
SA3 B4+B1
SX3 X3-32
RJ NWRITE WRITE PACKET NUMBER
SB2 10
RJ XWRITE
RJ LOGPACK
BX1 X1-X1 RETURN ZERO
EQ *-10 UPDATE RECEIVED COUNT BEFORE LEAVING
GETPCK2 RJ LOGLIN
SB3 CKERRM REPORT CHECKSUM ERROR
RJ ZWRITE
RJ SLINE
SB2 10
RJ XWRITE
EQ GETPACK-5 AND RECORD WHAT WAS RECEIVED
REQUESP SPACE 4,25
** REQUESP IS SLIGHTLY MORE SOPHISTICATED THAN GETPACK. IF NO PACKET
* WAS RECEIVED, IT RETRIES. THEN FOR PACKETS OF TYPE C-G-I-K-R-S IT
* RETURNS (WITHOUT CHECKING THE PACKET'S SEQUENCE NUMBER) WITH X1 <>
* 0. FOR E-PACKETS (ALSO WITHOUT CHECKING THE SEQUENCE NUMBER) IT
* TERMINATES THE CURRENT PROCESS (WITHOUT RETURNING) AFTER LOGGING
* THE ERROR MESSAGE. IT CONSIDERS ALL OTHER PACKETS LEGITIMATE WHEN
* THEY ARE IN PROPER SEQUENCE; IT DOES NOT RETURN AFTER RECEIVING A
* B-PACKET, AND IT RETURNS WITH X1 = 0 FOR D-F-Z AND OTHER PACKETS.
* AFTER RECEIVING A PACKET WITH AN INCORRECT SEQUENCE NUMBER, WE NAK
* THE EXPECTED PACKET AND TRY AGAIN. REQUESP RETURNS WITH A2 = CBUF
* + 98, X2 = PACKET TYPE, AND X0 = 32.
REQUESP SPACE 3,10
RECERR SA6 UPDAT SAVE ERROR MESSAGE
EQ REQUSP1
REQUESP PS
RJ GETPACK READ A PACKET
SX0 B1
LX0 5 X0 := 32
NZ X1,REQUSP2+1 X1 <> 0 IF NO PACKET WAS RECEIVED
SA1 PTYPES
SA2 CBUF+98 GET PACKET TYPE
SB2 X2-69
LX3 B2,X0
BX1 X1*X3 TEST FOR THE RESERVED PACKET TYPES
NZ X1,REQUSP2-2 (C, E, G, I, K, R, S)
SA3 CURN IF NOT RESERVED, THEN TEST:
SA1 A2-B1 GET SEQUENCE NUMBER AS CODED
IX1 X1-X0
BX1 X1-X3 TEST FOR CORRECT SEQUENCE NUMBER
NZ X1,REQUSP2 IF INCORRECT NAK AND TRY AGAIN
SX3 X2-66 TEST FOR BREAK
NZ X3,REQUESP IF NOT BREAK, RETURN (WITH X1 = 0)
SX6 BREAKM IF BREAK, REPORT IT
SA6 UPDAT
RJ ACKIT ACKNOWLEDGE RECEIPT OF PACKET
REQUSP1 SA2 RETRYT
SA1 A2+B1 UPDATE RETRY COUNTS
IX6 X2+X1
BX7 X7-X7
SA6 A2
SA7 A1 UPDATE ERROR COUNTS
RJ LOGLIN SET UP LOG FOR WRITING
SA1 UPDAT
SB4 CBUF+99
SB3 X1
RJ ZWRITE REPORT CAUSE OF TERMINATION
BX3 X3-X3
SB2 B1
RJ UNPACK
EQ *+2
RJ AWRITE AND RECORD ANY MESSAGES RECEIVED
RJ UNPACK
SX4 X5-32
PL X4,*-2 UNTIL X4 < 0 AT END-OF-PACKET
EQ TERMIN1
SX4 X2-69 TEST FOR ERROR PACKET
NZ X4,REQUESP OTHERWISE RETURN (WITH X1 <> 0)
SX6 ERRORM
EQ RECERR
REQUSP2 RJ RETRINC TEST NUMBER OF FAILURES
SA1 CURN
SX7 35
SX6 78 NO = NAK
SA7 CBUF
IX7 X0+X1
SA7 A7+B1
SA6 A7+B1
RJ SENDPACK SEND NAK OF EXPECTED PACKET
EQ REQUESP+1 AND TRY AGAIN
SENDWAC SPACE 4,17
** SENDWAC SENDS A PACKET AND INSISTS ON ACKNOWLEDGEMENT. ON ENTRY,
* X2 CONTAINS THE TYPE OF PACKET IN ASCII, AND B6 + B7 = THE ADDRESS
* OF THE CHECKSUM CHARACTER IN THE BUFFER. ON EXIT, A1 = CBUF + 98.
SPACE 3,10
SENDWAC PS
SA7 XSTORE XSTORE CONTAINS X7
BX7 X3
BX6 X5
SA7 A7+B1 XSTORE + 1 CONTAINS X3
SA6 A7+B1 XSTORE + 2 CONTAINS X5
SX4 B2
SX5 B3
SX6 B4
SX7 B5
MX0 42
BX4 -X0*X4 MASK OFF ALL BUT 18 BITS
BX5 -X0*X5
BX6 -X0*X6
BX7 -X0*X7
LX6 18
LX7 18
BX6 X6+X4
BX7 X7+X5
SA6 A6+B1 XSTORE + 3 CONTAINS B4, B2
SA7 A6+B1 XSTORE + 4 CONTAINS B5, B3
SA1 INFI
BX7 X1
SA7 A7+B1 XSTORE + 5 CONTAINS ADDR OF FILE FET
SA3 RETRYT
SA4 A3+B1
IX6 X3+X4
BX7 X7-X7
SA6 A3
SA7 A4 UPDATE RETRY COUNT FOR NEW PACKET
SA1 CURN
SX7 X1+32 PACKET NUMBER
SA7 CBUF+1
BX7 X2
SX6 B6+B7 ADDRESS OF CHECKSUM
SX6 X6+32-CBUF
SA6 A7-B1 1ST WORD OF PACKET
SA7 A7+B1 PACKET TYPE
EQ SENDWA1+1
SENDWA3 SX3 X1-78 NO
ZR X3,*+3
SA3 X1-69 TEST FOR ERROR PACKET
NZ X3,FATALE ANY OTHER KIND IS A DISASTER
SX6 ERRORM
EQ RECERR
SA3 A1-B1 CHECK NUMBER OF RECEIVED PACKET
SX4 X3-32
BX5 X2-X4
ZR X5,SENDWA1 X5 = 0 WHEN THE NUMBER IS CORRECT
MX0 54
SX6 X2+B1
BX6 -X0*X6
BX5 X4-X6
ZR X5,SENDWA2 X5 = 0 WHEN YOU NAK THE SUCCESSOR
FATALE SX6 KDATERM
EQ SENDERR ABORT WITH ERROR MESSAGE
SENDWA1 RJ RETRINC INCREMENT RETRY COUNT
RJ SENDPACK (RE)SEND
RJ GETPACK ASK FOR ACKNOWLEDGEMENT
NZ X1,*-2 REPEAT IF NOTHING RECEIVED
SA1 CBUF+98 GET TYPE OF PACKET RECEIVED
SA2 CURN
SX3 X1-89 Y = ACK
NZ X3,SENDWA3 X3 <> 0 IF THIS WAS NOT AN ACK
SA3 A1-B1 GET SEQUENCE NUMBER RECEIVED
SX6 X2+B1
SX4 X3-32
BX5 X4-X2 DID WE RECEIVE ACK OF PACKET SENT
MX0 54
ZR X5,SENDWA2 YES
SX4 X4+B1
BX4 -X0*X4
BX5 X2-X4 OR ACK OF PREVIOUS PACKET
ZR X5,SENDWA1 IF SO REPEAT
EQ FATALE OTHERWISE ABORT
SENDWA2 BX6 -X0*X6 (MAKE 64 = 0)
SA6 A2 UPDATE CURRENT PACKET NUMBER CURN
SA3 RETRYT
SA4 A3+B1
IX6 X3+X4
BX7 X7-X7
SA6 A3 RESTART ERROR COUNT
SA3 SLENGTH
SB7 X3+CBUF-5
SB6 CBUF+3 PREPARE TO SEND A PACKET
SB6 B6-B7
SA7 A4
SA2 XSTORE AND RESTORE ALL INPUT REGISTERS
BX7 X2
SA3 A2+B1
SA5 A3+B1
SA2 A5+B1
SA4 A2+B1
SB2 X2
SB3 X4
LX2 42
LX4 42
SB4 X2
SA2 A4+B1 GET FORMER CONTENTS OF INFI
BX6 X2
SA6 INFI
SB5 X4
EQ SENDWAC
PTVWAC SPACE 4,16
** PTVWAC STORES A VALUE IN A PACKET, SENDING THE PACKET AND GETTING
* IT ACKNOWLEDGED WHEN THE PACKET IS FULL.
PTVWAC SPACE 3,10
PTVWAC PS
RJ PUTVAL
MI B6,PTVWAC B6 < 0 IF THE PACKET IS NOT YET FULL
SX2 68 D = DATA
RJ SENDWAC SEND AND GET ACK
SX4 X1-89 Y = ACK
NZ X4,PTVWAC1 IGNORE NAK PACKETS
SA1 A1+B1 GET 1ST DATA WORD
MI X4,PTVWAC1 IGNORE ACKS WITH NO DATA
SX4 X4+B1 X = ABANDON
SX1 X4-2 Z = ABANDON
ZR X4,PUTEOF1 WE ARE HERE INSTRUCTED TO ABORT SENDING
ZR X1,PUTEOF1 THE FILE
PTVWAC1 BX4 X5-X7 TEST THAT REPEATED CHARACTER DOESN'T
ZR X4,PTVWAC OVERFLOW INTO NEXT PACKET (WHEN X4 <> 0)
EQ PTVWAC+1 NOT YET DONE
PZWRITE SPACE 4,15
** PZWRITE TRANSFERS A ZERO-TERMINATED MESSAGE TO A PACKET. ON ENTRY
* THE ADDRESS OF THE MESSAGE SHOULD BE IN B3.
PZWRITE SPACE 3,9
RJ PTVWAC
RJ PREAD
NZ X5,*-2 X5 <> 0 BEFORE THE TEXT TERMINATES
SX5 B1
LX5 5 X5 := ASCII BLANK
RJ PTVWAC ENSURE LAST CHAR IS STORED
PZWRITE PS
SB2 B0 FLAG NEED TO FETCH NEXT WORD OF TEXT
EQ *-4
PLINE SPACE 4,15
** PLINE STORES A PROTOCOL END-OF-LINE IN A PACKET AFTER FLUSHING THE
* OUTPUT REGISTER X7.
PLINE SPACE 3,9
PLINE PS
SX5 B1
LX5 5 X5 := BLANK
RJ PTVWAC THIS DOES NOT PUT THE BLANK BUT THE
SX7 13 PREVIOUS CHARACTER (UNLESS IT WAS BLANK)
SX5 10 THEN ADD THE CR/LF SEQUENCE REQUIRED
SB5 B1
RJ PTVWAC
EQ PLINE
PZLINE SPACE 4,10
** PZLINE PUTS INTO A PACKET AN END-OF-LINE FOLLOWED BY A TEXT WHOSE
* ADDRESS IS IN B3 ON ENTRY.
PZLINE SPACE 3,4
PZLINE PS
RJ PLINE
RJ PZWRITE
EQ PZLINE
PNWRITE SPACE 4,17
** PNWRITE CONVERTS A (BINARY) NUMBER TO ASCII AND STORES IT IN THE
* OUTGOING PACKET, SENDING THE PACKET WHEN IT IS FULL, IF NECESSARY.
* THE NUMBER MUST BE IN X3 ON ENTRY.
PNWRITE SPACE 3,10
MX0 54
LX3 6
BX5 -X0*X3 GET THE NEXT DIGIT
BX3 X3-X5 AND REMOVE IT FROM X3
SX5 X5+21 CONVERT IT TO ASCII
RJ PTVWAC STORE IT
NZ X3,*-2 AND REPEAT UNTIL X3 IS EMPTY
RJ PLINE THEN PUT END-OF-LINE
PNWRITE PS
SA0 B2 SAVE CONTENTS OF B2
BX5 X5-X5
RJ NCONV AND CALL NCONV
SB2 A0
BX3 X5 PUT THE RESULT IN X3
EQ *-5 AND CONVERT IT
SENDINIT TITLE MORE SPECIALISED PACKET HANDLERS
** SENDINIT PERFORMS NEGOTIATIONS AT THE START OF A FILE TRANSFER IF
* I AM SENDING A FILE AND YOU ARE RECEIVING ONE.
SENDINIT SPACE 3,10
SA6 A1-B1 SAVE REPETC
SA7 CURN AND NEW PACKET NUMBER
SB2 B0
SENDINIT PS
SX0 B1
LX0 5 X0 := 32
RJ MYPARM SEND MY PARAMETERS
SA1 REPETC
BX7 X1
SA7 A7+B1 AND THE REPEAT PREFIX
EQ *+3
SX1 X2-69 TEST FOR ERROR TYPE
SX6 ERRORM
ZR X1,RECERR X1 = 0 IF AN ERROR PACKET IS RECEIVED
RJ RETRINC OTHERWISE INCREMENT RETRIES
RJ SENDPACK SEND MY PARAMETERS
RJ GETPACK AND TRY TO GET YOURS
NZ X1,*-2 X1 MUST EQUAL 0
SA2 CBUF+98
SX1 X2-89 Y = ACK MUST BE THE TYPE OF PACKET REC'D
NZ X1,*-5
SA1 A2-B1 SEQUENCE
SX0 B1
LX0 5 X0 := 5
BX1 X1-X0 SEQUENCE MUST BE 0
NZ X1,*-6
RJ YOURPAR PROCESS YOUR PARAMETERS
SA1 REPETC
BX1 X2-X1 DOES HE ACCEPT REPETITION
SX7 B1
ZR X1,SENDINIT-1
MX6 50 IF NOT, CHOOSE A SAFE NEGATIVE NUMBER
EQ SENDINIT-1
NONEXT SPACE 4,13
** NONEXT REPORTS THAT A FILE DOES NOT EXIST.
NONEXT SPACE 3,8
NONEXT SX6 NONEXTM
+ SA3 KMODE ARE YOU A SERVER
NZ X3,SENDERR IF SO, SEND AN ERROR PACKET
SB3 X6 OTHERWISE
RJ OUTSTRT PREPARE TO WRITE ON OUTPUT
RJ ZLINE
RJ SLINE
EQ MAINPRG AND START OVER
SENDSUB SPACE 4,19
** SENDSUB PREPARES TO SEND DATA TO ANOTHER KERMIT; WHEN IT IS CALLED
* IT EXPECTS ZZZKLOG TO BE SET UP FOR WRITING AND B3 TO CONTAIN THE
* ADDRESS OF 'SEND' OR 'TYPE'. AFTER LOGGING THE FILE NAME IT MAKES
* AN FET AND TESTS FOR THE FILE'S EXISTENCE. IF IT EXISTS, WE SEND
* A SEND-INITIATION PACKET, PROCESS THE REPLY, AND OPEN THE FILE.
SENDSUB SPACE 3,10
BX6 X4
SA6 A4+B1 STORE THE FILE NAME IN 'LAST FILE' ADDR
RJ ISAVE AND SAVE ITS REGISTERS FOR REST OF INIT
SENDSUB PS
RJ ZWRITE WRITE CALLING COMMAND
SX5 45 A BLANK SPACE
RJ SWRITE
SB3 FILNAM AND FILE NAME ON COMMAND OR IN R-PACKET
RJ ZWRITE
RJ OSAVE
SA3 FILNAM
SX6 3 ALL KERMIT FET'S ARE BINARY
SA1 DUMMY+1
SA2 A1+B1
BX6 X6+X3 ADD TYPE CODE TO FILE NAME
SX5 WBUF
SA6 FILE CREATE A NEW FET
BX7 X1
SA7 A6+B1
BX7 X5
SA7 A7+B1
SA7 A7+B1
BX7 X2
SX5 3RZZZ TEST FOR ILLEGAL FILE NAMES
SA7 A7+B1
LX5 42
BX5 X5-X6
AX5 42
ZR X5,NONEXT X5 = 0 IF FILE NAME BEGINS WITH 'ZZZ'
SX6 A6 PUT ADDRESS OF FET INTO X6
RJ TESTFIL
ZR X6,NONEXT X6 = 0 IF THE FILE DOES NOT EXIST
REWIND FILE,R
BX7 X7-X7
SA7 FILE-2 CLEAR ANY SAVED SHIFT & CHARS FROM FET
SA7 A7+B1
SA7 CURN PACKET NUMBER WILL BE 0
SA7 PSENT NO PACKETS SEND
SA7 A7+B1 NONE RECEIVED
SA7 A7+B1 NO ERRORS
SA7 A7+B1
SA7 A7+B1 AND NO RETRIES
SX7 83 SEND-INITIATION PACKET
RJ SENDINIT
SX7 FILE
SA7 INFI
BX2 X7
BX3 X3-X3
RJ FREAD FILL THE FILE BUFFER
SA4 FILNAM
MI B3,SENDSUB-1 B3 < 0 IF THE FILE CONTAINS DATA
SENCOM3 SX6 NONEXTM OTHERWISE REPORT NONEXISTENCE
EQ SENDERR
INFOSUB SPACE 4,19
** INFOSUB PREPARES TO TYPE ON THE REMOTE SCREEN AS A RESULT OF A RE-
* MOTE TYPE COMMAND OR A REMOTE REQUEST FOR INFORMATION. ON ENTRY,
* X1 CONTAINS THE NAME OF THE FILE BEING TYPED AND A1 THE ADDRESS OF
* THE NAME. AFTER INITIAL NEGOTIATIONS AN X-PACKET IS SENT INSTEAD
* OF THE USUAL FILE HEADER.
INFOSUB SPACE 3,10
INFOSUB PS
BX6 X1
SA6 FILNAM
SB3 A1
RJ ZWRITE LOG THE KIND OF INFORMATION
RJ OSAVE
BX7 X7-X7
SA7 PSENT CLEAR ALL TRANSFER COUNTS
SA7 A7+B1
SA7 A7+B1
SA7 A7+B1
SA7 A7+B1
SA7 FILETYP TO AVOID PROBLEMS DURING SENDINIT
SA7 CURN
SX7 83 S = SEND-INITIATION
RJ SENDINIT
SB7 CBUF+3
SX2 88 X = TYPE ON SCREEN
SB6 B0
RJ SENDWAC SEND X-PACKET
SA4 SLENGTH
SB7 X4+CBUF-5 AND PREPARE TO SEND NEXT PACKET
SB6 CBUF+3
SB6 B6-B7
SB5 B1
SX7 B1
LX7 5 X7 := 32
EQ INFOSUB
LWRITE TITLE SOME UTILITY SUBROUTINES FOR COMMAND PROCESSING
** LWRITE PRINTS THE COMPRESSED LIST WHOSE ADDRESS IS IN B3 ON ENTRY.
* THE FORMAT OF SUCH A LIST CONSISTS OF A SERIES OF ASCII TEXTS WITH
* SIX ZERO BITS TERMINATING EACH TEXT, FOLLOWED BY A CODE SPECIFYING
* THE ACTION TO BE TAKEN: 0 = START A NEW LINE; 1 = END OF LIST; 2 -
* 63 = WRITE 2 - 63 BLANKS. THE ZERO BITS AND THE CODE MUST FALL IN
* THE SAME WORD, AND THE NEXT SECTION OF TEXT MUST BEING IN THE FOL-
* LOWING WORD.
LWRITE SPACE 3,10
LWRITE RJ OUTSTRT SET UP OUTPUT REGISTERS
RJ SLINE SKIP A LINE
SX7 45 AND START WITH A BLANK
SB5 -9
RJ ZWRITE PRINT HEADER
LX3 6
BX5 -X0*X3 GET NEXT CHAR AFTER COLON
ZR X5,*-3 IF IT'S 0, THEN WRITELN
SB2 X5
NE B1,B2,*+3 COLON-A MEANS END-OF-LIST
RJ SLINE
EQ MAINPRG
SB2 B2-B1
RJ XWRITE WRITE BLANKS
EQ LWRITE+3
SETDBG SPACE 4,17
** SETDBG SETS DEBUGGING ON OR OFF. ON ENTRY X7 CONTAINS THE CHOSEN
* OPTION. FIRST WE TEST FOR A HELP REQUEST, AND IF THERE IS NONE WE
* SET DEBUG AND LOG THE FACT.
SETDBG SPACE 3,10
RJ SREAD
SETDBG MI X5,*+3 SET IT AT END OF LINE
SX4 X5-45 TEST FOR BLANK
ZR X4,*-2 X4 = 0 IF A BLANK WAS READ
SX5 X7+6 OTHERWISE HELP IS REQUESTED
EQ GETHELP
SA7 DEBUGW SAVE OPTION
RJ LOGSET
SB3 SETLIST+10 'DEBUG'
RJ ZWRITE
SX5 45
RJ SWRITE WRITE BLANK SPACE
SA5 DEBUGW
SB3 X5+KNAME+2 'OFF' OR 'ON'
RJ ZWRITE
EQ TERMIN1 SAVE PLACE IN LOG
SETFILE SPACE 4,15
** SETFILE SETS THE FILE TYPE; X7 = THE OPTION ON ENTRY.
SETFILE SPACE 3,10
SETFILE SA1 KMODE
ZR X1,SETFIL1 X1 = 0 IF WE ARE IN COMMAND MODE
EQ *+2
RJ UNPACK
MI X5,SETFIL1+3 AT THIS POINT WE REACH END-OF-PACKET
SX4 X5-32 BLANK
NZ X4,SETFIL1+1 IF X4 <> 0 HELP IS REQUESTED
EQ *-2
RJ SREAD
SETFIL1 MI X5,*+3 END OF LINE
SX4 X5-45
ZR X4,*-2 BLANK
SX5 X7+B1
EQ GETHELP
SA7 FILETYP+1 SAVE OPTION
SA1 KMODE
ZR X1,*+1
RJ ACKIT IN SERVER MODE WE MUST SEND ACK IF OK
RJ LOGSET READY TO WRITE LOG
SB3 SETLIST+6 'FILE-TYPE'
RJ ZWRITE
RJ WFILTYP WRITE NAME OF FILE-TYPE
EQ TERMIN1
SETBIT SPACE 4,15
** SETBIT SETS THE BIT-PREFIX. THE DEFAULT VALUE IS THE AMPERSAND.
SETBIT SPACE 3,10
SX5 13
EQ GETHELP
SETBIT SX7 38
RJ SETCHAR
MI X7,*-2 IF X7 < 0 THERE WAS A REQUEST FOR HELP
SA1 QUOTEC
SA2 REPETC
BX1 X1-X7 THE BIT-PREFIX MUST BE DISTINCT FROM THE
BX2 X2-X7 QUOTE AND REPEAT PREFIXES
ZR X1,*-4
ZR X2,*-4
SA7 BITPREF IF SO, SAVE IT
RJ LOGSET
SB3 SETLIST+4
RJ ZWRITE
SA3 BITPREF
CHAREND SX5 45 WRITE A BLANK SPACE
RJ SWRITE
BX5 X3
RJ AWRITE AND THEN THE CHARACTER
EQ TERMIN1
SETQUOT SPACE 4,15
** SETQUOT SETS THE QUOTE PREFIX.
SETQUOT SPACE 3,10
SX5 14
EQ GETHELP
SETQUOT SX7 35
RJ SETCHAR
MI X7,*-2 X7 = 0 IF HELP IS REQUESTED
SA1 BITPREF
SA2 REPETC
BX1 X1-X7 THE THREE PREFIXES MUST BE DISTINCT
BX2 X2-X7
ZR X1,*-4
ZR X2,*-4
SA7 QUOTEC IF SO, SAVE AND LOG THE SET COMMAND
RJ LOGSET
SB3 SETLIST+8
RJ ZWRITE
SA3 QUOTEC
EQ CHAREND
SETREP SPACE 4,15
** SETREP SETS THE REPEAT PREFIX.
SETREP SPACE 3,10
SX5 15
EQ GETHELP
SETREP SX7 126
RJ SETCHAR
MI X7,*-2 X7 < 0 IF HELP IS REQUESTED
SA1 BITPREF
SA2 QUOTEC
BX1 X1-X7 THE THREE PREFIXES MUST BE DISTINCT
BX2 X2-X7
ZR X1,*-4
ZR X2,*-4
SA7 REPETC IF SO, SAVE AND LOG THE SET COMMAND
RJ LOGSET
SB3 SETLIST+13
RJ ZWRITE
SA3 REPETC
EQ CHAREND
SETESCA SPACE 4,15
** SETESCA SETS THE ESCAPE CHARACTER.
SETESCA SPACE 3,10
SX5 17
EQ GETHELP
SETESCA SX7 DEFESCA DEFAULT ESCAPE CHAR
RJ SETCTRL
MI X7,*-2 ERRORS REQUIRE HELP
SA1 SYNCM
BX1 X1-X7
ZR X1,*-3 ESCAPE MAY NOT BE THE SAME AS SYNC
SA7 ESCAPEC
RJ LOGSET
SB3 SETLIST+20 ESCAPE
SB4 ESCAPEC
CTRLREP RJ ZWRITE WRITE THE TERM BEING SET
SX5 45 A BLANK SPACE
RJ SWRITE
SB3 CTRLHYP 'CTRL-'
RJ ZWRITE
SA4 B4
SX5 X4+64
RJ AWRITE AND THE SYMBOL YOU MUST PRESS WITH CTRL
EQ TERMIN1
SETMARK SPACE 4,15
** SETMARK SETS THE PACKET SYNC MARKER.
SETMARK SPACE 3,10
SX5 18
EQ GETHELP
SETMARK SX7 B1 DEFAULT PACKET SYNC MARKER
RJ SETCTRL
MI X7,*-2 ERRORS REQUIRE HELP
SA1 ESCAPEC
BX1 X1-X7
ZR X1,*-3 SYNC MAY NOT BE THE SAME AS ESCAPE
SA7 SYNCM
RJ LOGSET
SB3 SETLIST+11 MARKER
SB4 SYNCM
EQ CTRLREP
SETDELA SPACE 4,15
** SETDELA SETS THE DELAY TO BE REQUESTED FROM ANOTHER KERMIT.
SETDELA SPACE 3,10
SX7 DEFTIME DEFAULT DELAY IS 20 SECONDS
EQ *+6
SETDELA RJ NREAD READ THE AMOUNT
ZR B5,*-2 SET THE DEFAULT VALUE
PL B5,*+2 SET THE VALUE READ
SX5 16
EQ GETHELP
SX4 X7-5 5 SECONDS IS MINIMUM
MI X4,*-1
SX4 X7-95 94 SECONDS IS MAXIMUM
PL X4,*-2
SA7 TIMEOUT STORE THE VALUE
RJ LOGSET
SB3 SETLIST+15 DELAY
SB4 TIMEOUT
SETNUM RJ ZWRITE WHAT IS BEING SET
SX5 45
RJ SWRITE A BLANK SPACE
SA3 B4
RJ NWRITE THE NUMBER TO WHICH IT IS SET
RJ OSAVE
EQ MAINPRG-1
SETPACL SPACE 4,15
** SETPACL SETS THE MAXIMUM PACKET LENGTH TO REQUEST.
SETPACL SPACE 3,10
SX7 DEFPLEN DEFAULT IS 94
EQ *+6
SETPACL RJ NREAD
ZR B5,*-2
PL B5,*+2
SX5 19
EQ GETHELP
SX4 X7-40 40 IS MINIMUM
MI X4,*-1
SX4 X7-95 94 IS MAXIMUM
PL X4,*-2
SA7 PLENGTH
RJ LOGSET
SB3 SETLIST+16 PACKET LENGTH
SB4 PLENGTH
EQ SETNUM
SETTRY SPACE 4,15
** SETTRY SETS THE LIMIT ON THE NUMBER OF RETRIES PER PACKET.
SETTRY SPACE 3,10
SX7 DEFRETR DEFAULT LIMIT IS 5
EQ *+6
SETTRY RJ NREAD
ZR B5,*-2
PL B5,*+2
SX5 20
EQ GETHELP
SX4 X7-3 3 IS MINIMUM
MI X4,*-1
SX4 X7-31 30 IS MAXIMUM
PL X4,*-2
SA7 RETRYN
RJ LOGSET
SB3 SETLIST+19 RETRY
SB4 RETRYN
EQ SETNUM
SENDCOM TITLE SENDING A FILE
** SENDCOM HANDLES SENDING A FILE TO ANOTHER KERMIT. SENDCOM IS THE
* ENTRY POINT FOR THE SEND COMMAND, SENDSER FOR A (REMOTE) GET COM-
* MAND, AND SENCOM2 FOR REMOTE LISTING (TYPE) AND HELP.
SENDCOM SPACE 3,10
SENDCOM BX7 X7-X7 COMMAND-MODE ENTRY POINT
MI X5,*+5 END-OF-LINE MEANS GET HELP
SB5 -7
EQ *+2
RJ AREAD
RJ MAKEFN
MI B5,*-2 CONSTRUCT A FILE NAME
NZ X7,*+4 AND PREPARE TO SEND IT
SX5 8
EQ GETHELP UNLESS THERE ISN'T ANY NAME
SENDSER RJ UNPCFIL ENTRY POINT FOR R PACKET
ZR X7,NONEXT
+ SA7 FILNAM
RJ LOGLIN
SB3 CMDLIST+11 'SEND'
RJ SENDSUB
SA5 SLENGTH
SB7 X5+CBUF-5
SB6 CBUF+3
SB6 B6-B7
SB5 B1
SB3 FILNAM
RJ PREAD
BX7 X5
RJ PACKTEX
SX5 B1
LX5 5
RJ PUTVAL
SX2 70 F = FILE HEADER
RJ SENDWAC
SENCOM2 SA4 SLENGTH
SB7 X4+CBUF-5
SB6 CBUF+3
SB6 B6-B7
SB5 B1
SA1 FILE-2
RJ IREST
SA1 FILETYP
ZR X1,SENAS ASCII TEXT
MX0 58 X0 := -3
IX0 X0+X1
MI X0,SENBI
ZR X0,SENNO
SB2 B0 SEND AN ASCII8 FILE
RJ EREAD
RJ EREAD
MI X5,*+6
BX7 X5
EQ *+2
RJ PTVWAC
RJ EREAD
PL X5,*-2
SX5 B1
LX5 5
RJ PTVWAC
GT B2,B0,PUTEOF
SX7 13
SX5 10
SB5 B1
EQ *-6
SENNO SB2 B0 SEND A DISPLAY CODE FILE
RJ DREAD
RJ DREAD
MI X5,*+6
BX7 X5
EQ *+2
RJ PTVWAC
RJ DREAD
PL X5,*-2
SX5 B1
LX5 5
RJ PTVWAC
GT B2,B0,PUTEOF
SX7 13
SX5 10
SB5 B1
EQ *-6
SENAS SB2 B0 SEND AN ASCII 6/12 FILE
RJ AREAD
RJ AREAD
MI X5,*+6
BX7 X5
EQ *+2
RJ PTVWAC
RJ AREAD
PL X5,*-2
SX5 B1
LX5 5
RJ PTVWAC
GT B2,B0,PUTEOF
SX7 13
SX5 10
SB5 B1
EQ *-6
SENKE SB3 B3-B1 SEND A 'KERMIT'-FORMAT BINARY
SB2 B0
RJ KREAD
MI X5,SENCOM3
BX7 X5
SB5 B1
EQ *+2
RJ PTVWAC
RJ KREAD
PL X5,*-2
EQ PUTEOF-2
SENBI SX7 X0+B1 SEND A BINARY FILE
RJ WREAD
NZ X1,SENCOM3
ZR X7,SENKE
BX3 X6
LX3 8
SB2 -13
MX0 52
BX7 -X0*X3
LX3 4
EQ *+2
RJ PTVWAC
RJ BREAD
PL X5,*-2
SX5 B1+B1
BX5 X5-X7
RJ PTVWAC
PUTEOF SA1 FILETOT SEND AN END-OF-FILE PACKET
SX6 X1+B1
SA6 A1
SB3 CBUF+3
SB4 B6+B7
EQ B3,B4,PUTEOF1
SX2 68 D = DATA
RJ SENDWAC
PUTEOF1 SB7 CBUF+3
SX2 90 Z = EOF
SX4 X1-78 N = NAK
SA1 A1+B1 GET DATA WORD
SB6 B0
ZR X4,*+4
SX4 X1-90 TEST Z
ZR X4,*+1
SX4 X4+B1
SX4 X4+B1 TEST X
NZ X4,*+2
SX6 68 D = DISCARD
SA6 B7
SB6 B1
+ RJ SENDWAC
SB7 CBUF+3
SX2 66 B = EOT
SB6 B0
RJ SENDWAC
RJ LOGLIN
SB3 EOFM
RJ ZWRITE
SA1 FILNAM
BX6 X6-X6 CANCEL CURRENT NAME AND PACKET NUMBER
SA6 A1
SA6 CURN
BX6 X1
SA6 A1+B1
SB3 A6
RJ ZWRITE
RJ SLINE
RJ WSTATS
EQ TERMIN1
GENERIC TITLE RECEIVE FILES AND CODED COMMANDS
** GENERIC, FINICOM, TYPECOM, AND REMCOM DEAL WITH COMMANDS RECEIVED
* FROM THE LOCAL KERMIT IN PACKETS.
FINICOM SPACE 3,10
FINICOM BX7 X7-X7 PROCESS FINISH COMMAND
SA7 KMODE
SX6 FINISHM
EQ TERMIN
GENERIC SPACE 4,10
GENERIC SB2 B1
SB4 A2+B1 B4 := CBUF+99
RJ UNPACK A DUMMY OPERATION
RJ UNPACK
SX4 X5-70 TEST FOR F = FINISH
ZR X4,FINICOM
SX4 X5-81 TEST FOR Q = STATUS QUERY
ZR X5,STATUSP
SX4 X5-72 TEST FOR H = GET HELP
ZR X4,SERVHLP
SX4 X5-76 TEST FOR L = LOGOUT
ZR X4,*+4
SX7 X5-84 TEST FOR T = TYPE
SB5 -7
ZR X7,TYPECOM+1
SX6 NOTIMP OTHERWISE SEND A 'NOT IMPLEMENTED' MSG
EQ SENDERR
RJ ACKIT
WRITER OUTPUT
SX7 LOGOUTM
EQ FINIS+3
TYPECOM SPACE 4,10
TYPECOM BX7 X7-X7 TYPE A LOCAL FILE ON THE OTHER KERMIT'S
EQ *+2 SCREEN
RJ UNPACK IGNORE ENCODED FIELD LENGTH
SA1 FILETYP+1
ZR X1,*+3
MX2 58
IX2 X1+X2
PL X2,*+2
SX6 TYPERM
EQ SENDERR
RJ UNPACK
RJ MAKEFN
MI B5,*-2
NZ X7,*+2
SX5 21
EQ GETHELP
SA7 FILNAM
RJ LOGLIN
SB3 TYPEM
RJ SENDSUB
SB7 CBUF+3
SX2 88 X = TYPE ON SCREEN
SB6 B0
RJ SENDWAC
EQ SENCOM2
REMCOM SPACE 4,10
REMCOM SB2 B1 PROCESS A REMOTE COMMAND
SB4 A2+B1 B4 := CBUF + 99
RJ UNPACK GET DUMMY CONTENTS OF X3
SB7 SERVTAB
EQ CREAD
SERVCOM SPACE 4,15
** SERVCOM IS THE ENTRY POINT FOR THE SERVER COMMAND.
SERVCOM SPACE 3,10
RJ SREAD
SERVCOM MI X5,*+3
SX4 X5-45
ZR X4,*-2
SX5 10
EQ GETHELP
SX6 B1 SET SERVER MODE
SA6 KMODE
BX6 X6-X6
SA6 CURN
RJ LOGLIN
SB3 CMDLIST+14
RJ ZWRITE
RJ OSAVE
SA6 FILNAM
EQ RECCOM2
RECVCOM SPACE 4,15
** RECVCOM IS THE ENTRY POINT FOR THE RECEIVE COMMAND.
RECVCOM SPACE 3,10
RECVCOM BX7 X7-X7
MI X5,*+6
SB5 -7
EQ *+2
RJ AREAD
RJ MAKEFN
MI B5,*-2
NZ X7,*+2
SX5 9
EQ GETHELP
SA7 FILNAM
RJ LOGLIN
SB3 CMDLIST+7 'RECEIVE'
RJ ZWRITE
SX5 45
RJ SWRITE
SB3 FILNAM
RJ ZWRITE
RJ OSAVE
SA3 FILNAM
ZR X3,*+2
RJ UNIQUE
BX7 X7-X7
SA7 FILE-2
SA7 A7+B1
SA7 PSENT
SA7 A7+B1 PRECD
SA7 A7+B1 PKERRS
SA7 A7+B1 RETRYT
SA7 A7+B1 RETRYC
SA7 CURN
SA7 RPCH
EQ RECCOM2
RECCOM1 SPACE 4,10
RECCOM1 SX3 X2-82 ENTRY FOR RECEIVING R-PACKET
ZR X3,SENDSER
SX3 X2-71 GENERIC COMMAND
ZR X3,GENERIC
SX3 X2-67 'HOST' COMMAND
ZR X3,REMCOM
SX3 X2-75 KERMIT COMMAND
ZR X3,REMCOM
SX3 X2-73 INITIALISE PACKET
ZR X3,*+2 WILL BE FOLLOWED BY 0, NOT 1
SX6 B1
SA6 CURN
RJ YOURPAR GET YOUR PARAMETERS
IX2 X0-X2 ARE YOU USING REPEAT COUNTS
MI X2,*+1
MX6 46
BX7 X6
PL X6,*+1
BX7 X0
SA7 CBUF+11
SX7 89 YES = ACK
SA6 A6+B1
RJ MYPARM
RJ SENDPACK
RECCOM2 RJ REQUESP
NZ X1,RECCOM1 PROCESS INITIALISATION COMMANDS
SX4 X2-70 IS IT A FILE HEADER
NZ X4,FATALE IF NOT, IT IS A FATAL ERROR
SA1 RPCH
ZR X1,REQUSP2 THIS SHOULD BE IMPOSSIBLE; WHO KNOWS
SA1 FILNAM
NZ X1,RECCOM3 THE FILE HAS A NAME ALREADY
RJ UNPCFIL
SA7 FILNAM
NZ X7,*+3 DO NOT USE THE PACKET NAME IF THERE WAS
RJ DEFFILE ONE ON THE COMMAND LINE
BX7 X6
SA2 A3
SX6 X2+B1
SA6 A2
BX3 X7
RJ UNIQUE ENSURE THERE IS NO SUCH FILE YET
RECCOM3 RJ LOGLIN START TO RECEIVE A FILE
SB3 OPENFM
RJ ZWRITE
SB2 B1
BX3 X3-X3
SB4 CBUF+99
RJ UNPACK
EQ *+2
RJ AWRITE RECORD THE FILE'S NAME IN THE LOG
RJ UNPACK
PL X5,*-2
RJ OSAVE
SA1 FILNAM
BX6 X1
SA6 A1+B1 RECORD THIS FILE AS LAST TRANSFERRED
EQ *+2
RECCOM4 RJ OSAVE START OF MAIN RECEIVE LOOP
SX7 89 ACKNOWLEDGE
SA1 RETRYT RESTART RETRY COUNT
SA2 A1+B1
IX6 X1+X2
SA6 A1
BX6 X6-X6
SA6 A2
SA1 CURN
SX6 X1+B1 INCREMENT PACKET NUMBER
MX0 54
BX6 -X0*X6 PROVIDED IT'S LESS THAN 63
SA6 A1
SX6 35
SA6 CBUF
SX6 X1+32 NUMBER OF PREVIOUS PACKET
SA6 A6+B1
SA7 A6+B1 TYPE OF PACKET (ACK OR NAK)
RJ SENDPACK
RJ REQUESP
NZ X1,FATALE WE CANNOT GET A COMMAND PACKET HERE
SX4 X2-90 Z IS END-OF-FILE
ZR X4,RECEOF
SX4 X2-68 TEST FOR DATA
NZ X4,RECCOM4+1
SX7 FILE
SB4 CBUF+99
RJ OREST
SB2 B1
BX3 X3-X3
RJ UNPACK
SA1 FILETYP
ZR X1,RECAS
MX2 58 X2 := -3
IX1 X1+X2
MI X1,*+2
ZR X1,RECNO
EQ RECEI
SX1 X1+B1
MI X1,RECBI
EQ RECKE
* RECEIVE ASCII8 FILES
MX0 53
BX5 -X0*X5
MI B5,*+3
SB5 -4
BX7 X5
EQ RECEI
LX7 12
SB5 B5+B1
BX7 X7+X5
MI B5,*+1
RJ WWRITE
RECEI RJ UNPACK
MI X5,RECCOM4
SX4 X5-10
ZR X4,*-2
SX4 X5-13
NZ X4,*-8
RJ ELINE
EQ *-4
* RECEIVE ASCII FILES
RJ AWRITE
RECAS RJ UNPACK
MI X5,RECCOM4
SX4 X5-10
ZR X4,*-2
SX4 X5-13
NZ X4,*-4
RJ SLINE
EQ RECAS
* RECEIVE BINARY FILES
MI B5,*+2
SB5 -13
BX7 X5
EQ RECBI
SB5 B5+B1
MI B5,*+4
BX4 X5
AX4 4
MX0 56
BX4 -X0*X4
BX5 -X0*X5
LX7 4
BX7 X7+X4
RJ WWRITE
SB5 -14
EQ *-4
SB5 B5+B1
LX7 8
BX7 X7+X5
MI B5,*+1
RJ WWRITE
RECBI RJ UNPACK
PL X5,*-9
EQ RECCOM4
* RECEIVE KERMIT-FORMAT BINARY FILES
MI B5,*+2
SB5 -6
BX7 X5
EQ *+3
SB5 B5+B1
LX7 8
BX7 X7+X5
MI B5,*+1
RJ WWRITE
RECKE RJ UNPACK
PL X5,*-5
EQ RECCOM4
* RECEIVE DISPLAY CODE FILES
SX4 X5-15
PL X4,*+2 X4 < 0 FOR CERTAIN SYMBOLS
SA5 X5+ASCTAB
EQ RECNO-1
SX4 X4-10
PL X4,*+2 X4 < 0 FOR DIGITS
SX5 X5+12
EQ RECNO-1 DIGITS
SX5 X5-10
SX4 X5-22
MI X4,*-4 X4 < 0 FOR CERTAIN SYMBOLS
SX4 X4-26
MI X4,*+4 X4 < 0 FOR UPPER CASE LETTERS
SX5 X5-26
SX4 X5-28
MI X4,*-6 X4 < 0 FOR CERTAIN SYMBOLS
SX4 X4-26
MI X4,*+2 X4 < 0 FOR LOWER CASE LETTERS
SA5 X5+ASCTAB-26
EQ RECNO-1
SX5 X4+27 LETTERS
EQ RECNO-1
MX0 53
BX5 -X0*X5 SHAVE OFF EIGHTH BIT IF NECESSARY
SX5 X5-33
PL X5,*-12 X5 >= 0 IF PRINTABLE
SX5 45 BLANK
RJ SWRITE
RECNO RJ UNPACK
MI X5,RECCOM4
SX4 X5-10
ZR X4,*-2
SX4 X5-13
NZ X4,*-6
RJ SLINE
EQ RECNO
*
RECEOF SA2 A2+B1 CONTENTS OF DATA FIELD
SX2 X2-68 IS IT A DISCARD
ZR X2,RECEOF2
SA3 FILETYP
SX7 FILE
SA1 FILETOT
SX6 X1+B1
SA6 A1
RJ OREST
ZR X3,RECEOFA
MX0 58 X0 := -3
IX3 X0+X3
PL X3,RECEOFA
PL B5,RECEOF1 BINARY FILE ENDS AT A WORD BOUNDARY
SX3 X3+B1
ZR X3,*+6
NZ X7,*+2 IF X7 CONTAINS DATA, FILL WITH ZEROS
SB4 B5+14
ZR B4,RECEOF1
+ LX7 4
SB5 B5+B1
MI B5,*
RJ WWRITE WRITE LAST WORD OF FILE
EQ RECEOF1-1
SX3 -B5
LX7 4
+ LX7 8
SB5 B5+B1
MI B5,*
BX7 X7+X3
LX7 56
EQ *-4
RECEOFA MI B5,*+1
MX0 48
BX6 -X0*X7 HAVE WE HAD AN EOLN
ZR X6,RECEOF1
ZR X3,*+3 SIX BIT FILE CODES HAVE X3 = 0 HERE
RJ ELINE
EQ *+2
RJ SLINE
RJ OSAVE
RECEOF1 WRITER FILE
EQ RECEOF3
RECEOF2 RETURN FILE
RECEOF3 RJ LOGLIN
SB3 EOFM
RJ ZWRITE
SB3 FILE
RJ ZWRITE
SA3 CBUF+99
RJ SLINE
SX3 X3-68 TEST FOR DISCARD INSTRUCTION
NZ X3,*+4
SB2 9
RJ XWRITE
SB3 DISCARM
RJ ZWRITE
RJ SLINE
RJ WSTATS
RJ OSAVE
SA1 CURN
SX7 X1+B1
MX0 54
BX7 -X0*X7
SA7 A1
SX6 X1+32
BX7 X7-X7
SA7 FILNAM
SX7 35
SA7 CBUF
SX7 89 Y = ACK
SA6 A7+B1
SA7 A6+B1
EQ RECCOM2-1
SHOWP TITLE INFORMATION ROUTINES
** SHOWP EXECUTES A REMOTE SHOW COMMAND.
SHOWP SPACE 3,10
SHOWP RJ LOGLIN
SA1 CMDLIST+12 SHOW
RJ INFOSUB
SB3 SETLIST+4 BIT-PREFIX
RJ PZLINE
SB5 10
SA5 BITPREF
RJ PTVWAC
SB3 BLOCKM
RJ PZLINE
SB3 SETLIST+10 DEBUG
RJ PZLINE
SB5 15
SA5 DEBUGW
SB3 X5+KNAME+2
RJ PZWRITE
SB3 DEFAULM
RJ PZLINE
SB5 B5-B1
RJ DEFFILE DEFAULT FILE NAME
SA6 UPDAT
SB3 A6
RJ PZWRITE
SB3 SETLIST+15 DELAY
RJ PZLINE
SB5 15
SA3 TIMEOUT
RJ PNWRITE
SB3 SETLIST+20 ESCAPE
RJ PZWRITE
SB5 14
SB3 CTRLHYP
RJ PZWRITE
SA5 ESCAPEC
SX7 X5+64
SB3 SETLIST+6 FILE TYPE
RJ PZLINE
SA4 FILETYP+1
MX0 58
BX0 -X0*X4
ZR X0,*+1
SX4 X4+B1
LX4 2
AX4 1
SB3 X4+FTLIST+4
SB5 11
RJ PZWRITE
RJ PLINE
SB3 SETLIST+11 SYNC MARKER
RJ PZWRITE
SB5 14
SB3 CTRLHYP
RJ PZWRITE
SA5 SYNCM
SX7 X5+64
SB3 SETLIST+16 PACKET LENGTH
RJ PZLINE
SB5 7
SA3 PLENGTH
RJ PNWRITE
SB3 PAREVEN
RJ PZWRITE
SB3 SETLIST+8 QUOTE CHARACTER
RJ PZLINE
SB5 10
SA5 QUOTEC
RJ PTVWAC
SB3 SETLIST+13 REPEAT CHARACTER
RJ PZLINE
SB5 9
SA5 REPETC
RJ PTVWAC
SB3 SETLIST+19 RETRY LIMIT
RJ PZLINE
SB5 15
SA3 RETRYN
SHSTEND RJ PNWRITE
RJ PLINE
SX5 B1
LX5 5
RJ PTVWAC
EQ PUTEOF
STATUSP SPACE 4,15
** STATUSP EXECUTES A REMOTE STATUS COMMAND.
STATUSP SPACE 3,10
STATUSP RJ LOGLIN
SA1 CMDLIST+16
SA2 SETTAB-1
BX1 X2
RJ INFOSUB
SB3 TRANSFM
RJ PZLINE
SB5 5
SA3 FILETOT FILES TRANSFERRED
RJ PNWRITE
SB3 LASTFM
RJ PZWRITE
SB3 FILNAM+1
SB5 12
RJ PZWRITE NAME OF LAST FILE TRANSFERRED
SB3 TRANSFM+4
RJ PZLINE
SB5 10
SA3 PSENT PACKETS SENT
RJ PNWRITE
RJ PZWRITE
SB5 6
SA3 PRECD PACKETS RECEIVED
RJ PNWRITE
RJ PZWRITE
SB5 11
SA3 PKERRS ERRORS IN RECEIVED DATA
RJ PNWRITE
RJ PZWRITE
SB5 11
SA3 RETRYT TOTAL RETRIES
EQ SHSTEND
SHOWVAL SPACE 4,15
** SHOWVAL DISPLAYS THE VALUES OF KERMIT VARIABLES.
SHOWVAL SPACE 3,10
SHOWVAL SX7 OUTPUT PREPARE TO WRITE OUTPUT
RJ OREST
SB3 SETLIST+4
RJ ZLINE
SB2 9
RJ XWRITE
SA5 BITPREF BIT-PREFIX
RJ AWRITE
SB3 BLOCKM CHECKSUM TYPE
RJ ZLINE
SB3 SETLIST+10
RJ ZLINE
SB2 14
RJ XWRITE
SA5 DEBUGW
SB3 X5+KNAME+2
RJ ZWRITE DEBUG
SB3 DEFAULM
RJ ZLINE
RJ DEFFILE CURRENT DEFAULT FILE NAME
SA6 UPDAT
SB3 A6
RJ ZWRITE
SB3 SETLIST+15 DELAY
RJ ZLINE
SB2 14
RJ XWRITE
SA3 TIMEOUT
RJ NWRITE
SB3 SETLIST+20 ESCAPE
SB4 ESCAPEC
RJ BCTRLW
SB3 SETLIST+6 FILE TYPE
RJ ZLINE
SB2 9
RJ XWRITE
RJ WFILTYP
SB3 SETLIST+11 SYNC MARKER
SB4 SYNCM
RJ BCTRLW
SB3 SETLIST+16 PACKET LENGTH
RJ ZLINE
SB2 6
RJ XWRITE
SA3 PLENGTH
RJ NWRITE
SB3 PAREVEN PARITY
RJ ZWRITE
SB3 SETLIST+8 QUOTE CHARACTER
RJ ZLINE
SB2 9
RJ XWRITE
SA5 QUOTEC
RJ AWRITE
SB3 SETLIST+13 REPEAT CHARACTER
RJ ZLINE
SB2 8
RJ XWRITE
SA5 REPETC
RJ AWRITE
SB3 SETLIST+19 RETRY
RJ ZLINE
SB2 14
RJ XWRITE
SA3 RETRYN
RJ NWRITE
RJ SLINE
EQ MAINPRG
STATUSV SPACE 4,15
** STATUSV DISPLAYS THE CURRENT TRANSFER STATISTICS.
STATUSV SPACE 3,10
STATUSV SX7 OUTPUT
RJ OREST PREPARE TO WRITE ON OUTPUT
SB3 TRANSFM
RJ ZLINE
SB2 4
RJ XWRITE
SA3 FILETOT NUMBER OF FILES TRANSFERRED
RJ NWRITE
SB3 LASTFM NAME OF LAST FILE TRANSFERRED
RJ ZWRITE
SB2 11
RJ XWRITE
SB3 FILNAM+1
RJ ZWRITE
RJ WSTATS
EQ MAINPRG
GETHELP SPACE 4,16
** GETHELP OBTAINS LONG HELP MESSAGES FROM THE FILE ZZZKHLP, A MULTI-
* RECORD FILE.
GETHELP SPACE 3,10
GETHELP SA4 HELPLOC
SX6 X5+B1
SA6 A4 SAVE THE NEXT POSITION IN ZZZKHLP
SX6 ZZZKHLP
SA6 INFI
NZ X4,GETHLP1
REWIND ZZZKHLP HERE THE FILE HAS NOT YET BEEN USED
SA5 HELPLOC
SX4 B1+B1
GETHLP1 IX1 X5-X4 COMPUTE RELATIVE LOCATION
PL X1,GETHLP2 IF X1 >= 0, WE MOVE FORWARD
BX1 -X1 OTHERWISE WE MOVE BACK
SKIPB ZZZKHLP,X1,R
EQ GETHLP3
GETHLP2 ZR X1,GETHLP3
SKIPF ZZZKHLP,X1,R
GETHLP3 SA1 KMODE
NZ X1,GETHLP4 X1 <> 0 IN SERVER MODE
SX2 ZZZKHLP
RJ FREAD FILL READ BUFFER
RJ OUTSTRT
EQ *+2
BX7 X6
RJ WWRITE
RJ WREAD
ZR X1,*-2
EQ MAINPRG
GETHLP4 RJ LOGLIN IN SERVER MODE, SEND HELP IN PACKETS
SA1 HELPM
RJ INFOSUB
SX6 ZZZKHLP
SA6 INFI
BX2 X6
RJ FREAD
EQ SENAS
KERMIT TITLE INITIALISATION
KERMIT SB1 1
OPEN INPUT,READNR,R
OPEN OUTPUT,WRITENR,R
SX6 ZZZKHLP
RJ TESTFIL
ZR X6,DEBACL-2
SX6 ZZZKLOG
RJ TESTFIL DOES THE LOG FILE EXIST
NZ X6,KERMIT1 IF SO, WRITE ON END OF IT
SX6 1R1 IF NOT, START WITH TOP-OF-PAGE
SA6 A6-B1
EQ KERMIT2
KERMIT1 SKIPEI X2,R
KERMIT2 SETFS ZZZKLOG,NAD
SX6 ZZZKDAT
RJ TESTFIL WAS THERE A PUSH COMMAND
ZR X6,KERMIT3
REWIND ZZZKDAT,R
READ ZZZKDAT,R
SA2 ZZZKDAT+3 GET ADDR OF START OF DATA
SX3 X2+12
SA1 A2-B1 GET ADDR AFTER END OF DATA
BX3 X3-X1
NZ X3,DEBACLD X3 <> 0 IF FILE NOT PROPER LENGTH
SA1 X2 BITPREFIX
SA2 A1+B1 DEBUG
SA3 A2+B1 DEFAULT FILE
SA4 A3+B1 ESCAPE CHAR
BX6 X1
SA6 BITPREF
BX6 X2
BX7 X3
SA6 DEBUGW
SA7 A6+B1 DEFAULF
BX7 X4
SA7 A7+B1 ESCAPEC
SA1 A4+B1 FILE TYPE
SA2 A1+B1 SYNC MARKER
SA3 A2+B1 PACKET LENGTH
BX7 X1
SA7 FILETYP+1
SA4 A3+B1 QUOTE CHARACTER
BX7 X2
BX6 X3
SA7 A7+B1 SYNCM
SA6 A7+B1 PLENGTH
BX6 X4
SA6 QUOTEC
SA1 A4+B1 REPEAT PREFIX
SA2 A1+B1 TIMEOUT
SA3 A2+B1 NUMBER OF FILES TRANSFERRED
SA4 A3+B1 RETRY LIMIT
BX6 X1
BX7 X2
SA6 REPETC
SA7 A6+B1 TIMEOUT
BX6 X4
SA6 RETRYN
BX7 X3
SA7 A7+B1 FILETOT
RETURN ZZZKDAT
KERMIT3 SA2 INPUT+1
SA1 OUTPUT+1
LX2 1
LX3 B1,X1
PL X2,DEBACL-1 INPUT IS NOT FROM A TERMINAL
PL X3,DEBACL-1 OUTPUT IS NOT TO A TERMINAL
SX2 B1
LX2 36 FLUSH BIT
BX7 X1+X2
SA7 A1 SET FLUSH BIT IN OUTPUT
SA3 ZZZKLOG+1
BX7 X2+X3
SA7 A3 SET FLUSH BIT IN LOG FILE
SA1 DUMMY+4
BX6 X1
SA6 DUMMY+2
PROMPT OFF
CSET ASCII
SETTL 77777B SET TIME LIMIT TO MAXIMUM
SETLOF LOFS THESE FILES WILL BE FLUSHED
DATE UPDAT
RJ LOGLIN START LOG FILE
SB3 KNAME
RJ ZWRITE
SB2 5
RJ XWRITE
SB3 UPDAT
RJ ZWRITE
RJ OSAVE
SA3 TPARAMS SET PARITY AND PAGE CHARACTERISTICS
RJ OUTSTRT SET UP OUTPUT FOR WRITING
BX7 X3
SA7 B6+B7
SB6 B6+B1
SA3 A3+B1
BX7 X3
SA7 B6+B7
SB6 B6+B1
EQ MAINPRG
COMSEL TITLE START TO PROCESS EACH COMMAND
FILEASK ZR X1,COMSEL-1 X1 = 0 WHEN WE ARE IN COMMAND MODE
SX5 23 OTHERWISE SEND A HELP MESSAGE
EQ GETHELP
SB3 FTLIST ASK ABOUT FILES
EQ LWRITE
COMSEL SB3 OFFLIST ASK FOR HELP WITH SET DEBUG
EQ LWRITE
COMDIFF EQU COMSEL-KNAME
SB3 OFFLIST AMBIGUOUS 'O'
EQ LWRITE
BX7 X7-X7 OFF = 0
EQ SETDBG
SX7 B1 ON = 1
EQ SETDBG
SB3 CMDLIST LIST COMMANDS
EQ LWRITE
SX7 CMDLIST+6 EXIT
EQ FINIS
SX7 CMDLIST+10 PUSH
EQ PUSHIT
SX7 CMDLIST+13 QUIT
EQ FINIS
EQ RECVCOM RECEIVE
SB3 CMDLIST AMBIGUOUS 'SE'
EQ LWRITE
EQ SENDCOM SEND
EQ SERVCOM SERVER
SB7 SETTAB SET
EQ CREAD
EQ SHOWVAL SHOW
EQ STATUSV STATUS
SB3 SETLIST ASK ABOUT SET
EQ LWRITE
EQ SETBIT BIT-PREFIX
SB3 SETLIST AMBIGUOUS 'DE'
EQ LWRITE
SB7 KNAME DEBUG
EQ CREAD
EQ SETDELA DELAY
EQ SETESCA ESCAPE
SB7 FTYPES FILE-TYPE
EQ CREAD
EQ SETMARK MARKER
EQ SETPACL PACKET-LENGTH
EQ SETQUOT QUOTE-CHAR
SB3 SETLIST AMBIGUOUS 'RE'
EQ LWRITE
EQ SETREP REPEAT-CHAR
EQ SETTRY RETRY
SA1 KMODE ASK ABOUT FILES
EQ FILEASK
BX7 X7-X7 ASCII
EQ SETFILE
SX7 B1 ASCII8
LX7 2
EQ SETFILE
SX7 B1 BINARY
EQ SETFILE
MX7 58 DISPLAY CODE
BX7 -X7
EQ SETFILE
MX7 58 DIS64
BX7 -X7
EQ SETFILE
SX7 B1 EIGHT
LX7 2
EQ SETFILE
SX7 B1+B1 KERMIT
EQ SETFILE
MX7 58 NORMAL
BX7 -X7
EQ SETFILE
SX7 B1 8
LX7 2
EQ SETFILE
SERVHLP SX5 22 GET HELP WITH SERVER COMMANDS
EQ GETHELP
SX5 22 AMBIGUOUS S
EQ GETHELP
SB7 FTYPES SET-FILE-TYPE
EQ CREAD
EQ SHOWP SHOW
EQ STATUSP STATUS
SB5 -7 TYPE
EQ TYPECOM
PUSHIT TITLE PROGRAM TERMINATION
** PUSHIT TERMINATES EXECUTION AFTER SAVING VARIABLES.
PUSHIT SPACE 3,10
RJ SREAD
PUSHIT MI X5,*+3 TEST FOR END-OF-LINE
SX4 X5-45
ZR X4,*-2 IGNORE BLANKS
SX5 12
EQ GETHELP
SA7 UPDAT
EVICT ZZZKDAT GET RID OF ANYTHING ELSE ON FILE
SX6 WBUF
SA6 ZZZKDAT+3 START OF DATA
SA3 BITPREF
BX7 X3
SA7 X6 BIT PREFIX
SA3 DEBUGW
BX7 X3
SA7 A7+B1 DEBUG SETTING
SA3 A3+B1 DEFAULF
BX7 X3
SA7 A7+B1 DEFAULT FILE NUMBER
SA3 A3+B1 ESCAPEC
BX7 X3
SA7 A7+B1 ESCAPE CHARACTER
SA3 FILETYP+1
BX7 X3
SA7 A7+B1 FILE TYPE
SA3 A3+B1 SYNCM
BX7 X3
SA7 A7+B1 PACKET SYNCHRONISATION MARKER
SA3 A3+B1 PLENGTH
BX7 X3
SA7 A7+B1 PACKET LENGTH TO REQUEST
SA3 QUOTEC
BX7 X3
SA7 A7+B1 QUOTE CHARACTER
SA3 REPETC
BX7 X3
SA7 A7+B1 REPEAT PREFIX
SA3 A3+B1 TIMEOUT
BX7 X3
SA7 A7+B1 TIMEOUT TO REQUEST
SA3 A3+B1 FILETOT
BX7 X3
SA7 A7+B1 NUMBER OF FILES TRANSFERRED
SA3 RETRYN
BX7 X3
SA7 A7+B1 NUMBER OF RETRIES PERMITTED
SX6 A7+B1
SA6 A6-B1 ADDRESS AFTER END OF DATA
WRITER ZZZKDAT
SETFS ZZZKDAT,NAD
EQ FINIS1
FINIS SPACE 4,15
** FINIS TERMINATES EXECUTION WITHOUT SAVING VARIABLES.
FINIS SPACE 3,10
RJ SREAD
FINIS MI X5,*+3
SX4 X5-45
ZR X4,*-2
SX5 11
EQ GETHELP
SA7 UPDAT
RETURN ZZZKDAT
FINIS1 RJ LOGLIN
SA2 UPDAT
SB3 X2
RJ ZWRITE
RJ SLINE
RJ OSAVE
WRITER ZZZKLOG
ENDRUN
SPACE 4,6
OPL XTEXT COMCSYS
OPL XTEXT COMCCIO
OPL XTEXT COMCLFM
OPL XTEXT COMCCPM
XREF A
END KERMIT