home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
k12.tar.gz
/
k12.tar
/
k12mit.pal
< prev
next >
Wrap
Text File
|
1991-10-16
|
225KB
|
6,715 lines
/ KERMIT FOR DEC 12-BIT MACHINES
/ LAST EDIT: 06-SEP-1990 11:00:00 CJL
XLIST OFF
IFNDEF OFF <OFF= 1> /TURN LISTING OFF
IFNDEF ON <ON= 0> /TURN LISTING ON
XLIST ON; IFZERO 1 <
*** **** *********** ********* *** *** *** *********** ***** ****
*** **** *********** ********** **** **** *** *********** ***** ******
*** **** *** *** **** **** **** *** *** *** *** ***
*** **** *** *** *** ***** ***** *** *** *** ** ****
*** **** *** *** *** ***** ***** *** *** *** ** ***
******* *** *** **** ************ *** *** *** **
****** ********** ********** *** **** *** *** *** ***** *** **
******* ********** ********* *** **** *** *** *** ***** *** **
*** **** *** *** **** *** ** *** *** *** *** **
*** **** *** *** **** *** ** *** *** *** *** **
*** **** *** *** **** *** *** *** *** *** **
*** **** *********** *** **** *** *** *** *** *** *********
*** **** *********** *** **** *** *** *** *** *** *********
> XLIST ON
/ COPYRIGHT (C) 1989, 1990 BY THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF
/ NEW YORK.
/ PERMISSION IS GRANTED TO ANY INDIVIDUAL OR INSTITUTION TO COPY OR USE THIS
/ DOCUMENT AND THE PROGRAM(S) DESCRIBED IN IT, EXCEPT FOR EXPLICITLY COMMERCIAL
/ PURPOSES.
/ EDIT HISTORY. /014 CJL
/ 052 06-SEP-1990 BUG FIX. CHARLES LASNER (CJL)
/ SENDING A FILE WHICH EXACTLY FILLS THE LAST DATA PACKET AT THE
/ END OF THE FILE WILL CAUSE THE PACKET TO BE SENT TWICE. THE
/ ROUTINE DIDN'T CHECK FOR AN EMPTY OUTPUT BUFFER AT EOF.
/ 051 29-AUG-1990 BUG FIX. CJL
/ PDP-8/A NOT IDENTIFIED CORRECTLY IN CPUID ROUTINE. THE UPDATED
/ PC IS WHAT IS LOADED INTO THE AC WHEN 7016 IS EXECUTED ON THE
/ KK-8/A CPU. THE ROUTINE WAS CHECKING FOR THE NON-UPDATED VALUE.
/ ALSO NEW DOCUMENTATION FOR PRE-CLEARING MEMORY FOR BENEFIT OF
/ ENCODED BINARY FILES.
/ 050 06-SEP-1989 DECMATE I SUPPORT, ETC. CJL
/ THIS EDIT IMPLEMENTS DECMATE I SUPPORT USING THE DP278-A OR -B.
/ A NEW CONDITIONAL 'PORT' SELECTS WHICH PORT IS TO BE USED. IF
/ KERMIT-12 IS RUN ON DECMATE I (WHILE NOT CONFIGURED FOR SERIAL
/ PRINTER PORT COMMUNICATIONS; SEE EDIT 048.) THEN REMOTE
/ COMMUNICATIONS TAKES PLACE ON THE PORT SELECTED AT ASSEMBLY TIME
/ ('PORT=0' OR 'PORT=1'). ADDED BAUD RATE PARAMETER 'BRATE' TO
/ SELECT REMOTE COMMUNICATIONS BAUD RATE FROM THE STANDARD TABLE;
/ DEFAULTS TO 1200 BAUD ('BRATE=7').
/ 049 30-AUG-1989 REMOTE FLOW CONTROL, ETC. CJL
/ THIS EDIT IMPLEMENTS FLOW CONTROL SUPPORT (IF FLOW CONTROL IS
/ ENABLED) FOR THE REMOTE LINE WHILE SENDING PACKETS TO THE REMOTE
/ KERMIT REGARDLESS OF STATE. PREVIOUSLY, FLOW CONTROL ONLY
/ APPLIED TO CONNECT MODE. LOCAL FLOW CONTROL (TOWARDS THE REMOTE
/ KERMIT) IS UNNECESSARY AS LOCAL BUFFERS FOR REMOTE INPUT ARE
/ ALWAYS AVAILABLE. CERTAIN ROUTINE CHANGES MADE FOR BENEFIT OF
/ DECMATE I SUPPORT IN A SUBSEQUENT EDIT.
/ 048 24-AUG-1989 DECMATE II, ETC. SUPPORT. CJL
/ ONCE-ONLY CODE ADDED TO IMPLEMENT DECMATE II, ETC. REMOTE LINE
/ SUPPORT ON SERIAL COMMUNICATIONS PORT. SELECTED PORT IS
/ INDICATED ON OPENING BANNER IF OPERATING ON DECMATE.
/ THIS EDIT PROVIDES BASIC SUPPORT OF THE DECMATE II COMMUNICATIONS PORT AS AN
/ AUTOMATIC FEATURE OF THE STANDARD RELEASE OF K12MIT. AUTOMATIC DETECTION OF
/ DECMATE II, ETC. HARDWARE IS PERFORMED UNLESS THE PDP-8-TYPE REMOTE LINE
/ SUPPORT IS ASSEMBLED FOR THE SERIAL PRINTER AS THE REMOTE LINE ('SPRINT' IS
/ SET OR EQUIVALENT).
/ THIS EDIT INCORPORATES ALL OF THE INFORMATION TAKEN FROM VARIOUS SOURCES
/ REGARDING DECMATE PORT INITIALIZATION, ETC. EVERY ATTEMPT HAS BEEN MADE TO
/ COMPLETELY SET ALL APPROPRIATE REGISTERS, ETC. FOR DECMATE II, III, III+
/ OPERATION. NO SUPPORT EXISTS FOR THE DECMATE III BUILT-IN MODEM OPTION, AS
/ EXPLICIT DOCUMENTATION IS NOT AVAILABLE (SOME OF THE INITIALIZATION CODE IS
/ APPARENTLY USED TO DISABLE THE MODEM). THESE ROUTINES ARE ONLY KNOWN TO WORK
/ ON THE DECMATE II, AS THE III (ESPECIALLY WITH OPTIONAL MODEM) AND THE III+
/ HAVEN'T BEEN AVAILABLE TO THE AUTHOR FOR TESTING. THE INITIALIZATION CODE
/ WILL BE UPDATED LATER TO INCLUDE PANEL REQUESTS, ETC. TO CORRECT ANY
/ PROBLEMS, ETC. DECMATE-SPECIFIC FEATURES (SUCH AS SETUP COMMANDS) WILL BE
/ ADDED LATER AND ENABLED FROM THESE ROUTINES.
/ THIS EDIT INCORPORATES NON-INTERRUPT ROUTINES WHICH HAVE BEEN TESTED AT THE
/ MAXIMUM COMMUNICATIONS SPEED OF THE DECMATE II (19200 BAUD). THEY WILL
/ SUFFICE FOR ALL KERMIT IMPROVEMENTS SHORT OF SLIDING WINDOWS AT WHICH TIME
/ INTERRUPT-DRIVEN I/O WILL BE REQUIRED. (INTERRUPT-DRIVEN I/O IS ILLEGAL ON
/ CERTAIN OS/8 SYSTEMS WHERE INTERRUPTS ARE HARMFUL TO THE SYSTEM OR NON-SYSTEM
/ HANDLERS.)
/ 047 21-AUG-1989 CODE CLEANUP. CJL
/ STREAM-LINED CONNECT MODE ROUTINES FOR MINIMUM USE OF IOTS. THIS
/ IS IN PREPARATION FOR EVENTUAL DECMATE II OPERATION, AND TO
/ MINIMIZE K12PCH PATCH FILE SIZE. CERTAIN NON-CONNECT ROUTINES
/ MOVED TO FACILIATE CONNECT ROUTINE REORGANIZATION.
/ 046 15-AUG-1989 CODE CLEANUP. CJL
/ ADDED NEW (NON-CONNECT) MODE COMMUNICATIONS ROUTINES FOR EVENTUAL
/ DECMATE USE. ELIMINATION OF 'IREM' AND 'IREMW' ROUTINES IN FAVOR
/ OF 'COMIN'. ELIMINATION OF 'OREM' IN FAVOR OF 'COMOUT'. ADDED
/ STATUS UPDATE ROUTINE ('UPSTATUS') FOR EVENTUAL DECMATE II, ETC.
/ USAGE. ELIMINATED PDP-8, DECMATE I, DECMATE II CONDITIONALS.
/ REORGANIZED SERIAL LINE CONDITIONALS AND ADDED NEW 'SPRINT'
/ PARAMETER FOR SERIAL PRINTER PORT USAGE AS COMMUNICATIONS PORT.
/ ADDED ONCE-ONLY CODE ADDED TO AUTOMATICALLY RECOGNIZE DECMATE I
/ AND II OPERATION UNLESS ASSEMBLED FOR REMOTE COMMUNICATIONS ON
/ SERIAL PRINTER PORT ('SPRINT' SET). UPDATED K12PCH.PAL TO
/ CORRESPOND TO NEW DEFINITIONS. DEFINED EVENTUALLY NEEDED
/ COMMUNICATIONS PORT INSTRUCTIONS FOR DECMATE II; ACTUAL DECMATE
/ II OPERATION WILL BE DEFINED IN A SUBSEQUENT EDIT. DOCUMENTED
/ NEW LOADING AND SAVING INSTRUCTIONS FOR K12MIT TO ALLOW FOR
/ ONCE-ONLY CODE IN 10000-11777 WITHOUT SWAPPING THE CODE OUT FOR
/ THE USR. THIS ELIMINATES OVERHEAD WHEN LOADING K12MIT, BUT IS
/ DIFFERENT FROM THE FORMER INSTRUCTIONS WHICH ASSUMED NO OTHER
/ USAGE OF 10000-11777 OTHER THAN THE (LOCKED-IN) USR.
/ THIS EDIT PROVIDES THE FRAMEWORK FOR AUTOMATIC DETECTION OF PROGRAM EXECUTION
/ OF K12MIT ON ANY MEMBER OF THE DECMATE FAMILY (I, II, III, III+). WHEN
/ 6120-TYPE CPU DETECTION OCCURS, THE DECMATE I OR II-TYPE COMMUNICATIONS PORT
/ INITIALIZE CODE IS AUTOMATICALLY SELECTED AS NECESSARY UNLESS THE PDP-8-TYPE
/ ROUTINES ARE ASSEMBLED (WITH 'SPRINT' SET OR EQUIVALENT USER SETTINGS, ETC.)
/ FOR THE VT-78-TYPE PRINTER PORT (32/33), IN WHICH CASE THE COMMUNICATIONS IS
/ DONE VIA THE PRINTER PORT ON THE DECMATE (WHICH IS ALMOST PDP-8 COMPATIBLE AND
/ IS ACCOMODATED AS SUCH).
/ SUBSEQUENT EDITS SHOULD PROVIDE FOR A DECMATE I PARAMETER TO CONTROL THE PORT
/ SELECTION, AS THERE ARE AT LEAST TWO VARIANT OPTIONS BOARDS (DP-278A AND
/ DP-278B) EACH CONSISTING OF TWO PORTS.
/ 045 12-AUG-1989 BUG FIX. CJL
/ FINISH, GET, AND RECEIVE COMMANDS FAIL TO ABORT PROPERLY
/ (ESPECIALLY AFTER THE SEND COMMAND HAS BEEN USED), AS THE CURRENT
/ OPERATING MODE ('KMODE') IS NEVER PROPERLY SET, OR IS SET AFTER
/ SEVERAL PACKETS HAVE BEEN SENT. EACH COMMAND NOW SETS ITS OWN
/ OPERATING MODE BEFORE INITIATING ANY PACKETS.
/ 044 11-AUG-1989 CODE CLEANUP. CJL
/ CHANGED 'CCMSG' TO 'ABMSG' WITH CLEARER MESSAGE. CHANGED
/ 'CCFLAG' TO 'ABFLAG' FOR CONSISTENCY. CHANGED ABORT CHARACTER
/ FROM <^C> TO CHOICE OF <^X> OR <^Z> FOR CONSISTENCY. ELIMINATED
/ 'ITTY' AND 'ITTYW' ROUTINES BY USING 'CTLCTST' AND 'INPUT'
/ ROUTINES ALREADY AVAILABLE A/O EDIT 043. ELIMINATED 'TCHAR' IN
/ FAVOR OF 'INCHAR' AVAILABLE A/O EDIT 043.
/ 043 07-AUG-1989 CODE CLEANUP, ETC. CJL
/ REWRITE OF CONSOLE SUPPORT ROUTINES INCLUDING FORCED-ECHO OUTPUT
/ AND COLUMN COUNT FOR <HT> SIMULATION IN PREPARATION FOR IMPENDING
/ USER-INTERFACE REWRITE. 'SCRIBE', 'LININP', AND 'ESCPRNT'
/ ROUTINES NOW CALL "P7ECHO" ROUTINE TO ENSURE PRINTING OF CRUCIAL
/ MESSAGES.
/ 042 13-JUN-1989 CODE CLEANUP. CJL
/ FIXED VARIOUS NAK-RELATED BUGS AND SEND-INIT PROBLEMS AS IN K278
/ (SOME OF THE K278 STUFF IS DEFICIENT!). CALCULATION OF PROPER
/ SEQUENCE NUMBER FOR NAK CORRECTED OVER FORMER (K08MIT AND K278)
/ VERSIONS. ADDED ERROR MESSAGE FOR FULL-DISK PROBLEM.
/ 041 12-MAY-1989 BUG FIX. CJL
/ VARIOUS VERSIONS (DECMATE) WON'T FUNCTION REMOTELY WHILE KL-8
/ VERSIONS WORK FINE. ADDED REMOTE LINE READ IOT TO INITIALIZE
/ REMOTE LINE AT STARTUP TIME FOR VERSIONS REQUIRING THIS.
/ CORRESPONDING CHANGES IN PATCH FILE MADE FOR REMOTE LINE READ IOT
/ IN TWO PLACES.
/ 040 07-MAR-1989 COSMETIC CLEANUP. CJL
/ CLEANUP OF EDIT HISTORY AND OTHER COMMENTS.
/ 039 21-MAY-1988 CODE CLEANUP. CJL
/ ADDED VARIABLE 'INIECHO' TO ALLOW DEFAULT CONNECT-MODE STATE TO
/ BE HALF-DUPLEX ("SET LOCAL-ECHO ON"). MODIFIED INPUT SERVICE
/ ERROR ADDRESSES TO SIMPLIFY ERROR TABLES.
/ 038 19-MAY-1988 CODE CLEANUP. CJL
/ ELIMINATED TRAILER FILES DURING ASSEMBLY BY CREATING VARIABLES
/ 'GENMSG' AND 'UMSG.' THIS ALLOWS THE HEADER FILE (PARAM.PA) TO
/ CONTAIN THE LOCAL MESSAGE TEXT WITHOUT SUBSEQUENT OVERLAY (WHICH
/ WAS WHY THERE FORMERLY WAS A TRAILER FILE CAPABILITY). OVERLAY
/ BY K12PCH.BN WILL DEFAULT TO CREATION OF A DUMMY USER MESSAGE
/ (WITHIN K12PCH) ENCOURAGING LOCAL CUSTOMIZATION. K12MIT.BN WILL
/ CONTAIN A NULL MESSAGE BY DEFAULT UNLESS CUSTOMIZED IN PARAM.PA.
/ 037 21-JAN-1988 BUG FIX. CJL
/ RESET OS/8 DEVICE CONTROL WORD TABLE TO DELETE TENTATIVE FILE IN
/ CASE OF PRIOR INPUT SERVICE ERROR.
/ 036 20-JAN-1988 BUG FIX. CJL
/ RESET 'OFFLG' WHEN DOING INPUT SERVICE IN CASE PRIOR ERRORS LEAVE
/ THE FLAG SET.
/ 035 14-JAN-1988 USR RESIDENT CODING. CJL
/ CALLS TO USR NOW USE 10200 INSTEAD OF 17700. NO SWAP OVERHEAD
/ WHEN OPENING OR CLOSING FILES.
/ 034 13-JAN-1988 CODE CLEANUP. CJL
/ ALL EIGHT-BIT ORIENTED CONSOLE CODE ELIMINATED; NOW IGNORES
/ PARITY (JUST SEVEN BITS).
/ 033 12-JAN-1988 CODE CLEANUP. CJL
/ 'TTYOUT' AND 'OTTY' ROUTINES ELIMINATED; NOW USES 'P7CH' FOR ALL
/ CONSOLE OUTPUT (EXCEPT FOR CONNECT MODE).
/ 032 12-JAN-1988 CODE CLEANUP. CJL
/ VARIOUS ROUTINES REWRITTEN TO ELIMINATE DEPENDENCIES ON CPU TYPE
/ BEYOND THE CLASSIC PDP-8.
/ 031 11-JAN-1988 CODE CLEANUP. CJL
/ ELIMINATED 'RTDISP' AND CHANGED CALLING CONVENTION FOR DISPATCH
/ ROUTINE. ALL CALLERS NOW LOCAL OR VIA LOCAL POINTERS. ADDED
/ SEVERAL CONDITIONAL PARAMETERS AND LABELS FOR BENEFIT OF
/ K12PCH.PAL.
/ 030 05-JAN-1988 CODE CLEANUP. CJL
/ CHANGED LOWER/UPPER CASE CONDITIONAL ASSEMBLY PARAMETERS AND MORE
/ EFFICIENT CODE.
/ 029 21-DEC-1987 CODE CLEANUP. CJL
/ CHANGED CALLING CONVENTIONS FOR 'SCRIBE' AND SIMILAR ROUTINES AND
/ REWROTE 'COMMAND' ROUTINE.
/ 028 15-DEC-1987 CODE CLEANUP. CJL
/ COMPLETE REWRITE OF FILE LOOKUP ROUTINE. 'LUKUP' NOW USES FIELD
/ ONE BUFFER AND ITS OWN AUTO-INDEX REGISTER CONSERVING PROGRAM
/ SPACE.
/ 027 05-DEC-1987 CODE CLEANUP. CJL
/ CHANGED DISPATCH ('DISPA0') ROUTINE TO USE 'SRCHTABLE' ROUTINE.
/ ALL CALLS MADE COMPATIBLE. ELIMINATED 'SCANC' CODE. ELIMINATED
/ CODE WITHIN 'DPARS' ROUTINE. 'LUKUP' ROUTINE NOW DOES ITS OWN
/ DISK I/O. ELIMINATED 'BLKIN' ROUTINE.
/ 026 27-NOV-1987 NEW CONNECT MODE CODE. CJL
/ TOTAL REWRITE OF ALL CONNECT MODE CONSOLE AND REMOTE INPUT AND
/ OUTPUT TERMINAL ROUTINES. CONNECT IS NOW FULLY BUFFERED IN ALL
/ DIRECTIONS. IF FLOW CONTROL IS OBEYED, ANY BAUD RATE CAN BE
/ ACCOMODATED BOTH LOCALLY AND REMOTE (UP TO 9600 BAUD TESTED,
/ SHOULD WORK TO AT LEAST 19200 BAUD BY INSPECTION). TESTED WITH
/ FAST VT-100 EMULATOR CONSOLE TO PROVE ESCAPE SEQUENCES ARE NOT
/ DROPPED WHEN LOCAL TERMINAL IS FASTER THAN REMOTE LINE. LIMITED
/ USE OF SUBROUTINES TO IMPROVE HIGH BAUD RATE OPERATION. ADDED
/ TABLE-DRIVEN ERROR EXIT ROUTINE FOR SEND ROUTINES.
/ THIS EDIT PROVIDES FULLY BUFFERED INPUT/OUTPUT ROUTINES FOR BOTH LOCAL AND
/ REMOTE PORTS. NO INTERRUPTS ARE USED FOR MAXIMUM COMPATIBILITY WITH OS/8
/ DEVICES (SOME OF WHICH ARE INTOLERANT OF INTERRUPTS, SUCH AS TD-8/E). REMOTE
/ FLOW CONTROL (IF ENABLED) WILL SIGNAL BUFFER FILLING VIA <DC3> WHEN THE BUFFER
/ IS 3/4 FULL. WHEN THE BUFFER REACHES 1/4 FULL, THE REMOTE WILL BE SENT <DC1>
/ TO ALLOW FURTHER OUTPUT. REMOTE FLOW CONTROL IS SUPPORTED IN BOTH DIRECTIONS;
/ LOCAL FLOW CONTROL IS FROM THE KEYBOARD ONLY.
/ WHILE THE CONSOLE OUTPUT IS PAUSED BY <DC3>, THE BUFFER WILL FILL WITH OUTPUT
/ CHARACTERS. WHEN THE USER RELEASES THE CONSOLE WITH <DC1>, THE BUFFER WILL
/ RAPIDLY EMPTY (ASSUMING THE CONSOLE IS FASTER THAN THE REMOTE LINE). THIS
/ ALLOWS THE USER TO PAUSE THE CONSOLE WITHOUT BACKING UP THE REMOTE LINE UP TO
/ THE LIMITS OF BOTH LOCAL OUTPUT AND REMOTE INPUT BUFFERS.
/ 025 24-NOV-1987 NEW FEATURES AND CODE CLEANUP. CJL
/ PROPER INTERRUPT SETUP FOR <^C> AND <^P>, ECHO STATE. ALL
/ MESSAGES IN NEW FORMAT, (SOME NEW ONES HAVE BETTER CONTENT).
/ ELIMINATED 'PRI6B' AND 'REM6B' ROUTINES. NEW AND IMPROVED INPUT
/ SERVICE ERROR CODE MOVED TO PROPER PAGE. REWROTE CONNECT
/ ROUTINES TO ALLOW NON-INTERRUPT BUFFERED I/O LATER. CREATED NEW
/ VARIABLE 'ESCHAR' AND PARAMETER 'ESCAPE' TO SET DEFAULT ESCAPE
/ CHARACTER. ESCAPE CHARACTER CAN BE CHANGED IN MEMORY AND WILL BE
/ USED CORRECTLY BY ALL ROUTINES. ADDED 'ESCPRNT' ROUTINE TO
/ HANDLE ALL CASES (INCLUDING NON-CONTROL CHARACTERS). DEFAULT
/ ESCAPE PARAMETER VALUE COMPATIBLE WITH K08V2, BUT IS A USER
/ PARAMETER, CONFIGURED AS OTHER PARAMETERS DEFINED IN EDIT 017.
/ CREATED ESCAPE FUNCTION TABLE FOR EXPANSION LATER. NOW SUPPORTS
/ ESCAPE C(LOSE) IN UPPER OR LOWER CASE, ESCAPE ESCAPE (SEND ONE
/ ESCAPE CHARACTER). ALL BAD ESCAPE COMMANDS WILL ISSUE <BEL>
/ CHARACTER TO WARN USER THAT COMMAND IS ILLEGAL AND OTHERWISE WAS
/ IGNORED. CREATED NEW VARIABLE 'ECHOFLAG' TO ALLOW LOCAL ECHO IN
/ CONNECT MODE.
/ 024 19-NOV-1987 NEW FEATURES. CJL
/ NEW STARTUP MESSAGES AND HELP METHOD VIA COMMAND. CPU TYPE
/ IDENTIFICATION TO ALLOW FUTURE VERSIONS TO CHECK FOR QUIRKS AND
/ MODEL DEPENDENCIES. THE DEFAULT PROMPT REFLECTS THE ACTUAL CPU
/ TYPE (THUS "KERMIT-12>" ON PDP-12). VERSION, REVISION, AND DATE
/ NOW EQUATED SYMBOLS.
/ 023 18-NOV-1987 NEW CONSOLE I/O PACKAGE. CJL
/ NEW CONSOLE I/O ROUTINES WITH DC1/DC3 SUPPORT FOR CONSOLE
/ TERMINAL MESSAGES NOT ASSOCIATED WITH ANY REMOTE ACTIVITY (NOT TO
/ BE USED DURING CONNECT MODE). USES FIELD ONE FOR MESSAGE TEXT TO
/ ALLOW FOR MORE PROGRAM SPACE. THE MESSAGES ARE NOW GIVEN IN
/ UPPER/LOWER SIXBIT FORMAT. SUPPORT FOR <^P> RESTART AND <^O> TO
/ FLIP ECHO. UPPER-CASE CAN BE FORCED BY CHANGING A VARIABLE
/ ('UPONLY').
/ 022 17-NOV-1987 BUG FIX. CJL
/ EXTRA-LONG INIT PACKETS CORRUPTING PROGRAM; NOW CHECKS FOR AND
/ IGNORES EXTRA CAPABILITIES BEYOND 'CAPAS' BYTE.
/ 021 17-NOV-1987 CODE CLEANUP. CJL
/ REWROTE TENTATIVE OUTPUT FILE LENGTH CODE FOR MORE CONSISTENCY.
/ RENAMED "FINISH" COMMAND CORRECTLY (FORMERLY "BYE").
/ FORMER CODE REGARDING THE TENTATIVE FILE MAXIMUM LENGTH WAS ACCEPTABLY
/ ORGANIZED FOR ORIGINAL PS/8, OS/8 CONVENTIONS. WITH THE EVOLUTION OF THE
/ OPERATING SYSTEM INTO OS/78 (VERSIONS 1-4) AND OS/278 (VERSIONS 1-2), THE
/ ENTER OPERATION HAS BEEN CHANGED WITH DANGEROUS CONSEQUENCES.
/ THE ORIGINAL DEFINITION OF THE LENGTH RETURNED BY ENTER IS THE ACTUAL LENGTH
/ OF THE LARGEST EMPTY (IN TWO'S COMPLEMENT FORM). IF RECORD 7777 IS PART OF
/ THE ACTUAL LARGEST EMPTY (FULL SIZE DEVICE AND THE LARGEST EMPTY IS LAST ON
/ THE DEVICE), THEN THE LENGTH RETURNED IS ONE LESS (THIS IS A LONG STANDING
/ BUG). SINCE THERE IS NO STRAIGHT-FORWARD WAY TO DETERMINE THIS, THE LENGTH IS
/ ASSUMED TO BE CORRECT.
/ TESTS WITH THE DECUS VERSION OF OS/278 (DM-101) REVEAL A DANGEROUS CHANGE:
/ THE LENGTH RETURNED IS TWO LARGER THAN ACTUALLY EXISTS!
/ TO COUNTERACT THIS, EDIT 010 INSERTED A DECREMENT OF TWO INTO THE LENGTH
/ BEFORE PASSING IT BACK TO THE KERMIT FILE WRITING ROUTINE. THE FILE WRITING
/ ROUTINE THEN ADDS ONE TO THE LENGTH TO CREATE A "DANGER COUNT", I.E., IN TWO'S
/ COMPLEMENT NOTATION, THIS IS THE AMOUNT THAT WILL INDICATE FILE OVERFLOW
/ SHOULD IT REACH ZERO.
/ THIS HAS NOW BEEN REORGANIZED TO ALLOW THE ENTER ROUTINE TO SET THE DANGER
/ COUNT DIRECTLY. OS/8 USERS MUST ALLOW FOR THE EXTRA ROOM (WHICH MUST BE
/ PRESENT BUT WILL NOT BE USED), SINCE NO CHECK FOR SYSTEM VERSION WILL BE
/ PERFORMED.
/ 020 16-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL
/ REWROTE ENTIRE OUTPUT FILE PACK ROUTINE. NOW SUPPORTS
/ ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES OUTPUT
/ BUFFER IN FIELD ONE (SAME DEFINITIONS AS INPUT BUFFER) TO ALLOW
/ MORE PROGRAM SPACE. END OF FILE CONVENTION IN ASCII MODE NOW
/ INCLUDES ENSURING <^Z> CHARACTER PACKED INTO FILE (OR NOT).
/ REWROTE ENTIRE OUTPUT FILE CLOSE ROUTINE TO IMPLEMENT <^Z>
/ SCHEME. ELIMINATED SEPARATE OUTPUT FILE INITIALIZE ROUTINE; USE
/ SPECIAL ROUTINE CALL INSTEAD. FIXED PACKET WRITE BUG.
/ 019 15-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL
/ FIXED UNPACK <^Z> BUG. REWROTE ENTIRE INPUT FILE UNPACK ROUTINE.
/ NOW SUPPORTS ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES
/ INPUT BUFFER IN FIELD ONE TO ALLOW MORE PROGRAM SPACE. BUFFER
/ FIELD DEFINED VIA SYMBOLS TO ALLOW CHANGES IN THE FUTURE. END OF
/ FILE CONVENTION IN ASCII MODE NOW INCLUDES SENDING <^Z> CHARACTER
/ OR NOT. ELIMINATED SEPARATE INPUT FILE INITIALIZE ROUTINE; USE
/ SPECIAL ROUTINE CALL INSTEAD.
/ 018 09-NOV-1987 BUG FIX AND CODE CLEANUP. CJL
/ FIXED RECEIVE BUG; NOW ALLOW DEV: ON RECEIVE.
/ 017 05-NOV-1987 NEW FEATURES. CJL
/ CONDITIONAL ASSEMBLY PARAMETERS ADDED FOR MACHINE TYPE (PDP-8,
/ DECMATE I, DECMATE II/III/III+), REMOTE LINE AND LOCAL TERMINAL
/ INTERFACE DEFINITIONS.
/ 016 05-NOV-1987 CODE CLEANUP. CJL
/ OPTIMIZATION OF CODE, LITERALS, CONSTANTS.
/ 015 04-NOV-1987 BUG FIX. CJL
/ INPUT SERVICE ROUTINE ERROR DOES JMP INSTEAD OF JMS WHEN CALLING
/ COMMON ERROR HANDLER.
/ 014 02-NOV-1987 SOURCE FILE CLEANUP. CJL
/ SOURCE FILE COSMETICALLY CLEANED UP AND RENAMED TO K12MIT.PAL
/ WHICH CONFORMS WITH CUCCA NAMING CONVENTION. NO ACTUAL BINARY
/ CODE CHANGES BEYOND K08V2. THIS EDIT HISTORY ADDED. ENTRIES
/ PRIOR TO 014 TRANSCRIBED BY CJL.
/ SINCE THE PDP-12 (AND OTHER 12-BIT DEC MACHINES) IS THE INTENDED ENVIRONMENT
/ FOR THIS PROGRAM, IT IS NOW KNOWN AS KERMIT-12.
/ ASSEMBLING THE SOURCE FILE PRODUCES BINARY IDENTICAL TO K08V2.PA CONFIRMING
/ THAT SOURCE CLEANUP DOESN'T DAMAGE THE CODING (K08V2 IS NOW OBSOLETE).
/ 013 01-OCT-1987 CHANGE TO VERSION 2.0. R. SCHLERF (RICH)
/ CHANGED 'RKIOT'/'RTIOT' TO 43/44 REMOTE LINE IOT (LOCAL
/ PREFERENCE). CHANGED 'ESCAPE' CHARACTER TO ^] ('CONX1') FOR
/ GENERIC CONFORMITY. ADDED VERSION/COMMAND BANNER AT STARTUP FOR
/ MINI-HELP. INCORPORATED K278 CHANGES 003-006, 009-010 (NO
/ INTERRUPTS). DELETED 'ERRMSG.' NOW USES 'STXERR' AT 'CLOOP9'+2
/ FOR PROGRAM SPACE. TO CONFORM TO GENERIC KERMIT, "BACK ON PDP8"
/ MESSAGE DELETED AND REPLACED WITH BEEP <^G>. MESSAGE "SENDING
/ FILE XXXXXX.XX CREATED ON DD-MM-YY" REDUCED TO "SENDING FILE
/ XXXXXX.XX" TO CONFORM TO GENERIC KERMIT. PARITY BIT IS IGNORED
/ ON BOTH REMOTE AND TTY LINES. OUTPUT PARITY IS SET TO SPACE.
/ PROGRAM RENAMED TO K08V2.PA AND MADE AVAILABLE TO CUCCA BY:
/ RICHARD SCHLERF (RICH)
/ AMERICAN CYANAMID COMPANY
/ MEDICAL RESEARCH DIVISION
/ LEDERLE LABORATORIES
/ BUILDING 190 ROOM 115H
/ PEARL RIVER, NEW YORK 10965
/ (914) 732-2186 (09:00 TO 16:00)
/ SINCE PRIMARY APPLICATION OF K08V2 IS FOR PDP-8 USAGE, THE MODIFICATIONS NOT
/ SPECIFIC TO DECMATE II/III FROM K278 WERE MOVED TO THE K08MIT VERSION. FUTURE
/ VERSIONS WILL INCORPORATE THE DECMATE FEATURES AND THUS OBSOLETE ALL OTHER
/ VERSIONS AT THAT TIME.
/ 012 04-JUN-1986 PROGRAM FIX. SEPP STADELMANN (SSTA)
/ RE-INITIALIZE VIA 'V30ST' AS ROM SETUP CLEARS COMPOSETABLE, ETC.
/ 04-JUN-1986 VERSION RELEASED TO CUCCA BY MARTYN HEMMINGS (DEC GERMANY) AND
/ SEPP STADELMANN (DEC SWITZERLAND) OF:
/ DIGITAL EQUIPMENT CORPORATION (DEC)
/ 146 MAIN STREET
/ MAYNARD, MASS 01754
/ (617) 897-5111
/ CUCCA RENAMED FILES (KERMIT.PA AND KERCOM.PA) TO K278.PA AND K278COM.PA (WHICH
/ DOESN'T REALLY CONFORM TO THE NAMING CONVENTION).
/ CUCCA VERSION OF K278.PA FOUND TO BE DEFECTIVE. FILE REPAIRED BY:
/ CHARLES LASNER (CJL)
/ CLA SYSTEMS
/ 72-55 METROPOLITAN AVENUE
/ MIDDLE VILLAGE, NEW YORK 11379-2107
/ (718) 894-6499
/ REPAIRED FILE (K278.PA) NOW AVAILABLE AT CUCCA.
/ PROGRAM IS NOW THE DECMATE II/III (III-PLUS) KERMIT ONLY. HOOKS WERE LEFT IN
/ FOR PDP-8 VERSION, BUT NOT IMPLEMENTED. K278 DOES WORK WITH ADDITIONAL
/ IMPLEMENTATIONS OF KERMIT, BUT RECEIVE COMMAND DOES NOT WORK. PROGRAM YIELDS
/ RECOVERABLE SYSTEM ERROR/HALT WHEN EXITING TO FLOPPY-BASED DECMATE II SYSTEM.
/ CONNECT MODE IS VT200 8-BIT WHICH CONFUSES EVEN/ODD PARITY SYSTEMS. K278 DOES
/ NOT SUPPORT SETUP KEY OF DECMATE, BUT IMPLEMENTS SETUP COMMAND.
/ 011 04-JUN-1986 NEW FEATURES. SSTA
/ 'PRQ3' CODE CONDITIONALS. ROM SETUP COMMAND IMPLEMENTED FOR DMII/III.
/ AUTOMATIC UPPERCASE SELECT ON RETURN FROM CONNECT.
/ 010 13-MAR-1986 BUG FIX. MARTYN HEMMINGS (MART)
/ FULL DISK HANDLED WELL.
/ 009 13-MAR-1986 BUG FIX. MART
/ CLEAN UP BREAK AND GET.
/ 008 12-MAR-1986 BUG FIX. MART
/ CLEAR INPUT CHARACTERS FROM COMMUNICATIONS PORT WHEN IN IDLE
/ LOOP.
/ 007 11-MAR-1986 NEW FEATURES AND BUG FIX. MARTYN HEMMINGS AND
/ SSEP STADELMANN
/ (MART+SSTA)
/ INTERRUPT DRIVEN AND BUG FIX.
/ 006 10-MAR-1986 NEW FEATURE. MART+SSTA
/ DEVICE PARSE ON GET.
/ 005 10-MAR-1986 BUG FIX. MART+SSTA
/ NO DATE IN FILE WITH <^Z> INTACT.
/ 004 10-MAR-1986 NEW FEATURES AND BUG FIX. MART+SSTA
/ MAXIMUM RECEIVE BUFFER FIXUP ('RTERMI'), 15 SECOND TIME-OUT
/ DURING CONNECT.
/ 003 10-MAR-1986 BUG FIX. SSTA
/ TWO PAGE HANDLER FIX.
/ K08MIT.PAL COPIED TO DEC ENGINEERING NETWORK (NODE LSMVAX::) ULTIMATELY TO
/ EUROPE (NODE VIRGIN::) WHERE PROGRAM BECAME KERMIT.PAL AND KERCOM.PAL.
/ KERMIT.PAL AND KERCOM.PAL ARE TWO SOURCE FILES ASSEMBLED TOGETHER TO PRODUCE
/ THE RUNNING KERMIT-8. *THEY ARE FOR THE DECMATE II/III/III-PLUS ONLY.*
/ 002 18-JUL-1985 ORIGINAL RELEASE. RANDY HIPPE
/ 18-JUL-1985 VERSION RELEASED TO CUCCA BY JERRY SANDS AND RANDY HIPPE OF:
/ BUREAU OF ENGRAVING, INC.
/ 3311 BROADWAY N.E.
/ MINNEAPOLIS, MN 55413
/ (612) 623-0900 X218
/ CUCCA RENAMED FILE (KER8.PAL) TO K08MIT.PAL WHICH CONFORMS TO NAMING
/ CONVENTION OF KERMIT FILES.
/ K08MIT SUPPORTS CONNECT, BYE (REALLY FIN), EXIT, SEND, GET, RECEIVE ONLY.
/ PROGRAM PRONE TO GETTING "CONFUSED" AND OUTPUTS FILE DATE ATTRIBUTE BOTH AS
/ 'CAPAS' BYTE FEATURE AND ASCII TEXT INSERTED INTO CONTENTS OF FILE AHEAD OF
/ FILE DATA. COMMAND PROCESSOR ACCEPTS UPPER-CASE COMPLETE COMMANDS ONLY. <^C>
/ ABORT FEATURE TAKES VERY LONG TIME TO ACT (IF AT ALL!). MANY KERMITS WILL NOT
/ WORK WITH K08MIT; HOWEVER, K08MIT WAS TESTED SUCCESSFULLY WITH KERMIT-20.
/ 001 30-JUL-1984 FIRST VERSION (KER8.PAL). JERRY SANDS
/ HARDWARE HINTS AND KINKS.
/ KERMIT-12 REQUIRES THE FOLLOWING STANDARD OS/8 FAMILY CONFIGURATION:
/ PDP-8 FAMILY MEMBER WITH AT LEAST 8K MEMORY.
/ OS/8 SYSTEM DEVICE (WITH OS/8 FAMILY OPERATING SYSTEM RESIDENT).
/ KL8-COMPATIBLE CONSOLE INTERFACE.
/ 7/8-BIT ASCII EXTERNAL CONSOLE TERMINAL DEVICE (TTY:).
/ KL8-COMPATIBLE REMOTE INTERFACE TO OTHER KERMIT.
/ NOTE: ASSEMBLY PARAMETERS OF KERMIT-12 ALLOW FOR LOCAL KERMIT CONTROLLING
/ TERMINALS TO BE OTHER THAN THE PRIMARY OS/8 CONSOLE DEVICE. THE ACTUAL
/ HARDWARE MUST STILL CONFORM TO THE SAME REQUIREMENTS (THE DEVICE CODES WOULD
/ THEN BE USER-SPECIFIED AND DIFFER FROM THE STANDARD 03/04) AS THE STANDARD
/ CONSOLE INTERFACE AND TERMINAL.
/ SPECIAL DECMATE CONSIDERATIONS:
/ DECMATE USAGE IS USUALLY OBTAINED BY ASSEMBLING FOR THE STANDARD CONSOLE
/ DEVICE (03/04), AS THE BUILT-IN FIRMWARE/SLUSHWARE OF THE DECMATES IS
/ SUFFICIENTLY COMPATIBLE WITH THE PDP-8 HARDWARE FOR KERMIT-12'S REQUIREMENTS.
/ (THE ONLY OTHER ACCEPTABLE CONSOLE DEVICE ON THE DECMATE IS THE PRINTER PORT.)
/ DECMATE REMOTE COMMUNICATIONS PORTS ARE *RADICALLY* DIFFERENT FROM
/ KL8-COMPATIBLE PORTS. THESE ARE HANDLED AUTOMATICALLY BY ONCE-ONLY CODE WHICH
/ DETECTS THE USAGE OF KERMIT-12 ON THE SPECIFIC DECMATE SYSTEM, AND
/ SELF-CONFIGURATION AS APPROPRIATE. THERE IS ONE EXCEPTION TO THIS, NAMELY IF
/ THE COMMUNICATIONS PORT CODE IS ASSEMBLED FOR THE PRINTER PORT (32/33), THEN
/ THE PRINTER PORT, *NOT* THE COMMUNICATIONS PORT WILL BE USED. THE STANDARD
/ ASSEMBLY OF KERMIT-12 IS FOR A PDP-8 WITH DEVICE 40/41 COMMUNICATIONS PORT.
/ THIS DESIGNATED VERSION WILL SELF-CONFIGURE WHEN EXECUTED ON A DECMATE.
/ CONFIGURATION RESTRICTIONS:
/ WHEN INTERRUPTS ARE SUPPORTED AGAIN, DEVICES SUCH AS THE TD-8/E WON'T WORK.
/ THE NON-INTERRUPT VERSION SHOULD WORK TO 19200 BAUD ON THE PDP-8/E CPU, SO
/ THIS SHOULD NOT BE A PROBLEM. INTERRUPT-DRIVEN VERSIONS OF KERMIT-12 MUST BE
/ RUN ONLY ON SYSTEMS WHERE *ALL* INTENDED DEVICES CAN HAVE THEIR HANDLERS
/ INTERRUPTED BY THE CONSOLE AND REMOTE LINE INTERRUPT HANDLERS. WHEN IN DOUBT,
/ THE NON-INTERRUPT VERSION MUST BE USED (CURRENTLY THE ONLY VERSION).
/ IF FLOW CONTROL IS DISABLED (DUE TO XON/XOFF BEING UNAVAILABLE) THEN THE
/ CONSOLE BAUD RATE MUST MEET OR EXCEED THE REMOTE LINE RATE. THE USER MUST
/ TAKE MINIMAL CARE NOT TO OVERLOAD THE INTERNAL BUFFERS OF KERMIT-12, AS THIS
/ WILL YIELD THE ERROR MESSAGE: KEYBOARD INPUT ERROR!
/ THIS IS NOT LIKELY TO OCCUR UNLESS ONE "PLAYS" WITH A KEYBOARD WHICH CAN
/ GENERATE NUMEROUS ESCAPE SEQUENCES AS THE BUFFERS ARE QUITE ADEQUATE FOR ALL
/ REASONABLE TERMINAL APPLICATIONS. SIMILARLY, IF THE REMOTE LINE DOES NOT OBEY
/ XON/XOFF PROTOCOL (WHILE KERMIT-12 HAS IT ENABLED), THEN INTERNAL BUFFER
/ OVERFLOW WILL YIELD THE ERROR MESSAGE: REMOTE LINE INPUT ERROR!
/ THESE ERRORS ARE EXTREMELY UNLIKELY AND CAN ONLY BE CREATED BY MISUSE OF FLOW
/ CONTROL (THE ONLY EXCEPTION TO THIS IS THE ATTEMPT TO USE KERMIT-12 WITH THE
/ CONSOLE BAUD RATE SLOWER THAN THE REMOTE LINE BAUD RATE WITH FLOW CONTROL
/ DISABLED). IF FLOW CONTROL IS ENABLED AND OBEYED THEN THE BUFFERING OF REMOTE
/ LINE INPUT WILL OCCUR WHILE SHORT PAUSES OCCUR ON THE CONSOLE (ASSUMING THE
/ USER FREEZES/UNFREEZES THE DISPLAY OFTEN AND THE CONSOLE DISPLAY BAUD RATE IS
/ FASTER THAN THE REMOTE LINE BAUD RATE) WITH PRACTICALLY NO REMOTE LINE DELAY.
/ FLOW CONTROL IS NOT YET SUPPORTED DURING KERMIT TRANSFERS. SINCE KERMIT-12
/ DOES NOT SUPPORT SLIDING WINDOWS, KERMIT-12 WILL NEVER GENERATE OUTGOING
/ XON/XOFF SEQUENCES. FUTURE REVISIONS WILL SUPPORT INCOMING XON/XOFF FROM THE
/ REMOTE KERMIT. XON/XOFF PROTOCOL DURING CONNECT MODE IS COMPLETELY AVAILABLE
/ AT THE USER'S OPTION.
/ CONSOLE TERMINALS ARE REQUIRED TO SUPPORT "GLASS TTY:" FEATURES, I.E. THE
/ PRINTING ASCII CHARACTER SET (LOWER-CASE DESIRABLE) AND THE CONTROL CHARACTERS
/ <CR>, <LF>, AND <BEL> (THE LAST FOR VARIOUS AUDIBLE REPORTS ONLY). TERMINALS
/ LACKING LOWER-CASE SUPPORT SHOULD "FOLD" LOWER-CASE CHARACTERS TO UPPER-CASE
/ AUTOMATICALLY. TERMINALS SUCH AS THE VT05 CAN HAVE THE KEYBOARD LOWER-CASE
/ ENABLED, AS KERMIT-12 SUPPORTS OPTIONAL OUTPUT FOLDING. THE UPPER-CASE ONLY
/ OPTION SHOULD BE ENABLED FOR TERMINALS WHICH IGNORE LOWER-CASE INPUT FROM THE
/ HOST, AS KERMIT-12 GENERATES NUMEROUS LOWER-CASE MESSAGE CHARACTERS (WHICH
/ BECOME UPPER-CASE IF THIS OPTION IS SET). THE <BS> CHARACTER IS REQUIRED FOR
/ VISUAL RUBOUT (<BS> <SPACE> <BS>) ONLY. FUTURE VERSIONS WILL SUPPORT
/ HARD-COPY BACKSPACE TO REMOVE THIS REQUIREMENT. ALL TERMINAL FEATURES (SUCH
/ AS ACTUAL VT-100 FUNCTIONALITY) ARE FREELY PASSED TO THE HOST DURING CONNECT
/ MODE; THE ONLY CHARACTER ACTUALLY RESERVED IS THE ESCAPE CHARACTER WHICH WILL
/ BE TREATED AS A SEVEN-BIT CHARACTER ONLY. IF THE USER PRESSES THE ESCAPE
/ CHARACTER TWICE, THEN THE SEVEN-BIT REPRESENTATION OF THE CHARACTER IS SENT
/ ONCE; THERE IS NO WAY TO SEND THE ESCAPE CHARACTER WITH THE HIGH-BIT SET.
/ SINCE THE ESCAPE CHARACTER ITSELF CAN BE SET TO ALMOST ANY SEVEN-BIT VALUE,
/ THIS SHOULD NOT BE A SERIOUS LIMITATION. TERMINALS THAT DON'T "BEEP" WHEN THE
/ <BEL> CHARACTER IS SENT SHOULD NOT OUTPUT A PRINTABLE RENDITION OF THE <^G>
/ CHARACTER, AS THIS WOULD DISRUPT THE TERMINAL OUTPUT AND INTERNAL COLUMN COUNT
/ DURING VARIOUS MESSAGE SEQUENCES, ETC.
/ KL-8/E INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS:
/ 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA.
/ FUNCTIONAL BAUD RATES INCLUDE 110, 150, 300, 600, 1200, 2400, 4800, 9600,
/ 19200, 38400 AND 76800. 2400 BAUD REQUIRES A REVISION "B" OR BETTER M8650
/ MODULE (IF ONE USES DEC'S DOCUMENTATION OF AVAILABLE SPLIT-LUG OPTIONS).
/ ACTUAL BAUD RATES UP TO APPROXIMATELY 100 KBAUD SHOULD WORK WHEN KERMIT-12
/ BECOMES INTERRUPT-DRIVEN. RATES OTHER THAN 110 BAUD REQUIRE A 19.6608 MHZ
/ BAUD-RATE OSCILLATOR.
/ THE BAUD RATES STATED ABOVE ARE ACTUALLY AVAILABLE ON THE KL-8/E, BUT REQUIRE
/ A SINGLE SOLDER JUMPER TO IMPLEMENT THE PROPER BAUD RATE ABOVE 2400 BAUD.
/ CHANGING BAUD-RATE GENERATOR CRYSTALS WILL PRODUCE OTHER RATES AS NECESSARY.
/ (SEND INQUIRIES TO CLA SYSTEMS FOR INFORMATION REGARDING KL-8/E MODIFICATIONS
/ INCLUDING UPGRADED BAUD-RATE OSCILLATORS, ETC.) KERMIT-12 HAS BEEN TESTED TO
/ 9600 BAUD AND SHOULD WORK TO 19200 BAUD (AS OF THE CURRENT VERSION).
/ KL8-J/A INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS:
/ 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA NO PARITY.
/ FUTURE VERSIONS OF KERMIT-12 WILL SUPPORT VARIOUS SOFTWARE-GENERATED PARITY
/ OPTIONS. THE FRAMING AND OVERRUN ERRORS CAN BE ENABLED AND WILL EVENTUALLY BE
/ SUPPORTED (BUT THE PARITY GENERATOR SHOULD BE DISABLED TO PREVENT INTERACTION
/ WITH THE SOFTWARE USE OF PARITY GENERATION/DETECTION).
/ ALL BAUD RATES ARE SUPPORTABLE:
/ 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200.
/ 19200 BAUD IS ACHIEVED BY CUTTING JUMPER "W2" AND ADDING JUMPER "W5" AND THEN
/ SETTING THE BOARD FOR WHAT IS NORMALLY 9600 BAUD. A WESTERN DIGITAL TR-1602-B
/ OR EQUIVALENT UART IS REQUIRED TO SUPPORT 19200 BAUD; MOST OF THE RECENT
/ PRODUCTION DEC M8655 BOARDS USE THE SMC COMM 2017 UART WHICH MEETS OR EXCEEDS
/ THIS REQUIREMENT. EARLY M8655 BOARDS USE GI UARTS IN CERAMIC PACKAGES WHICH
/ *CANNOT* BE USED AT 19200 BAUD (MANY ARE FLAKY AT 9600 BAUD!).
/ RECEIVE BAUD RATE SHOULD BE IDENTICAL TO TRANSMIT BAUD RATE. (DO NOT SET THE
/ RECEIVE=150 BAUD SWITCH!)
/ OTHER INTERFACES:
/ DKC-8/A (8/A OPTION BOARD #1) INTERFACES SHOULD BE SETUP AS PER THE KL8-J/A
/ SPECIFICATIONS INCLUDING THE REQUIREMENTS OF THE UART. SOME DEC DOCUMENTATION
/ INDICATED A PROHIBITION ON THE USE OF 19200 BAUD, BUT THIS IS OBVIATED BY THE
/ USE OF THE SAME UARTS AS IN THE KL8-J/A.
/ EARLIER DEVICES SUCH AS PT08, DP-12, KL-8/F OR DC02 (CHANNEL ZERO ONLY) SHOULD
/ WORK CORRECTLY AS FACTORY WIRED (MOST OF THESE DEVICES DO NOT SUPPORT OPTIONS
/ KERMIT-12 WOULD REQUIRE TO BE DISABLED ANYWAY. THESE INCLUDE PARITY
/ GENERATION, FRAMING ERROR DETECTION, ETC.). TO UTILIZE THESE DEVICES, THE
/ ASSEMBLY PARAMETERS FOR USER DEVICES AND THEIR RESPECTIVE DEVICE CODE VALUES
/ SHOULD BE GIVEN DURING ASSEMBLY (SEE ASSEMBLY INSTRUCTIONS). PROPER DEVICE
/ CODE VALUES MUST BE OBTAINED FOR THE SELECTED INTERFACE, AS THERE ARE MANY
/ ACTUAL POSSIBILITIES. (DP-12 DEVICES ARE GENERALLY DEVICE 40/41; PT08/DC02
/ INTERFACES ARE GENERALLY DEVICE 11/12, ETC.)
/ ASSEMBLY INSTRUCTIONS.
/ KERMIT-12 CAN BE ASSEMBLED BY EITHER OF TWO METHODS:
/ P?S/8 METHOD:
/ ASSUMING THE EXTENDED-LENGTH FILE KERM12 IS THE SOURCE FILE, THE FOLLOWING
/ COMMAND WILL PRODUCE A FULLY ORNAMENTED LISTING:
/ .PAL KB1,KB2,KB3,KB4<KERM12(ACEJLMNPQSX8)
/ OPTION SWITCH BREAKDOWN:
/ /A ALL SYMBOLS IN SYMBOL PRINTOUT.
/ /C OPTIMIZE CORE DURING ASSEMBLY FOR MORE SYMBOLS, LESS BUFFERS.
/ THIS OPTION SHOULD BE DELETED IF MORE THAN 8K IS AVAILABLE FOR
/ ASSEMBLY.
/ /E FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE.
/ /J *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD.
/ /L PERFORM SECOND-PASS LISTING.
/ /M CHAIN TO MAP FOR BITMAP OUTPUT AT END OF ASSEMBLY.
/ /N ENABLE NEATNESS ADORNMENTS TO LISTING OUTPUT.
/ /P ENABLE PRINTER-ORIENTED (WIDE MODE) LISTING OUTPUT.
/ /Q ENABLE LITERALS ONLY, GENERATED LINKS ARE ERRORS.
/ /S ENABLE SYMBOL TABLE PRINTOUT.
/ /X ENABLE CROSS-REFERENCE OUTPUT AT END OF ASSEMBLY.
/ /8 ENABLE FULL SYMBOL TABLE INCLUDING LINC MODE CROSS ASSEMBLY.
/ THE NUMBER OF BINARY FILES REQUIRED (KB1, KB2, KB3, ETC.) IS TO BE DETERMINED
/ AT ASSEMBLY TIME, AS KERMIT-12 WILL TEND TO GROW LARGER AS FEATURES ARE ADDED.
/ P?S/8 PAL IS THE PREFERRED METHOD OF ASSEMBLING K12MIT DURING DEVELOPMENT DUE
/ TO SUPERIOR ERROR DIAGNOSTICS AND OVERALL SPEED. K12MIT COULD GROW TO A SIZE
/ BEYOND THE CAPABILITIES OF OS/8 CREF. THIS LIMITATION CANNOT APPLY TO THE
/ P?S/8 DEVELOPMENT ENVIRONMENT.
/ P?S/8 PAL CAN PRODUCE A LISTING OF K12MIT, BUT THE BINARY FILES CREATED BY THE
/ ASSEMBLY MUST BE TRANSFERRED TO AN OS/8 ENVIRONMENT FOR USE, SINCE K12MIT (AS
/ SPECIFICALLY WRITTEN) IS FOR THE OS/8 FAMILY OF SYSTEMS ONLY.
/ NOTE: P?S/8 IS *NOT* A DEC PRODUCT; IT IS SOLD COMMERCIALLY AND IS AVAILABLE
/ FREE OF CHARGE (EXCEPT FOR MEDIA HANDLING CHARGES, ETC.) *ONLY* TO QUALIFIED
/ INSTITUTIONS. CONTACT CJL FOR ADDITIONAL INFORMATION ON ACQUIRING P?S/8.
/ OS/8 FAMILY OF SYSTEMS METHOD:
/ K12MIT.PA CAN BE ASSEMBLED WITH PAL8 VERSION B0 WHICH IS AVAILABLE FROM DECUS
/ AS PART OF THE OS/278 RELEASE. PAL8 VERSION B0 WILL RUN ON ANY OS/8 FAMILY
/ SYSTEM, AS IT HAS NO HARDWARE DEPENDENCIES BEYOND THE ORIGINAL PDP-8
/ REQUIREMENT (NO BSW OR IAC ROTATE OR CAF OR R3L INSTRUCTIONS AS WAS INTENDED).
/ THIS ALSO APPLIES TO CREF VERSION B0 WHICH IS REQUIRED WHEN A CROSS-REFERENCE
/ IS REQUESTED. PAL8 VERSION B0 AND CREF VERSION B0 ARE AVAILABLE AS PART OF
/ THE KERMIT-12 DISTRIBUTION AS K12PL8.ENC AND K12CRF.ENC RESPECTIVELY. SEE THE
/ DOCUMENTATION OF K12DEC FOR INFORMATION ON PRODUCING PAL8.SV AND CREF.SV FROM
/ THESE ENCODED FILES.
/ ASSUMING CCL IS ENABLED, THE FOLLOWING COMMAND WILL PRODUCE A BINARY AND FULLY
/ ORNAMENTED LISTING:
/ .PAL DEV:K12MIT.BN,DEV:K12MIT.LS,DEV:KSCR.TM<DEV:PARAM.PA,DEV:K12MIT.PA(CEFMW)
/ DEV: IS THE APPLICABLE DEVICE WHERE THE FILES RESIDE. STANDARD EXTENSIONS
/ ARE ASSUMED (.BN FOR BINARY, .LS FOR LISTING, .PA FOR PAL SOURCE). THE
/ KSCR.TM TEMPORARY OUTPUT FILE SPECIFICATION IS OPTIONAL, BUT IS DEFAULTED TO
/ SYS:CREFLS.TM IF NOT EXPLICITLY GIVEN. MANY SYSTEM DEVICES ARE TOO SMALL TO
/ SUPPORT THIS TEMPORARY FILE, THUS THE FILE MAY BE DIRECTED TO ANOTHER
/ AVAILABLE DEVICE WITH SUFFICIENT SPACE.
/ THE PARAM.PA FILE IS OPTIONAL AND USED TO PASS SHORT USER PARAMETERS, ETC. TO
/ THE ASSEMBLY.
/ OPTION SWITCH BREAKDOWN:
/ /C CHAIN TO CREF.SV TO PRODUCE A CROSS-REFERENCED LISTING FILE.
/ /E GENERATED LINKS ARE ERRORS.
/ /F *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD.
/ /M USE MAMMOTH SYMBOL TABLE OPTION FOR CREF.
/ /W FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE.
/ LOADING INSTRUCTIONS:
/ .LOAD DEV:K12CLR,K12MIT.BN THIS LOADS THE BINARY CLEAR AND KERMIT
/ .SAVE DEV K12MIT.SV=1 THIS SAVES THE CORE IMAGE
/ THE JOB STATUS WORD (=1) INDICATED THAT K12MIT.SV LOADS INTO 10000-11777, BUT
/ SHOULD NOT BE SAVED/RESTORED WHEN THE USR IS LOADED OVER THIS AREA OR
/ DISMISSED (THE USR IS ACTUALLY NEVER DISMISSED IN NORMAL K12MIT OPERATION).
/ OTHER BITS MAY BE SET AT THE USER'S OPTION, BUT ARE UNNECESSARY; THE BIT
/ INDICATED SERVES ONLY TO REDUCE SYSTEM OVERHEAD REGARDING THE DISPOSITION OF
/ 10000-11777. THE BINARY FILE K12CLR.BN (CREATED BY ASSEMBLING K12CLR.PA)
/ LOADS ZEROES INTO ALL OF MEMORY TO CREATE A "CLEAN" CORE IMAGE FILE, WHICH
/ MAKES THE ENCODED BINARY FILE SMALLER DUE TO REPEAT COMPRESSION.
/ PASSING SHORT PARAMETER FILES.
/ WHEN INSERTING A SHORT USER MODIFICATION FILE IN THE INPUT STREAM (PARAM.PAL)
/ THE FOLLOWING SHOULD BE NOTED:
/ ALWAYS PUT THE SHORT PARAMETER FILE (CONTAINING EQUATED SYMBOLS SUCH AS
/ USER=1, ETC.) IN FRONT OF K12MIT.PAL.
/ IF TTY: IS USED FOR DIRECT TYPE-IN OF THESE PARAMETERS, THE INFORMATION NEED
/ ONLY BE TYPED ENDING WITH <^Z> DURING PASS 1. SUBSEQUENT PASSES REQUIRE THE
/ ENDING <^Z> ONLY. IF THIS METHOD IS USED, A LISTING WITHOUT THE USER INPUT
/ WHICH DID THE CUSTOMIZING OF KERMIT-12 CAN BE CREATED. NOTE: IF BINARY IS
/ GENERATED BY THE CONTENTS OF THE PARAMETER FILE (SUCH AS USE OF THE LOCAL TEXT
/ MESSAGE, ETC.), THE INFORMATION MUST BE TYPED IN DURING PASS 2. THE PASS 3
/ LISTING MAY CONTAIN THE INFORMATION IF SO DESIRED, REQUIRING A REPETITION OF
/ THE INPUT. PASS 1 INPUT OF THE INFORMATION IS EFFECTIVELY IGNORED, AS NO
/ DEFINITIONS ARE CREATED ('LCLMSG' IS DEFINED ELSEWHERE, ETC.).
/ EXPERIENCED PDP-8 USERS NEW TO PAL8 VERSION B0 TAKE SPECIAL NOTICE:
/ DUE TO HARDWARE LIMITATIONS OF THE DECMATES, THE KEYBOARD FLAG WILL BE CLEARED
/ DURING PDP-8 PAL8 B0 OPERATION. THE KL8E TTY: HANDLER WILL NO LONGER BE ABLE
/ TO BUFFER <^Z> DURING THE ASSEMBLY; YOU MUST WAIT UNTIL THE HANDLER ACCESSES
/ THE KEYBOARD ON EACH PASS *THEN* PRESS <^Z> TO CONTINUE THE ASSEMBLY.
/ CREATING A CUSTOM MESSAGE FROM THE PARAMETER FILE.
/ IF SO DESIRED, A CUSTOM LOCAL HEADER MESSAGE MAY BE ADDED BY INSERTING THE
/ FOLLOWING INTO THE PARAMETER FILE:
/ BUFFLD= 10 /THESE PROBABLY
/ FILBUFF=2000 /WON'T CHANGE!
/ GENMSG= 0 /DON'T GENERATE STANDARD (NULL) MESSAGE
/ UMSG= 0 /DON'T GENERATE STANDARD (DUMMY) USER MESSAGE
/ FIELD BUFFLD%10 /FIELD FOR TEXT MESSAGE
/ *FILBUFFER /LOCAL MESSAGE LOADS THERE
/LCLMSG,TEXT "%^I^NSERT ^L^OCAL ^M^ESSAGE ^H^ERE!%"
/ ZBLOCK LCLMSG+40-. /ZERO REST OF MESSAGE AREA
/ TEXT IS IN UPPER/LOWER-CASE SIXBIT WITH '^' MEANING SHIFT CASE (INITIALLY
/ LOWER-CASE) AND '%' MEANING <CR>, <LF>.
/ OTHER METHODS:
/ KERMIT-12 *CANNOT* BE ASSEMBLED BY PAL10 (LAST KNOWN VERSION OF PDP-8
/ CROSS-ASSEMBLER FOR TOPS10 (142)) BECAUSE IT LACKS CERTAIN FEATURES:
/ DOES NOT SUPPORT 'RELOC' PSEUDO-OP.
/ DOES NOT SUPPORT PAGE ZERO REDEFINE (CAUSES "Z" ERROR ON SOURCE FILES WHICH
/ DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8).
/ INCORRECTLY HANDLES 'ZBLOCK' PSEUDO-OP (LEADS TO "Q" ERROR ON SOURCE FILES
/ WHICH DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8).
/ DOES NOT SUPPORT LITERAL "FORGETTING" (P?S/8 PAL OPTION /E OR OS/8 PAL8 OPTION
/ /W) WHICH IS REQUIRED FOR DEFINING OVERLAY AREAS, ETC.
/ DOES NOT SUPPORT TEXT WITHOUT ZERO WORD FILL (P?S/8 PAL OPTION /J OR OS/8 PAL8
/ OPTION /F FULFILLS THIS REQUIREMENT) WHICH IS REQUIRED FOR TEXT MESSAGES.
/ P?S/8 PAL IS AN IMPROPER SUPERSET OF PAL10. PAL10 SUPPORTS MACRO-8 MODE AS AN
/ OPTION AND AUTOMATIC FIELD DUMP BITMAPS; ALL OTHER KNOWN PAL10 FEATURES EXIST
/ IN P?S/8 PAL INCLUDING THE SUPPORT OF THE AUTOMATIC FIELD DUMP BITMAP
/ PSEUDO-OPS ('ENBITS' AND 'NOBITS').
/ OS/8 PAL8 (VERSION B0) IS A SUBSET OF P?S/8 PAL WHICH HAS SEVERAL SYNTACTIC
/ QUIRKS (WHICH ARE AVOIDABLE, BUT NONETHELESS ARE INCOMPATIBLE WITH BOTH P?S/8
/ PAL AND PAL10 IN CERTAIN MINOR WAYS); REGARDLESS, PAL8 LACKS THE
/ COMPATIBILITY PROBLEMS OF PAL10.
/ MAINTAINING SOURCE COMPATIBILITY.
/ KERMIT-12 SOURCE FILE CONVENTIONS DEMAND THE USE OF THE COMMON SUBSET OF P?S/8
/ PAL AND OS/8 PAL8 (VERSION B0). CERTAIN FORMS OF STATEMENTS SHOULD BE
/ AVOIDED:
/ TAD /NOT LEGAL IN PAL8
/ 0+TAD /NOT LEGAL IN PAL10, AND POSSIBLY WRONG IN PAL8
/ TAD (3)+1 /GENERATES SAME AS "TAD (3+1)" IN PAL8
/ -A!-B /UNARY OPERATOR HANDLED WRONG IN PAL8
/ I+N /NOT LEGAL IN PAL8
/ N+I /NOT LEGAL IN PAL8
/ I I /NOT LEGAL IN PAL8
/ THIS REQUIREMENT IS EASILY MET BY KERMIT-12 AS MOST OF THESE CASES ARE
/ ESOTERIC QUIRKS AND NOT NEEDED FOR THIS ASSEMBLY.
/ THE RESTRICTIONS OF PAL10 (EVEN THOUGH IT HAS OTHER DESIRABLE FEATURES, MOST
/ OF WHICH IT SHARES WITH P?S/8 PAL) ARE TOO SEVERE TO ALLOW USABLE ASSEMBLY OF
/ THIS PROGRAM. BETTER CROSS-ASSEMBLERS MAY EXIST ELSEWHERE WHICH ARE
/ SOURCE-COMPATIBLE WITH KERMIT-12.
/ USE OF P?S/8 LANGUAGE EXTENSIONS.
/ P?S/8 OFFERS SEVERAL USEFUL FEATURES OVER PAL8 (AND PAL10) WHICH MAY BE USEFUL
/ FOR ASSEMBLY DEVELOPMENT OF KERMIT-12. THESE INCLUDE LANGUAGE ELEMENTS SUCH
/ AS "TAD (3)+1" HANDLED CORRECTLY, OR PSEUDO-OPS SUCH AS "PAUSE EXPR" WHERE THE
/ VALUE OF 'EXPR' WILL BE DISPLAYED ON THE SYSTEM CONSOLE DURING THE ASSEMBLY
/ WHEN THAT POINT IN THE ASSEMBLY IS REACHED. TO ACCESS THESE FEATURES AND
/ STILL PROVIDE COMPATIBILITY WITH PAL8 (VERSION B0), THE FOLLOWING CODING
/ TECHNIQUE IS SUGGESTED:
/ IFNDEF PQS <PQS=0> /WILL BE 0 ON PAL8, PAL10
/ IFZERO PQS < /DO PAL8, ETC. STUFF HERE
/ FOO= (TABLE) /DEFINE POINTER TO ADDRESS OF TABLE
/ TAD FOO-1 /GET (POINTER TO ADDRESS OF TABLE)-1
/ DCA XR1 /SETUP AUTO-INDEX REGISTER
/ WISH WE HAD PAUSE AND ERROR PSEUDO-OPS IN PAL8.
/ > /END OF PAL8, ETC. VARIANT
/ IFNZRO PQS < /DO P?S/8 PAL STUFF HERE
/ TAD (TABLE)-1 /GET (POINTER TO ADDRESS OF TABLE)-1
/ DCA XR1 /SETUP AUTO-INDEX REGISTER
/ IFNDEF PASS <PASS=0>/DEFINE PASS VARIABLE
/ PASS= PASS+1 /BUMP EVERY ASSEMBLER PASS
/ PAUSE PASS /DISPLAY PASS NUMBER
/ IFNZRO .&4000 <
/ ERROR 1234 /DISPLAY ERROR MESSAGE IF THERE ARE PROBLEMS
/ >
/ > /END OF P?S/8 PAL VARIANT
/ THIS ALLOWS TEMPORARY DEVELOPMENT FEATURES OR PERMANENT ELEMENTS WHICH MAY BE
/ MORE ELEGANTLY EXPRESSED IN P?S/8 PAL VARIANT CODING, WHILE THE PAL8 (VERSION
/ B0) VERSION CAN STILL BE USED (VIA DIRECT OCTAL, MULTIPLE EQUATE STATEMENTS,
/ CONDITIONAL FLUSH AS IN THE ABOVE EXAMPLE, ETC. AS NECESSARY) FOR STANDARD
/ ASSEMBLY OF KERMIT-12.
/ ASSEMBLY PARAMETERS.
/ SEVERAL PARAMETERS MUST BE CHANGED WITHIN K12MIT.PA (OR PASSED TO THE
/ ASSEMBLER VIA A SHORT FILE INSERTED INTO THE ASSEMBLY STREAM BEFORE THE MAIN
/ FILE):
/ SETTING KEY= [RECEIVE IOT CODE FOR CONSOLE KEYBOARD] DEFINES THE CONSOLE
/ KEYBOARD IOT CODE (DEFAULT IS 03).
/ SETTING TTY= [TRANSMIT IOT CODE FOR CONSOLE OUTPUT] CHANGES THE CONSOLE
/ PRINTER IOT CODE (DEFAULT IS 04).
/ THE FOLLOWING DEFINITIONS ARE ESSENTIALLY FOR KL8-TYPE DEVICES ONLY, AS THE
/ CODE DEMANDS KL8 HARDWARE COMPATIBILITY. MODELS OTHER THAN PDP-8 (SUCH AS
/ DECMATE) GENERALLY EITHER PLACE RESTRICTIONS ON AVAILABLE INTERFACES (OTHER
/ SOFTWARE DESIGNATES A SERIAL INTERFACE AS A LOGICAL PRINTER PORT; DECMATES
/ SUPPORT A FIRMWARE "PRINT SCREEN" KEY WHICH ENFORCES THIS.), OR DON'T ALLOW
/ USABLE PLUG-IN OPTIONS.
/ IGNORING BUILT-IN DECMATE SUPPORT, THE FOLLOWING PARAMETERS ARE ACTIVE:
/ SETTING DEV30= 1 CREATES DEVICE 30/31 REMOTE LINE IOTS.
/ SETTING DEV40= 1 CREATES DEVICE 40/41 REMOTE LINE IOTS.
/ SETTING LEDERLE=1 CREATES DEVICE 43/44 REMOTE LINE IOTS (AND A CUSTOM
/ HEADER).
/ SETTING ORIGNAL=1 CREATES DEVICE 33/34 REMOTE LINE IOTS (ORIGINAL
/ SETTINGS).
/ SETTING SPRINT= 1 CREATES DEVICE 32/33 REMOTE LINE IOTS (SERIAL PRINTER
/ PORT).
/ SETTING USER= 1 CREATES DEVICE XX/XY REMOTE LINE IOTS.
/ IF NONE OF THESE ARE SET, THEN DEV40=1 APPLIES BY DEFAULT.
/ SETTING USER= 1 REQUIRES THE USER TO DEFINE TWO ADDITIONAL VALUES:
/ XX= [RECEIVE IOT DEVICE CODE] (DEFAULT IS 40).
/ XY= [TRANSMIT IOT DEVICE CODE] (DEFAULT IS 41).
/ SETTING SPRINT= 1 INHIBITS THE BUILT-IN CHECK FOR DECMATE OPERATION AND
/ USES THE SERIAL PRINTER PORT FOUND ON ALL
/ WPS-8-CONFIGURED PDP-8/E, PDP-8/A CONFIGURATIONS,
/ VT-78, AND ALL DECMATES (VT-278, DECMATE II, III,
/ III+) FOR REMOTE COMMUNICATIONS.
/ THE USE OF THE SERIAL PRINTER PORT FOR REMOTE COMMUNICATIONS PURPOSES MAY BE
/ PROBLEMATIC DUE TO CONSIDERATIONS SUCH AS THE RS-232 CONNECTION TO THE PRINTER
/ IS A MODEM (DCE), RATHER THAN A TERMINAL (DTE) (DECMATE II, ETC. REQUIRES A
/ GENDER CHANGER.), OR THE SOFTWARE DESIGNATION OF THE PORT AS BEING ALLEDGEDLY
/ *ONLY* FOR A PRINTER, SUCH AS WHEN CERTAIN SYSTEMS SUPPORT THE "PRINT SCREEN"
/ KEY AS A SCREEN DUMP TO THE SERIAL PRINTER PORT, ETC. THESE ISSUES ARE NOT
/ RELEVANT TO KERMIT-12 OPERATION, AS THE "PRINT SCREEN" KEY IS NOT SUPPORTED BY
/ KERMIT-12 IN THIS CONFIGURATION AS SUCH (FUTURE VERSIONS COULD REDEFINE THE
/ "PRINT SCREEN" KEY TO SUCH FUNCTIONS AS DUMP SCREEN TO A FILE, ETC.).
/ SETTING BRATE= NN SETS THE DEFAULT BAUD RATE (FOR SYSTEMS THAT SUPPORT
/ THIS FEATURE) FROM A TABLE OF VALUES (0-15) AS
/ FOLLOWS:
/ NN BAUD RATE
/ 00 50
/ 01 75
/ 02 110
/ 03 134.5
/ 04 150
/ 05 300
/ 06 600
/ 07 1200
/ 08 1800
/ 09 2000
/ 10 2400
/ 11 3600
/ 12 4800
/ 13 7200
/ 14 9600
/ 15 19200
/ SETTING ESCAPE= NNNN SETS THE DEFAULT ESCAPE CHARACTER TO NNNN.
/ SETTING FLOW= 1 ENABLES FLOW-CONTROL BY DEFAULT.
/ SETTING FLOW= 0 DISABLES FLOW-CONTROL BY DEFAULT.
/ SETTING FMODE= 0177 SETS THE DEFAULT FILE MODE TO ASCII.
/ SETTING FMODE= 4377 SETS THE DEFAULT FILE MODE TO BINARY.
/ SETTING GENMSG= 0 CAUSES NO BINARY TO BE GENERATED WHERE 'LCLMSG' IS
/ DEFINED. THIS ALLOWS THE PARAMETER FILE (PARAM.PA) OR
/ SUBSEQUENT OVERLAY BY K12PCH.BN TO DEFINE THE LOCAL
/ HEADER MESSAGE. THIS PARAMETER SHOULD NOT BE SET
/ UNLESS ONE OF THESE METHODS IS USED, ELSE THE HEADER
/ MESSAGE WILL BE UNDEFINED. (NOTE: IF K12PCH.BN
/ GENERATES A HEADER MESSAGE, THEN THIS PARAMETER IS
/ UNIMPORTANT, AS K12PCH.BN OVERLAYS THE BINARY OF
/ K12MIT.)
/ SETTING GENMSG= 1 CAUSES A HEADER MESSAGE TO BE GENERATED. THE CONTENTS
/ OF THE MESSAGE ARE CREATED BY SETTING LEDERLE=1 OR
/ UMSG=1. IF EITHER IS ZERO, A DEFAULT (NULL) MESSAGE
/ WILL BE GENERATED.
/ SETTING ICLOSE= 1 ENSURES A <^Z> AT <EOF> OF ASCII INPUT FILES BY
/ DEFAULT.
/ SETTING ICLOSE= 0 CLOSES ASCII INPUT FILES AS RECEIVED BY DEFAULT.
/ SETTING INIECHO=0 CAUSES A FULL-DUPLEX CONNECT MODE STATE WITH NO LOCAL
/ CHARACTER ECHOING BY DEFAULT.
/ SETTING INIECHO=1 CAUSES A HALF-DUPLEX CONNECT MODE STATE WITH LOCAL
/ ECHO OF ALL CONSOLE CHARACTERS BY DEFAULT.
/ SETTING LOWER= 0 ALLOWS LOWER-CASE CONSOLE OUTPUT BY DEFAULT.
/ SETTING LOWER= -40 FOLDS LOWER-CASE CONSOLE OUTPUT TO UPPER-CASE BY
/ DEFAULT.
/ SETTING OCLOSE= 0 PREVENTS DEFAULT SENDING OF <^Z> AT <EOF> OF ASCII
/ FILES.
/ SETTING OCLOSE= 1 CAUSES <^Z> TO BE SENT AT <EOF> OF ASCII FILES BY
/ DEFAULT.
/ SETTING PORT= 0 CAUSES THE DP-278 PORT 0 TO BE USED IF KERMIT-12 IS
/ RUN ON A DECMATE 1 (ASSUMING SPRINT=0).
/ SETTING PORT= 1 CAUSES THE DP-278 PORT 1 TO BE USED IF KERMIT-12 IS
/ RUN ON A DECMATE 1 (ASSUMING SPRINT=0).
/ SETTING RETCNT= NNNN SETS THE PACKET RETRY COUNT TO NNNN BY DEFAULT.
/ SETTING UMSG= 0 PREVENTS THE LOCAL USER HEADER MESSAGE FROM BEING
/ GENERATED.
/ SETTING UMSG= 1 CAUSES THE LOCAL USER HEADER MESSAGE TO BE GENERATED.
/ THE PARAMETER GENMSG=1 IS REQUIRED TO BE SET. THE
/ SOURCE MUST BE MODIFIED LOCALLY TO CHANGE THE MESSAGE
/ TEXT FROM "INSERT LOCAL USER MESSAGE HERE!," AS THIS
/ IS THE DEFAULT CONTENTS.
/ KERMIT-12 FOR THE FAMILY OF 12-BIT DEC MACHINES.
/ BRIEF USAGE DESCRIPTION.
/ KERMIT-12 IS AN IMPLEMENTATION OF THE KERMIT PROTOCOL FOR THE FAMILY OF 12-BIT
/ DEC (AND COMPATIBLE) MACHINES GENERALLY KNOWN AS PDP-8 OR DECMATE.
/ AS OF THE CURRENT IMPLEMENTATION, THE FOLLOWING COMMANDS ARE EFFECTIVE:
/ 1. CONNECT (TO REMOTE SYSTEM AS TERMINAL).
/ 2. SEND FILESPEC (TO REMOTE RECEIVER OR SERVER).
/ 3. RECEIVE FILESPEC (FROM REMOTE SENDER).
/ 4. GET FILESPEC (FROM REMOTE SERVER).
/ 5. FINISH (SERVING).
/ 6. SETUP (ON DECMATE II/III/III-PLUS ONLY). **** NOT IMPLEMENTED ****
/ 7. EXIT (TO OPERATING SYSTEM).
/ 8. HELP (DISPLAYS HELP MESSAGE).
/ FILESPEC MAY BE ANY LOCAL (OS/8) FILE-STRUCTURED DEVICE:FILENAME.EXTENSION,
/ WHERE THE FILENAME AND EXTENSION WILL BE TRUNCATED TO 6 ALPHANUMERICS AND 2
/ ALPHANUMERICS RESPECTIVELY, AS NECESSARY (THIS IS REFERRED TO AS 6.2 FILENAME
/ FORMAT). THE DEVICE: FIELD IS OPTIONAL; ALL COMMANDS USING THE DEVICE:
/ FIELD FOR LOCAL DEVICE SPECIFICATION WILL USE THIS DEVICE AS THE SOURCE OR
/ DESTINATION AS NECESSARY FOR THE LOCAL FILES. IF THE DEVICE: FIELD IS
/ OMITTED, THE DEFAULT DEVICE DSK: WILL BE USED. THE ACTUAL DEVICE USED MAY BE
/ SELECTED BEFORE INVOKING KERMIT-12 BY USING THE OS/8 ASSIGN COMMAND:
/ .ASSIGN DEV DSK
/ WHERE DEV IS ANY AVAILABLE FILE-STRUCTURED DEVICE.
/ KERMIT-12 USES AN UNUSUAL SCHEME FOR ITS PROMPT: THE ACTUAL DEFAULT PROMPT
/ TEXT IS PARTIALLY TAKEN FROM THE ACTUAL MACHINE KERMIT-12 IS CURRENTLY
/ EXECUTING ON. FOR EXAMPLE, IF KERMIT-12 HAS DETERMINED THE CPU TYPE AS
/ PDP-8/E, THE PROMPT WILL BE:
/ KERMIT-8/E>
/ THIS ALLOWS KERMIT-12 USERS (WITH DIFFERENT CPU-TYPE MACHINES) TO DISTINGUISH
/ MESSAGES ORIGINATING FROM THE RESPECTIVE SYSTEMS. FUTURE VERSIONS WILL
/ SUPPORT USER PROMPT STRINGS TO ALLOW MORE DISTINCTIVE SYSTEM MESSAGES.
/ THE HELP OR CONNECT COMMANDS MAY BE USED TO DETERMINE THE CURRENT CONNECT MODE
/ ESCAPE CHARACTER.
/ COMMAND RESTRICTIONS.
/ THE SEND COMMAND ALLOWS DEVICE:FILENAME.EXTENSION (6.2) WITH WILD-CARD
/ SUBSTITUTION. A * MAY BE GIVEN FOR AN ENTIRE FIELD (EITHER FILENAME OR
/ EXTENSION OR BOTH) ONLY. A ? WILL MATCH ANY SINGLE CHARACTER WHICH MUST
/ EXIST IN THE ACTUAL FILENAME OR EXTENSION, UNLESS RIGHT-MOST IN THE FIELD.
/ ALL MATCHING FILES WILL BE SENT. NO OUTBOUND FILENAME (AS-NAME) FACILITY
/ EXISTS AT THIS TIME.
/ THE RECEIVE COMMAND ALLOWS OPTIONAL DEVICE: ONLY. *THE FILENAME AND
/ EXTENSION ARE NOT ALLOWED*. NAMES OF RECEIVED FILES WILL BE MODIFIED IF
/ NECESSARY TO CONFORM TO THE 6.2 FORMAT. *IMPLEMENTATION RESTRICTION* :
/ CERTAIN REMOTE FILENAMES CONTAINING NON-ALPHANUMERIC CHARACTERS MAY CAUSE
/ KERMIT-12 TO HASTILY ABORT THE TRANSMISSION AND RETURN TO COMMAND LEVEL.
/ THE GET COMMAND ALLOWS OPTIONAL DEVICE: TO DETERMINE DESTINATION OF THE
/ INCOMING FILES. THE OUTBOUND FILESPEC MUST CONFORM TO LOCAL CONVENTIONS
/ (FILENAME AND EXTENSION ARE NOT LIMITED TO 6.2 FORMAT; THE DEVICE: FIELD
/ WILL NOT BE SENT TO THE REMOTE KERMIT UNLESS IT IS ILLEGAL WITHIN OS/8
/ SPECIFICATIONS, SUCH AS TOO MANY DEVICE LETTERS. IN THIS CASE, THE DEFAULT
/ DEVICE DSK: APPLIES, AND THE ENTIRE "DEVICE" FIELD IS SENT ALONG WITH ANY
/ FILENAME AND EXTENSION). CERTAIN REMOTE SYSTEMS ARE INCOMPATIBLE WITH THIS
/ IMPLEMENTATION, AS IMBEDDED SPACES OR NON-ALPHANUMERIC CHARACTERS ARE NOT
/ ALLOWED, EVEN THOUGH THEY MAY BE REQUIRED ON THE REMOTE SYSTEM. WILD-CARD
/ CHARACTERS ARE ALLOWED, BUT ONLY AS SPECIFIED IN THE SEND COMMAND ABOVE.
/ <^X> OR <^Z> CAN BE USED TO ABORT KERMIT TRANSMISSIONS (EVENTUALLY) BUT IS
/ NORMALLY A SLOW PROCESS, SINCE THE CHECKING IS DONE BY A SOFTWARE TIMEOUT
/ SCHEME. AT THE PRESENT TIME, THERE IS NO DISTINCTION BETWEEN THESE THO
/ CHARACTERS, SO IT IS NOT POSSIBLE TO ABORT A SINGLE FILE; THE ENTIRE BATCH OF
/ FILES INVOLVED IN THE TRANSFER IS ABORTED.
/ DECMATE II/III/III-PLUS CONSIDERATIONS:
/ FUNCTION KEYS SEND <ESC> SEQUENCES SPECIFIED BY SLUSHWARE/FIRMWARE. ALL SOFT
/ FUNCTION KEYS ARE THEREFORE INEFFECTIVE (EXCEPT FOR HOLD SCREEN WHICH ALWAYS
/ WORKS).
/ CONNECT MODE RUNS IN 8-BIT MODE.
/ THE COMPOSE KEY IS ENABLED FOR USE WITH A LOADED COMPOSE TABLE.
/ ANY VALID DECMATE II/III/III-PLUS CHARACTER SET IS ALLOWED WHILE IN CONNECT
/ MODE (MCS TCS LINE, ETC.). ALL <ESC> SEQUENCES ARE PASSED TO THE
/ SLUSHWARE/FIRMWARE UNMODIFIED.
/ KEYBOARD UPPER-CASE LOCK WILL ALWAYS BE AUTOMATICALLY APPLIED UPON RETURN FROM
/ CONNECT MODE.
/ DEFINITIONS. /017 CJL
*200 /FOR DEFINITIONS /047 CJL
/ REMOTE LINE PARAMETERS; SET ONLY ONE AS NECESSARY. /046 CJL
IFNDEF DEV30 <DEV30= 0> /USE DEVICE 30/31 VALUES
IFNDEF DEV40 <DEV40= 0> /USE DEVICE 40/41 VALUES
IFNDEF LEDERLE <LEDERLE=0> /USE LEDERLE LABS VALUES
IFNDEF ORIGNAL <ORIGNAL=0> /USE ORIGINAL VALUES
IFNDEF SPRINT <SPRINT=0> /USE DEVICE 32/33 VALUES
IFNDEF USER <USER= 0> /USE USER-DEFINED VALUES
REMOTE= DEV30+DEV40+LEDERLE+ORIGNAL /SET REMOTE LINE IOT CODE
REMOTE= REMOTE+SPRINT+USER /SET REMOTE LINE IOT CODE
IFZERO REMOTE <DEV40= 1> /DEFAULT TO DEVICE 40/41 VERSION
/ DEV30 PARAMETERS.
IFNZRO DEV30 <
IFNDEF REC <REC= 30> /DEVICE 30 INPUT
IFNDEF SEN <SEN= 31> /DEVICE 31 OUTPUT
>
/ DEV40 PARAMETERS (DEFAULT).
IFNZRO DEV40 <
IFNDEF REC <REC= 40> /DEVICE 40 INPUT
IFNDEF SEN <SEN= 41> /DEVICE 41 OUTPUT
>
/ LEDERLE PARAMETERS. /038 CJL
IFNZRO LEDERLE <
IFNDEF REC <REC= 43> /DEVICE 43 INPUT
IFNDEF SEN <SEN= 44> /DEVICE 44 OUTPUT
IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE
IFNDEF UMSG <UMSG= 0> /DON'T GENERATE USER MESSAGE
>
/ ORIGNAL PARAMETERS.
IFNZRO ORIGNAL <
IFNDEF REC <REC= 33> /DEVICE 33 INPUT
IFNDEF SEN <SEN= 34> /DEVICE 34 OUTPUT
>
/ SPRINT PARAMETERS. /046 CJL
IFNZRO SPRINT <
IFNDEF REC <REC= 32> /DEVICE 32 INPUT
IFNDEF SEN <SEN= 33> /DEVICE 33 OUTPUT
>
/ USER PARAMETERS.
IFNZRO USER <
IFNDEF XX <XX= 40> /DEFAULT TO DEVICE 40
IFNDEF XY <XY= 41> /DEFAULT TO DEVICE 41
IFNDEF REC <REC= XX> /DEVICE XX INPUT
IFNDEF SEN <SEN= XY> /DEVICE XY OUTPUT
IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE
IFNDEF UMSG <UMSG= 1> /GENERATE USER MESSAGE
>
/ REMOTE LINE IOT DEFINITIONS.
/ RECEIVE DEFINITIONS.
RKRBIOT=REC^10+6006 /READ REMOTE, CLEAR FLAG
RKSFIOT=REC^10+6001 /SKIP ON REMOTE INPUT FLAG
/ TRANSMIT DEFINITIONS.
RSBIOT= SEN^10+6003 /SET BAUD RATE FROM AC[8-11]
RTLSIOT=SEN^10+6006 /TRANSMIT CHARACTER, CLEAR FLAG
RTSFIOT=SEN^10+6001 /SKIP ON TRANSMIT FLAG
/ CONSOLE TTY: DEFINITIONS. /017 CJL
/ KEYBOARD DEFINITIONS. /017 CJL
IFNDEF KEY <KEY= 03> /KEYBOARD DEVICE CODE
KCCIOT= KEY^10+6002 /CLEAR CONSOLE KEYBOARD FLAG, AC
KRBIOT= KEY^10+6006 /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG
KRSIOT= KEY^10+6004 /READ CONSOLE KEYBOARD BUFFER STATIC
KSFIOT= KEY^10+6001 /SKIP ON CONSOLE KEYBOARD FLAG
/ TELEPRINTER DEFINITIONS. /017 CJL
IFNDEF TTY <TTY= 04> /TELEPRINTER DEVICE CODE
TLSIOT= TTY^10+6006 /PRINT CHARACTER, CLEAR FLAG
TSFIOT= TTY^10+6001 /SKIP ON TELEPRINTER FLAG
/ DEFAULT ESCAPE CHARACTER DEFINITION. /025 CJL
IFNDEF ESCAPE <ESCAPE="]&37> /DEFAULT IS CONTROL-]
/ DEFAULT LOWER-CASE ENABLE DEFINITION. /030 CJL
IFNDEF LOWER <LOWER= 0/-40> /LOWER-CASE IS ALLOWED AS IS
/CHANGE TO -40 IF LOWER-CASE
/SHOULD BE FOLDED TO UPPER-CASE
/ DEFAULT RETRY COUNT DEFINITION. /031 CJL
IFNDEF RETCNT <RETCNT=5> /DEFAULT IS FIVE RETRIES
/ DEFAULT FILE MODE DEFINITION. /031 CJL
IFNDEF FMODE <FMODE= 0177> /DEFAULT IS ASCII FILE MODE
/4377 IS BINARY FILE MODE
/ DEFAULT FLOW-CONTROL MODE DEFINITION. /031 CJL
IFNDEF FLOW <FLOW= 1> /DEFAULT IS FLOW-CONTROL ENABLED
/ DEFAULT ASCII INPUT FILE <^Z> DISPOSITION. /031 CJL
IFNDEF ICLOSE <ICLOSE=1> /ENSURE <^Z> AT ASCII <EOF>
/ DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION. /031 CJL
IFNDEF OCLOSE <OCLOSE=0> /<^Z> NOT SENT AT ASCII <EOF>
/ DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS. /038 CJL
IFNDEF GENMSG <GENMSG=1> /DEFAULT IS TO GENERATE A MESSAGE
IFNDEF UMSG <UMSG= 0> /DEFAULT IS NO DUMMY USER MESSAGE
IFNDEF LEDERLE <LEDERLE=0> /DEFAULT IS NO LEDERLE MESSAGE
/ THE NULL MESSAGE WILL BE GENERATED BY DEFAULT.
/ ECHO DEFINITION. /039 CJL
IFNDEF INIECHO <INIECHO=0> /DEFAULT IS NO LOCAL ECHO
/ DEFAULT DECMATE I PORT DEFINITION. /050 CJL
IFNDEF PORT <PORT= 0> /DEFAULT IS PORT ZERO
/ DEFAULT BAUD RATE DEFINITION. /050 CJL
IFNDEF BRATE <BRATE= 7> /DEFAULT IS 1200 BAUD
/ STATE DEFINITIONS.
STDAT= "D&137 /DATA
STACK= "Y&137 /ACK
STNAK= "N&137 /NAK
STSIN= "S&137 /SEND-INIT
STBRK= "B&137 /BREAK LINK
STFIL= "F&137 /FILENAME HEADER
STEOF= "Z&137 /END OF FILE OR REPLY
STERR= "E&137 /ERROR PACKET
STATT= "A&137 /FILE ATTRIBUTES
STRIN= "R&137 /RECEIVE-INIT
STEOT= "B&137 /BREAK TRANSMISSION
STGEN= "G&137 /KERMIT GENERIC COMMAND
/ DEFAULT INIT PARAMETERS.
DEFCK= "1&177 /DEFAULT 1 CHARACTER CHECKSUM /014 CJL
DEFEOL= 15+40 /CR IS DEFAULT <EOL>
DEFQCTL= "#&177 /"#" IS DEFAULT QCTL
/ BUFFER DEFINITIONS. /014 CJL
DECIMAL /MAKE IT EASIER /014 CJL
DEFMAXL=94 /DEFAULT MAXIMUM PACKET SIZE
LINSIZ= 32 /KEYBOARD LINE BUFFER SIZE
OCTAL /BACK TO NORMAL /014 CJL
BUFSIZE=200 /128 CHARACTER RING BUFFERS /026 CJL
/FOR NO-INTERRUPT CONNECT MODE
/ CONTROL CHARACTER DEFINITIONS. /023 CJL
CNTRLA= "A&37 /<^A> DEFAULT MARK CHARACTER /023 CJL
CNTRLB= "B&37 /<^B> /046 CJL
CNTRLC= "C&37 /<^C> PROGRAM EXIT CHARACTER /023 CJL
CNTRLD= "D&37 /<^D> /046 CJL
CNTRLE= "E&37 /<^E> /046 CJL
CNTRLF= "F&37 /<^F> /046 CJL
CNTRLG= "G&37 /<^G> BELL CHARACTER /023 CJL
CNTRLH= "H&37 /<^H> BACKSPACE CHARACTER /023 CJL
CNTRLI= "I&37 /<^I> HORIZONTAL TAB CHARACTER /043 CJL
CNTRLJ= "J&37 /<^J> LINEFEED CHARACTER /023 CJL
CNTRLK= "K&37 /<^K> VERTICAL TAB CHARACTER /046 CJL
CNTRLL= "L&37 /<^L> FORM FEED CHARACTER /046 CJL
CNTRLM= "M&37 /<^M> CARRIAGE RETURN CHARACTER /023 CJL
CNTRLN= "N&37 /<^N> /046 CJL
CNTRLO= "O&37 /<^O> ECHO FLIP CHARACTER /023 CJL
CNTRLP= "P&37 /<^P> PROGRAM RESTART CHARACTER /023 CJL
CNTRLQ= "Q&37 /<^Q> OUTPUT RESUME CHARACTER /023 CJL
CNTRLR= "R&37 /<^R> /046 CJL
CNTRLS= "S&37 /<^S> OUTPUT WAIT CHARACTER /023 CJL
CNTRLT= "T&37 /<^T> /046 CJL
CNTRLU= "U&37 /<^U> /046 CJL
CNTRLV= "V&37 /<^V> /046 CJL
CNTRLW= "W&37 /<^W> /046 CJL
CNTRLX= "X&37 /<^X> FILE ABORT CHARACTER /044 CJL
CNTRLY= "Y&37 /<^Y> /046 CJL
CNTRLZ= "Z&37 /<^Z> ABORT AND <EOF> CHARACTER /044 CJL
DELETE= 177 /<DEL> DELETE OR <RO> CHARACTER /034 CJL
LOWERC= "C&177+40 /LOWER-CASE C (CLOSE CHARACTER) /025 CJL
UPPERC= "C&177 /UPPER-CASE C (CLOSE CHARACTER) /025 CJL
/ I/O AND FIELD DEFINITIONS. /019 CJL
BUFFLD= 10 /I/O BUFFER FIELD /019 CJL
DIRFLD= 10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL
DMIFLD= 10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL
MSGFLD= 10 /TEXT MESSAGE FIELD /023 CJL
PAGCNT= 2 /I/O BUFFER SIZE IN PAGES /019 CJL
PRGFLD= 00 /PROGRAM FIELD /019 CJL
USRFLD= 10 /USR FIELD /020 CJL
/ OS/8 MONITOR DEFINITIONS. /014 CJL
SBOOT= 7600 /MONITOR EXIT LOCATION IS 07600 /014 CJL
USR= 7700 /NON-LOCKED USR ENTRY POINT /035 CJL
/ USER SERVICE ROUTINE AND HANDLER DEFINITIONS. /020 CJL
CLOSE= 4 /CLOSE TENTATIVE OUTPUT FILE /020 CJL
ENTER= 3 /ENTER TENTATIVE OUTPUT FILE /020 CJL
FETCH= 1 /FETCH HANDLER /020 CJL
INQUIRE=12 /INQUIRE ABOUT HANDLER /020 CJL
LOOKUP= 2 /LOOKUP FILE /020 CJL
RESET= 13 /RESET DEVICE CONTROL WORD TABLE/037 CJL
USRIN= 10 /LOCK USR IN CORE /020 CJL
WRITE= 4000 /I/O CALL WRITE BIT /020 CJL
/ INSTRUCTION DEFINITIONS.
CLCL= 6136 /CLEAR CLOCK FLAG (8/A, ETC.) /046 CJL
CLSK= 6131 /SKIP ON, CLEAR CLOCK FLAG /046 CJL
CLSK8A= 6137 /SKIP ON CLOCK FLAG (8/A, ETC.) /046 CJL
COM= 0017 /COMPLEMENT AC
DCAC= DCA . /CURRENT PAGE DCA INSTRUCTION /047 CJL
IAAC= 6171 /"A" REGISTER TO AC
IACA= 6167 /AC TO "A" REGISTER
ISZC= ISZ . /CURRENT PAGE ISZ INSTRUCTION /050 CJL
JMPC= JMP . /CURRENT PAGE JMP INSTRUCTION /047 CJL
JMPIC= JMP I . /CURRENT PAGE JMP I INSTRUCTION /047 CJL
JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION /047 CJL
JMSIC= JMS I . /CURRENT PAGE JMS I INSTRUCTION /047 CJL
LINC= 6141 /GOTO LINC MODE
PDP= 0002 /GOTO PDP-8 MODE
PRQ3= 6236 /TYPE THREE PANEL REQUEST /046 CJL
TADC= TAD . /CURRENT PAGE TAD INSTRUCTION /047 CJL
R3L= 7014 /ROTATE AC (NOT LINK) LEFT 3 /046 CJL
/ NUMERIC LOAD DEFINITIONS. /014 CJL
NL0000= CLA /LOAD AC WITH 0000 /046 CJL
NL0001= CLA IAC /LOAD AC WITH 0001 /014 CJL
NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 /014 CJL
NL0003= CLA STL IAC RAL /LOAD AC WITH 0003 (8/I ON UP) /046 CJL
NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 (8/I ON UP) /046 CJL
NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 (8/I ON UP) /046 CJL
NL0010= CLA IAC RAL RAR /LOAD AC WITH 0010 (6120) /024 CJL
NL0100= CLA IAC BSW /LOAD AC WITH 0100 (8/E ON UP) /024 CJL
NL3776= CLA CLL CMA RAR RAL /LOAD AC WITH 3776 (8/I OR 8/L) /024 CJL
NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 /046 CJL
NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 /014 CJL
NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 /046 CJL
NL6000= CLA STL IAC RTR /LOAD AC WITH 6000 (8/I ON UP) /046 CJL
NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 /014 CJL
NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 /014 CJL
NL7777= CLA CMA /LOAD AC WITH 7777 /014 CJL
/ DECMATE I COMMUNICATIONS PORT DEFINITIONS. /050 CJL
IPORT0= 30 /COMMUNICATIONS PORT 0 INPUT DEVICE CODE
RKFL0= IPORT0^10+6000 /SET COMMUNICATIONS PORT 0 INPUT FLAG
RKSF0= IPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 INPUT FLAG
RKCC0= IPORT0^10+6002 /CLEAR AC
RKIE0= IPORT0^10+6005 /PORT 0 INPUT INTERRUPT ENABLE PER AC[11]
RKRB0= IPORT0^10+6006 /READ COMMUNICATIONS PORT 0 INTO AC
OPORT0= 31 /COMMUNICATIONS PORT 0 OUTPUT DEVICE CODE
RTFL0= OPORT0^10+6000 /SET COMMUNICATIONS PORT 0 OUTPUT FLAG
RTSF0= OPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 OUTPUT FLAG
RTCF0= OPORT0^10+6002 /NOP
RTIE0= OPORT0^10+6005 /PORT 0 OUTPUT INTERRUPT ENABLE PER AC[11]
RTLS0= OPORT0^10+6006 /WRITE COMMUNICATIONS PORT 0 FROM AC
IPORT1= 34 /COMMUNICATIONS PORT 1 INPUT DEVICE CODE
RKFL1= IPORT1^10+6000 /SET COMMUNICATIONS PORT 1 INPUT FLAG
RKSF1= IPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 INPUT FLAG
RKCC1= IPORT1^10+6002 /CLEAR AC
RKIE1= IPORT1^10+6005 /PORT 1 INPUT INTERRUPT ENABLE PER AC[11]
RKRB1= IPORT1^10+6006 /READ COMMUNICATIONS PORT 1 INTO AC
OPORT1= 35 /COMMUNICATIONS PORT 1 OUTPUT DEVICE CODE
RTFL1= OPORT1^10+6000 /SET COMMUNICATIONS PORT 1 OUTPUT FLAG
RTSF1= OPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 OUTPUT FLAG
RTCF1= OPORT1^10+6002 /NOP
RTIE1= OPORT1^10+6005 /PORT 1 OUTPUT INTERRUPT ENABLE PER AC[11]
RTLS1= OPORT1^10+6006 /WRITE COMMUNICATIONS PORT 1 FROM AC
PCON= 36 /PORT STATUS AND CONTROL DEVICE CODE
SMFL= PCON^10+6000 /SET MODEM CHANGE FLAG
MFSK= PCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG
WCON0= PCON^10+6002 /WRITE COMMUNICATIONS PORT 0 CONTROL REGISTER
PSR= PCON^10+6003 /READ PORT STATUS REGISTER
PMR= PCON^10+6004 /READ PORT MODEM REGISTER
MFIE= PCON^10+6005 /LOAD MODEM CHANGE INTERRUPT ENABLE PER AC[11]
WCON1= PCON^10+6006 /WRITE COMMUNICATIONS PORT 1 CONTROL REGISTER
RACD= PCON^10+6007 /RESET ACTIVE COMMUNICATIONS PORT PER AC[0]
/ DECMATE II, ETC. COMMUNICATIONS PORT DEFINITIONS. /046 CJL
PORTIN= 30 /COMMUNICATIONS PORT INPUT DEVICE CODE
IFL= PORTIN^10+6000 /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG
ISF= PORTIN^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT INPUT/OUTPUT FLAG
ICF= PORTIN^10+6002 /NOP (CLEAR THE AC?)
INOP1= PORTIN^10+6003 /(NOP?)
IRS= PORTIN^10+6004 /READ COMMUNICATIONS PORT RECEIVE BUFFER
IIE= PORTIN^10+6005 /COMMUNICATIONS PORT I/O INTERRUPT ENABLE PER AC[11]
IRB= PORTIN^10+6006 /READ COMMUNICATIONS PORT RECEIVE BUFFER
INOP2= PORTIN^10+6007 /(NOP?)
PORTOUT=31 /COMMUNICATIONS PORT OUTPUT DEVICE CODE
DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG
DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG
DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?)
ONOP1= PORTOUT^10+6003 /(NOP?)
OPC= PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
DUMBIE= PORTOUT^10+6005 /COMMUNICATIONS PORT DUMMY INTERRUPT ENABLE PER AC[11]
OLS= PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
ONOP2= PORTOUT^10+6007 /(NOP?)
PORTCON=36 /COMMUNICATIONS PORT CONTROL DEVICE CODE
MFL= PORTCON^10+6000 /SET MODEM CHANGE FLAG
MSF= PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG
MLC= PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER
MSB= PORTCON^10+6003 /LOAD BAUD RATE REGISTER
MRS= PORTCON^10+6004 /READ MODEM STATUS REGISTER
MIE= PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11]
MPSCC= PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER
MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER
/ MISCELLANEOUS DEFINITIONS. /014 CJL
/ STATIC DATE CALCULATIONS. /024 CJL
/ THESE EQUATIONS CAUSE PRINTABLE TEXT OF THE DATE PARTICULARS, WHICH ARE GIVEN
/ IN OS/8 INTERNAL FORMAT. PROGRAM MAINTAINENCE REQUIRES THE UPDATE OF VERSION,
/ REVISION, REVDATE, AND REVDGRP. REVDATE AND REVDGRP SHOULD BE OBTAINED FROM
/ THE SYSTEM WHEN RELEASING A NEW VERSION AFTER FIRST CORRECTLY INVOKING THE
/ SYSTEM DATE COMMAND.
/ VERSION=[ANY NUMBER IN THE RANGE 00-143 (DECIMAL 00-99)]
/ REVISIO=[ANY SIX-BIT ALPHA (A-Z); DO NOT FORGET &77]
/ REVDATE=[THE CONTENTS OF 17666 (DATE WORD)]
/ REVDGRP=[THE CONTENTS OF 07777 (ONLY BITS[3-4] ARE USED)]
IFNDEF REVDATE <REVDATE=4464> /REVISION DATE (LOCATION 17666)
IFNDEF REVDGRP <REVDGRP=0400> /REVISION 8 YEAR DATE GROUP (LOCATION 07777)
IFNDEF REVISIO <REVISIO="G&77> /REVISION OF KERMIT-12
IFNDEF VERSION <VERSION=12> /VERSION OF KERMIT-12
DAY= REVDATE&370%10 /REVISION DAY
DGROUP= REVDGRP&600%20 /REVISION DATE GROUP (WHICH 8 YEARS)
MONTH= REVDATE&7400%400 /REVISION MONTH
YEAR= REVDATE&7+DGROUP+106 /REVISION YEAR (SINCE 1900)
FIELD PRGFLD%10 /STARTING FIELD /038 CJL
*0 /START AT THE BEGINNING /014 CJL
INTPC, .-. /PC FROM INTERRUPT (IF ANY) /014 CJL
JMP I INTPC /RETURN WITH INTERRUPTS OFF /014 CJL
ABFLAG, .-. /FILE ABORT FLAG /044 CJL
TABLEJU,.-. /MATCHING VALUE FOR SRCHTABLE ROUTINE /025 CJL
IFNZRO .-4 <ERROR .> /014 CJL
ODT, ZBLOCK 7-. /RESERVED FOR OS/8 ODT /014 CJL
RATE, BRATE /BAUD RATE /050 CJL
*10 /GET TO AUTO-INDEX AREA /014 CJL
XR0, .-. /AUTO-INDEX ZERO /014 CJL
XR1, .-. /AUTO-INDEX ONE /014 CJL
DIRXR, PORT /DIRECTORY LOOKUP DEDICATED AUTO-INDEX /028 CJL
/INITIALIZED FOR DECMATE I ONCE-ONLY /050 CJL
/ THE REMAINING LOCATIONS THROUGH 000017 MUST BE USED DIRECTLY ONLY, SO AS TO
/ NOT CAUSE INADVERTANT AUTO-INDEXING.
/ COLUMN COUNTER FOR CONSOLE ROUTINES (NEVER USED INDIRECTLY). /043 CJL
COLUMN, .-. /CONSOLE OUTPUT COLUMN COUNTER /043 CJL
/ CONSOLE TERMINAL ECHO SWITCH (NEVER USED INDIRECTLY). /020 CJL
ECHOSW, 0 /0=ECHO, 4000=DON'T ECHO /020 CJL
/ LATEST (NON-CONNECT MODE) CHARACTER (NEVER USED INDIRECTLY). /043 CJL
INCHAR, .-. /LATEST INPUT CHARACTER FROM CONSOLE /043 CJL
/ CURRENT KERMIT MODE (NEVER USED INDIRECTLY). /025 CJL
KMODE, .-. /CURRENT MODE OF KERMIT /025 CJL
/ KERMIT MODE FLAG VALUES. /014 CJL
/ MLINE= 1 /KERMIT IS ON-LINE
MSEND= 2 /KERMIT IS IN SEND MODE
MREC= 3 /KERMIT IS IN RECEIVE MODE
/ LATEST CHARACTER SENT TO OUTPUT FILE (NEVER USED INDIRECTLY). /020 CJL
LATEST, .-. /LATEST CHARACTER SENT TO OUTPUT FILE /020 CJL
*20 /GET PAST AUTO-INDEX AREA
INFLAG, .-. /DECMATE INPUT AVAILABLE FLAG /046 CJL
OUTFLAG,.-. /DECMATE OUTPUT AVAILABLE FLAG /046 CJL
TEMP, 0
RCHAR, 0 /REMOTE LINE CURRENT INPUT CHAR
SCAN1, 0 /
SCAN2, 0 /
KEYDSP, 0 /DISPATCH ADDRESS FOR KEYWORD MATCH
BININP, 0 /BINARY REGISTER FOR DECIMAL INPUT
PTABLE, 0 /
LPTR, 0 /HOLDS LINE POINTER
STATE, 0 /CURRENT STATE
RETRY, -RETCNT /PACKET ERROR RETRY COUNTER /031 CJL
RTRYC, 0 /USE THIS FOR ACTUAL COUNTER
/ CURRENT PACKET I/O DATA. /014 CJL
PAKPTR, 0 /POINTER TO OUTPUT PACKET POINTER
PAKCKS, 0 /HOLDS CURRENT OUTPUT PACKET CHECKSUM TOTAL
CURSEQ, 0 /CURRENT SEQ NUMBER
QFLAG, 0 /NON-ZERO WHEN NO CONTROL QUOTING
/ RECEIVE "INIT" REGISTERS. /014 CJL
RMAXL, DEFMAXL+40 /MAX LENGTH FOR DATA PACKET (DEFAULT)
RTIME, 0 /TIME-OUT VALUE
RNPAD, 0 /NUMBER OF PADDING CHARS
RPADC, 0 /CHAR USED FOR PADDING
REOL, DEFEOL /TERMINATOR CHAR USED FOR END OF PACKET
RQCTL, DEFQCTL /CONTROL CHAR PREFIX CHAR
RQBIN, 0 /PARITY CHAR PREFIX CHAR (CHARS GT 177)
RCHKT, DEFCK /CHECKSUM TYPE (DEFAULT TYPE 1)
RREPT, 0 /PREFIX CHAR FOR REPEATED CHARS
RCAPAS, 0 /EXTRA CAPABILITY BIT MASK
/ ZBLOCK 4 /RESERVED FOR EXTRA CAPABILITIES /022 CJL
INITEND=. /END OF INIT REGISTERS /022 CJL
HNDADR, 0 /FILE DEVICE HANDLER ADDRESS
FORCEP, 0 /FLAG FOR FORCED OUTPUT OF PACKET WHEN THERE IS
/ NO DATA (JUST SOH, LEN, SEQ, AND CHECKSUM)
PRSERR, 0 /HOLDS PARSE POSITION FOR REPORTING ERRORS
PACK6P, 0 /POINTER TO STORAGE OF 6 BIT CHARS
PACK6F, 0 /FLAG FOR WHICH BYTE TO STORE
GET6P, 0 /POINTER USED IN THE GET6 ROUTINE
GET6F, 0 /FLAG USED IN THE GET6 ROUTINE
MOVE4, 0 /COUNTER FOR "MOVE"
INIFLG, 0 /INIT DONE FLAG
MQ, .-. /"MQ" TEMPORARY REGISTER /032 CJL
/ FILE NAME PARSE REGISTERS. /014 CJL
FNPTR, 0 /POINTER TO WHERE TO PUT A PARSED FILE NAME
WILDF, 0 /WILD CARD IN FILE NAME FLAG
/ FILE INFORMATION. /014 CJL
FSBLK, 0 /FILE START BLOCK
FLEN, 0 /FILE LENGTH
DEVNUM, 0 /PARSED DEVICE NUMBER HERE
OFFLG, 0 /OUTPUT FILE OPEN FLAG
ODNAME, 0 /POINTER TO USER SPECIFIED DEVICE FOR OUTPUT
ODNUMB, 0 /OUTPUT DEVICE NUMBER
/ PARITY VARIABLES. /014 CJL
/MARK, 0200 /SET BIT [8] FOR COMMAND INPUTS /A013
/PARITY,0 /PARITY MASK (0=SPACE, 200=MARK) /AM013
/ INTERNAL FILE MODE FLAG. /019 CJL
FILMODE,FMODE /ASCII=0177, BINARY=4377 /019 CJL
/ UPPER-CASE ONLY FLAG. /023 CJL
UPONLY, LOWER /0=UPPER/LOWER CASE, -40=UPPER-CASE ONLY/030 CJL
/ <^C> DISPATCH ADDRESS. /023 CJL
UCADDRE,SBOOT /<^C> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL
/ <^P> DISPATCH ADDRESS. /023 CJL
UPADDRE,CHKCLR /<^P> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL
/ ESCAPE CHARACTER FOR CONNECT MODE. /025 CJL
ESCHAR, ESCAPE /ESCAPE CHARACTER FOR CONNECT MODE /025 CJL
/ FLOW CONTROL FLAG. /026 CJL
FLOWFLA,-FLOW /0=NO FLOW CONTROL, 7777=FLOW CONTROL /049 CJL
/VIA <^S>/<^Q>
/ KEYBOARD INPUT ERROR FLAG. /026 CJL
KEYERRO,.-. /0=NO ERROR, NON-ZERO=BAD CHARACTER /026 CJL
/OR BUFFER OVERRUN
/ REMOTE LINE INPUT ERROR FLAG. /026 CJL
RINERRO,.-. /0=NO ERROR, NON-ZERO=BAD CHARACTER /026 CJL
/OR BUFFER OVERRUN
/ REMOTE LINE OUTPUT FLOW CONTROL WAIT FLAG. /026 CJL
REMWAIT,.-. /0=DON'T WAIT, 4000=WAIT FOR <^Q> /026 CJL
/ REMOTE INPUT WAIT FLAG. /026 CJL
/ FLAG STATES:
/ VALUE ACTION
/ 0000 BUFFER IS LESS THAN 3/4 FULL. INPUT FREELY ALLOWED
/ WITHOUT FLOW CONTROL RESTRICTIONS. IF BUFFER BECOMES
/ 3/4 FULL AND FLOW CONTROL IS IN EFFECT THEN CHANGE
/ STATE TO 0001.
/ 0001 BUFFER IS NOW 3/4 FULL. OUTPUT <^S> TO REMOTE AND
/ THEN CHANGE STATE TO 4000.
/ 4000 WAITING FOR BUFFER TO EMPTY TO LESS THAN 1/4 FULL. IF
/ FLOW CONTROL IS BEING OBEYED, THEN BUFFER SHOULD NOW
/ BE EMPTYING.
/ 7777 BUFFER IS NOW LESS THAN 1/4 FULL. OUTPUT <^Q> TO
/ REMOTE AND THEN CHANGE STATE TO 0000.
RINWAIT,.-. /REMOTE INPUT WAIT FLAG /026 CJL
/ REMOTE LINE OUTPUT BUFFER POINTERS. /026 CJL
REMINSE,.-. /REMOTE OUTPUT INSERTION POINTER /026 CJL
REMREMO,.-. /REMOTE OUTPUT REMOVAL POINTER /026 CJL
/ POINTER FOR THE PACKET INPUT AND OUTPUT ROUTINES
SPACK= JMS I . /SEND A PACKET TO REMOTE
SPACK0 /PUT IN A POINTER
FPACK= JMS I . /FORMAT PACKET
FPACK0 /PUT IN THE POINTER
RPACK= JMS I . /RECEIVE A PACKET FROM REMOTE
ILINK /PUT IN A POINTER
/ POINTERS FOR OUTPUT ROUTINES
PRI8B= JMS I . /PRINT 8 BIT STRING ON TTY
PRI8B0 /PUT IN THE POINTER
REM8B= JMS I . /SEND 8 BIT STRING DOWN REMOTE LINE
REM8B0 /PUT IN THE POINTER
/ MISC.
PACK6= JMS I . /DEFINE CALL TO ROUTINE
PACK60 /POINTER TO ROUTINE
GET6= JMS I . /DEFINE THE INSTRUCTION
GET60 /PUT IN THE POINTER
MOVE= JMS I . /DEFINE CALL TO MOVE ROUTINE
MOVE0 /POINTER
CLEAR= JMS I . /DEFINE CALL FOR "CLEAR" ROUTINE
CLEAR0 /POINTER
PAGE /START ON NEW PAGE /A014 CJL
/ KERMIT-12 PROGRAM STARTS HERE. /A014 CJL
CLOOP, JMP I (INITIALIZE) /**** INITIALIZED **** CLA CLL /024 CJL
JMS I [CRESET] /RESET CONSOLE ROUTINE STUFF
DCA ABFLAG /CLEAR ABORT FLAG /044 CJL
DCA REMWAIT /CLEAR REMOTE FLOW CONTROL WAIT /049 CJL
CLDMZAP,JMS DMINIT /INITIALIZE DECMATE PORT /048 CJL
/ THE PREVIOUS INSTRUCTION IS FOR DECMATE OPERATION ONLY. THE DEFAULT
/ INSTRUCTION IS FOR KL8 INTERFACES ONLY.
*CLDMZAP /OVERLAY DECMATE CODE /048 CJL
CLDMZAP,NOP /DON'T INITIALIZE DECMATE PORT /048 CJL
TAD RATE /GET BAUD RATE
SETBAUD,MSB /SET REMOTE BAUD RATE /050 CJL
/ THE PREVIOUS INSTRUCTION IS FOR DECMATE II OPERATION ONLY. /050 CJL
*SETBAUD /OVERLAY DECMATE II CODE /050 CJL
SETBAUD,NOP /NOT APPLICABLE ON DECMATE I /050 CJL
/ THE PREVIOUS INSTRUCTION IS FOR DECMATE I OPERATION ONLY. THE DEFAULT
/ INSTRUCTION IS FOR KL8 INTERFACES ONLY.
*SETBAUD /OVERLAY DECMATE I CODE /050 CJL
SETBAUD,RSBIOT /SET REMOTE BAUD RATE /050 CJL
JMS I [SCRIBE] /DO A /025 CJL
CRLF /<CR>, <LF> /025 CJL
JMS I [SCRIBE] /GIVE THEM THE /025 CJL
PRMTMSG /PROMPT MESSAGE /025 CJL
JMS I (LININP) /GET INPUT LINE FROM USER
TAD (CMDTBL) /GET ADDRESS OF PARSE TABLE /M014 CJL
DCA PTABLE /STORE FOR PARSER
TAD (LINBUF) /GET INPUT LINE BUFFER ADDRESS /M014 CJL
CLOOP1, JMS I (KEYPRS) /PARSE OFF A KEYWORD
JMP CLOOP9 /NO MATCH ON KEYWORD
JMP CLOOP /END OF LINE DETECTED
DCA LPTR /STORE POINTER TO NEXT POS ON LINE
JMS I KEYDSP /DISPATCH TO SERVICE
JMP CLOOP7 /ERROR RETURN FROM SERVICE DISPATCH
TAD LPTR /RE-GET COMMAND LINE POINTER
JMP CLOOP1 /CONTINUE LINE PARSE
CLOOP7, SNA /SKIP IF A RETURNING MESSAGE PASSED /029 CJL
JMP CLOOP /JUST GO BACK TO COMMAND LOOP /029 CJL
DCA RETARG /STORE IN-LINE /029 CJL
JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE
RETARG, .-. /WILL BE PASSED MESSAGE ADDRESS
JMP CLOOP /KEEP GOING
CLOOP9, JMS I [SCRIBE] /COMPLAIN OF /025 CJL
CMERMSG /BAD COMMAND /025 CJL
JMP CLOOP /GO AGAIN
/ ROUTINE TO FORMAT A PACKET OF DATA
/ CALL: FPACK
/ DATA ADDRESS (DATA MUST ALREADY BE CONTROL/QUOTED AND MUST
/ NOT BE LONGER THAN THE LARGEST PACKET)
/ PACKET TYPE
FPACK0, 0
CLA CLL /INSURE CLEAR AC
TAD I FPACK0 /GET THE DATA ADDRESS
DCA FP1 /STORE IN SOURCE POINTER
ISZ FPACK0 /BUMP ARGUMENT POINTER
TAD I FPACK0 /NOW GET TYPE
DCA I (RSTYP) /STORE
ISZ FPACK0 /BUMP ARGUMENT POINTER
TAD (RSDTA /GET ADDRESS OF DATA BUFFER
DCA FP2 /STORE IN DESTINATION POINTER
TAD (40+3 /SET FOR LENGTH COUNTER
DCA I (RSLEN) /STORE IN PACKET
DCA FP3 /INIT CHECKSUM
TAD CURSEQ /GET CURRENT SEQ NUMBER
AND [77] /MODULO 64 /014/016 CJL
TAD [40] /TAKE CHAR(SEQUENCE NUMBER) /014/016 CJL
DCA I (RSSEQ) /PUT INTO PACKET
FPACK2, TAD I FP1 /GET A CHAR FROM SOURCE
SPA /SKIP IF NOT END
JMP FPACK3 /END
TAD FP3 /COMBINE WITH CHECKSUM
DCA FP3 /AND RETURN
TAD I FP1 /GET CHAR BACK AGAIN
DCA I FP2 /NOW PUT INTO DESTINATION
ISZ I (RSLEN) /BUMP THE LENGTH
ISZ FP1 /BUMP THE SOURCE POINTER
ISZ FP2 /BUMP THE DESTINATION POINTER
JMP FPACK2 /LOOP
FPACK3, CLA CLL /CLEAR THE AC
TAD FP3 /GET CALCULATED CHECKSUM
TAD I (RSLEN) /INCLUDE THE LENGTH
TAD I (RSSEQ) /AND THE SEQUENCE
TAD I (RSTYP) /AND THE TYPE
JMS I [CKSUM] /GET IT CORRECT
DCA I FP2 /STORE WITH PACKET
ISZ FP2 /BUMP PACKET POINTER
TAD REOL /GET ANY END OF LINE TO INCLUDE
TAD [-40] /MAKE IT A REAL CHARACTER /014/016 CJL
SNA /SKIP IF EOL CHAR REQUIRED
JMP FPACK4 /NO EOL CHAR
DCA I FP2 /STORE EOL CHAR WITH PACKET
ISZ FP2 /BUMP POINTER
FPACK4, NL7777 /SET -1 /032 CJL
DCA I FP2 /PACKET NOW COMPLETE
TAD RETRY /SET UP RE-TRY COUNTER
DCA RTRYC
ISZ CURSEQ /BUMP SEQUENCE NUMBER FOR NEXT TIME
NOP /PROTECT ISZ
JMP I FPACK0 /RETURN
FP1, 0 /POINTER TO SOURCE DATA
FP2, 0 /POINTER TO PACKET BUFFER
FP3, 0 /RUNNING CHECKSUM
/ DECMATE INITIALIZE ROUTINE. /048 CJL
DMINIT, .-. /DECMATE PORT INITIALIZE ROUTINE/048 CJL
DMI01, TAD DM234/(234) /GET SCD ENABLE VALUE /050 CJL
DMI02, WCON0 /WRITE CONTROL REGISTER 0 (1) /050 CJL
DMI03, NL0000 /INDICATE PORT 0 (1) /050 CJL
DMI04, RACD /RESET THE ACTIVE PORT /050 CJL
DMI05, ISZ DMWASTE /WASTE /050 CJL
DMI06, JMP DMI05 /SOME TIME /050 CJL
DMI07, ISZ DMWASTE /WASTE /050 CJL
DMI08, JMP DMI07 /SOME TIME /050 CJL
DMI09, RTFL0 /SET PORT 0 (1) OUTPUT FLAG /050 CJL
DMI10, TAD DM2516/(2516) /SETUP FOR 8 BITS, NO PARITY /050 CJL
DMI11, JMS DMSEND /SEND TO MODE REGISTER 1 /050 CJL
DMI12, TAD RATE /GET BAUD RATE /050 CJL
DMI13, TAD DM2460/(2460) /ADD ON CLOCK ENABLE VALUES /050 CJL
DMI14, JMS DMSEND /SEND TO MODE REGISTER 2 /050 CJL
DMI15, TAD DM3425/(3425) /GET ENABLE AND RESET VALUE /050 CJL
DMI16, JMS DMSEND /SEND TO COMMAND REGISTER /050 CJL
DMI17, RKRB0 /DO A DUMMY READ ON PORT 0 (1) /050 CJL
/ THE PREVIOUS INSTRUCTIONS ARE FOR DECMATE I OPERATION ONLY. THE DEFAULT
/ INSTRUCTIONS ARE FOR DECMATE II, ETC. INTERFACES ONLY.
*DMI01 /OVERLAY DECMATE I CODE /050 CJL
DMI01, ISZ DMWASTE /WASTE /048 CJL
DMI02, JMP DMI01 /SOME TIME /048 CJL
DMI03, ISZ DMWASTE /WASTE /048 CJL
DMI04, JMP DMI03 /SOME TIME /048 CJL
DMI05, ISF /SKIP ON AND CLEAR PORT FLAG /048 CJL
DM50, 50/NOP /JUST IN CASE /048 CJL
DMI07, IRB /READ THE PORT BUFFER /048 CJL
DMI08, CLA /CLEAN UP /048 CJL
DMI09, TAD DM50/(50) /GET OUTPUT INTERRUPT VALUE /048 CJL
DMI10, MPSCC /CLEAR OUTPUT INTERRUPT /048 CJL
DMI11, TAD (60-50) /GET ERROR RESET VALUE /048 CJL
DMI12, MPSCC /CLEAR OVERRUN ERRORS /048 CJL
DMI13, TAD (70-60) /SET END OF INTERRUPT VALUE /048 CJL
DMI14, MPSCC /CLEAR THE INTERRUPT /048 CJL
DMI15, DCA OUTFLAG /INDICATE OUTPUT IS AVAILABLE /048 CJL
DMI16, DCA INFLAG /CLEAR INPUT AVAILABLE FLAG /048 CJL
DMI17, JMP I DMINIT /RETURN /048 CJL
/ DECMATE I INITIALIZE CODE CONTINUES HERE. /050 CJL
DMISET, RTFL0 /SET PORT 0 (1) OUTPUT FLAG /050 CJL
CLA /CLEAN UP /050 CJL
JMP I DMINIT /RETURN /050 CJL
DMSEND, .-. /DECMATE I SEND ROUTINE /050 CJL
DMISKP, RTSF0 /SKIP ON PORT 0 (1) OUTPUT FLAG /050 CJL
JMP DMISKP /WAIT FOR IT /050 CJL
DMIOUT, RTLS0 /SEND TO PORT 0 (1) REGISTER /050 CJL
CLA /CLEAN UP /050 CJL
JMP I DMSEND /RETURN /050 CJL
DMWASTE,.-. /TIMER TEMPORARY /050 CJL
DM234, 234 /CONSTANT 0234 /050 CJL
DM2460, 2460 /CONSTANT 2460 /050 CJL
DM2516, 2516 /CONSTANT 2516 /050 CJL
DM3425, 3425 /CONSTANT 3425 /050 CJL
PAGE
/ ROUTINE TO SEND THE FORMATTED PACKET /027 CJL
/ ARGUMENTS: CALL+1 NON-ZERO = AWAIT RESPONSE
/ ZERO = DO NOT AWAIT RESPONSE
/ CALL + 2 DISPATCH TABLE-2 /027 CJL
SPACK0, 0
REM8B; RSBUF /SEND PACKET JUST COMPLETED
TAD I SPACK0 /DO WE GET A RESPONSE?
ISZ SPACK0 /BUMP POINTER PAST ARGUMENT
SNA CLA /SKIP IF YES
JMP I SPACK0 /ALL DONE HERE
RPACK /GET PACKET BACK FROM REMOTE
TAD I SPACK0 /DID WE WANT A DISPATCH?
ISZ SPACK0 /BUMP PAST ARGUMENT
SNA /SKIP IF YES
JMP I SPACK0 /EXIT IF NO
DCA SPACARG /STORE IN-LINE /031 CJL
JMS DISPATCH /CALL DISPATCH ROUTINE /031 CJL
SPACARG,.-. /WILL BE DISPATCH TABLE-2 /031 CJL
JMP I SPACK0 /NOT FOUND, GOTTA RETURN
/ CONSOLE RESET ROUTINE. /024 CJL
CRESET, .-. /CONSOLE RESET ROUTINE
CLA CLL /CLEAN UP
DCA ECHOSW /ENABLE OUTPUT ECHO
TAD (UPCPRT) /ALLOW THEM TO
DCA UCADDRESS /RESTART VIA <^C>
TAD [CLOOP] /ALLOW THEM TO
DCA UPADDRESS /RESTART VIA <^P>
JMP I CRESET /RETURN
/ ALTERNATE CONSOLE RESET ROUTINE. /025 CJL
CREST2, .-. /ALTERNATE CONSOLE RESET ROUTINE
JMS CRESET /CLEAR AC AND ENABLE OUTPUT ECHO
TAD (KCCZAP) /RENDER <^C>
DCA UCADDRESS /TOTALLY HARMLESS
TAD (CHKCLR) /MAKE <^P> PRINT "^P"
DCA UPADDRESS /AND THEN GO AWAY
JMP I CREST2 /RETURN
/ ROUTINE TO CLEAR WORDS OF MEMORY
/ ENTER WITH: AC = MINUS NUMBER OF WORDS TO CLEAR
/ MQ = ADDRESS OF WHERE TO START THE CLEAR
CLEAR0, 0
DCA CLEAR5 /STORE COUNT OF WORDS
TAD MQ /GET ADDRESS TO CLEAR /032 CJL
DCA CLEAR6 /STORE IN POINTER
DCA I CLEAR6 /ZERO A WORD
ISZ CLEAR6 /BUMP POINTER
ISZ CLEAR5 /BUMP COUNTER
JMP .-3 /LOOP
JMP I CLEAR0 /DONE
CLEAR5, 0 /TEMP FOR "CLEAR" ROUTINE
CLEAR6, 0 /TEMP FOR "CLEAR" ROUTINE
/ ROUTINE TO DISPATCH TO ROUTINE BASED ON VALUE OF "RRTYP". /027 CJL
/ CALLING SEQUENCE:
/ CLA /AC MUST BE CLEAR
/ JMS DISPATCH /CALL ROUTINE
/ ADDRESS-2 /DISPATCH TABLE ADDRESS-2
/ NO MATCH RETURN /RETURNS HERE WITH CLEAR AC IF NO MATCH
/ CALL WILL DISPATCH TO THE CORRESPONDING ROUTINE ON A MATCH IN THE SPECIFIED
/ TABLE (WHICH ENDS WITH ZERO) WITH A CLEAR AC.
DISPATC,.-. /MATCH "RRTYP" AND DISPATCH ROUTINE
CLA /JUST IN CASE /031 CJL
TAD I DISPATCH /GET PASSED ARGUMENT
ISZ DISPATCH /BUMP PAST THE ARGUMENT
DCA DISPA2 /SAVE PASSED ARGUMENT IN-LINE
TAD I (RRTYP) /GET VALUE OF "RRTYP"
CIA /INVERT FOR TESTING
JMS I [SRCHTABLE] /CALL TABLE SEARCH ROUTINE
DISPA2, .-. /WILL BE TABLE ADDRESS-2
SNA CLA /SKIP IF MATCH FOUND
JMP I DISPATCH /RETURN ON NO MATCH
JMP I TABLEJUMP /DISPATCH TO MATCHING ADDRESS
/ ROUTINE TO PUT CHARS INTO A BUFFER TO GET READY TO FORMAT A PACKET.
/ ENTER WITH CHAR IN THE AC; IF THE CHAR NEEDS CONTROL QUOTING, IT WILL BE ADDED
/ EXIT + 2 IF EVERYTHING IS OK
/ EXIT + 1 IF BUFFER IS FULL
OPBUF, 0 /PUT CHARACTERS INTO BUFFER FOR PACKET ROUTINE
JMS I (OPRE) /CHECK FOR PREFIX
JMP OPBUF1 /NO PREFIX
DCA OP1 /SAVE CONVERTED CHAR
TAD RQCTL /GET QUOTE CHAR TO USE
DCA I OP2 /PUT RETURNED PREFIX INTO BUFFER
ISZ OP2 /BUMP POINTER
TAD OP1 /GET BACK CONVERTED CHAR
OPBUF1, DCA I OP2 /PUT INTO BUFFER
ISZ OP2 /BUMP POINTER
NL7777 /SET -1 /032 CJL
DCA I OP2 /ALWAYS TERMINATE BUFFER
TAD RMAXL /GET MAX BUFFER LENGTH
TAD (-40+HOLDBF-4 /
CIA
TAD OP2 /COMPARE WITH WHAT WE HAVE
SPA CLA /SKIP IF NO ROOM
JMP OPBUF2 /HAVE ROOM
JMS INIOPB /RESET BUFFER
JMP I OPBUF /TAKE RETURN + 1
OPBUF2, ISZ OPBUF /BUMP RETURN FOR BUFFER NOT FULL
JMP I OPBUF /DONE
OP1, 0 /TEMP LOCATION
OP2, HOLDBF /POINTER FOR HOLD BUFFER
/ ROUTINE TO RE-SET THE HOLD BUFFER.
INIOPB, 0
TAD (HOLDBF /RE-SET BUFFER POINTER
DCA OP2
JMP I INIOPB
/ ROUTINE TO CALCULATE A 1 BYTE CHECKSUM.
CKSUM, 0
DCA CKSUM1 /STORE TEMP
TAD CKSUM1 /GET BACK
RTR;RTR;RTR /GET TWO HIGHEST INTO TWO LOWEST /032 CJL
AND (3 /KEEP ONLY BITS 0-1
TAD CKSUM1 /GET ORIGINAL
AND [77] /KEEP ONLY BITS 0-5 /016 CJL
TAD [40] /MAKE A CHAR(CHECKSUM)
JMP I CKSUM /DONE, RETURN IN AC
CKSUM1, 0 /TEMP FOR "CKSUM"
PAGE
/ ROUTINE TO INPUT CHARS FROM REMOTE UNTIL A "SOH" CHAR IS FOUND.
GETSOH, 0
JMS COMIN /GET A CHARACTER FROM THE REMOTE LINE /046 CJL
JMP I GETSOH /TIME-OUT
AND [177] /IGNORE PARITY BIT /034 CJL
TAD (-CNTRLA) /COMPARE WITH "SOH" /034 CJL
SZA CLA /SKIP IF SAME
JMP GETSOH+1 /LOOP TILL WE GET ONE
ISZ GETSOH /BUMP FOR GOOD RETURN
JMP I GETSOH /GOT ONE, DONE
/ ROUTINE TO GET A CHAR FROM THE REMOTE LINE AND UPDATE CHECKSUM.
GETIR, 0
JMS COMIN /GET A CHARACTER FROM THE REMOTE LINE /046 CJL
JMP I GETIR /TIME-OUT RETURN
DCA GETIR1 /STORE TEMP
TAD GETIR1 /GET CHAR BACK
TAD I (ILINK9) /ADD CHECKSUM
DCA I (ILINK9) /RETURN UPDATED CHECKSUM
TAD GETIR1 /RE-GET CURRENT INPUT CHAR
TAD [-15] /CHECK FOR A RETURN
SNA CLA /SKIP IF NOT A RETURN
JMP I GETIR /WAS A RETURN, TAKE EXIT + 1
TAD GETIR1 /RE-GET CHAR FOR RETURN
ISZ GETIR /BUMP FOR GOOD RETURN
JMP I GETIR /AND RETURN IN THE AC
GETIR1, 0 /TEMP LOCAL TO "GETIR"
/ REMOTE COMMUNICATIONS ROUTINES FOR NON-CONNECT USAGE. /046 CJL
/ REMOTE INPUT ROUTINE. /046 CJL
COMIN, .-. /REMOTE INPUT ROUTINE /046 CJL
CLA /CLEAN UP /046 CJL
TAD [-15] /SETUP THE /049 CJL
DCA TIMEOUT /TIME-OUT FACTOR /046 CJL
INLUP, TAD INFLAG /IS INPUT AVAILABLE? /046 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*INLUP /OVERLAY DECMATE II CODE /049 CJL
INLUP, SKP /WE'RE NOT A DECMATE II /049 CJL
SNA CLA /SKIP IF INPUT AVAILABLE (ON DECMATE II)/049 CJL
INSKIP, JMP NOTYET /JUMP IF NOT /049 CJL
INLUP1, DCA INFLAG /CLEAR INPUT AVAILABILITY FLAG /049 CJL
INREAD, IRB /GET THE CHARACTER /049 CJL
/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
/ ARE FOR KL8 INTERFACES.
*INSKIP /OVERLAY DECMATE II CODE /049 CJL
INSKIP, RKSFIOT /INPUT FLAG UP? /049 CJL
INLUP1, JMP NOTYET /NO, CHECK FOR ABORT, ETC. /049 CJL
INREAD, RKRBIOT /YES, READ IN THE CHARACTER /049 CJL
AND [177] /JUST SEVEN-BIT /046 CJL
DCA RCHAR /SAVE THE CHARACTER /046 CJL
TAD RCHAR /GET IT BACK /046 CJL
ISZ COMIN /BUMP TO GOOD RETURN /046 CJL
JMP I COMIN /RETURN /046 CJL
/ COMES HERE IF INPUT NOT AVAILABLE.
NOTYET, JMS I (CTLCTST) /CHECK FOR <^C>, ETC. /044 CJL
TAD [-CNTRLZ] /COMPARE POSSIBLE CHARACTER TO <^Z> /044 CJL
SZA /SKIP IF IT ALREADY MATCHES /044 CJL
TAD [-CNTRLX+CNTRLZ]/ELSE COMPARE TO <^X> /044 CJL
SNA CLA /SKIP IF NEITHER ABORT CHARACTER /049 CJL
ISZ ABFLAG /SET ABORT FLAG /049 CJL
SKP /SKIP IF NOT TOO MANY TIMES /049 CJL
JMP .-2 /ENSURE FLAG SETTING /049 CJL
INSTATU,JMS UPSTATUS /UPDATE THE PORT STATUS /049 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*INSTATUS /OVERLAY DECMATE II CODE /049 CJL
INSTATU,NOP /WE'RE NOT A DECMATE II /049 CJL
ISZ WASTIME /WASTE SOME TIME /046 CJL
JMP INLUP /KEEP TRYING /046 CJL
ISZ TIMEOUT /WAITING TOO LONG? /046 CJL
JMP INLUP /NO, KEEP TRYING /046 CJL
JMP I COMIN /YES, TAKE ERROR RETURN /046 CJL
/ FLOW-CONTROL STATUS ROUTINE. /049 CJL
GETFLOW,.-. /GET FLOW-CONTROL STATUS
GETFL1, JMS UPSTATUS /UPDATE THE CURRENT STATUS
/ THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*GETFL1 /OVERLAY DECMATE II CODE
GETFL1, NOP /WE'RE NOT A DECMATE II
JMS I (RINGET) /GET REMOTE CHARACTER (IF ANY)
CLA /THROW IT AWAY
TAD REMWAIT /GET REMOTE FLOW STATUS
JMP I GETFLOW /RETURN
/ REMOTE OUTPUT ROUTINE. /046 CJL
COMOUT, .-. /REMOTE OUTPUT ROUTINE /046 CJL
DCA OUTEMP /SAVE PASSED VALUE /046 CJL
CMRESET,TAD [-15] /SETUP THE /049 CJL
DCA OTIME /TIME-OUT COUNTER /049 CJL
COMWAIT,JMS GETFLOW /GET REMOTE WAIT STATUS /049 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR
/ KL8 INTERFACES.
*COMWAIT /OVERLAY DECMATE CODE /049 CJL
COMWAIT,NL7777 /SETUP FOR FLOW CONTROL FLAG LOAD /049 CJL
AND FLOWFLAG /SHOULD WE WAIT FOR REMOTE FLOW CONTROL?/049 CJL
SNA CLA /SKIP IF SO /049 CJL
JMP NOWAIT /JUMP IF NOT /049 CJL
FLOWAIT,JMS GETFLOW /GET REMOTE WAIT STATUS /049 CJL
SZA CLA /SKIP IF NOT WAITING /049 CJL
JMP FLOWAIT /JUMP IF STILL WAITING /049 CJL
NOWAIT, TAD OUTFLAG /CHECK IF OUTPUT IS AVAILABLE /049 CJL
CMOUT1, SNA CLA /SKIP IF SO /049 CJL
CMOUT2, JMP OWAIT /JUMP IF NOT /049 CJL
DM1AND, DCA OUTFLAG /CLEAR OUTPUT AVAILABILITY FLAG /049 CJL
CMOUT3, TAD OUTEMP /GET THE PASSED VALUE /049 CJL
CMOUT4, OLS /OUTPUT IT /049 CJL
/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
/ ARE FOR KL8 INTERFACES.
*NOWAIT /OVERLAY DECMATE II CODE /049 CJL
NOWAIT, RTSFIOT /OUTPUT FLAG UP? /049 CJL
CMOUT1, JMP OWAIT /NO, WAIT FOR IT THERE /049 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*CMOUT1 /OVERLAY DECMATE I CODE /049 CJL
CMOUT1, JMP COMWAIT /NO, WAIT FOR IT /049 CJL
CMOUT2, TAD OUTEMP /YES, GET PASSED VALUE /049 CJL
DM1AND, AND [377] /ENSURE EIGHT BITS (FOR DECMATE I) /049 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*DM1AND /OVERLAY DECMATE I CODE /049 CJL
DM1AND, SKP /WE'RE NOT A DECMATE I /049 CJL
CMOUT3, TAD [400] /FORCE OUTPUT WRITE FOR DECMATE I /049 CJL
CMOUT4, RTLSIOT /OUTPUT THE CHARACTER /049 CJL
CLA /CLEAN UP /049 CJL
JMP I COMOUT /RETURN /049 CJL
/ COMES HERE IF OUTPUT NOT READY. /049 CJL
OWAIT, ISZ OWASTE /WASTE SOME TIME /049 CJL
JMP COMWAIT /KEEP TRYING /049 CJL
ISZ OTIME /WAITING TOO LONG? /049 CJL
JMP COMWAIT /NO, KEEP TRYING /049 CJL
JMS I (DMINIT) /YES, RESET EVERYTHING /049 CJL
JMP CMRESET /TRY, TRY AGAIN /049 CJL
/ DECMATE II, ETC. STATUS UPDATE ROUTINE. /046 CJL
UPSTATU,.-. /UPDATE THE STATUS ROUTINE /046 CJL
ISF /COMMUNICATIONS PORT FLAG UP? /046 CJL
JMP I UPSTATUS /NO, RETURN /046 CJL
NL4000 /SETUP READ OF REGISTER ZERO /046 CJL
MPSCC /TELL THE MPSCC CHIP /046 CJL
CLA /CLEAN UP /046 CJL
MPSCC /READ REGISTER ZERO NOW /046 CJL
AND (5) /JUST INPUT AND OUTPUT BITS /046 CJL
CLL RAR /MOVE INPUT TO LINK /046 CJL
SNA CLA /SKIP IF OUTPUT INTERRUPT /046 CJL
JMP INCHK /JUMP IF NOT /046 CJL
TAD (050) /GET OUTPUT CLEAR VALUE /046 CJL
MPSCC /CLEAR THE OUTPUT INTERRUPT /046 CJL
DCA OUTFLAG /INDICATE OUTPUT AVAILABLE NOW /046 CJL
INCHK, CLA RAL /GET RECEIVE STATUS /046 CJL
SZA /SKIP IF INPUT NOT AVAILABLE RIGHT NOW /046 CJL
DCA INFLAG /INDICATE NEW INPUT STATUS /046 CJL
CLA /CLEAN UP EITHER WAY /046 CJL
TAD (070) /GET END OF INTERRUPT VALUE /046 CJL
MPSCC /CLEAR THE INTERRUPT /046 CJL
CLA /CLEAN UP /046 CJL
JMP I UPSTATUS /RETURN /046 CJL
AND377= AND [377] /INSTRUCTION CONSTANT /049 CJL
OUTEMP= COMIN /OUTPUT ROUTINE TEMPORARY /049 CJL
TIMEOUT=GETFLOW /TIME-OUT TEMPORARY /049 CJL
WASTIME=COMOUT /TIME-OUT TEMPORARY /049 CJL
OTIME, .-. /TIME-OUT TEMPORARY /049 CJL
OWASTE, .-. /TIME-OUT TEMPORARY /049 CJL
PAGE
/ HOLD BUFFER FOR CHAR OUTPUT
DECIMAL
HOLDBF, ZBLOCK 92
OCTAL
/ ROUTINE TO CHECK FOR CONTROL PREFIX.
/ ENTER WITH CHAR TO CHECK IN THE AC.
/ EXIT + 1 WITH CHAR IN THE AC IF NO PREFIX QUOTING.
/ EXIT + 2 WITH PROPER CHAR IN THE AC AND QUOTING IS REQUIRED.
OPRE, 0 /CHECK FOR CONTROL PREFIX ROUTINE
DCA PRETEMP /SAVE THE CHARACTER /032 CJL
TAD QFLAG /CHECK FOR IN CTRL QUOTE MODE
SZA CLA /SKIP IF YES
JMP OPRE1 /NO QUOTE PREFIX
TAD PRETEMP /GET THE CHARACTER /032 CJL
AND [7740] /QUICK CHECK FOR <40 /014/016 CJL
SNA CLA /SKIP IF NOT CONTROL
JMP OPRE2 /PREFIX QUOTE
TAD PRETEMP /GET THE CHARACTER /032 CJL
TAD (-177 /CHECK FOR "DELETE"
SNA CLA /SKIP IF NOT
JMP OPRE2 /PREFIX QUOTE
TAD PRETEMP /GET THE CHARACTER /032 CJL
CIA /NEGATE FOR COMPARE
TAD RQCTL /SEE IF SAME AS QUOTE CHAR
SZA CLA /SKIP IF PREFIX QUOTE
JMP OPRE1 /NO PREFIX QUOTE
TAD RQCTL /PREFIX WITH PREFIX
JMP OPRE3 /PREFIX WITH THE PREFIX
OPRE1, TAD PRETEMP /GET THE CHARACTER /032 CJL
JMP I OPRE /DONE
OPRE2, TAD PRETEMP /GET THE CHARACTER /032 CJL
TAD [100] /MAKE IT PRINTABLE /016 CJL
AND [177] /IN CASE IT WAS 177 /014/016 CJL
OPRE3, ISZ OPRE /BUMP FOR PREFIX RETURN
JMP I OPRE /DONE
PRETEMP,.-. /PREFIX TEMPORARY /032 CJL
PAGE /014 CJL
/ ROUTINE TO SCAN A TEXT LINE FOR KEYWORD DELIMITERS.
/ THIS ROUTINE EXPECTS THE AC TO POINT TO A TEXT LINE TO SCAN AND FINDS THE
/ FIRST NON-SPACE, NON-END OF LINE CHAR IN THE LINE AND SETS "SCAN1" TO POINT TO
/ IT. NEXT WE FIND THE LAST CHAR IN THE LINE THAT IS A NON-SPACE, NON-END OF
/ LINE AND STORE A POINTER TO IT IN "SCAN2". KEYWORDS ARE DELIMITED BY A
/ BEGINNING OF LINE OR SPACE AT THE BEGINNING AND AN END OF LINE OR A SPACE AT
/ THE END.
/ ENTER: AC = POINTER TO COMMAND LINE
/ EXIT: (SUCCESS) SCAN1 = POINTER TO FIRST CHAR OF KEYWORD.
/ SCAN2 = POINTER TO LAST CHAR OF KEYWORD.
/ RETURN = RETURN + 2 (NO WORDS LEFT IN LINE).
/ EXIT: (FAIL) RETURN = RETURN + 1.
SCNEL, 0 /SCAN ROUTINE
JMS I [NOSP] /FIND FIRST NON-SPACE
JMP I SCNEL /END OF LINE RETURN
DCA SCAN1 /RETURN SCAN LINE POINTER
TAD SCAN1 /RE-GET SCAN LINE POINTER
JMS I [SP] /FIND FIRST SPACE OR EOL
NOP /RETURN HERE ON EOL
TAD (-1 /BACK UP TO PREVIOUS CHAR
DCA SCAN2 /SET END ELEMENT POINTER
ISZ SCNEL /TAKE SUCCESS RETURN
JMP I SCNEL /DONE
/ ROUTINE TO SCAN THRU A TEXT LINE LOOKING FOR THE NEXT SPACE.
/ ENTER ROUTINE WITH THE LINE POINTER IN THE AC.
/ EXIT: RETURN + 2 WITH AC = POINTER TO SPACE.
/ RETURN + 1 WITH AC = POINTER TO END OF LINE.
SP, 0 /CHECK FOR A <SPACE> ROUTINE
DCA SCANTP /USE A TEMP POINTER
SKP /SKIP INTO LOOP BELOW
SP1, ISZ SCANTP /BUMP LINE POINTER
TAD I SCANTP /GET A CHAR
SPA /SKIP IF NOT END OF LINE
JMP SP3 /GOT AN END OF LINE
TAD [-" !200] /COMPARE WITH <SP> /034 CJL
SZA CLA /SKIP IF IS A SPACE
JMP SP1 /LOOP TILL SPACE OR EOL
ISZ SP /BUMP RETURN FOR SPACE FOUND
SP3, CLA CLL /INSURE A CLEAR AC
TAD SCANTP /GET POINTER VALUE
JMP I SP /RETURN IN AC
/ ROUTINE TO SCAN THRU A TEXT LINE FOR THE FIRST NON-SPACE.
/ ENTER ROUTINE WITH POINTER TO THE LINE IN THE AC.
/ EXIT: RETURN + 2 WITH AC = POINTER TO NON-SPACE.
/ RETURN + 1 WITH AC = POINTER TO END OF LINE.
NOSP, 0 /FIND A NON-<SPACE> ROUTINE
DCA SCANTP /USE A TEMP POINTER
SKP /SKIP INTO LOOP BELOW
NOSP1, ISZ SCANTP /BUMP THE LINE POINTER
TAD I SCANTP /GET A CHAR FROM THE LINE
SPA /SKIP IF NOT EOL
JMP NOSP3 /EXIT IF EOL
TAD [-" !200] /COMPARE WITH <SP> /034 CJL
SNA CLA /SKIP IF NOT SPACE
JMP NOSP1 /LOOP TILL SPACE OR EOL
ISZ NOSP /BUMP RETURN FOR SPACE FOUND
NOSP3, CLA CLL /INSURE CLEAR AC
TAD SCANTP /GET POINTER
JMP I NOSP /RETURN IN AC
/ ROUTINE TO FIND AN END CHAR IN A STRING.
/ ENTER ROUTINE WITH POINTER TO THE STRING IN THE AC.
/ EXIT WITH THE POINTER TO THE FIRST MINUS CHAR IN THE AC.
FNDEND, 0 /FIND END CHAR ROUTINE
DCA SCANTP /PUT POINTER IN SCANTP
FEND1, TAD I SCANTP /GET A CHAR FROM THE STRING
SPA CLA /SKIP IF NOT END
JMP FEND2 /EXIT IF END OF STRING
ISZ SCANTP /BUMP THE POINTER
JMP FEND1 /LOOP TILL NON-END OF STRING
FEND2, TAD SCANTP /GET POINTER TO NON-END OF STRING
JMP I FNDEND /EXIT WITH POINTER IN AC
SCANTP, 0 /USED IN THE SCAN ROUTINES "SP", "NOSP", "FNDNUL"
/ ROUTINE TO LOOKUP THE KEY WORD POINTED TO BY THE AC IN THE /014 CJL
/ TABLE POINTED TO BY PTABLE.
/ RETURN + 1 IF NO MATCH IS FOUND WITH AC = ENTRY VALUE.
/ RETURN + 2 IF NO KEYWORD IS FOUND (EOL DETECTED).
/ RETURN + 3 IF MATCH IS FOUND WITH THE NEXT PARSE POSITION IN THE LINE IN
/ THE AC AND THE DISPATCH ADDRESS FROM THE TABLE IN "KEYDSP".
KEYPRS, .-. /KEYWORD PARSE ROUTINE
DCA LOOK3 /SAVE IN CASE OF FAIL
TAD LOOK3 /RE-GET
/ AND (137) /MAKE CHARACTER UPPER-CASE, NO PARITY /MD013
JMS SCNEL /TRY TO SCAN OFF A KEYWORD
JMP KP45 /END OF LINE ENCOUNTERED
TAD PTABLE /GET ADDRESS OF TABLE
DCA LOOK2 /STORE IN LOCAL POINTER
KP10, TAD SCAN1 /GET ADDRESS OF SCAN ELEMENT
DCA LOOK1 /INTO LOCAL POINTER
KP20, TAD I LOOK1 /GET A CHARACTER FROM THE SCAN ELEMENT
CIA /NEGATE FOR COMPARE
TAD I LOOK2 /GET A CHAR FROM THE TABLE ELEMENT
SZA CLA /SKIP IF MATCH
JMP KP90 /NO MATCH, SET TO LOOK AT NEXT TABLE ENTRY
TAD LOOK1 /CHECK IF ALL ENTERED CHARS MATCH
CIA /NEGATE TO COMPARE
TAD SCAN2 /HAVE WE MATCHED TO THE TERMINATOR?
SNA CLA /SKIP IF NO
JMP KP40 /YES, GOT ENOUGH TO MATCH
ISZ LOOK1 /MORE TO MATCH, BUMP SCAN ELEMENT POINTER
ISZ LOOK2 /BUMP TABLE ELEMENT POINTER
JMP KP20 /CONTINUE MATCH LOOP
KP40, TAD LOOK2 /GET CURRENT TABLE POINTER
JMS FNDEND /FIND A NULL MARK
IAC /BUMP BY 1
DCA LOOK1 /STORE IN A POINTER
TAD I LOOK1 /GET DISPATCH ADDRESS
DCA KEYDSP /PUT INTO DISPATCH ADDRESS
ISZ KEYPRS /BUMP RETURN
ISZ KEYPRS /BUMP AGAIN
CLA CLL IAC /AC = 1
TAD SCAN2 /GET POINTER TO END OF CURRENT KEY
JMP I KEYPRS /RETURN
/ END OF LINE ENCOUNTERED ON PARSE.
KP45, ISZ KEYPRS /BUMP RETURN ONCE FOR EOL
/ NO MATCHES IN THE TABLE HERE.
KP50, TAD LOOK3 /GET ORIGINAL AC
JMP I KEYPRS /RETURN
/ FAILURE ON CURRENT TABLE ENTRY, SET FOR NEXT ENTRY (IF THERE IS ONE) AND TRY
/ AGAIN.
KP90, TAD LOOK2 /GET TABLE POINTER
JMS FNDEND /FIND NEXT TABLE ENTRY
IAC;IAC /NEXT ENTRY IS 2 PAST THE NULL
DCA LOOK2 /RE-SET LOCAL TABLE POINTER
TAD I LOOK2 /CHECK END OF TABLE
SNA CLA /SKIP IF NOT END OF THE TABLE
JMP KP50 /TAKE NOT FOUND EXIT
JMP KP10 /TRY MATCH ON THIS ENTRY
LOOK1, .-. /TEMPORARY FOR KEYPRS /014 CJL
LOOK2, .-. /TEMPORARY FOR KEYPRS /014 CJL
LOOK3, .-. /TEMPORARY FOR KEYPRS /014 CJL
/ ROUTINE TO MOVE WORDS OF MEMORY. /014 CJL
/ CALLING SEQUENCE:
/ TAD (DESTINATION) /GET DESTINATION ADDRESS
/ DCA MQ /INTO MQ /032 CJL
/ TAD (-COUNT) /GET -NUMBER OF WORDS TO MOVE
/ DCA MOVE4 /SETUP MOVE COUNTER
/ TAD (SOURCE) /GET SOURCE ADDRESS
/ JMS I (MOVE0) /CALL MOVE ROUTINE
/ RETURN /RETURNS HERE
MOVE0, .-. /MOVE ROUTINE /014 CJL
DCA MOVE5 /STORE SOURCE ADDRESS IN LOCAL POINTER
TAD MQ /GET DESTINATION ADDRESS /032 CJL
DCA MOVE6 /STORE IN LOCAL POINTER
MOVE1, TAD I MOVE5 /GET A WORD FROM THE SOURCE
DCA I MOVE6 /MOVE TO DESTINATION
ISZ MOVE5 /BUMP SOURCE POINTER
ISZ MOVE6 /BUMP DESTINATION COUNTER
ISZ MOVE4 /BUMP COUNTER
JMP MOVE1 /LOOP
JMP I MOVE0 /DONE
MOVE5, .-. /SOURCE POINTER FOR "MOVE"
MOVE6, .-. /DESTINATION POINTER FOR "MOVE"
PAGE /014 CJL
/ ROUTINE TO PARSE OFF A DEVICE NAME FROM THE COMMAND LINE. /O14 CJL
/ CALLING SEQUENCE:
/ TAD (POINTER) /AC CONTAINS POINTER TO COMMAND LINE
/ JMS I [DPARS] /CALL ROUTINE
/ ERROR RETURN /AC UNCHANGED
/ GOOD RETURN /AC NOW POINTS TO REST OF LINE
/ DEVNUM= DEVICE NUMBER TO USE.
/ ":" IS THE FIFTH CHARACTER IF NOT USING DEFAULT DEVICE.
DPARS, .-. /DEVICE PARSE ROUTINE /014 CJL
DCA DPAR10 /SAVE INITIAL POINTER TO LINE
TAD DPAR10 /GET POINTER
JMS I [NOSP] /GET PAST ANY LEADING SPACES
JMP DFDEV /GOT END OF LINE, USE DEFAULT DEVICE
DCA DPAR11 /SAVE POINTER TO LINE
DCA DEVNAME /INITIALIZE THE DEVICE NAME /014 CJL
DCA DEVNAME+1 /FOR "INQUIRE" FUNCTION /014 CJL
TAD (DEVNAM) /GET ADDRESS OF WHERE TO PUT DEVICE NAME/014 CJL
DCA PACK6P /STORE IN PACK6 POINTER
DCA PACK6F /INITIALIZE PACK6 FLAG FOR LOW BYTE /014 CJL
TAD (-4) /SET UP A COUNTER /014 CJL
DCA DPAR13 /FOR NO MORE THAN 4 CHARS
DPAR1, TAD I DPAR11 /GET A CHAR FROM THE LINE
SNA /SKIP IF NOT <EOL> /014 CJL
JMP DFDEV /GOT AN <EOL>, USE DEFAULT DEVICE /014 CJL
TAD (-":!200) /CHECK FOR ":" /034 CJL
SNA CLA /SKIP IF NOT END OF DEVICE NAME
JMP DPAR2 /DEVICE NAME SET UP
TAD I DPAR11 /RE-GET CHAR
ISZ DPAR11 /BUMP LINE POINTER
PACK6 /PACK SIX-BIT /014 CJL
ISZ DPAR13 /BUMP CHARACTER COUNTER /014 CJL
JMP DPAR1 /CAN CONTINUE
TAD I DPAR11 /GET CHARACTER AFTER THE FOURTH /014 CJL
TAD (-":!200) /CHECK FOR ":" /034 CJL
SZA CLA /SKIP IF YES, ALL IS OK
JMP DFDEV /USE THE DEFAULT DEVICE
DPAR2, ISZ DPAR11 /BUMP POINTER PAST ":"
TAD (DEVNAM) /GET PARSED DEVICE NAME ADDRESS /014 CJL
JMP DPAR4 /DO AN OS/8 "INQUIRE"
DFDEV, CLA CLL /CLEAN UP /019 CJL
TAD DPAR10 /GET ORIGINAL AC FOR
DCA DPAR11 /RETURN POINTER
DPAR4, JMS DVNUM /GET DEVICE NUMBER
JMP DPAR8 /DEVICE NAME ERROR
DCA DEVNUM /RETURN FOR CALLING PROGRAM
TAD DPAR11 /GET CURRENT POINTER
ISZ DPARS /BUMP RETURN
JMP I DPARS /RETURN /014 CJL
DPAR8, CLA CLL /INSURE CLEAR AC
TAD DPAR10 /GET ORIGINAL AC
JMP I DPARS /TAKE ERROR EXIT
DPAR10, .-. /TEMPORARY FOR DPARS /014 CJL
DPAR11, .-. /TEMPORARY FOR DPARS /014 CJL
DPAR13, .-. /TEMPORARY FOR DPARS /014 CJL
DEFDEV, DEVICE DSK /DEFAULT DEVICE
DEVNAM, FILENAM ZZZZZZ.ZZ /DEFAULT FILENAME /014 CJL
/ ROUTINE TO RETURN A DEVICE NUMBER FOR A DEVICE NAME. /014 CJL
/ CALLING SEQUENCE:
/ TAD (ADDRESS) /AC=ADDRESS OF DEVICE NAME
/ /*OR* 0000 IF "DSK:" IS TO BE USED
/ ERROR RETURN /INVALID DEVICE
/ GOOD RETURN /AC=DEVICE NUMBER
DVNUM, .-. /DEVICE NUMBER ROUTINE /014 CJL
SNA /SKIP IF DEVICE NAME SPECIFIED
TAD (DEFDEV) /ELSE USE DEFAULT /014 CJL
DCA DVNUM9 /SAVE IN LOCAL POINTER
TAD I DVNUM9 /GET FIRST TWO CHARACTERS OF NAME /014 CJL
DCA DVNUM5 /PUT INTO CALL
ISZ DVNUM9 /BUMP POINTER
TAD I DVNUM9 /GET LAST TWO CHARACTERS OF NAME /014 CJL
DCA DVNUM5+1 /PUT INTO CALL
CIF USRFLD /GOTO USR FIELD /020 CJL
JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
INQUIRE /INQUIRE ABOUT HANDLER /020 CJL
DVNUM5, .-. /FIRST TWO BYTES OF DEVICE NAME /014 CJL
.-. /LAST TWO BYTES OF DEVICE NAME /014 CJL
0 /ENTRY POINT OF HANDLER RETURNED HERE
JMP I DVNUM /ERROR, TAKE ERROR EXIT
TAD DVNUM5+1 /DEVICE NUMBER
ISZ DVNUM /BUMP RETURN FOR NO ERROR
JMP I DVNUM /RETURN
DVNUM9, .-. /LOCAL FOR "DVNUM" /014 CJL
/ DEVICE HANDLER FETCH ROUTINE. /020 CJL
/ CALLING SEQUENCE:
/ TAD (HANDLERNUMBER) /AC CONTAINS DEVICE HANDLER NUMBER
/ JMS I [HFETCH] /CALL ROUTINE
/ ERROR RETURN /COULDN'T LOAD HANDLER
/ GOOD RETURN /HANDLER LOADED
/ IF THE HANDLER WAS LOADED, THEN HNDADR CONTAINS THE HANDLER ENTRY POINT.
HFETCH, .-. /HANDLER FETCH ROUTINE
DCA HANDNUMBER /STORE HANDLER NUMBER
TAD (HNDLR+1) /GET OUR BUFFER+(TWO PAGE ALLOWED)
DCA HADR /STORE IN-LINE
TAD HANDNUMBER /GET HANDLER NUMBER AGAIN
CIF USRFLD /GOTO USR FIELD
JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
FETCH /FETCH HANDLER
HADR, .-. /WILL BE OUR SUGGESTED ADDRESS+TWO PAGES ALLOWED
SKP /COULDN'T DO IT
ISZ HFETCH /BUMP TO GOOD RETURN
CLA CLL /CLEAN UP
TAD HADR /GET ACTUAL HANDLER ADDRESS
DCA HNDADR /STASH THE POINTER
JMP I HFETCH /RETURN EITHER WAY
HANDNUM,.-. /HANDLER NUMBER TEMPORARY
/ ROUTINE TO HANDLE THE "FINISH" COMMAND. /021 CJL
FINSRV, 0
JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
TAD (MSEND) /GET SEND MODE VALUE /045 CJL
DCA KMODE /SETUP PROPER MODE /045 CJL
FPACK /FORMAT A PACKET
SRVFIN /PACKET DATA ADDRESS
STGEN /PACKET TYPE
FIN2, SPACK /SEND PACKET
1 /AWAIT RESPONSE
FIN20-2 /DISPATCH LIST FOR RESPONSE /027 CJL
/ NAK OR UNDEFINED RESPONSE HERE
FIN5, ISZ RTRYC /BUMP RE-TRY COUNTER
JMP FIN2 /GET RESPONSE AND TRY AGAIN
TAD (NOFINISH) /FAILED, RETURN MESSAGE /025 CJL
JMP I FINSRV
/ ACK HERE
FIN10, ISZ FINSRV /BUMP FOR NON-ERROR EXIT
JMP I FINSRV /DONE
FIN20, STACK; FIN10 /ACK
STNAK; FIN5 /NAK
0
SRVFIN, "F&137 /SERVER KERMIT COMMAND TO SHUT DOWN
-1 /END OF DATA
PAGE
/ ROUTINE TO PARSE OFF A FILE NAME.
/ FILE NAME TO BE PARSED MUST BE LETTERS OR DIGITS AND BE NO MORE THAN
/ SIX CHARS FOR THE NAME AND TWO CHARS FOR THE EXTENSION.
/ ENTER WITH: AC = POINTER TO FILE NAME TO PARSE.
/ FNPTR = POINTER TO WHERE TO PUT THE PARSED FILE NAME.
/ NON-ERROR EXIT: AC = POINTER TO REMAINDER OF COMMAND LINE.
/ RETURN THE CALL + 2.
/ ERROR EXIT: AC = ORIGINAL POINTER.
/ RETURN THE CALL + 1.
PFNAM, 0
DCA PFN10 /SAVE POINTER TO FILE NAME STRING
TAD FNPTR /GET POINTER TO FILE NAME BLOCK
DCA MQ /SET FOR "CLEAR" ROUTINE /032 CJL
TAD (-4 /FOUR WORDS TO CLEAR OUT
CLEAR /INIT THE FILE NAME BLOCK
TAD PFN10 /GET THE STRING POINTER
JMS I [NOSP] /GET PAST ANY LEADING SPACES
JMP PFNAM9 /GOT EOL, NO FILE NAME
DCA PFN11 /SAVE POINTER
TAD FNPTR /GET FILE NAME BLOCK POINTER
DCA PACK6P /SET UP THE "PACK6" POINTER
DCA PACK6F /INIT THE "PACK6" FLAG
TAD (-6 /MAX OF 6 CHARS FOR FILE NAME
DCA PFN15 /PUT INTO COUNTER
DCA WILDF /INIT THE WILD CARD FLAG
JMS NAM /MOVE AND PACK FILE NAME
TAD I PFN11 /GET THE TERM CHAR
SPA /SKIP IF NOT EOL
JMP PFNAM7 /EOL MEANS END OF FILE NAME
TAD (-".!200) /COMPARE TO "." /034 CJL
SNA /SKIP IF NO
JMP PFNAM3 /GO HANDLE EXTENSION
TAD (-" +".) /COMPARE TO <SP> /034 CJL
SZA CLA /SKIP IF WAS A SPACE
JMP PFNAM9 /NOT A SPACE, GOT AN ERROR
JMP PFNAM7 /IS A SPACE, END OF FILE NAME
PFNAM3, ISZ PFN11 /BUMP PAST THE "."
TAD FNPTR /GET FILE NAME BLOCK POINTER
TAD (3) /POINT TO EXTENSION /032 CJL
DCA PACK6P /SET "PACK6" POINTER
DCA PACK6F /INIT "PACK6" FLAG
NL7776 /SET -2 /032 CJL
DCA PFN15 /COUNTER FOR 2 EXT CHARS
JMS NAM /NOW DO THE EXTENSION
TAD I PFN11 /GET THE TERM CHAR
SPA /SKIP IF NOT EOL
JMP PFNAM7 /GOT COMPLETE FILE NAME HERE
TAD [-" !200] /COMPARE TO <SP> /034 CJL
SZA CLA /SKIP IF IT WAS
JMP PFNAM9 /GOT A FILE NAME ERROR
PFNAM7, ISZ PFNAM /BUMP RETURN FOR GOOD FILE NAME
CLA CLL /INSURE CLEAR AC
TAD PFN11 /GET CURRENT STRING POINTER
JMP I PFNAM /AND RETURN
PFNAM9, CLA CLL /INSURE CLEAR AC
TAD PFN10 /GET ORIGINAL STRING POINTER
JMP I PFNAM /TAKE ERROR RETURN
PFN10, 0 /TEMP FOR PFNAM ROUTINE
PFN11, 0 /TEMP FOR PFNAM ROUTINE
PFN15, 0 /TEMP FOR PFNAM ROUTINE
/ LOCAL ROUTINE TO "PFNAM" TO MOVE IN THE FILE NAME OR FILE EXTENSION.
/ ENTER WITH "PFN11" POINTING TO WHERE TO GET THE NAME OR EXTENSION.
/ AND "PFN15" EQUAL TO THE MAX NUMBER OF CHARS (6 FOR NAME, 2 FOR EXT).
/ THIS ROUTINE CHECKS FOR WILD CARD CHARS "*" AND "?" AND PUTS THE
/ "?" CHAR IN FOR ANY CHARS IN THE NAME THAT ARE WILD. ALSO IF ANY
/ WILD CARD CHARS ARE FOUND THE FLAG "WILDC" IS SET SO BEFORE PARSING
/ ANY FILE NAME THE "WILDC" FLAG SHOULD BE INITIALIZED.
NAM, 0
NAM0, TAD I PFN11 /GET A CHAR FROM THE STRING
JMS I (ALPNUM) /MUST BE ALPHA OR NUMBER
SKP /NOT A ALPHA NUMERIC
JMP NAM3 /IS ALPHA NUMERIC
TAD (-"?!200) /COMPARE TO "?" /034 CJL
SNA /SKIP IF NO
JMP NAM2 /YES, JUST PUT IT IN
TAD (-"*+"?) /COMPARE TO "*" /034 CJL
SZA CLA /SKIP IF YES
JMP I NAM /TAKE THE FILE NAME ERROR EXIT
ISZ WILDF /SET FLAG FOR WILD CARD FOUND
NAM1, TAD ["?&77] /GET WILD CARD CHARACTER /034 CJL
PACK6 /PUT IN NAME BLOCK
ISZ PFN15 /BUMP CHAR COUNTER
JMP NAM1 /LOOP TILL ALL FILLED
ISZ PFN11 /BUMP THE STRING POINTER
JMP NAM9 /EXIT WITH "PFN11" POINTING TO NEXT CHAR
NAM2, ISZ WILDF /SET FLAG FOR WILD CARD FOUND
TAD ["?&77] /GET WILD CARD CHARACTER /034 CJL
NAM3, PACK6 /PUT THE CHAR INTO THE FILE NAME BLOCK
ISZ PFN11 /BUMP THE STRING POINTER
ISZ PFN15 /BUMP THE CHAR COUNTER
JMP NAM0 /LOOP
NAM4, TAD I PFN11 /NOW GET TO A TERMINATOR CHAR
JMS I (ALPNUM) /BY FINDING FIRST NON-ALPHNUMERIC
JMP NAM9 /NOW WE CAN QUIT
CLA CLL /IGNORE EXCESS CHARS
ISZ PFN11 /BUMP THE STRING POINTER
JMP NAM4 /LOOP
NAM9, CLA CLL /LEAVE WITH A CLEAR AC
JMP I NAM /RETURN
/ ROUTINE TO SEND A PACKET.
/ ENTER WITH ADDRESS OF PACKET DATA IN CALL + 1.
/ AND TYPE OF PACKET IN CALL + 2.
/ EXIT CALL + 4 IF ACK RETURNED.
/ EXIT CALL + 3 IF NAK OR OTHER PACKET TYPE RETURNED.
SNDP, 0
TAD I SNDP /GET DATA ADDRESS
DCA SNDP1 /STORE IN CALL
ISZ SNDP /BUMP POINTER
TAD I SNDP /GET PACKET TYPE
DCA SNDP2 /STORE IN CALL
ISZ SNDP /BUMP
FPACK /FORMAT A PACKET
SNDP1, 0 /DATA ADDRESS GOES HERE
SNDP2, 0 /PACKET TYPE GOES HERE
SNDP3, SPACK /SEND A DATA PACKET
1 /GET RESPONSE
SNDP9-2 /RESPONSE DISPATCH TABLE ADDRESS /027 CJL
/ HERE ON NOT "NAK" OR "ACK" RESPONSE.
SKP
/ HERE ON "ACK".
SNDP5, ISZ SNDP /BUMP RETURN
ISZ SNDP /BUMP RETURN
JMP I SNDP /EXIT
/ HERE ON NAK.
SNDP4, ISZ RTRYC /BUMP THE RE-TRY COUNTER
JMP SNDP3 /RE-TRY
JMP I SNDP /TAKE RETURN + 3
SNDP9, STACK; SNDP5 /ACK
STACK; SNDP4 /NAK
0
PAGE /014 CJL
IFZERO 1 <
/ ROUTINE TO PARSE OFF A DECIMAL NUMBER.
/ ENTER ROUTINE WITH A POINTER TO THE PARSE LINE IN THE AC.
/ EXIT: RETURN + 1 FOR NO NUMBER.
/ RETURN + 2 FOR INVALID NUMBER.
/ RETURN + 3 FOR VALID NUMBER.
/ IN ALL CASES ON RETURN THE AC WILL CONTAIN A POINTER TO THE NEXT CHAR TO PARSE
/ IN THE LINE. ANY NUMBER PARSED WILL BE CONVERTED TO BINARY AND PUT INTO THE
/ REGISTER "BININP".
DECPRS, 0
JMS I [NOSP] /GET PAST ANY LEADING SPACES
JMP I DECPRS /GOT AN END OF LINE, AC POINTS TO IT
DCA DP10 /SAVE POINTER TO LINE
TAD DP10 /RE-GET POINTER TO LINE
DCA DP11 /STORE IN OUR LINE POINTER
DCA BININP /INIT BINARY REGISTER
DCA DP13 /INIT PARSED NUMBER FLAG
SKP /SKIP INTO LOOP BELOW
DP1, ISZ DP11 /BUMP THE LINE POINTER
TAD I DP11 /GET A CHAR FROM THE LINE
JMS DECCK /CHECK FOR PROPER ASCII DECIMAL
JMP DP5 /NOT PROPER ASCII DECIMAL
ISZ DP13 /FLAG NUMBER INPUT
TAD (-"0 /MAKE BINARY
DCA DP12 /AND STORE
TAD BININP /GET PREVIOUS INPUT
JMS MUL10 /AND MULTIPLY TIMES 10
SZL /SKIP IF NO OVERFLOW ENCOUNTERED
JMP DP6 /GOT AN OVERFLOW ERROR
TAD DP12 /COMBINE WITH CURRENT INPUT
SZL /SKIP IF NO OVERFLOW ERROR
JMP DP6 /GOT AN OVERFLOW ERROR
DCA BININP /RETURN ACCUMULATED SUM
JMP DP1 /LOOP
DP5, CLA CLL /AC MAY NOT BE CLEAR
TAD DP13 /ANY NUMBERS INPUT YET?
SNA CLA /SKIP IF YES
JMP DP6 /TAKE THE NO NUMBER INPUT RETURN
ISZ DECPRS /BUMP THE RETURN
ISZ DECPRS /TWICE FOR GOOD NUMBER INPUT RETURN
TAD DP11 /GET POINTER TO LINE
JMP I DECPRS /AND RETURN
DP6, CLA CLL /AC MAY NOT BE CLEAR
TAD DP10 /GET ORIGINAL LINE POINTER
ISZ DECPRS /BUMP THE RETURN
JMP I DECPRS /TAKE THE INVALID NUMBER RETURN
>
IFZERO 1 <
DP10, 0 /TEMP FOR DECPRS
DP11, 0 /TEMP FOR DECPRS
DP12, 0 /TEMP FOR DECPRS
DP13, 0 /TEMP FOR DECPRS
/ ROUTINE TO MULTIPLY THE VALUE OF THE AC TIMES 10.
/ VALUE IN THE AC IS ASSUMED BINARY.
/ THE NUMBER IS RETURNED IN THE AC. IF THE LINK IS SET THE MULTIPLY
/ OVERFLOWED 12 BITS.
MUL10, 0
DCA MULTMP /SAVE THE NUMBER
TAD MULTMP /GET THE NUMBER BACK
CLL RTL /MULTIPLY TIMES 4
TAD MULTMP /TIMES 5
SNL /SKIP IF ALREADY OVERFLOWED /025 CJL
RAL /TIMES 10
JMP I MUL10 /RETURN NUMBER IN AC
/THE LINK HAS ANY OVERFLOW
MULTMP, 0 /TEMP STORAGE FOR MUL10 ROUTINE
/ ROUTINE TO CHECK FOR A VALID ASCII DECIMAL VALUE.
/ ENTER WITH ASCII CHAR IN THE AC.
/ EXIT RETURN + 1 IF NON-VALID ASCII DECIMAL WITH CHAR IN AC.
/ EXIT RETURN + 2 IF VALID ASCII DECIMAL WITH CHAR IN AC.
DECCK, 0
DCA DECCK5 /STORE THE CHAR TO CHECK
TAD DECCK5 /GET THE CHAR
TAD (-"0 /CHECK FOR LESS THAN 0
SPA /SKIP IF NOT LESS THAN 0
JMP DECCK1 /NON-ASCII DECIMAL
TAD ("0-"9-1 /CHECK GREATER THAN 9
SMA CLA /SKIP IF LE 9
JMP DECCK1 /INVALID ASCII DECIMAL
ISZ DECCK /BUMP RETURN FOR VALID ASCII DECIMAL
DECCK1, TAD DECCK5 /RE-GET ORIGINAL CHAR IN AC
JMP I DECCK /RETURN
DECCK5, 0 /TEMP FOR "DECCK" ROUTINE
>
/ ROUTINE TO INPUT A COMMAND LINE FROM THE KEYBOARD. /013/014 CJL
LININP, 0
TAD (LINBUF /GET ADDRESS OF LINE BUFFER
DCA LIN50 /STORE IN A POINTER
LIN1, JMS I (INPUT) /GET A CHARACTER FROM THE KEYBOARD /044 CJL
TAD (-CNTRLM) /COMPARE TO <CR> /034 CJL
SNA /SKIP IF NOT A RETURN
JMP LIN2 /LINE IS INPUT
TAD (-DELETE+CNTRLM)/COMPARE TO <DEL> /034 CJL
SNA CLA /SKIP IF NOT A DELETE
JMP LIN5 /OFF TO HANDLE A DELETE
TAD LIN50 /GET VALUE OF LINE POINTER
TAD (-LINBUF-LINSIZ /COMPARE WITH END OF LINE BUFFER
SMA CLA /SKIP IF ROOM IN LINE BUFFER
JMP LIN10 /BEEP FOR FULL BUFFER
TAD INCHAR /GET THE KEYBOARD CHARACTER AGAIN /044 CJL
TAD (-140) /COMPARE TO LOWER-CASE LIMIT /034 CJL
SMA /SKIP IF BELOW LIMIT /034 CJL
TAD [-40] /ELSE MAKE IT UPPER-CASE /034 CJL
TAD (140) /RESTORE THE CHARACTER /034 CJL
DCA I LIN50 /STORE IN THE LINE BUFFER
ISZ LIN50 /BUMP THE LINE BUFFER POINTER
NL7777 /SET -1 /032 CJL
DCA I LIN50 /TERMINATE THE LINE
TAD INCHAR /GET THE LATEST KEYBOARD CHARACTER BACK /044 CJL
JMS I [P7ECHO] /PRINT IT /043 CJL
JMP LIN1 /LOOP TILL A RETURN TYPED
LIN2, NL7777 /SET -1 /032 CJL
DCA I LIN50 /INSURE STRING TERMINATED
JMS I [SCRIBE] /DO A /025 CJL
CRLF /<CR>, <LF> /025 CJL
JMP I LININP /DONE
/ HANDLE A DELETE TYPED IN
LIN5, TAD LIN50 /FIND OUT FIRST IF...
TAD (-LINBUF /WE ARE AT THE BEGINNING OF THE LINE
SNA CLA /SKIP IF NO
JMP LIN1 /JUST IGNORE THE DELETE
NL7777 /SET -1 /032 CJL
TAD LIN50 /GET THE LINE POINTER
DCA LIN50 /RETURN BACKED UP
DCA I LIN50 /ZERO THE CHAR
TAD (CNTRLH) /GET A <BS> /025 CJL
JMS I [P7ECHO] /PRINT IT /043 CJL
TAD [" &177] /GET A <SPACE> /025 CJL
JMS I [P7ECHO] /PRINT IT /043 CJL
TAD (CNTRLH) /GET A <BS> /025 CJL
JMS I [P7ECHO] /PRINT IT /043 CJL
JMP LIN1 /BACK TO INPUT
/ HANDLE FULL LINE BUFFER HERE
LIN10, CLA CLL /ENSURE CLEAR AC
TAD [CNTRLG] /GET A <BEL> CHARACTER /025 CJL
JMS I [P7ECHO] /PRINT IT /043 CJL
JMP LIN1 /WAIT FOR EITHER RETURN OF DELETE KEY
LIN50, 0 /TEMP POINTER FOR "LININP" ROUTINE
/ ROUTINE TO PACK TWO SIX-BIT CHARACTERS INTO A WORD. /032 CJL
/ CALLING SEQUENCE:
/ [PACK6PTR => CHARACTER PACKING AREA].
/ [PACK6FLAG=0 IF PACKING INTO HIGH-ORDER BYTE.
/ PACK6FLAG=4000 IF PACKING INTO LOW-ORDER BYTE].
/ TAD CHAR /AC CONTAINS CHARACTER TO BE PACKED
/ PACK6 /CALL VIA PAGE ZERO POINTER
/ RETURNS WITH AC CLEAR AND PACK6PTR AND PACK6FLAG UPDATED FOR NEXT PACKING.
PACK60, .-. /PACK SIX-BIT ROUTINE
AND [77] /JUST SIX-BIT
DCA PACK6TEMP /SAVE FOR NOW
NL4000 /SET INVERSION BIT
TAD PACK6FLAG /REVERSE THE FLAG
DCA PACK6FLAG /STORE BACK
SZL /WAS IT CLEAR?
JMP PACKIT /NO, GO DO LOW-ORDER
TAD PACK6TEMP /GET THE CHARACTER
RTL;RTL;RTL /MOVE UP
DCA I PACK6PTR /STORE IT
JMP I PACK60 /RETURN
PACKIT, TAD I PACK6PTR /GET PREVIOUS HIGH-ORDER HALFWORD
TAD PACK6TEMP /ADD ON LATEST
DCA I PACK6PTR /STORE BOTH
ISZ PACK6PTR /BUMP FOR NEXT TIME
JMP I PACK60 /RETURN
PACK6TE,.-. /PACK6 TEMPORARY
/ ROUTINE TO COMPARE TWO FILE NAMES FOR EQUALITY.
/ THE ROUTINE WILL CHECK EACH OF THE 8 FILE NAME CHARS AND IF A
/ CHAR IN THE FIRST FILE NAME (THE ONE WE ARE LOOKING FOR) CONTAINS
/ A "?" IT WILL MATCH ON THE SECOND FILE NAME CHAR.
/ ENTER WITH "FCMP1" POINTING TO THE FILE NAME TO FIND, AND "FCMP2"
/ POINTING TO THE FILE NAME TO TRY AND MATCH. EXIT + 1 IF NO MATCH
/ AND EXIT + 2 IF MATCH. (IF NON-ZERO AC ON ENTRY, THE AC IS ASSUMED
/ TO HAVE THE VALUE FOR "FCMP2".)
FMATCH, 0
SZA /SKIP IF NO ARGUMENT IN AC
DCA FCMP2 /THIS ARGUMENT CAME IN THE AC
TAD FCMP1 /GET ADDRESS OF FIRST FILE NAME BLOCK
DCA GET6P /STORE IN A POINTER
DCA GET6F /INIT FLAG FOR "GET6" ROUTINE
TAD FCMP2 /GET ADDRESS OF SECOND FILE NAME BLOCK
DCA FMATP /STORE IN A LOCAL POINTER
DCA FMATF /INIT LOCAL FLAG
TAD (-10 /8 CHARS TO DO
DCA FMATC /STORE IN LOCAL COUNTER
FMAT1, NL4000 /SET 4000 /032 CJL
TAD FMATF /GET FLAG
DCA FMATF /RETURN FLAG, LINK CONTAINS STATUS
TAD I FMATP /GET A WORD FROM THE SECOND NAME
SZL /SKIP IF HIGH-ORDER WANTED NOW /032 CJL
JMP FSWIT /JUMP IF LOW-ORDER WANTED NOW /032 CJL
RTR;RTR;RTR /MOVE DOWN HIGH-ORDER /032 CJL
SKP /DON'T BUMP YET /032 CJL
FSWIT, ISZ FMATP /BUMP THE POINTER /032 CJL
AND [77] /KEEP ONLY BOTTOM 6 BITS /016 CJL
DCA FMATT /STORE IN A TEMP
GET6 /NOW GET A CHAR FROM FIRST NAME
TAD (-77 /CHECK IF WILD
SNA /SKIP IF NO
JMP FMAT2 /NO MATCH CHECK ON A WILD CARD
TAD [77] /RESTORE THE CHARACTER /014/016 CJL
CIA /NEGATE FOR COMPARE
TAD FMATT /COMPARE WITH SECOND FILE NAME
SZA CLA /SKIP IF IS A MATCH
JMP I FMATCH /THIS IS NOT A MATCH
FMAT2, ISZ FMATC /BUMP COUNTER
JMP FMAT1 /LOOP, MORE TO CHECK
ISZ FMATCH /BUMP RETURN FOR MATCH
JMP I FMATCH /GOT A MATCH
FMATP, 0 /POINTER FOR "FMATCH"
FMATC, 0 /COUNTER FOR "FMATCH"
FMATF, 0 /FLAG FOR "FMATCH"
FMATT, 0 /TEMP FOR "FMATCH"
FCMP1, 0 /POINTER FOR FIRST FILE NAME BLOCK
FCMP2, 0 /POINTER FOR SECOND FILE NAME BLOCK
PAGE /014 CJL
/ REMOTE LINK INPUT ROUTINE.
/ CALL = RPACK.
ILINK, 0
TAD RETRY /SET UP A RE-TRY COUNT
DCA ILINK6 /RE-TRY COUNT FOR INPUT ERRORS
ILINK0, JMS I (GETSOH) /FIRST GET THE "SOH" BYTE
JMP ILINK2 /RETURN HERE ON TIME-OUT
DCA ILINK9 /INIT CHECKSUM REGISTER
TAD [RRLEN] /GET REMOTE RECEIVE BUFFER ADDRESS
DCA ILINK8 /STORE IN LOCAL POINTER
JMS I (GETIR) /GET A CHAR
JMP ILINK2 /GOT A RETURN OR TIME-OUT
DCA I ILINK8 /STORE LENGTH IN BUFFER
TAD I ILINK8 /GET LENGTH CHAR BACK
TAD (-40-1 /CHAR FUNCTION - LENGTH BYTE
CIA /NEGATE FOR COUNTER
DCA ILINK7 /STORE IN LOCAL COUNTER
ILINK1, ISZ ILINK8 /BUMP POINTER
JMS I (GETIR) /GET NEXT CHAR
JMP ILINK2 /GOT A RETURN
DCA I ILINK8 /STORE IN BUFFER
ISZ ILINK7 /BUMP COUNTER
JMP ILINK1 /LOOP
ISZ ILINK8
NL7777 /SET -1 /032 CJL
DCA I ILINK8
TAD ILINK9 /GET CALCULATED CHECKSUM
JMS I [CKSUM] /CALCULATE 1 BYTE CHECKSUM
CIA /NEGATE FOR COMPARE
DCA ILINK7 /STORE TEMP
JMS I (GETIR) /NOW GET CHECKSUM
JMP ILINK2 /GOT A RETURN
TAD ILINK7 /COMPARE WITH CALCULATED CHECKSUM
SNA CLA /SKIP IF NOT SAME
JMP ILINK4 /ARE SAME
ILINK2, CLA CLL /INSURE CLEAR AC
ISZ ILINK6 /BUMP RE-TRY COUNTER
JMP ILINK3 /CAN RE-TRY
TAD (RPERMSG) /GET MESSAGE FOR FATAL PACKET ERROR /025 CJL
JMP I [CLOOP7] /AND ABORT THE MESS
ILINK3, TAD ABFLAG /GET ABORT FLAG /044 CJL
SZA CLA /SKIP IF NO
JMP I (ABORT) /ABORT THIS
JMS I (SNDNAK) /SEND BACK A "NAK"
JMP ILINK0 /AND TRY AGAIN
ILINK4, TAD ABFLAG /GET ABORT FLAG /044 CJL
SNA CLA /SKIP IF YES
JMP I ILINK /NOPE, RETURN
JMP I (ABORT)
ILINK6, 0 /LOCAL TO "ILINK"
ILINK7, 0 /LOCAL TO "ILINK"
ILINK8, 0 /LOCAL TO "ILINK"
ILINK9, 0 /LOCAL TO "ILINK"
/ HELP COMMAND ROUTINE. /024 CJL
HELPSRV,.-. /HELP ROUTINE
JMS I [CRESET] /RESET CONSOLE ROUTINE STUFF
JMS I [SCRIBE] /GIVE THEM THE
HELPMSG /HELP MESSAGE
TAD ESCHAR /GET THE ESCAPE CHARACTER
JMS I [ESCPRNT] /PRINT IT
JMS I [SCRIBE] /DO A
CRLF /<CR>, <LF>
ISZ HELPSRV /BUMP PAST ERROR RETURN
JMP I HELPSRV /RETURN
/ ROUTINE TO PRINT THE DATA IN THE RECEIVED PACKET.
PRIPAK, 0
PRI8B; RRDTA /PRINT THE DATA
JMS I [SCRIBE] /DO A /025 CJL
CRLF /<CR>, <LF> /025 CJL
JMP I PRIPAK /DONE
PAGE /014 CJL
/ ROUTINE TO SERVICE A SEND REQUEST.
SNDSRV, 0
JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
TAD (MSEND) /FIRST SET MODE TO SEND
DCA KMODE /PUT INTO MODE FLAG
TAD LPTR /GET CURRENT LINE POINTER
DCA PRSERR /SAVE LINE POSITION
TAD PRSERR /GET LINE POSITION
JMS I [DPARS] /TRY TO PARSE OFF A DEVICE NAME
JMS SNDERROR /RETURN A DEVICE NAME ERROR /026 CJL
SER1, DCA PRSERR /SAVE LINE POINTER /026 CJL
TAD (FNBLK /GET FILE NAME BLOCK ADDRESS
DCA FNPTR /STORE IN POINTER
TAD PRSERR /GET STRING POINTER
JMS I [PFNAM] /PARSE OFF THE FILE NAME
JMS SNDERROR /FILE NAME PARSE ERROR /026 CJL
SER2, DCA PRSERR /SAVE THE STRING POINTER /026 CJL
TAD PRSERR /GET THE STRING POINTER
JMS I [NOSP] /FIND THE END OF STRING
SKP /GOT END OF STRING HERE
JMS SNDERROR /SYNTAX ERROR /026 CJL
SER3, DCA PRSERR /RETURN POINTER /026 CJL
TAD DEVNUM /GET THE DEVICE NUMBER PARSED
JMS I [HFETCH] /FETCH A HANDLER FOR THIS
JMS SNDERROR /HANDLER FETCH ERROR /026 CJL
SER4, DCA FILFND /INIT FILE FOUND FLAG
DCA INIFLG /CLEAR THE INIT DONE FLAG
NL0001 /INITIALIZE DIRECTORY /028 CJL
DCA SLFLAG /LOOKUP FLAG /028 CJL
SNDSV1, TAD (FNBLK /GET FILE NAME BLOCK ADDRESS
DCA I (FCMP1) /SET FOR FILE TO FINE
TAD SLFLAG /GET DIRECTORY FLAG /028 CJL
JMS I (LUKUP) /FIND A MATCH FOR THIS FILE
JMS SNDERROR /DIRECTORY I/O ERROR /026 CJL
SER5, JMP S00 /FILE NOT FOUND /026 CJL
ISZ FILFND /BUMP FILE FOUND COUNT
DCA SLFLAG /DON'T INITIALIZE LOOKUP AGAIN
JMS I (SNDPRO) /PROCESS THIS FILE FOR SEND
JMS SNDERROR /ERROR IN FILE SEND PROCESS /026 CJL
SER6, TAD WILDF /WAS WILD CARD FILE SPEC? /026 CJL
SZA CLA /SKIP IF NO
JMP SNDSV1 /GOT WILD CARD, TRY FOR NEXT
S00, TAD FILFND /CHECK FOR ANY FILES FOUND
SNA CLA /SKIP IF YES
JMS SNDERROR /RETURN FILE NOT FOUND ERROR /026 CJL
SER7, JMS BRKXMT /BREAK THE SEND /026 CJL
TAD PRSERR /GET CURRENT CURSOR POSITION
DCA LPTR /UPDATE
ISZ SNDSRV /BUMP RETURN
JMP I SNDSRV /AND DONE
/ SEND ERRORS COME HERE. /026 CJL
SNDERRO,.-. /SEND ERROR ROUTINE
CLA /CLEAN UP
TAD SNDERROR /GET CALLER
JMS I [SRCHTABLE] /GO MATCH IT
SNERTABLE-1-1 /IN ERROR TABLE
JMP I SNDSRV /TAKE ERROR EXIT WITH MESSAGE ADDRESS IN AC
/ SEND ERROR MESSAGE DISPATCH TABLE. /026 CJL
SNERTAB,-SER1; DNERMSG /DEVICE NAME ERROR
-SER2; FNERMSG /FILE NAME ERROR
-SER3; FSERMSG /FILE NAME SYNTAX ERROR
-SER4; SHFEMSG /HANDLER FETCH ERROR
-SER5; SDERMSG /DIRECTORY I/O ERROR
-SER6; SNDEMSG /SEND ERROR
-SER7; NOTFND /LOOKUP
0 /THIS ENDS THE LIST
FILFND, 0 /HOLDS COUNT OF # OF FILES FOUND
SLFLAG, .-. /LOOKUP INITIALIZE FLAG /028 CJL
FNBLK, 0
0
0
0
/ ROUTINE TO RE-SET THE SEND.
BRKXMT, .-.
CLA CLL /INSURE CLEAR AC
DCA INIFLG /CLEAR THE INIT SEND FLAG
FPACK /FORMAT A PACKET
NODATA /NO DATA FOR THIS PACKET
STEOT /"EOT" PACKET TYPE
SPACK /SEND THE PACKET
1 /READ RESPONSE /042 CJL
0 /DO NOT DISPATCH /042 CJL
JMP I BRKXMT /DONE
/ ROUTINE TO SEND OUT A NAK WITHOUT DISTURBING THE NORMAL PACKET BUFFER.
SNDNAK, 0
NL7777 /-1 /042 CJL
TAD CURSEQ /ADD ON CURRENT SEQUENCE NUMBER /042 CJL
AND [77] /MODULO 64 /042 CJL
TAD [40] /TAKE CHAR(SEQUENCE NUMBER) /042 CJL
DCA NAKPAK+2 /PUT IN NAK PACKET BUFFER
TAD NAKPAK+1 /GET LENGTH
TAD NAKPAK+2 /GET SEQ
TAD NAKPAK+3 /GET TYPE
JMS I [CKSUM] /CALCULATE CHECKSUM
DCA NAKPAK+4 /PUT IN CHECKSUM
TAD REOL /GET ANY EOL REQUIRED
TAD [-40] /UN-CHAR IT /014/016 CJL
SNA /SKIP IF USING
NL7777 /NO EOL, PUT IN -1 INSTEAD /032 CJL
DCA NAKPAK+5 /PUT EOL IN
REM8B; NAKPAK /SEND NAK TO REMOTE
JMP I SNDNAK /DONE
NAKPAK, CNTRLA /MARK /042 CJL
" &77+3 /LENGTH OF NAK PACKET /042 CJL
.-. /SEQUENCE NUMBER GOES HERE /042 CJL
STNAK /DATA TYPE
.-. /CHECKSUM /042 CJL
.-. /<EOL> IF USED /042 CJL
-1 /TERMINATE
/ FILENAME BUFFER. /014 CJL
NAMBUFF,ZBLOCK 12 /FILENAME.EXTENSION (WITH TERMINATOR) GOES HERE
PAGE /014 CJL
/ ROUTINE TO SERVICE A "GET" COMMAND.
GETSRV, 0
JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
TAD (MREC) /GET OUR MODE VALUE /045 CJL
DCA KMODE /SETUP NOW /045 CJL
TAD LPTR /GET CURRENT LINE POINTER
DCA PRSERR /SAVE
TAD PRSERR /RE-GET IT
JMS I [DPARS] /PARSE OFF THE DEVICE NAME /006/014 CJL
JMP GSRV50 /ERROR IN DEVICE NAME /006
JMS I [NOSP] /FIND BEGINNING OF A FILE NAME
JMP GSRV22 /GOT <EOL>, NO FILE NAME /006/014 CJL
DCA GSRV90 /STORE BEGINNING ADDRESS
TAD GSRV90 /NOW WE LOOK FOR
JMS I [SP] /THE END OF THE LINE
SKP /GOT THE END OF THE LINE HERE
JMP .-2 /NOT END YET, CONTINUE
DCA PRSERR /STORE POINTER TO EOL
NL7777 /SET -1 /032 CJL
DCA I PRSERR /TERMINATE FILE NAME WITH -1
DCA CURSEQ /RE-SET THE SEQUENCE
TAD GSRV90 /GET ADDRESS OF FILE NAME
GSRV10, FPACK /FORMAT THE PACKET
GSRV90, 0 /DATA ADDRESS HERE
STRIN /RECIEVE INIT PACKET
GSRV12, SPACK /SEND THE PACKET
1 /GET RESPONSE
GSRV80-2 /DISPATCH TABLE /027 CJL
/ SERVICE A NAK OR UNDEFINED.
GSRV15, ISZ RTRYC /BUMP THE RE-TRY COUNTER
JMP GSRV12 /TRY AGAIN
JMP I GETSRV /GIVE UP
/ SERVICE A SEND/INIT FROM THE REMOTE.
GSRV20, JMS I (INPSRV) /HANDLE JUST LIKE A RECEIVE
JMP GSRV21 /ERROR RETURN FROM "INPSRV"
ISZ GETSRV /BUMP RETURN FOR NO ERROR
TAD PRSERR /UPDATE THE CURRENT LINE POINTER
DCA LPTR
GSRV21, JMP I GETSRV
GSRV22, CLA CLL /MAKE SURE WE ARE CLEAR /009/014 CJL
TAD [NOTFND] /GET ERROR MESSAGE ADDRESS /025 CJL
JMP I GETSRV /TAKE ERROR RETURN /009/014 CJL
/ GOT AN ERROR PACKET, DISPLAY ERROR AND ABORT.
GSRV40, JMS I [PRIPAK] /PRINT OUT THE ERROR PACKET
JMP I GETSRV /TAKE THE ERROR EXIT
/ GOT DEVICE ERROR. /006/014 CJL
GSRV50, CLA CLL /ENSURE CLEAR AC /006/014 CJL
TAD (DNERMSG) /GET ERROR MESSAGE ADDRESS /025 CJL
JMP I GETSRV /TAKE ERROR RETURN /006/014 CJL
/ DISPATCH TABLE.
GSRV80, STERR; GSRV40 /ERROR PACKET RETURNED
STSIN; GSRV20 /SEND INIT PACKET RETURNED
STNAK; GSRV15 /NAK PACKET RETURNED
0 /TERMINATE TABLE
/ ROUTINE TO SERVICE A "RECEIVE" COMMAND.
RECSRV, 0
JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
TAD (MREC) /GET OUR MODE VALUE /045 CJL
DCA KMODE /SETUP NOW /045 CJL
TAD LPTR /GET CURRENT LINE POINTER
DCA PRSERR /SAVE IT
TAD PRSERR /GET IT BACK
JMS I [DPARS] /PARSE OFF DEVICE NAME /018 CJL
JMP RECS30 /ERROR IN DEVICE NAME /018 CJL
JMS I [NOSP] /CHECK IF BEGINNING OF FILE NAME /014 CJL
SKP /GOT <EOL> HERE /018 CJL
JMP RECS60 /SOMETHING ELSE ON LINE, ERROR /014 CJL
DCA PRSERR /SAVE CURRENT LINE POINTER /018 CJL
RPACK /GET SEND/INIT PACKET FROM REMOTE
JMS I (DISPATCH) /DISPATCH BASED ON RRTYP /031 CJL
RECS80-2 /TABLE ADDRESS /027/031 CJL
JMP RECS60 /DON'T KNOW WHAT IT IS
/ GOT A SEND INIT PACKET.
RECS10, JMS I (INPSRV) /OFF TO HANDLE INPUT
JMP RECS60 /ERROR RETURN
/ TAKE THE NON-ERROR RETURN.
RECS20, ISZ RECSRV /BUMP FOR NON-ERROR RETURN
TAD PRSERR /GET CURRENT CURSOR POSITION /018 CJL
DCA LPTR /UPDATE IT /018 CJL
JMP I RECSRV
/ GOT ERROR IN DEVICE NAME. /018 CJL
RECS30, CLA CLL /CLEAN UP /018 CJL
TAD (DNERMSG) /GET ERROR MESSAGE ADDRESS /025 CJL
JMP I RECSRV /TAKE ERROR RETURN /018 CJL
/ TAKE THE ERROR RETURN.
RECS60, CLA
JMP I RECSRV /TAKE ERROR EXIT
/ DISPATCH TABLE.
RECS80, STSIN; RECS10 /SEND INIT PACKET DISPATCH
STEOT; RECS60 /END OF CONNECTION
STBRK; RECS20 /BREAK TRANSMISSION
0
RECS90, 0 /TEMP FOR "RECSRV"
/ KEYBOARD LINE BUFFER. /014 CJL
LINBUF, ZBLOCK LINSIZE /LINE BUFFER
PAGE /014 CJL
/ ROUTINE TO SERVICE INPUT OF A FILE.
INPSRV, 0
JMS I (SETINI) /SET UP INIT REGISTERS
DCA OFFLG /INITIALIZE OUTPUT FILE FLAG /036 CJL
CIF USRFLD /GOTO USR FIELD /037 CJL
JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /037 CJL
RESET /RESET TABLES /037 CJL
DCA CURSEQ /RE-SET THE SEQUENCE NUMBER
FPACK /FORMAT A PACKET
INIDAT /PACKET DATA ADDRESS
STACK /"ACK" PACKET TYPE
INPS01, SPACK /SEND A PACKET
1 /AWAIT RESPONSE
INPS91-2 /DISPATCH TABLE ADDRESS /027 CJL
/ NAK OR UNDEFINED RESPONSE HERE.
INPS02, ISZ RTRYC /GOT A NAK, CHECK RE-TRY COUNT
JMP INPS01 /RE-TRY THE INIT
JMS INPERROR /GIVE UP /025 CJL
IER02= . /ERROR TABLE ADDRESS /039 CJL
INPS03, FPACK /FORMAT A PACKET
NODATA /NO DATA
STACK /"ACK" PACKET TYPE
INPS05, SPACK /SEND A PACKET
1 /AWAIT RESPONSE
INPS90-2 /DISPATCH TABLE ADDRESS /027 CJL
JMS INPERROR /UNDEFINED RESPONSE /025 CJL
IER05= . /ERROR TABLE ADDRESS /039 CJL
/ GOT A DATA PACKET, WRITE TO OUTPUT FILE.
INPS10, TAD OFFLG /CHECK THE OUTPUT FILE FLAG
SNA CLA /SKIP IF OUTPUT FILE OPEN
JMS INPERROR /ABORT AND EXIT /025 CJL
IER10, JMS I (WRIPAK) /WRITE THE PACKET TO THE FILE /039 CJL
JMS INPERROR /ERROR WRITING PACKET /025 CJL
IER11, JMP INPS03 /LOOP /039 CJL
/ GOT A FILE HEADER PACKET, OPEN FILE.
INPS20, TAD OFFLG /CHECK IF OUTPUT FILE OPEN
SZA CLA /SKIP IF NO
JMS INPERROR /ABORT IF FILE ALREADY OPEN /025 CJL
IER20, TAD I [RRLEN] /GET CURRENT PACKET LENGTH /039 CJL
TAD (-40-3 /CALCULATE LENGTH OF DATA
SPA /SKIP IF DATA IN THE PACKET
JMS INPERROR /ELSE AN ERROR /025 CJL
IER21, TAD (RRDTA) /CALCULATE LAST BYTE IN DATA /039 CJL
DCA INPS81 /STORE IN POINTER
NL7777 /SET -1 /032 CJL
DCA I INPS81 /TERMINATE NAME WITH A MINUS WORD
TAD (FNBLK /GET ADDRESS OF FILE NAME BLOCK
DCA FNPTR /SAVE FOR NAME PARSE
TAD (RRDTA /GET ADDRESS OF DATA IN PACKET
JMS I [PFNAM] /PARSE OFF THE FILE NAME
JMS INPERROR /ERROR IN FILE NAME /025 CJL
/ GET TARGET DEVICE.
IER23, CLA CLL /CLEAR AC FROM FILE NAME PARSE /039 CJL
TAD DEVNUM /GET DEVICE NUMBER PARSED /006
DCA ODNUMB /SAVE OUTPUT DEVICE NUMBER
TAD ODNUMB /GET NUMBER BACK
JMS I [HFETCH] /FETCH HANDLER FOR THIS DEVICE
JMS INPERROR /HANDLER FETCH ERROR /025 CJL
IER24, TAD (FNBLK) /GET ADDRESS OF FILE NAME BLOCK /039 CJL
DCA INPS22 /PUT IN CALL
TAD ODNUMB /GET DEVICE NUMBER
CIF USRFLD /GOTO USR FIELD /020 CJL
JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
ENTER /ENTER TENTATIVE FILE /020 CJL
INPS22, 0 /
0 /
JMS INPERROR /NO DIRECTORY ROOM /025 CJL
IER22, TAD INPS22 /GET NEW FILE START BLOCK /039 CJL
DCA FSBLK /SAVE
TAD INPS22+1 /GET INDICATED MAXIMUM FILE SIZE /021 CJL
IAC /GIVE ONE MORE THAN 2 LESS /021 CJL
DCA FLEN /SAVE AS DANGER COUNT /021 CJL
ISZ OFFLG /SET FLAG FOR OUTPUT FILE OPEN
NL7777 /INDICATE INITIALIZATION /020 CJL
JMS I [PUTBYTE] /INITIALIZE OUTPUT FILE ROUTINE /020 CJL
HLT /THIS CAN'T HAPPEN! /020 CJL
TAD FNPTR /GET POINTER TO 6 BIT FILE NAME
JMS I [FILN8] /MAKE 8 BIT FORMATTED STRING
JMS I [SCRIBE] /TELL THEM
FRECMSG /WE ARE RECEIVING
PRI8B; NAMBUF /WHICH FILE WE ARE RECEIVING
JMS I [SCRIBE] /DO A
CRLF /<CR>, <LF>
JMP INPS03 /LOOP
/ GOT AN END OF FILE PACKET.
INPS30, TAD OFFLG /ANY OUTPUT FILE OPEN?
SNA CLA /SKIP IF YES
JMS INPERROR /ERROR /025 CJL
IER30, JMS I [FILCLOSE] /CLOSE THE FILE /020/039 CJL
JMS INPERROR /ERROR CLOSING THE FILE /025 CJL
IER31,/ DCA OFFLG /RE-SET FILE OPEN FLAG /D009/039 CJL
JMP INPS03 /CONTINUE
/ GOT AN END OF TRANSMISSION PACKET.
INPS40, TAD OFFLG /WAS A FILE OPEN?
SZA CLA /SKIP IF NO
JMS I [FILCLOSE] /CLOSE ANY OPEN FILE /020 CJL
NOP /ERROR CLOSING THE FILE **** FIX THIS ****
FPACK /FORMAT A PACKET
NODATA /NO DATA IN PACKET
STACK /"ACK" PACKET TYPE
SPACK /SEND THE PACKET
0 /NO RESPONSE
ISZ INPSRV /BUMP RETURN FOR NO ERROR
JMP I INPSRV /TAKE NON-ERROR EXIT
/ GOT AN ERROR PACKET.
INPS50, JMS I [PRIPAK] /PRINT THE PACKET DATA
JMP I INPSRV /AND TAKE THE ERROR EXIT /009/014 CJL
/ INPUT ERRORS COME HERE. /025 CJL
INPERRO,.-. /INPUT ERROR ROUTINE /025 CJL
FPACK /FORMAT A PACKET /025 CJL
NODATA /NO DATA /025 CJL
STBRK /"BREAK LINK" PACKET TYPE /025 CJL
SPACK /SEND THE PACKET /025 CJL
0 /NO RESPONSE /025 CJL
TAD INPERROR /GET CALLER /025 CJL
JMS I [SRCHTABLE] /TRY TO FIND A MATCH /025 CJL
INERTABLE-1-1 /IN ERROR TABLE /025 CJL
SNA /SKIP IF FOUND PARTICULAR MESSAGE /025 CJL
TAD (RERRMSG) /ELSE USE GENERAL MESSAGE /025 CJL
JMP I INPSRV /TAKE ERROR RETURN /025 CJL
/ TEMPS FOR "INPSRV".
INPS80, 0
INPS81, 0
PAGE /014 CJL
/ DISPATCH TABLES FOR "INPSRV".
INPS90, STDAT; INPS10 /HANDLE DATA PACKETS
STEOF; INPS30 /HANDLE EOF PACKET
STEOT; INPS40 /HANDLE END OF TRANSMISSION PACKET
STFIL; INPS20 /HANDLE FILE NAME PACKET
STERR; INPS50 /HANDLE ERROR PACKET
0 /TERMINATE TABLE
INPS91, STNAK; INPS02 /HANDLE A NAK PACKET
STFIL; INPS20 /HANDLE FILE NAME PACKET
STERR; INPS50 /HANDLE ERROR PACKET
0 /TERMINATE TABLE
/ INPUT ERROR MESSAGE DISPATCH TABLE. /025/039 CJL
INERTAB,-IER05; UPERMSG /UNDEFINED PACKET ERROR /025 CJL
-IER11; DSFLMSG /DISK OVERFLOW ERROR /042 CJL
-IER22; RIDEMSG /DIRECTORY FULL ERROR /025 CJL
-IER23; RFLNMSG /RECEIVED FILE NAME ERROR /025 CJL
-IER24; RHFEMSG /HANDLER FETCH ERROR /025 CJL
-IER31; FCLEMSG /FILE CLOSE ERROR /025 CJL
0 /THIS ENDS THE LIST /025 CJL
/ ROUTINE TO CHECK FOR AN ALPHABETIC OR NUMERIC CHAR.
/ ENTER WITH THE CHAR IN THE AC.
/ EXIT + 2 IF ALPHABETIC OR NUMERIC WITH CHAR IN THE AC.
/ EXIT + 1 IF NON-ALPHABETIC OR NUMERIC WITH CHAR IN THE AC.
ALPNUM, 0
JMS ALPHA /CHECK FOR ALPHA FIRST
SKP /NON-ALPHA RETURN, MUST CHECK NUMERIC
JMP ALPNM1 /IS ALPHA, TAKE RETURN + 2
JMS NUMRC /CHECK IF NUMERIC
SKP /NOT NUMERIC
ALPNM1, ISZ ALPNUM /BUMP RETURN FOR ALPHA-NUMERIC
JMP I ALPNUM /DONE
/ ROUTINE TO CHECK FOR AN ALPHABETIC CHARACTER.
/ ROUTINE ASSUMES UPPER CASE.
/ ENTER ROUTINE WITH CHAR IN THE AC.
/ EXIT + 2 IF THE CHAR IS ALPHABETIC WITH THE CHAR IN THE AC.
/ EXIT + 1 IF THE CHAR IS NOT ALPHABETIC WITH THE CHAR IN THE AC.
ALPHA, 0
DCA ALPHA1 /STORE THE CHAR FOR RETURN
TAD ALPHA1 /GET THE CHAR
TAD (-"Z!200-1) /ADD ON UPPER LIMIT /034 CJL
CLL /INIT LINK FOR A FLAG
TAD ("Z-"A+1
SZL /SKIP IF NOT A LETTER
ISZ ALPHA /IS A LETTER, BUMP RETURN
CLA CLL /CLEAR AC
TAD ALPHA1 /RESTORE CHAR IN THE AC
JMP I ALPHA /TAKE PROPER RETURN
ALPHA1, 0 /TEMP FOR ALPHA ROUTINE
/ ROUTINE TO CHECK FOR A NUMERIC CHARACTER.
/ ENTER WITH THE CHAR TO CHECK IN THE AC.
/ EXIT + 2 IF NUMERIC WITH THE CHAR IN THE AC.
/ EXIT + 1 IF NON-NUMERIC WITH THE CHAR IN THE AC.
NUMRC, 0
DCA NUMRC1 /SAVE THE CHAR FOR RETURN
TAD NUMRC1 /GET THE CHAR BACK
TAD (-"9!200-1) /ADD ON UPPER LIMIT /034 CJL
CLL /INIT LINK FOR A FLAG
TAD ["9-"0+1] /016 CJL
SZL /SKIP IF NOT A DIGIT
ISZ NUMRC /BUMP RETURN FOR NUMERIC
CLA CLL /CLEAR AC
TAD NUMRC1 /RESTORE CHAR IN THE AC
JMP I NUMRC /DONE
NUMRC1, 0 /TEMP FOR NUMRC CHECK ROUTINE
/ ROUTINE TO WRITE THE CURRENT INPUT PACKET TO THE OUTPUT FILE.
/ ENTER: NOTHING.
/ EXIT: + 2 = WRITE SUCCESSFUL.
/ + 1 = WRITE NOT SUCCESSFUL.
WRIPAK, 0
TAD I [RRLEN] /GET LENGTH OF PACKET
TAD (RRDTA-40-3 /CALCULATE END OF BUFFER
DCA W90 /PUT INTO POINTER
DCA I W90 /ZERO AFTER END OF BUFFER
TAD (RRDTA /GET ADDRESS OF DATA
DCA W90 /PUT INTO POINTER
W10, TAD I W90 /GET A CHAR FROM PACKET
SNA /SKIP IF NOT END
JMP W60 /END, EXIT
CIA /NEGATE FOR COMPARE
TAD RQCTL /COMPARE WITH CURRENT QUOTE CHAR
SNA CLA /SKIP IF NOT QUOTE CHAR
JMP W20 /IS QUOTE, HANDLE SPECIAL
TAD W92 /WAS LAST CHAR A QUOTE?
SZA CLA /SKIP IF NO
TAD (-100 /IT WAS, FIX UP THIS CHAR
JMP W25 /HANDLE REST BELOW
W20, TAD W92 /CURRENT CHAR A QUOTE, CHECK PREVIOUS
SNA CLA /SKIP IF YES
JMP W30 /JUST THIS CHAR IS QUOTE, SET FLAG
W25, TAD I W90 /GET CHAR FROM BUFFER
JMS I [PUTBYTE] /OUTPUT TO FILE /020 CJL
JMP I WRIPAK /ERROR IN OUTPUT /M020 CJL
JMP W35 /FINISH BELOW
W30, NL0001 CLL /GOTA SET FLAG FOR QUOTE CHARACTER /032 CJL
W35, DCA W92 /SET UP QUOTE FLAG
ISZ W90 /BUMP POINTER
JMP W10 /LOOP
W60, ISZ WRIPAK /BUMP RETURN FOR OK
JMP I WRIPAK /DONE
W90, 0 /POINTER FOR "WRIPAK"
W92, 0 /TEMP FOR "WRIPAK"
/ TABLE SEARCH ROUTINE. /025 CJL
/ CALLING SEQUENCE:
/ TAD VALUE /AC CONTAINS VALUE TO MATCH
/ JMS I [SRCHTABLE] /CALL ROUTINE
/ TABLE-2 /ADDRESS(TABLE)-2
/ RETURN /ALWAYS RETURNS HERE
/ IF AC=0 THEN NO MATCH OCCURRED.
/ IF AC IS NON-ZERO, THEN AC CONTAINS CORRESPONDING VALUE TO MATCH WHICH IS ALSO
/ STORED IN TABLEJUMP.
/ TABLE FORMAT.
/ -VALUE; CORRESPONDING VALUE /TABLE PAIR
/ ""; "" /ADDITIONAL PAIRS AS NECESSARY
/ 0 /ZERO TERMINATES THE TABLE
SRCHTAB,.-. /TABLE SEARCH ROUTINE
DCA TABLEJUMP /SAVE PASSED VALUE TO MATCH
TAD I SRCHTABLE /GET PASSED POINTER ARGUMENT
DCA XR0 /STASH THE POINTER
ISZ SRCHTABLE /BUMP PAST ARGUMENT
SRCHLUP,ISZ XR0 /BUMP TO NEXT PAIR
TAD I XR0 /GET A TABLE VALUE
SNA /END OF TABLE?
JMP I SRCHTABLE /YES, RETURN WITH CLEAR AC
TAD TABLEJUMP /COMPARE TO DESIRED
SZA CLA /SKIP IF IT MATCHES
JMP SRCHLUP /JUMP IF NOT
TAD I XR0 /GET CORRESPONDING VALUE
DCA TABLEJUMP /STASH IT
TAD TABLEJUMP /GET IT BACK
JMP I SRCHTABLE /RETURN WITH CORRESPONDING VAUE IN AC
PAGE /014 CJL
IFZERO 1 <
/ OS8 DIRECTORY FILE DATA SETUP.
/ ENTER WITH THE DIRECTORY DATE WORD IN THE AC.
/ EXIT WITH THE DATE IN THE BUFFER "DATBUF".
FILD8, 0
DCA FILD89 /SAVE THE DATE WORD
TAD FILD89 /GET DATA WORD
AND (7 /KEEP ONLY YEAR BITS
TAD (116 /ADD 78 YEARS
MQL /PUT INTO MQ REGISTER
TAD (DATEYR /GET POINTER TO YEAR
JMS DECCON /CONVERT TO ASCII DATE
TAD FILD89 /GET DATE WORD BACK
CLL RTR /SHIFT DAY DOWN
RAR
AND (37 /KEEP ONLY DAY BITS
MQL /PUT IN MQ REGISTER
TAD (DATEDA /GET POINTER TO DAY
JMS DECCON /CONVERT TO ASCII DAY
TAD FILD89 /GET DATE WORD BACK
BSW /GET MONTH
CLL RTR /DOWN
AND (17 /KEEP ONLY MONTH BITS
MQL /INTO MQ REGISTER
TAD (DATEMO /GET ADDRESS OF WHERE TO PUT MONTH
JMS DECCON /CONVERT
JMP I FILD8 /ALL DONE
FILD89, 0 /TEMP FOR "FILD8"
/ ROUTINE TO CONVERT A BINARY VALUE INTO A TWO DIGIT ASCII DECIMAL NUMBER.
/ ENTER WITH WHERE TO STORE THE CONVERTED NUMBER IN THE AC AND THE NUMBER IN THE
/ MQ REGISTER.
DECCON, 0
DCA DECC20 /STORE THE POINTER
TAD ("0&177-1 /GET AN ASCII ZERO
DCA I DECC20 /START OUT WITH A ZERO
MQA /GET THE BINARY VALUE
DECC01, ISZ I DECC20 /BUMP
TAD (-12 /SUB 10
SMA /SKIP IF NO MORE DIVISION
JMP DECC01 /ELSE KEEP GOING
TAD (12+"0&177 /CONVERT REMAINDER TO ASCII
ISZ DECC20 /BUMP POINTER
DCA I DECC20 /STORE
/ JMS FMTDAT /FORMAT FOR PRINTING /D013
JMP I DECCON /DONE
>
IFZERO 1 <
DECC20, 0 /LOCAL POINTER TO DECCON
/ ROUTINE TO SET UP THE DATE IN A MM-DD-YY FORMAT TO PUT IN FRONT OF A FILE TO
/ PASS THE FILES DATE (TEMPORY AND NOT PART OF THE KERMIT PROTOCOL).
FMTDAT, 0
TAD DATEMO /GET FIRST CHAR OF DATE
DCA FDATE /MOVE IT
TAD DATEMO+1
DCA FDATE+1
TAD DATEDA
DCA FDATE+3
TAD DATEDA+1
DCA FDATE+4
TAD DATEYR
DCA FDATE+6
TAD DATEYR+1
DCA FDATE+7
JMP I FMTDAT /QUICK AND DIRTY
DATBUF, "#&177 /FILE CREATION DATE ATTRIBUTE
6+40 /LENGTH OF DATE (CHAR(X))
DATEYR, 0 /ASCII YEAR GOES HERE
0
DATEMO, 0 /ASCII MONTH GOES HERE
0
DATEDA, 0 /ASCII DAY GOES HERE
0
-1 /TERMINATE
/ FORMATTED DATE GOES HERE.
SETDAT,"ANGLEBRACKET&177 /COMMENT SIGN
FDATE, 0
0
"-&177
0
0
"-&177
0
0
12
15
-1
>
/ DIRECTORY LOOKUP ROUTINE. /028 CJL
/ CALLING SEQUENCE:
/ NL0001 /IF INITIALIZING THE DIRECTORY
/ OR
/ CLA /CLEAR AC IF SUBSEQUENT CALL
/ JMS I (LUKUP) /CALL ROUTINE
/ I/O ERROR /DIRECTORY I/O ERROR RETURN WITH AC DIRTY
/ NOT FOUND /FILE NOT FOUND RETURN
/ FOUND /LATEST FILE MATCHES REQUEST
/ SETS FLEN TO -(FILE LENGTH) IN RECORDS.
/ SETS FSBLK TO STARTING RECORD OF FILE.
/ MODIFIES DIRECTORY SEGMENT SLIGHTLY (NOT TO BE WRITTEN BACK).
/ DEPENDS ON DIRXR BEING UNTOUCHED BY OTHER ROUTINES.
LUKUP, .-. /DIRECTORY LOOKUP ROUTINE
SNA /INITIALIZING DIRECTORY?
JMP NXTFILE /NO, JUST GET ANOTHER FILE IF POSSIBLE
NEXTSEG,DCA DIRRECORD /STORE LATEST DIRECTORY SEGMENT RECORD
JMS I HNDADR /CALL I/O HANDLER
PAGCNT^100+DIRFLD /READ IN A DIRECTORY SEGMENT
DIRBUFFER /DIRECTORY I/O BUFFER
DIRRECO,.-. /WILL BE LATEST SEGMENT NUMBER
JMP I LUKUP /I/O ERROR, TAKE DIRTY IMMEDIATE RETURN
CDF DIRFLD /GOTO DIRECTORY FIELD
TAD I (FRSTRECORD) /GET FIRST RECORD OF FIRST ENTRY
DCA FSBLK /STASH IT
TAD (ENTSTRT-1) /POINT TO
DCA DIRXR /ENTRIES
LOOKLUP,TAD I DIRXR /GET FIRST WORD OF ENTRY
SNA /SKIP IF NOT EMPTY
JMP EMPENTRY /JUMP IF EMPTY ENTRY
DCA FNAME /STORE FIRST FILENAME WORD
TAD I DIRXR /GET NEXT
DCA FNAME+1 /STORE SECOND FILENAME WORD
TAD I DIRXR /GET NEXT
DCA FNAME+2 /STORE THIRD FILENAME WORD
TAD I DIRXR /GET NEXT
DCA FNAME+3 /STORE EXTENSION WORD
NL7777 /BACKUP
TAD I (AIWNUMBER) /GET ADDITIONAL INFORMATION WORD COUNT
DCA AIWCNT /STASH THE COUNTER
DCADATW,DCA DATWORD /CLEAR THE DATE WORD
TAD DCADATW/(DCA DATWORD)/GET STORING INSTRUCTION
DCA AIWSTORE /STORE IN-LINE
JMP AIWTEST /START LOOP THERE
AIWLUP, TAD I DIRXR /GET A WORD FROM ENTRY
AIWSTOR,DCA DATWORD+.-. /STORE IN PROPER WORD
ISZ AIWSTORE /BUMP TO NEXT INSTRUCTION
AIWTEST,ISZ AIWCNT /DONE ALL ADDITIONAL INFORMATION WORDS?
JMP AIWLUP /NO, KEEP GOING
TAD I DIRXR /GET THE FILE LENGTH
SNA /SKIP IF VALID
JMP TENTRY /JUMP IF ONLY TENTATIVE FILE (NO LENGTH)
DCA FILENGTH /STORE FILE LENGTH
CDF PRGFLD /BACK TO OUR FIELD
/ JMS I (FILTER) /CHECK IF WE LIKE THIS ONE
TAD (FNAME) /POINT TO LATEST FILENAME
JMS I (FMATCH) /CHECK FOR A MATCH
JMP NXTFILE /FORGET THIS ONE, IT DIDN'T MATCH
TAD FILENGTH /GET FILE LENGTH
DCA FLEN /GIVE TO CALLER TO DESTROY
TAD (FNAME) /POINT TO FILENAME
JMS I [FILN8] /PUT IN CHARACTER FORM IN BUFFER
ISZ LUKUP /BUMP TO FILE MATCH RETURN
JMP FLEXIT /EXIT THERE
/ COMES HERE FROM SUBSEQUENT CALL OR MATCH FAILURE.
NXTFILE,CDF DIRFLD /GOTO BUFFER FIELD
TAD FILENGTH /GET LATEST FILE LENGTH
SKP /DON'T DO EMPTY LENGTH
/ COMES HERE TO BYPASS AN EMPTY ENTRY.
EMPENTR,TAD I DIRXR /GET LENGTH OF EMPTY
CIA /WANT POSITIVE FORM
TAD FSBLK /UPDATE TO NEXT FILE RECORD
DCA FSBLK /STORE UPDATED VALUE
TENTRY, ISZ I (FILECNT) /DONE WITH THIS SEGMENT?
JMP LOOKLUP /NO, KEEP GOING
TAD I (DIRLINK) /GET LINK TO NEXT SEGMENT
CDF PRGFLD /BACK TO OUR FIELD
SZA /END OF DIRECTORY?
JMP NEXTSEGMENT /NO, GO DO NEXT SEGMENT
FLEXIT, ISZ LUKUP /BUMP PAST I/O ERROR EXIT
JMP I LUKUP /RETURN FOR FILE NOT FOUND
AIWCNT, .-. /ADDITIONAL INFORMATION WORD COUNTER
DATWORD,.-. /DATE WORD STORED HERE (0000 IF NONE)
ZBLOCK 7 /ROOM FOR MORE ADDITIONAL INFORMATION WORDS
FILENGT,.-. /LATEST FILE LENGTH
FNAME, ZBLOCK 4 /FILENAME AND EXTENSION STORED HERE
PAGE
/ OS/8 FILE UNPACK ROUTINE. /019 CJL
/ THIS ROUTINE UNPACKS BYTES FROM THE INPUT FILE ACCORDING TO THE CURRENT VALUE
/ OF FILMODE:
/ FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII
/ CHARACTERS BY STRIPPING THE HIGH-ORDER BIT. END OF FILE IS THE <^Z> CHARACTER
/ WHICH WILL BE SENT OR NOT ACCORDING TO THE CONTENTS OF OCTLZFLAG. IF
/ OCTLZFLAG CONTAINS NON-ZERO, THEN <^Z> WILL BE SENT AT <EOF>; THE NEXT CALL
/ WILL YIELD THE <EOF> RETURN. IF OCTLZFLAG CONTAINS ZERO, THEN DETECTION OF
/ <^Z> YIELDS THE <EOF> RETURN IMMEDIATELY.
/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT
/ CHARACTERS AND WILL BE SENT WITHOUT <^Z> CHECK. THE NEXT CALL AFTER THE LAST
/ BYTE OF THE LAST RECORD HAS BEEN SENT YIELDS THE <EOF> RETURN.
/ CALLING CONSIDERATIONS:
/ OCTLZFLAG MUST BE SETUP ACCORDINGLY IF IN ASCII MODE.
/ FILMODE MUST BE SETUP ACCORDINGLY.
/ FLEN MUST CONTAIN -(FILE LENGTH IN RECORDS) WHEN INITIALIZING THE INPUT FILE.
/ IT WILL BE MODIFIED BY CALLING THIS ROUTINE.
/ FSBLK MUST CONTAIN THE THE STARTING RECORD WHEN INITIALIZING THE INPUT FILE.
/ HNDADR MUST ALREADY BE SETUP TO CALL THE INPUT HANDLER.
/ CALLING SEQUENCE:
/ CLA /OR NL7777 IF INITIALIZING THE INPUT FILE
/ JMS I (GETBYTE) /CALL ROUTINE
/ I/O ERROR RETURN /FATAL INPUT ERROR OCCURRED; AC CONTAINS JUNK
/ END OF FILE /<EOF> OCCURRED
/ GOOD RETURN /AC CONTAINS LATEST SEVEN/EIGHT-BIT CHARACTER
GETBYTE,.-. /GET A BYTE ROUTINE
SNA CLA /INITIALIZING?
JMP I PUTC /NO, GO GET NEXT BYTE
TAD FSBLK /GET STARTING RECORD OF INPUT FILE
DCA GETRECORD /STORE IN-LINE
GETNEWR,JMS I HNDADR /CALL I/O HANDLER
PAGCNT^100+BUFFLD /READ SOME PAGES INTO BUFFER FIELD
GETCORE,FILBUFFER /BUFFER ADDRESS
GETRECO,.-. /WILL BE LATEST RECORD NUMBER
JMP I GETBYTE /INPUT ERROR!
TAD GETCORE/(FILBUFFER) /SETUP THE
DCA BUFPTR /BUFFER POINTER
GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW
JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE
JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE
TAD THIRD /GET THIRD BYTE
JMS PUTC /SEND IT BACK
TAD BUFPTR /GET THE POINTER
TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT
SZA CLA /SKIP IF AT END
JMP GETLOOP /KEEP GOING
ISZ GETRECORD /BUMP TO NEXT RECORD
ISZ FLEN /DONE ALL RECORDS? (BINARY MODE ONLY)
JMP GETNEWRECORD /NO, GO DO ANOTHER ONE
/ BINARY <EOF> REACHED HERE.
JMP GETEOF /TAKE SKIP RETURN TO MAIN CALLER
PUTONE, .-. /SEND BACK A BYTE ROUTINE
CDF BUFFLD /GOTO BUFFER FIELD
TAD I BUFPTR /GET LATEST WORD
AND [7400] /JUST THIRD-BYTE NYBBLE
CLL RAL /MOVE UP
TAD THIRD /GET OLD NYBBLE (IF ANY)
RTL;RTL /MOVE UP NYBBLE BITS
DCA THIRD /SAVE FOR NEXT TIME
TAD I BUFPTR /GET LATEST WORD AGAIN
JMS PUTC /SEND BACK CURRENT BYTE
ISZ BUFPTR /BUMP TO NEXT WORD
JMP I PUTONE /RETURN
PUTC, .-. /SEND BACK LATEST BYTE ROUTINE
CDF PRGFLD /BACK TO OUR FIELD
RAL /MOVE UP
STL RAR /MOVE DOWN WITH BIT[0] SET
AND FILMODE /KEEP ONLY GOOD BITS
TAD [-CNTRLZ] /COMPARE TO <^Z>
SNA /SKIP IF NOT ASCII MODE <EOF>
JMP GETEND /JUMP IF ASCII MODE <EOF>
GETUPZ, TAD [CNTRLZ] /RESTORE THE CHARACTER
AND [377] /ENSURE EIGHT-BIT (MIGHT ALREADY BE SEVEN-BIT)
ISZ GETBYTE /BUMP PAST <EOF> RETURN
GETEOF, ISZ GETBYTE /BUMP PAST I/O ERROR RETURN
JMP I GETBYTE /RETURN TO MAIN CALLER
/ GOT <Z> IN ASCII MODE.
GETEND, TAD OCTLZFLAG /GET <^Z> DISPOSITION FLAG
SNA CLA /SKIP IF SET
JMP GETEOF /JUST RETURN <EOF> CONDITION
TAD (GETEOF) /POINT TO <EOF>
DCA PUTC /FOR NEXT TIME
JMP GETUPZ /GIVE THEM BACK <^Z> THIS TIME
/ OS/8 FILE PACK ROUTINE. /020 CJL
/ THIS ROUTINE PACKS BYTES INTO THE OUTPUT FILE ACCORDING TO THE CURRENT VALUE
/ OF FILMODE:
/ FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII
/ CHARACTERS BY STRIPPING THE HIGH-ORDER BIT.
/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT
/ CHARACTERS AND WILL BE WRITTEN AS IS.
/ CALLING CONSIDERATIONS:
/ FILMODE MUST BE SETUP ACCORDINGLY.
/ FLEN MUST CONTAIN -(MAXIMUM FILE LENGTH IN RECORDS) WHEN INITIALIZING THE
/ TENTATIVE OUTPUT FILE. IT WILL BE MODIFIED BY CALLING THIS ROUTINE.
/ FSBLK MUST CONTAIN THE STARTING RECORD WHEN INITIALIZING THE TENTATIVE OUTPUT
/ FILE.
/ HNDADR MUST ALREADY BE SETUP TO CALL THE OUTPUT HANDLER.
/ CALLING SEQUENCE:
/ NL7777 /ANY NEGATIVE VALUE
/ JMS I [PUTBYTE] /CALL ROUTINE TO INITIALIZE
/ IMPOSSIBLE /CAN'T RETURN HERE
/ GOOD RETURN /ALWAYS RETURNS HERE
/ OR
/ TAD (CHAR&377) /ANY EIGHT-BIT (OR LESS) VALUE
/ JMS I [PUTBYTE] /CALL ROUTINE TO PACK A CHARACTER
/ ERROR RETURN /I/O ERROR WHILE WRITING A BUFFER
/ GOOD RETURN /CHARACTER PACKED WITH NO ERRORS
/ ALL RETURNS CLEAR THE AC.
PUTBYTE,.-. /OUTPUT A BYTE ROUTINE
SPA /ARE WE INITIALIZING?
JMP PUTINITIALIZE /YES
AND FILMODE /REDUCE TO SEVEN-BIT/EIGHT-BIT
DCA LATEST /SAVE LATEST CHARACTER
CDF BUFFLD /GOTO BUFFER FIELD
TAD LATEST /GET LATEST CHARACTER
JMP I PUTNEXT /GO WHERE YOU SHOULD GO
PUTNEXT,.-. /EXIT ROUTINE
ISZ PUTBYTE /BUMP TO GOOD RETURN
PUTERRO,CLA CLL /CLEAN UP
CDF PRGFLD /BACK TO OUR FIELD
JMP I PUTBYTE /RETURN TO MAIN CALLER
PUTINIT,CLA /CLEAN UP
TAD FSBLK /GET STARTING RECORD OF TENTATIVE FILE
DCA PUTRECORD /STORE IN-LINE
DCA I (FLENGTH) /CLEAR ACTUAL FILE LENGTH
PUTNEWR,TAD PUTCORE/(FILEBUFFER) /SETUP THE
DCA BUFPTR /BUFFER POINTER
PUTLOOP,JMS PUTNEXT /GET A CHARACTER
DCA I BUFPTR /STORE IT
TAD BUFPTR /GET POINTER VALUE
DCA TEMPTR /SAVE FOR LATER
ISZ BUFPTR /BUMP TO NEXT
JMS PUTNEXT /GET A CHARACTER
DCA I BUFPTR /STORE IT
JMS PUTNEXT /GET A CHARACTER
RTL;RTL /MOVE UP
AND [7400] /ISOLATE HIGH NYBBLE
TAD I TEMPTR /ADD ON FIRST BYTE
DCA I TEMPTR /STORE COMPOSITE
TAD LATEST /GET LATEST CHARACTER
RTR;RTR;RAR /MOVE UP AND
AND [7400] /ISOLATE LOW NYBBLE
TAD I BUFPTR /ADD ON SECOND BYTE
DCA I BUFPTR /STORE COMPOSITE
ISZ BUFPTR /BUMP TO NEXT
TAD BUFPTR /GET LATEST POINTER VALUE
TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT
SZA CLA /SKIP IF AT END
JMP PUTLOOP /KEEP GOING
CDF PRGFLD /BACK TO OUR FIELD
ISZ FLEN /TOO MANY RECORDS?
SKP /SKIP IF NOT
JMP I PUTBYTE /TAKE ERROR RETURN
JMS I HNDADR /CALL I/O HANDLER
PAGCNT^100+BUFFLD+WRITE /WRITE SOME PAGES FROM BUFFER FIELD
PUTCORE,FILBUFFER /BUFFER ADDRESS
PUTRECO,.-. /WILL BE LATEST RECORD NUMBER
JMP PUTERROR /OUTPUT ERROR!
ISZ I (FLENGTH) /BUMP ACTUAL LENGTH
ISZ PUTRECORD /BUMP TO NEXT RECORD
JMP PUTNEWRECORD /KEEP GOING
BUFPTR, .-. /INPUT/OUTPUT BUFFER POINTER
/ ASCII FILE MODE <^Z> OUTPUT DISPOSITION FLAG.
OCTLZFL,OCLOSE /ZERO=DON'T SEND <^Z> AT <EOF>,
/NON-ZERO=SEND <^Z> AT <EOF>
THIRD= PUTNEXT /THIRD BYTE TEMPORARY
TEMPTR= PUTONE /TEMPORARY BUFFER POINTER
PAGE
/ OUTPUT FILE CLOSE ROUTINE /020 CJL
/ THIS ROUTINE CLOSES THE OPEN OUTPUT FILE ACCORDING TO THE CURRENT VALUE OF
/ FILMODE:
/ FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES PRIOR TO CLOSE ARE STRIPPED
/ SEVEN-BIT CHARACTERS. IF THE LAST CHARACTER SENT TO PUTBYTE (CONTENTS OF
/ LATEST) IS A <^Z>, THEN JUST CLOSE THE FILE. IF NOT, THEN IF ICTLZFLAG IS
/ NON-ZERO, INSERT A <^Z> CHARACTER INTO THE FILE AS <EOF> INDICATOR, ELSE JUST
/ CLOSE THE FILE.
/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES PRIOR TO CLOSE ARE EIGHT-BIT
/ CHARACTERS. IF NECESSARY, <NUL> CHARACTERS WILL BE APPENDED TO THE END OF THE
/ LAST BLOCK OF THE FILE TO FILL IT. THE FILE IS CLOSED OTHERWISE UNMODIFIED.
/ CALLING CONSIDERATIONS.
/ OFFLG MUST BE SET (OUTPUT FILE IS OPEN).
/ FLENGTH MUST CONTAIN THE ACTUAL FILE LENGTH.
/ LATEST MUST CONTAIN THE LAST BYTE SENT TO THE OUTPUT FILE VIA PUTBYTE (ASCII
/ MODE ONLY).
/ ICTLZFLAG MUST BE SETUP ACCORDINGLY.
/ FILMODE MUST BE SETUP ACCORDINGLY.
/ CALLING SEQUENCE:
/ CLA CLL /CLEAR AC
/ JMS I (FILCLOSE) /CALL ROUTINE
/ ERROR RETURN /ERROR WHILE CLOSING FILE
/ GOOD RETURN /FILE CLOSED PROPERLY
/ ON RETURN, OFFLG WILL BE CLEAR; THE AC WILL BE CLEAR ALSO.
FILCLOS,.-. /OUTPUT FILE CLOSE ROUTINE
TAD FILMODE /GET CURRENT FILE MODE
SPA CLA /SKIP IF ASCII
JMP CLOSIT /JUMP IF BINARY
TAD LATEST /GET LATEST CHARACTER
TAD [-CNTRLZ] /COMPARE TO <^Z>
SZA CLA /SKIP IF <^Z> ALREADY IN FILE
TAD ICTLZFLAG /GET <^Z> DISPOSITION FLAG
SNA CLA /SKIP IF SET
JMP CLOSIT /JUMP IF NOT
TAD [CNTRLZ] /GET A <^Z>
CLOSLUP,JMS I [PUTBYTE] /OUTPUT A BYTE
JMP CLOSERROR /ERROR WHILE WRITING
CLOSIT, TAD I (BUFPTR) /GET THE BUFFER POINTER
TAD (-FILBUFFER) /COMPARE TO RESET VALUE
SZA CLA /SKIP IF IT MATCHES
JMP CLOSLUP /ELSE KEEP GOING
TAD ODNUMBER /GET OUTPUT DEVICE NUMBER
CIF USRFLD /GOTO USR FIELD
JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
CLOSE /CLOSE FILE
FNBLK /=> FILENAME
FLENGTH,.-. /ACTUAL FILE LENGTH
CLOSERR,SKP CLA /ERROR WHILE CLOSING THE FILE
ISZ FILCLOSE /BUMP RETURN IF NO ERRORS
DCA OFFLG /CLEAR OUTPUT FILE OPEN FLAG
JMP I FILCLOSE /RETURN TO CALLER
/ ASCII FILE MODE <^Z> INPUT DISPOSITION FLAG.
ICTLZFL,ICLOSE /ZERO=DON'T ENSURE <^Z> IN FILE, NON-ZERO=PACK <^Z>
/IF LAST CHARACTER WASN'T <^Z>
/ SEND PROCESSING
SNDPRO, 0
TAD INIFLG /CHECK IF SEND/INIT HAS BEEN DONE
SZA CLA /SKIP IF NO
JMP SNDP10 /RIGHT INTO FILE TRANSFER
TAD (DEFCK /SET UP DEFAULT CHECKSUM
DCA RCHKT
TAD (DEFEOL /GET DEFAULT EOL
DCA REOL /AND SET IT
TAD (DEFQCTL /GET DEFAULT QUOTE CONTROL CHAR
DCA RQCTL /AND SET IT UP
TAD (DEFMAXL+40 /GET DEFAULT MAX BUFFER SIZE
DCA RMAXL /SET IT UP
DCA CURSEQ /RE-SET SEQUENCE NUMBER
JMS I (SNDI00) /HANDLE "SEND-INIT"
JMP I SNDPRO /TAKE ERROR RETURN /014 CJL
/ SEND FILE HEADER DISPATCH ROUTINE
SNDP10, FPACK /FORMAT A PACKET
NAMBUF /ADDRESS OF FILE HEADER FOR DATA
STFIL /"FIL" PACKET TYPE
SNDP11, SPACK /SEND A PACKET
1 /AWAIT RESPONSE
SNDP96-2 /DISPATCH TABLE ADDRESS /026 CJL
/ GOT A NAK OR UNDEFINED HERE
SNDP12, ISZ RTRYC /BUMP THE COUNTER
JMP SNDP11 /TRY AGAIN
JMP I SNDPRO /TAKE ERROR RETURN /014 CJL
/ FILE CREATION DATE HANDLING
SNDP15, IFZERO 1 <
TAD RCAPAS /CHECK IF REMOTE SUPPORTS FILE
AND (10 / ATTRIBUTES
SNA CLA /SKIP IF YES
JMP SNDP20 /SKIP IF NO
FPACK /FORMAT PACKET
DATBUF /DATE DATA
STATT /"ATT" PACKET TYPE
SNDP16, SPACK /SEND THE PACKET
1 /AWAIT RESPONSE
SNDP98-2 /DISPATCH TABLE ADDRESS /027 CJL
JMP I SNDPRO /TAKE ERROR RETURN /014 CJL
>
/ GOT ACK HERE
SNDP20, JMS I [SCRIBE] /TELL THEM /025 CJL
FSENMSG /WE ARE SENDING /025 CJL
PRI8B; NAMBUF /TELL THEM THE NAME OF THE FILE
JMS I [SCRIBE] /DO A /025 CJL
CRLF /<CR>, <LF> /025 CJL
JMS SLOOP
SKP /ERROR RETURN
ISZ SNDPRO /BUMP FOR NON-ERROR EXIT
JMP I SNDPRO
/ DATA SEND LOOP.
/ ROUTINE TO GET CHARS FROM THE INPUT BUFFER AND SEND THEM TO REMOTE
/ VIA PACKET TRANSFERS. RETURN + 1 IF ERROR, + 2 IF DONE.
SLOOP, 0
JMS I (INIOPB) /INIT OUTPUT PACKET HOLD BUFFER
NL7777 /INITIALIZE INPUT FILE ROUTINE /019 CJL
SLOP01, JMS I (GETBYTE) /GET A FILE CHARACTER /019 CJL
JMP I SLOOP /FATAL I/O ERROR /026 CJL
JMP SLOP15 /HERE ON EOF
JMS I (OPBUF) /PUT INTO PACKET BUFFER
SKP /RETURN HERE ON BUFFER FULL
JMP SLOP01 /RETURN HERE IF STILL ROOM
/ PACKET IS FULL HERE, WE MUST SEND IT.
FPACK /FORMAT A PACKET
HOLDBF /DATA ADDRESS
STDAT /"DAT" PACKET TYPE
SLOP05, SPACK /SEND PACKET
1 /AWAIT RESPONSE
SLOP90-2 /RESPONSE TABLE ADDRESS /027 CJL
/ HERE ON NAK OR FALL THRU ON UNDEFINED RESPONSE ABOVE.
SLOP10, ISZ RTRYC /BUMP THE RE-TRY COUNTER
JMP SLOP05 /TRY AGAIN
JMP I SLOOP /TAKE ERROR RETURN /026 CJL
/ HERE ON END OF FILE -- SEND THEM WHAT WE HAVE.
SLOP15, TAD I (OP2) /GET THE POINTER /052 CJL
TAD (-HOLDBF) /COMPARE TO EMPTY VALUE /052 CJL
SNA CLA /SKIP IF NOT EMPTY /052 CJL
JMP SLOP35 /JUMP IF EMPTY /052 CJL
FPACK /FORMAT A PACKET
HOLDBF /ADDRESS OF DATA
STDAT /"DAT" PACKET TYPE
SLOP20, SPACK /SEND A PACKET
1 /AWAIT RESPONSE
SLOP92-2 /DISPATCH TABLE ADDRESS /027 CJL
/ NAK FOR LAST PACKET.
SLOP25, ISZ RTRYC /BUMP RE-TRY COUNTER
JMP SLOP20 /TRY AGAIN
JMP I SLOOP /TAKE ERROR RETURN /026 CJL
/ ACK FOR FINAL PACKET, SEND AN EOF PACKET.
SLOP35, JMS I [SNDP] /SEND A PACKET
NODATA /NO DATA
STEOF /MAKE IT AN EOF PACKET
JMP I SLOOP /NAK, TAKE ERROR RETURN
JMP I SLOOP /OTHER THAN ACK, NAK; TAKE ERROR RETURN /026 CJL
ISZ SLOOP /EOF ACCEPTED, BUMP FOR GOOD RETURN
JMP I SLOOP /TAKE GOOD RETURN
PAGE
SLOP90, STACK; SLOP01 /ACK, CONTINUE
STNAK; SLOP10 /NAK, HANDLE
0
SLOP92, STACK; SLOP35 /ACK, CONTINUE
STNAK; SLOP25 /NAK, HANDLE
0
/ COMMAND DISPATCH TABLE FOR SEND SERVICE.
SNDP96, STACK; SNDP15 /FILE HEADER ACKNOWLEDGED
STNAK; SNDP12 /NAK RETURNED, RE-TRY
0 /END OF TABLE
SNDP98, STACK; SNDP20 /DATE ATTRIBUTE ACKNOWLEDGED
0 /END OF TABLE
/ ROUTINE TO HANDLE A "SEND-INIT" COMMAND.
/ RETURN + 1 IF ERROR.
/ RETURN + 2 IF SUCCESSFUL.
SNDI00, 0
FPACK /FORMAT A PACKET
INIDAT /ADDRESS OF DATA FOR PACKET
STSIN /"SIN" PACKET TYPE
SNDI02, SPACK /SEND A PACKET
1 /AWAIT RESPONSE
SNDI80-2 /RESPONSE TABLE TYPE /027 CJL
/ HERE ON NAK OR UNDEFINED.
SNDI05, ISZ RTRYC /BUMP RE-TRY COUNTER
JMP SNDI02 /TRY AGAIN
JMP I SNDI00 /TAKE ERROR EXIT
/ HERE ON ACK.
SNDI10, JMS SETINI /SET UP THE INIT REGISTERS
NL0001 CLL /NOW FLAG THE SEND/INIT DONE /032 CJL
DCA INIFLG /BY MAKING THIS NON-ZERO
ISZ SNDI00 /BUMP FOR NON-ERROR RETURN
JMP I SNDI00 /BACK TO MAIN SEND PROCESSING
SNDI80, STACK; SNDI10 /GOT AN ACK
STNAK; SNDI05 /NAK
0 /END OF TABLE
/ ROUTINE TO MOVE THE SEND/INIT OR RECEIVE/INIT PACKET INTO THE INIT REGISTERS.
SETINI, 0
TAD (RMAXL /GET ADDRESS OF RECEIVE INIT REGISTERS
DCA MQ /SETUP FOR CLEAR ROUTINE /032 CJL
TAD (RMAXL-INITEND) /GET -(NUMBER OF REGISTERS) /022 CJL
CLEAR /CLEAR OUT A CHUNK OF MEMORY /M013
/ TAD (RMAXL /GET ADDRESS OF RECEIVE INIT REGISTERS
/ DCA MQ /SETUP FOR MOVE ROUTINE /032 CJL
TAD I [RRLEN] /GET LENGTH OF PACKET JUST INPUT
TAD (-40-4 /COUNT OF DATA RECEIVED
TAD (RMAXL-INITEND) /COMPARE TO MAXIMUM ALLOWED /022 CJL
SMA SZA /SKIP IF NOT TOO MANY /022 CJL
CLA /ELSE USE ALLOWED MAXIMUM /022 CJL
TAD (INITEND-RMAXL) /RESTORE VALUE /022 CJL
CIA /MAKE IT NEGATIVE
DCA MOVE4 /SAVE FOR "MOVE" ROUTINE
TAD (RRDTA /ADDRESS OF DATA IN PACKET
MOVE /MOVE THE INIT REGISTERS
JMP I SETINI /DONE
IFZERO 1 < /D013
/ ROUTINE TO SEND THE DATE IN A DATA PACKET.
/ RETURN + 1 IF ERROR, + 2 IF SUCCESSFUL.
DATOUT, 0
JMS INIOPB /INSURE PACKET HOLD BUFFER INITIALIZED
TAD (SETDAT /GET ADDRESS OF DATE
DCA DATOU9 /PUT INTO POINTER
DATOU1, TAD I DATOU9 /GET A CHAR
ISZ DATOU9 /BUMP POINTER
SPA /SKIP IF NOT ENT
JMP DATOU2 /DONE
JMS OPBUF /PUT INTO HOLD BUFFER
SKP /HOLD FULL, SEND IT
JMP DATOU1 /LOOP
DATOU2, CLA CLL /INSURE CLEAR AC
FPACK /FORMAT A PACKET
HOLDBF /DATA ADDRESS
STDAT /DATA PACKET
DATOU3, SPACK /SEND THE PACKET
1 /GET RESPONSE
DATOU7-2 /DISPATCH TABLE ADDRESS /027 CJL
/ HERE ON NAK OR UNDEFINED RESPONSE.
DATOU4, ISZ RTRYC /BUMP RE-TRY COUNTER
JMP DATOU3 /TRY AGAIN
JMP I DATOUT /ABORT
/ HERE ON ACK.
DATOU5, ISZ DATOUT /BUMP FOR GOOD RETURN
JMP I DATOUT /EXIT
DATOU7, STACK; DATOU5 /ACK
STNAK; DATOU4 /NAK
0
DATOU9, 0 /TEMP POINTER FOR DATOUT
> /D013
/ HANDLE AN ABORT REQUEST.
ABORT, CLA CLL /INSURE CLEAR AC
DCA ABFLAG /CLEAR ABORT FLAG NOW /044 CJL
TAD KMODE /GET CURRENT MODE
TAD (-MSEND /IS IT A SEND?
SZA /SKIP IF YES
JMP ABORT2 /NOT SEND
JMS I [SNDP] /SEND OUT A PACKET
ABORT9 /WHICH HAS A "D" IN THE DATA
STEOF /AND IS AN EOF PACKET
NOP /WE GOT NAK BACK HERE
NOP /WE GOT NEITHER NAK OR ACK HERE
JMS I (BRKXMT) /BREAK THE SEND
JMP ABORT3 /FINISH THE ABORT
ABORT2, TAD (MSEND-MREC /CHECK IF IN RECEIVE MODE
SZA CLA /SKIP IF YES
JMP ABORT3 /JUST BACK TO COMMAND LOOP
JMS I [SNDP] /SEND A PACKET BACK FOR AN ABORT
IFZERO 1 < /D009
ABORT8 /WHICH HAS AN "X" IN THE DATA
STACK /MAKE IT AN ACK PACKET
NOP /NAK HERE
NOP /NOT NAK OR ACK HERE
> /D009
NODATA /NO DATA /A009
STBRK /BREAK TRANSMISSION /A009
NOP /NAK HERE /A009
CLA /NOT ACK OR NAK HERE /A009
TAD OFFLG /GET FILE OPEN FLAG /A009
SZA CLA /IS IT OPEN YET? /A009
JMS I [FILCLOSE] /CLOSE THE OUTPUT FILE /020 CJL
CLA /ERROR DURING CLOSE **** FIX THIS ****
ABORT3, TAD (ABMSG) /GET MESSAGE ADDRESS /044 CJL
JMP I [CLOOP7] /DISPLAY THE ABORT
ABORT9, "D&137 /DATA PACKET FOR SEND ABORT
-1
PAGE /014 CJL
/ ROUTINE TO PRINT 8 BIT CHARS ON THE TTY. ENTER ROUTINE WITH THE ADDRESS OF
/ THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1. TEXT
/ TERMINATES ON A MINUS WORD.
PRI8B0, 0
SZA /SKIP IF ADDRESS NOT IN AC
JMP PRI8B1 /ADDRESS IS IN THE AC
TAD I PRI8B0 /GET ADDRESS FROM CALL + 1
ISZ PRI8B0 /BUMP RETURN POINTER
PRI8B1, DCA MQ /SAVE ADDRESS OF STRING /032 CJL
TAD [P7ECHO] /GET CONSOLE OUTPUT ROUTINE ADDRESS /043 CJL
JMS EIGHTB /AND SEND IT
JMP I PRI8B0 /ALL DONE
/ ROUTINE TO SEND 8 BIT CHARS DOWN THE REMOTE LINE. ENTER ROUTINE WITH THE
/ ADDRESS OF THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1.
/ TEXT TERMINATES ON A MINUS WORD.
REM8B0, 0
SZA /SKIP IF ADDRESS NOT IN AC
JMP REM8B1 /ADDRESS IN AC
TAD I REM8B0 /GET ADDRESS FROM CALL + 1
ISZ REM8B0 /BUMP RETURN
REM8B1, DCA MQ /SAVE ADDRESS OF STRING /032 CJL
TAD (COMOUT) /GET ADDRESS OF REMOTE OUTPUT ROUTINE /046 CJL
JMS EIGHTB /AND SEND THE STRING
JMP I REM8B0 /DONE
/ ROUTINE TO SEND 8 BIT DATA. ENTER WITH ADDRESS OF DATA IN THE MQ AND THE
/ ADDRESS OF THE ROUTINE TO TAKE EACH BYTE IN THE AC. TEXT TERMINATES ON A
/ MINUS WORD.
EIGHTB, 0
DCA EIGHT5 /STORE POINTER TO ROUTINE
TAD MQ /GET STRING POINTER /032 CJL
DCA EIGHT6 /STORE IN LOCAL POINTER
EIGHT1, TAD I EIGHT6 /GET A CHAR
ISZ EIGHT6 /BUMP THE POINTER
SPA /SKIP IF NOT EOL
JMP EIGHT2 /GOT EOL
JMS I EIGHT5 /CALL OUTPUT ROUTINE
CLA CLL /INSURE CLEAR AC
JMP EIGHT1 /LOOP
EIGHT2, CLA CLL /CLEAR THE AC
JMP I EIGHTB /DONE
EIGHT5, 0 /POINTER TO ROUTINE TO DO OUTPUT
EIGHT6, 0 /POINTER TO TEXT TO OUTPUT
/ ROUTINE TO UNPACK 6-BT CHARS FROM MEMORY. BEFORE CALLING INIT "GET6P" AS A
/ POINTER TO THE STRING LOCATION AND "GET6F" SHOULD BE ZEROED TO START WITH THE
/ TOP BYTE OF THE FIRST MEMORY LOCATION.
GET60, 0
NL4000 /SET 4000 /032 CJL
TAD GET6F /GET THE FLAG
DCA GET6F /RETURN THE FLAG
TAD I GET6P /GET TWO BYTES
SZL /HIGH-ORDER WANTED? /032 CJL
JMP GETSWT /JUMP IF NOT /032 CJL
RTR;RTR;RTR /MOVE DOWN HIGH-ORDER HALF /032 CJL
SKP /DON'T BUMP POINTER YET /032 CJL
GETSWT, ISZ GET6P /BUMP TO NEXT WORD /032 CJL
AND [77] /STRIP UNUSED BITS /016 CJL
JMP I GET60 /DONE
/ LOCAL ROUTINE TO "FILN8" TO MAKE THE 6 BIT CHAR IN THE AC INTO 8 BITS AND
/ STORE IN A STRING.
MOV8, .-. /6-BIT CHARACTER => 7-BIT CHARACTER /028 CJL
SNA /SKIP IF SOMETHING PASSED /028 CJL
TAD [" &77] /ELSE SUPPLY A <SPACE> /025 CJL
TAD [" &77] /INVERT THE CHARACTER /028 CJL
AND [77] /JUST SIX-BITS /014/016 CJL
TAD [" &77] /MAKE IT SEVEN-BIT ASCII /028 CJL
DCA I MOV8P /STORE IN THE STRING /028 CJL
ISZ MOV8P /BUMP POINTER FOR NEXT TIME /028 CJL
JMP I MOV8 /RETURN /028 CJL
MOV8P, 0 /POINTER FOR "MOV8" ROUTINE
/ ROUTINE TO PULL A FILE NAME IN 6 BIT POINTED TO BY THE AC AND PLACE IN THE
/ FILE NAME BUFFER IN 8 BIT ADDING IN THE "." TO SEPARATE FILE NAME AND
/ EXTENSION. A MINUS WORD WILL FOLLOW THE NAME.
FILN8, 0
DCA GET6P /SET POINTER FOR "GET6"
DCA GET6F /SET FLAG FOR "GET6"
TAD (NAMBUF /GET ADDRESS OF THE NAME BUFFER
DCA MOV8P /SET IN A POINTER
TAD (-6 /6 NAME CHARS TO DO
DCA FILN8C /SAVE IN COUNTER
GET6 /PULL A CHAR
SZA /SKIP IF A SPACE
JMS MOV8 /PUT INTO THE BUFFER
ISZ FILN8C /BUMP COUNTER
JMP .-4 /LOOP TILL ALL 6 DONE
TAD (".&177) /GET A "." /034 CJL
JMS MOV8 /PUT WITH FILE NAME
NL7776 /SET -2 /032 CJL
DCA FILN8C /2 EXTENSION CHARS
GET6 /GET NEXT CHAR
SZA /SKIP IF A SPACE
JMS MOV8 /PUT WITH NAME
ISZ FILN8C /BUMP COUNTER
JMP .-4 /LOOP
NL7777 /SET -1 /032 CJL
DCA I MOV8P /TERMINATE THE STRING
JMP I FILN8 /AND RETURN
FILN8C, 0 /COUNTER FOR "FILN8"
PAGE
/ CONSOLE I/O ROUTINES, ETC. /023 CJL
/ CONSOLE MESSAGE PRINT ROUTINE.
/ CALLING SEQUENCE:
/ JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE
/ MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE
/ AC CAN BE DIRTY ON CALL.
/ RETURNS WITH CLEAR AC.
/ MESSAGE FORMAT:
/ ALL UPPER-CASE CHARACTERS ARE ALLOWED TO EXIST IN THE MESSAGE EXCEPT '%' AND
/ '^' WHICH ARE RESERVED. A ZERO HALF-WORD TERMINATES THE MESSAGE STRING. IF
/ '%' IS DETECTED, A <CR> AND <LF> WILL BE OUTPUT. IF '^' IS DETECTED, THE
/ PREVAILING CASE WILL BE REVERSED. INITIAL CASE IS LOWER-CASE. IF 'UPONLY' IS
/ SET TO 7740, ALL CASE CHANGES ARE IGNORED AND THE OUTPUT IS FORCED TO
/ UPPER-CASE ONLY. THE MESSAGE ADDRESS MUST BE IN FIELD ONE AND MUST NOT
/ OVERLAP AREAS RESERVED FOR OTHER PURPOSES (OS/8 RESIDENT AT 17600-17777, USR
/ LOCATIONS 10000-11777, ETC.).
SCRIBE, .-. /CONSOLE MESSAGE PRINT ROUTINE
CLA /CLEAN UP /029 CJL
TAD [P7ECHO] /POINT TO /043 CJL
RSCRENT,DCA MSGOUT /CONSOLE PRINT ROUTINE
TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT
DCA SCRPTR /STASH THE POINTER
ISZ SCRIBE /BUMP PAST ARGUMENT
TAD UPONLY /GET UPPER-ONLY VALUE /030 CJL
TAD [140] /ADD ON LOWER-CASE VALUE /030 CJL
DCA SCRCASE /STORE INITIAL CASE VALUE
SCRLUP, CDF MSGFLD /GOTO MESSAGE FIELD
TAD I SCRPTR /GET LEFT HALF-WORD
RTR;RTR;RTR /MOVE OVER
JMS SCRPRNT /PRINT IT
CDF MSGFLD /GOTO MESSAGE FIELD
TAD I SCRPTR /GET RIGHT HALF-WORD
JMS SCRPRNT /PRINT IT
ISZ SCRPTR /BUMP TO NEXT PAIR
JMP SCRLUP /KEEP GOING
SCRPRNT,.-. /CHARACTER PRINT ROUTINE
CDF PRGFLD /BACK TO OUR FIELD
AND [77] /JUST SIX BITS
SNA /END OF MESSAGE?
JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER
DCA SCRCHAR /NO, SAVE FOR NOW
TAD SCRCHAR /GET IT BACK
TAD (-"%!200) /IS IT "%"?
SNA /SKIP IF NOT
JMP SCRCRLF /JUMP IF IT MATCHES
TAD [-"^+100+"%] /IS IT "^"
SNA CLA /SKIP IF NOT
JMP SCRFLIP /JUMP IF IT MATCHES
TAD SCRCHAR /GET THE CHARACTER
AND [40] /DOES CASE MATTER?
SNA CLA /SKIP IF NOT
TAD SCRCASE /ELSE GET PREVAILING CASE
TAD SCRCHAR /GET THE CHARACTER
SCRPRLF,JMS I MSGOUT /PRINT THE CHARACTER
JMP I SCRPRNT /RETURN
SCRCRLF,TAD [CNTRLM] /GET A <CR>
JMS I MSGOUT /PRINT IT
TAD [CNTRLJ] /GET A <LF>
JMP SCRPRLF /CONTINUE THERE
SCRFLIP,TAD UPONLY /GET UPPER-ONLY FLAG
SZA CLA /SKIP IF OFF
JMP I SCRPRNT /RETURN IF ON
TAD SCRCASE /GET CURRENT CASE
CIA /INVERT IT
TAD (140+100) /ADD SUM OF POSSIBLE VALUES
DCA SCRCASE /STORE NEW INVERTED CASE
JMP I SCRPRNT /RETURN
/ REMOTE LINE MESSAGE PRINT ROUTINE.
/ CALLING SEQUENCE:
/ JMS I [RSCRIBE] /CALL MESSAGE PRINT ROUTINE
/ MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE
/ AC CAN BE DIRTY ON CALL.
/ RETURNS WITH CLEAR AC.
/ MESSAGE FORMAT AND RESTRICTIONS ARE IDENTICAL TO SCRIBE ROUTINE.
RSCRIBE,.-. /REMOTE LINE MESSAGE PRINT ROUTINE
CLA /CLEAN UP /029 CJL
TAD RSCRIBE /GET OUR CALLER
DCA SCRIBE /MAKE IT THEIRS
TAD (COMOUT) /POINT TO REMOTE OUTPUT ROUTINE
JMP RSCRENTRY /CONTINUE THERE
/ ESCAPE CHARACTER PRINT ROUTINE.
/ CALLING SEQUENCE:
/ TAD ESCHAR /OR OTHER CHARACTER TO PRINT
/ JMS I [ESCPRNT] /CALL ROUTINE
/ RETURNS WITH CLEAR AC HERE
/ CAUSES CHARACTER TO PRINT LITERALLY IF CHARACTER>37.
/ CAUSES MESSAGE "CONTROL-" FOLLOWED BY CHARACTER+100 IF CHARACTER<40.
ESCPRNT,.-. /ESCAPE CHARACTER PRINT ROUTINE
DCA ESCTEMP /SAVE PASSED VALUE
TAD ESCTEMP /GET IT BACK
TAD [-40] /COMPARE TO CONTROL LIMIT
SMA CLA /SKIP IF LESS THAN LIMIT
JMP ESPRINT /JUMP IF NOT
JMS I [SCRIBE] /GIVE THEM THE
CONTMSG /CONTROL MESSAGE
TAD [100] /MAKE IT UPPER-CASE, NOT CONTROL
ESPRINT,TAD ESCTEMP /GET ORIGINAL VALUE
JMS I [P7ECHO] /PRINT IT /043 CJL
JMP I ESCPRNT /RETURN
MSGOUT= RSCRIBE /OUTPUT ROUTINE POINTER
ESCTEMP,.-. /TEMPORARY FOR ESCPRNT ROUTINE
SCRCASE,.-. /CURRENT MESSAGE CASE
SCRCHAR,.-. /LATEST MESSAGE CHARACTER
SCRPTR, .-. /MESSAGE POINTER
PAGE
/ ROUTINE TO HANDLE THE "CONNECT" COMMAND. /025 CJL
CONSRV, .-. /CONNECT SERVICE ROUTINE
JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
JMS I [SCRIBE] /GIVE THE
CONNMSG /OPENING MESSAGE
TAD ESCHAR /GET THE CURRENT <ESCAPE> CHARACTER
JMS I [ESCPRNT] /PRINT IT
JMS I [SCRIBE] /GIVE THEM THE
CON2MSG /BRIDGING MESSAGE
JMS I [SCRIBE] /PRINT OUT THE
CPUMSG /ACTUAL CPU TYPE
JMS I [SCRIBE] /GIVE THEM THE
CON3MSG /CLOSING MESSAGE
CORESET,DCA ESCFLAG /CLEAR <ESCAPE> SEEN FLAG
TAD ESCHAR /GET THE <ESCAPE> CHARACTER
DCA ESCH /STORE IN SEARCH LIST
JMS I (CONRESET) /RESET CONSOLE ROUTINES
JMS I (REMRESET) /RESET REMOTE LINE ROUTINES
CONNLUP,TAD KEYERROR /GET KEYBOARD ERROR FLAG
SNA /SKIP IF KEYBOARD ERROR
TAD RINERROR /ELSE GET REMOTE ERROR FLAG
SZA CLA /SKIP IF NEITHER KEYBOARD NOR REMOTE LINE ERRORS
JMP KERROR /JUMP IF KEYBOARD ERROR
JMS I (CONTEST) /TEST IF CONSOLE CAN TAKE OUTPUT
JMP TESTKEYBOARD /JUMP IF NOT
JMS I (REMINPUT) /TEST IF ANY REMOTE INPUT
SKP /SKIP IF NONE
JMS I (CONOUT) /OUTPUT TO CONSOLE
TESTKEY,TAD ECHOFLAG /GET LOCAL ECHO FLAG
TAD ESCFLAG /ADD ON <ESCAPE> SEEN FLAG
SNA CLA /SKIP IF LOCAL ECHO POSSIBLY NEEDED
JMP NOLOCALECHO /JUMP IF NOT
JMS I (CONTEST) /TEST IF CONSOLE CAN TAKE OUTPUT
JMP BUFCHECK /JUMP IF NOT
NOLOCAL,JMS I (REMTEST) /TEST IF REMOTE CAN TAKE OUTPUT
JMP BUFCHECK /JUMP IF NOT
JMS I (KEYINPUT) /TEST IF ANY KEYBOARD INPUT
JMP BUFCHECK /JUMP IF NOT
DCA KEYLATEST /SAVE FOR LATER
TAD KEYLATEST /GET IT BACK
AND [177] /WANT SEVEN-BIT VERSION FOR TESTS
CIA /INVERT IT
DCA TESTCHAR /SAVE FOR LATER
TAD ESCFLAG /<ESCAPE> SEEN LAST TIME?
SNA CLA /SKIP IF SO
JMP NOESCAPE /JUMP IF NOT
TAD TESTCHAR /GET TEST VAUE
JMS I [SRCHTABLE] /SEARCH FOR IT
ESCLIST-1-1 /SEARCH TABLE POINTER
SNA CLA /SKIP IF FOUND
JMP ESCOMPLAIN /JUMP IF NOT
JMP I TABLEJUMP /GO WHERE YOU'RE SUPPOSED TO
/ COMES HERE IF PREVIOUS WAS NOT THE <ESCAPE> CHARACTER.
NOESCAP,TAD TESTCHAR /GET THE LATEST CHARACTER
TAD ESCHAR /COMPARE TO <ESCAPE> CHARACTER
SZA CLA /SKIP IF IT MATCHES
JMP OUTCHAR /JUMP IF NOT
NL7777 /SET THE
/ DCA ESCFLAG /<ESCAPE> SEEN FLAG
/ JMP BUFCHECK /CONTINUE THERE
JMP NOESENTRY /CONTINUE THERE
/ COMES HERE IF BOTH PREVIOUS AND LATEST ARE THE <ESCAPE> CHARACTER.
ESCTYPE,DCA ESCFLAG /CLEAR THE <ESCAPE> SEEN FLAG AND OUTPUT
/ COMES HERE IF PREVIOUS AND LATEST CHARACTER ARE NOT THE <ESCAPE> CHARACTER.
OUTCHAR,TAD ECHOFLAG /GET LOCAL ECHO FLAG
SNA CLA /SKIP IF SET
JMP NOECHO /JUMP IF NOT
TAD KEYLATEST /GET LATEST CHARACTER
JMS I (CONOUT) /OUTPUT TO CONSOLE
NOECHO, TAD KEYLATEST /GET LATEST CHARACTER
JMS I (REMOUT) /OUTPUT TO REMOTE
JMP BUFCHECK /CONTINUE THERE
/ COMES HERE IF PREVIOUS WAS THE <ESCAPE> CHARACTER AND THE LATEST IS NOT
/ A VALID <ESCAPE> COMMAND CHARACTER.
ESCOMPL,TAD [CNTRLG] /GET A <BEL>
JMS I (CONOUT) /OUTPUT TO CONSOLE
NOESENT,DCA ESCFLAG /CLEAR <ESCAPE> SEEN FLAG
BUFCHEC,JMS I PUPSTATUS /UPDATE THE PORT STATUS /047 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR
/ KL8 INTERFACES.
*BUFCHECK /OVERLAY DECMATE CODE /047 CJL
BUFCHEC,NOP /DON'T CHECK PORT STATUS /047 CJL
JMS I (RINUPDATE) /CHECK FOR MORE REMOTE INPUT
JMS I (KEYUPDATE) /CHECK FOR MORE KEYBOARD INPUT
JMS I (REMUPDATE) /CHECK FOR MORE REMOTE OUTPUT
JMS I (CONUPDATE) /CHECK FOR MORE CONSOLE OUTPUT
JMP CONNLUP /GO BACK FOR MORE
/ COMES HERE ON <ESCAPE> C(LOSE).
ESCLOSE,ISZ CONSRV /BUMP TO GOOD RETURN
JMP I CONSRV /RETURN
KERRLUP,JMS I PUPSTATUS /UPDATE THE PORT STATUS /047 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR
/ KL8 INTERFACES.
*KERRLUP /OVERLAY DECMATE CODE /047 CJL
KERRLUP,NOP /DON'T CHECK PORT STATUS /047 CJL
JMS I (RINUPDATE) /CHECK FOR MORE REMOTE INPUT
JMS I (KEYUPDATE) /CHECK FOR MORE KEYBOARD INPUT
JMS I (REMUPDATE) /CHECK FOR MORE REMOTE OUTPUT
JMS I (CONUPDATE) /CHECK FOR MORE CONSOLE OUTPUT
/ COMES HERE ON KEYBOARD INPUT ERROR.
KERROR, JMS I (CONTEST) /CONSOLE READY FOR OUTPUT?
JMP KERRLUP /NO, GO WAIT AWHILE
TAD I (CONINSERT) /GET CONSOLE INSERTION POINTER
CIA /INVERT FOR TEST
TAD I (CONREMOVE) /COMPARE TO CONSOLE REMOVAL POINTER
SZA CLA /SKIP IF CONSOLE OUTPUT BUFFER EMPTY
JMP KERRLUP /GO WAIT FOR AWHILE
TAD KEYERROR /KEYBOARD INPUT ERROR?
SNA CLA /SKIP IF SO
JMP RIERTST /JUMP IF NOT
JMS I [SCRIBE] /TELL THEM
KERRMSG /WE HAD A KEYBOARD ERROR
RIERTST,TAD RINERROR /REMOTE INPUT ERROR?
SNA CLA /SKIP IF SO
JMP CORESET /JUMP IF NOT
JMS I [SCRIBE] /TELL THEM
RIERMSG /WE HAD A REMOTE LINE ERROR
JMP CORESET /RESTART
/ <ESCAPE> CHARACTER SEARCH LIST.
ESCLIST,UPPERC; ESCLOSE /<ESCAPE> C(LOSE)
LOWERC; ESCLOSE /<ESCAPE> C(LOSE) (LOWER-CASE)
ESCH, .-.; ESCTYPE /<ESCAPE> <ESCAPE>
0 /THIS ENDS THE LIST
/ LOCAL ECHO FLAG FOR CONNECT MODE.
ECHOFLA,INIECHO /0=DON'T ECHO, NON-ZERO=ECHO /039 CJL
ESCFLAG,.-. /<ESCAPE> CHARACTER SEEN FLAG
KEYLATE,.-. /LATEST KEYBOARD CHARACTER
PUPSTAT,UPSTATUS /POINTER TO DECMATE STATUS UPDATE /047 CJL
TESTCHA,.-. /LATEST KEYBOARD TEST CHARACTER
PAGE
/ CONNECT-MODE SUPPORT ROUTINES. /047 CJL
/ CONSOLE KEYBOARD ROUTINES. /047 CJL
/ KEYBOARD INPUT ROUTINE. /026 CJL
/ CALLING SEQUENCE:
/ JMS I (KEYINPUT) /CALL ROUTINE
/ NO INPUT /RETURN IF NO INPUT
/ INPUT /RETURN IF INPUT AVAILABLE
/ THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT.
/ THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN.
KEYINPU,.-. /KEYBOARD INPUT ROUTINE
TAD KEYINSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD KEYREMOVE /COMPARE TO REMOVAL POINTER
SNA CLA /SKIP IF BUFFER NOT EMPTY
JMP KEYCHECK /JUMP IF BUFFER EMPTY
TAD KEYREMOVE /GET REMOVAL POINTER
DCA KEYTEMP /SAVE FOR LATER
NL0001 /SET INCREMENT
TAD KEYREMOVE /UPDATE REMOVAL POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD [KEYBUFFER] /MAKE IT ABSOLUTE
DCA KEYREMOVE /STORE UPDATED POINTER
CDF BUFFLD /GOTO BUFFER FIELD
TAD I KEYTEMP /GET THE LATEST CHARACTER
CDF PRGFLD /BACK TO OUR FIELD
SKP /DON'T GET ANOTHER CHARACTER /047 CJL
/ COMES HERE IF BUFFER IS EMPTY.
KEYCHEC,JMS KEYGET /TRY TO GET A CHARACTER NOW /047 CJL
ISZ KEYINPUT /GOT ONE, SO TAKE SKIP RETURN /047 CJL
JMP I KEYINPUT /RETURN EITHER WAY
/ KEYBOARD BUFFER UPDATE ROUTINE. /026 CJL
/ CALLING SEQUENCE:
/ JMS I (KEYUPDATE) /CALL ROUTINE
/ RETURNS WITH CLEAR AC. ANY KEYBOARD INPUT WHICH JUST OCCURRED WILL BE
/ BUFFERED; CALLS TO KEYINPUT WILL RETRIEVE THE CHARACTERS.
KEYUPDA,.-. /KEYBOARD BUFFER UPDATE ROUTINE
JMS KEYGET /TRY TO GET A CHARACTER NOW /047 CJL
SKP /GOT ONE, DON'T LEAVE YET /047 CJL
JMP I KEYUPDATE /CHARACTER NOT AVAILABLE NOW, RETURN /047 CJL
CDF BUFFLD /GOTO BUFFER FIELD
DCA I KEYINSERT /STORE IN THE BUFFER
CDF PRGFLD /BACK TO OUR FIELD
NL0001 /SET INCREMENT
TAD KEYINSERT /UPDATE POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD [KEYBUFFER] /MAKE IT ABSOLUTE
DCA KEYINSERT /STORE BACK UPDATED POINTER
TAD KEYINSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD KEYREMOVE /COMPARE TO REMOVAL POINTER
SNA CLA /SKIP IF NOT EQUAL
KSERROR,ISZ KEYERROR /INDICATE KEYBOARD ERROR
JMP I KEYUPDATE /RETURN
JMP KSERROR /MAKE SURE ERROR IS INDICATED
/ KEYBOARD GET A CHARACTER ROUTINE. /047 CJL
/ CALLING SEQUENCE:
/ JMS KEYGET /CALL ROUTINE
/ CHARACTER AVAILABLE /RETURNS HERE WITH LATEST CHARACTER
/ NO CHARACTER AVAILABLE /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL
/ NORMAL RETURN HAS LATEST CHARACTER IN AC.
/ SKIP RETURN HAS CLEAR AC.
/ IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN.
KEYGET, .-. /KEYBOARD GET A CHARACTER ROUTINE
KGTEST, KSFIOT /FLAG UP?
JMP KEYGNONE /NO, TAKE SKIP RETURN
KGREAD, KRBIOT /YES, READ THE CHARACTER
SPA /SKIP IF NO UART ERRORS
ISZ KEYERROR /INDICATE KEYBOARD ERROR
SKP /SKIP IF NOT TOO MANY ERRORS
JMP .-2 /ENSURE KEYBOARD ERROR IS INDICATED
AND [377] /JUST EIGHT-BIT
DCA KEYTEMP /SAVE FOR NOW
TAD FLOWFLAG /GET FLOW CONTROL FLAG
SNA CLA /SKIP IF SET
JMP KEYGEXIT /JUMP IF NOT
TAD KEYTEMP /GET THE CHARACTER
AND [177] /JUST SEVEN-BIT
TAD [-CNTRLS] /COMPARE TO <^S>
SNA /SKIP IF OTHER
JMP KWATSET /JUMP IF IT MATCHES
TAD [-CNTRLQ+CNTRLS]/COMPARE TO <^S>
SNA CLA /SKIP IF OTHER
JMP KWATCLEAR /JUMP IF IT MATCHES
KEYGEXI,TAD KEYTEMP /GET THE CHARACTER
JMP I KEYGET /TAKE IMMEDIATE RETURN
/ COMES HERE ON <^S> TO SET OUTPUT WAIT.
KWATSET,NL4000 /SET WAIT VALUE
/ COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT.
KWATCLE,DCA CONWAIT /STORE NEW STATE
KEYGNON,ISZ KEYGET /BUMP RETURN ADDRESS
JMP I KEYGET /TAKE SKIP RETURN
/ CONSOLE TERMINAL ROUTINES.
/ CONSOLE OUTPUT ROUTINE.
/ CALLING SEQUENCE:
/ TAD CHAR /CHARACTER TO OUTPUT IN AC
/ JMS I (CONOUT) /CALL ROUTINE
/ RETURN /RETURNS HERE WITH CLEAR AC
CONOUT, .-. /CONSOLE OUTPUT ROUTINE
DCA CONTEMP /SAVE PASSED VALUE
TAD CONINSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD CONREMOVE /COMPARE TO REMOVAL POINTER
TAD CONWAIT /ADD ON WAIT STATUS
SZA CLA /SKIP IF BUFFER EMPTY AND NOT WAITING /047 CJL
JMP CSTUFF /JUMP IF CHARACTER MUST BE BUFFERED
TAD CONTEMP /GET PASSED VALUE /047 CJL
JMS I (CONPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
JMP CSTUFF /COULDN'T OUTPUT IT, SO BUFFER IT /047 CJL
JMP I CONOUT /RETURN
CSTUFF, TAD CONTEMP /GET THE CHARACTER
CDF BUFFLD /GOTO BUFFER FIELD
DCA I CONINSERT /STORE THE CHARACTER
CDF PRGFLD /BACK TO OUR FIELD
NL0001 /SET INCREMENT
TAD CONINSERT /UPDATE POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD [CONBUFFER] /MAKE IT ABSOLUTE
DCA CONINSERT /STORE BACK UPDATED POINTER
JMP I CONOUT /RETURN
/ CONSOLE OUTPUT TEST ROUTINE.
/ CALLING SEQUENCE:
/ JMS I (CONTEST) /CALL ROUTINE
/ NOT READY /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER
/ READY /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW
CONTEST,.-. /CONSOLE OUTPUT TEST ROUTINE
NL0001 /SET BUFFER INCREMENT
TAD CONINSERT /GET UPDATED INSERTION POINTER
CIA /INVERT FOR TEST
TAD CONREMOVE /COMPARE TO REMOVAL POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
SZA CLA /SKIP IF BUFFER IS FULL
ISZ CONTEST /BUMP RETURN IF NOT
JMP I CONTEST /RETURN EITHER WAY
/ CONSOLE OUTPUT BUFFER UPDATE ROUTINE.
/ CALLING SEQUENCE:
/ JMS I (CONUPDATE) /CALL ROUTINE
/ RETURN /RETURN WITH CLEAR AC
/ THE CONSOLE OUTPUT BUFFERING ROUTINES WILL UPDATE POINTERS, ETC. IF ANY
/ STATUS HAS CHANGED SINCE THE LAST CALL.
CONUPDA,.-. /CONSOLE OUTPUT UPDATE ROUTINE
TAD CONWAIT /FLOW CONTROL WAIT SET?
SZA CLA /SKIP IF NOT
JMP I CONUPDATE /JUST RETURN IF SO
TAD CONINSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD CONREMOVE /COMPARE TO REMOVAL POINTER
SNA CLA /SKIP IF BUFFER CONTAINS SOMETHING /047 CJL
JMP I CONUPDATE /RETURN IF BUFFER EMPTY /047 CJL
CDF BUFFLD /GOTO BUFFER FIELD
TAD I CONREMOVE /GET A CHARACTER FROM THE BUFFER
CDF PRGFLD /BACK TO OUR FIELD
JMS I (CONPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
JMP I CONUPDATE /COULDN'T DO IT, SO JUST RETURN /047 CJL
NL0001 /SET BUFFER INCREMENT
TAD CONREMOVE /UPDATE REMOVAL POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD [CONBUFFER] /MAKE IT ABSOLUTE
DCA CONREMOVE /STORE UPDATED POINTER
JMP I CONUPDATE /RETURN
CONINSE,.-. /CONSOLE OUTPUT INSERTION POINTER
CONREMO,.-. /CONSOLE OUTPUT REMOVAL POINTER
/ CONSOLE FLOW CONTROL WAIT FLAG.
CONWAIT,.-. /0=DON'T WAIT, 4000=WAIT FOR <^Q>
KEYINSE,.-. /KEYBOARD BUFFER INSERTION POINTER
KEYREMO,.-. /KEYBOARD BUFFER REMOVAL POINTER
CONTEMP=CONUPDATE /CONSOLE OUTPUT TEMPORARY
KEYTEMP=CONUPDATE /KEYBOARD INPUT TEMPORARY
PAGE
/ REMOTE LINE ROUTINES.
/ REMOTE LINE INPUT ROUTINE. /026 CJL
/ CALLING SEQUENCE:
/ JMS I (REMINPUT) /CALL ROUTINE
/ NO INPUT /RETURN IF NO INPUT
/ INPUT /RETURN IF INPUT AVAILABLE
/ THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT.
/ THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN.
REMINPU,.-. /REMOTE LINE INPUT ROUTINE
TAD RININSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD RINREMOVE /COMPARE TO REMOVAL POINTER
SNA CLA /SKIP IF BUFFER NOT EMPTY
JMP RINCHECK /JUMP IF BUFFER EMPTY
TAD RINREMOVE /GET REMOVAL POINTER
DCA RINTEMP /SAVE FOR LATER
NL0001 /SET INCREMENT
TAD RINREMOVE /UPDATE REMOVAL POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD (RINBUFFER) /MAKE IT ABSOLUTE
DCA RINREMOVE /STORE UPDATED POINTER
CDF BUFFLD /GOTO BUFFER FIELD
TAD I RINTEMP /GET THE LATEST CHARACTER
CDF PRGFLD /BACK TO OUR FIELD
DCA RINTEMP /SAVE FOR LATER
TAD FLOWFLAG /GET FLOW CONTROL FLAG
SNA CLA /SKIP IF SET
JMP REMINEXIT /JUMP IF NOT
NL4000 /SET WAITING VALUE
TAD RINWAIT /ARE WE WAITING TO EMPTY?
SZA CLA /SKIP IF SO
JMP REMINEXIT /JUMP IF NOT
TAD RININSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD RINREMOVE /COMPARE TO REMOVAL POINTER
AND [BUFSIZE^3%4] /JUST 3/4 BITS
SZA CLA /SKIP IF BUFFER NOW 1/4 FULL (OR LESS)
JMP REMINEXIT /JUMP IF NOT
NL7777 /SET BUFFER EMPTYING VALUE
DCA RINWAIT /STORE FOR OUTPUT ROUTINE
REMINEX,TAD RINTEMP /GET THE CHARACTER
SKP /DON'T GET ANOTHER ONE /047 CJL
/ COMES HERE IF REMOTE LINE INPUT BUFFER IS EMPTY.
RINCHEC,JMS RINGET /TRY TO GET A CHARACTER NOW /047 CJL
ISZ REMINPUT /GOT ONE, SO TAKE SKIP RETURN /047 CJL
JMP I REMINPUT /RETURN EITHER WAY
/ REMOTE LINE INPUT BUFFER UPDATE ROUTINE. /026 CJL
/ CALLING SEQUENCE:
/ JMS I (RINUPDATE) /CALL ROUTINE
/ RETURNS WITH CLEAR AC. ANY REMOTE LINE INPUT WHICH JUST OCCURRED WILL BE
/ BUFFERED; CALLS TO REMINPUT WILL RETRIEVE THE CHARACTERS.
RINUPDA,.-. /REMOTE LINE INPUT BUFFER UPDATE ROUTINE
JMS RINGET /TRY TO GET A CHARACTER NOW /047 CJL
SKP /GOT ONE, DON'T LEAVE YET /047 CJL
JMP I RINUPDATE /CHARACTER NOT AVAILABLE NOW, RETURN /047 CJL
CDF BUFFLD /GOTO BUFFER FIELD
DCA I RININSERT /STORE IN THE BUFFER
CDF PRGFLD /BACK TO OUR FIELD
NL0001 /SET INCREMENT
TAD RININSERT /UPDATE POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD (RINBUFFER) /MAKE IT ABSOLUTE
DCA RININSERT /STORE BACK UPDATED POINTER
TAD RININSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD RINREMOVE /COMPARE TO REMOVAL POINTER
SNA /SKIP IF BUFFER NOT FULL
ISZ RINERROR /INDICATE REMOTE LINE INPUT ERROR
SKP /SKIP IF NO OVERFLOW
JMP .-2 /ENSURE ERROR IS SET
TAD [BUFSIZE^3%4] /SUBTRACT 1/4 BUFFER'S WORTH
AND [BUFSIZE^3%4] /JUST 3/4 BUFFER BITS
SNA CLA /SKIP IF NOT 3/4 FULL
TAD FLOWFLAG /ELSE CHECK IF FLOW CONTROL IS ENABLED
SNA CLA /SKIP IF 3/4 FULL AND FLOW CONTROL IS ENABLED
JMP I RINUPDATE /JUST RETURN
TAD RINWAIT /GET INPUT WAIT FLAG
SNA CLA /SKIP IF ALREADY SET
ISZ RINWAIT /SET TO <^S> STATE
JMP I RINUPDATE /RETURN
/ REMOTE LINE GET A CHARACTER ROUTINE. /047 CJL
/ CALLING SEQUENCE:
/ JMS I (RINGET) /CALL ROUTINE
/ CHARACTER AVAILABLE /RETURNS HERE WITH LATEST CHARACTER
/ NO CHARACTER AVAILABLE /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL
/ NORMAL RETURN HAS LATEST CHARACTER IN AC.
/ SKIP RETURN HAS CLEAR AC.
/ IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN.
RINGET, .-. /REMOTE LINE GET A CHARACTER ROUTINE
RINTEST,TAD INFLAG /IS INPUT AVAILABLE?
RINGT0, SNA CLA /SKIP IF SO
RINREAD,JMP RINGNONE /JUMP IF NOT
RINGT1, DCA INFLAG /CLEAR AVAILABILITY FLAG
RINGT2, IRB /READ IN THE CHARACTER
/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
/ ARE FOR KL8 INTERFACES.
*RINTEST /OVERLAY DECMATE II CODE
RINTEST,RKSFIOT /FLAG UP?
RINGT0, JMP RINGNONE /NO, TAKE SKIP RETURN
RINREAD,RKRBIOT /YES, READ THE CHARACTER
RINGT1, SKP /NO ERRORS ON DECMATE I
/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*RINGT1 /OVERLAY DECMATE I CODE
RINGT1, SPA /SKIP IF NO UART ERRORS
RING2, ISZ RINERROR /INDICATE REMOTE LINE INPUT ERROR
SKP /SKIP IF NOT TOO MANY ERRORS
JMP .-2 /ENSURE REMOTE LINE INPUT ERROR IS INDICATED
AND [377] /JUST EIGHT-BIT
DCA RINTEMP /SAVE FOR NOW
TAD FLOWFLAG /GET FLOW CONTROL FLAG
SNA CLA /SKIP IF SET
JMP RINGEXIT /JUMP IF NOT
TAD RINTEMP /GET THE CHARACTER
AND [177] /JUST SEVEN-BIT
TAD [-CNTRLS] /COMPARE TO <^S>
SNA /SKIP IF OTHER
JMP RWATSET /JUMP IF IT MATCHES
TAD [-CNTRLQ+CNTRLS]/COMPARE TO <^S>
SNA CLA /SKIP IF OTHER
JMP RWATCLEAR /JUMP IF IT MATCHES
RINGEXI,TAD RINTEMP /GET THE CHARACTER
JMP I RINGET /TAKE IMMEDIATE RETURN
/ COMES HERE ON <^S> TO SET OUTPUT WAIT.
RWATSET,NL4000 /SET WAIT VALUE
/ COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT.
RWATCLE,DCA REMWAIT /STORE NEW STATE
RINGNON,ISZ RINGET /BUMP RETURN ADDRESS
JMP I RINGET /TAKE SKIP RETURN
/ REMOTE LINE RESET ROUTINE. /026 CJL
/ CALLING SEQUENCE:
/ JMS I (REMRESET) /CALL ROUTINE
/ RETURN /RETURN WITH CLEAR AC
/ RETURNS WITH CLEAR AC AND ALL REMOTE LINE VARIABLES RESET.
REMRESE,.-. /REMOTE LINE RESET ROUTINE
TAD [REMBUFFER] /SETUP THE REMOTE LINE
DCA REMINSERT /OUTPUT INSERTION POINTER
TAD [REMBUFFER] /SETUP THE REMOTE LINE
DCA REMREMOVE /OUTPUT REMOVAL POINTER
TAD (RINBUFFER) /SETUP THE REMOTE LINE
DCA RININSERT /INPUT INSERTION POINTER
TAD (RINBUFFER) /SETUP THE REMOTE LINE
DCA RINREMOVE /INPUT REMOVAL POINTER
DCA REMWAIT /CLEAR REMOTE OUTPUT WAIT
DCA RINWAIT /CLEAR REMOTE INPUT WAIT
DCA RINERROR /CLEAR REMOTE INPUT ERROR
JMP I REMRESET /RETURN
RININSE,.-. /REMOTE INPUT INSERTION POINTER
RINREMO,.-. /REMOTE INPUT REMOVAL POINTER
RINTEMP,.-. /REMOTE INPUT TEMPORARY /047 CJL
PAGE
/ REMOTE LINE OUTPUT ROUTINE.
/ CALLING SEQUENCE:
/ TAD CHAR /CHARACTER TO OUTPUT IN AC
/ JMS I (REMOUT) /CALL ROUTINE
/ RETURN /RETURNS HERE WITH CLEAR AC
REMOUT, .-. /REMOTE LINE OUTPUT ROUTINE
DCA REMTEMP /SAVE PASSED VALUE
TAD REMINSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD REMREMOVE /COMPARE TO REMOVAL POINTER
TAD REMWAIT /ADD ON WAIT STATUS
SZA CLA /SKIP IF BUFFER EMPTY AND NOT WAITING /047 CJL
JMP RSTUFF /JUMP IF CHARACTER MUST BE BUFFERED
TAD REMTEMP /GET PASSED VALUE /047 CJL
JMS I (REMPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
JMP RSTUFF /COULDN'T OUTPUT IT, SO BUFFER IT /047 CJL
JMP I REMOUT /RETURN
RSTUFF, TAD REMTEMP /GET THE CHARACTER
CDF BUFFLD /GOTO BUFFER FIELD
DCA I REMINSERT /STORE IN BUFFER
CDF PRGFLD /BACK TO OUR FIELD
NL0001 /SET BUFFER INCREMENT
TAD REMINSERT /BUMP INSERTION POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD [REMBUFFER] /MAKE IT ABSOLUTE
DCA REMINSERT /STORE UPDATED POINTER
JMP I REMOUT /RETURN
/ REMOTE LINE OUTPUT TEST ROUTINE.
/ CALLING SEQUENCE:
/ JMS I (REMTEST) /CALL ROUTINE
/ NOT READY /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER
/ READY /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW
/ AC WILL BE CLEARED AFTER THE CALL.
REMTEST,.-. /REMOTE LINE OUTPUT TEST ROUTINE
NL0001 /SET BUFFER INCREMENT
TAD REMINSERT /GET INSERTION POINTER
CIA /INVERT FOR TEST
TAD REMREMOVE /COMPARE TO REMOVAL POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
SZA CLA /SKIP IF BUFFER IS FULL
ISZ REMTEST /BUMP RETURN IF BUFFER IS NOT FULL
JMP I REMTEST /RETURN EITHER WAY
/ REMOTE LINE OUTPUT BUFFER UPDATE ROUTINE.
/ CALLING SEQUENCE:
/ JMS I (REMUPDATE) /CALL ROUTINE
/ RETURN /RETURN WITH CLEAR AC
/ THE REMOTE LINE OUTPUT BUFFERING ROUTINES WILL UPDATE POINTERS, ETC. IF ANY
/ STATUS HAS CHANGED SINCE THE LAST CALL.
REMUPDA,.-. /REMOTE LINE OUTPUT UPDATE ROUTINE
TAD RINWAIT /GET INPUT WAIT FLAG
CLL RAL /MAIN STATE BIT TO LINK
SNA CLA /SKIP IF OUTPUT FLOW CHARACTER NEEDED /047 CJL
JMP REMCHECK /JUMP IF CHARACTER NOT NEEDED NOW /047 CJL
TAD (CNTRLQ) /ASSUME RELEASE CHARACTER NEEDED /047 CJL
SNL /SKIP IF SO /047 CJL
TAD [CNTRLS-CNTRLQ] /ELSE CHANGE IT TO HOLD CHARACTER /047 CJL
JMS I (REMPUT) /TRY TO OUTPUT IT NOW /047 CJL
JMP REMCHECK /COULDN'T DO IT, FORGET IT FOR NOW /047 CJL
CML RAR /SET NEW STATE VALUE /047 CJL
DCA RINWAIT /STORE IT
REMCHEC,TAD REMWAIT /GET OUTPUT WAIT FLAG
SZA CLA /SKIP IF NOT WAITING
JMP I REMUPDATE /JUST RETURN IF WAITING
TAD REMINSERT /GET OUTPUT INSERTION POINTER
CIA /INVERT FOR TEST
TAD REMREMOVE /COMPARE TO OUTPUT REMOVAL POINTER
SNA CLA /SKIP IF BUFFER CONTAINS SOMETHING /047 CJL
JMP I REMUPDATE /RETURN IF BUFFER EMPTY /047 CJL
CDF BUFFLD /GOTO BUFFER FIELD
TAD I REMREMOVE /GET A CHARACTER FROM THE BUFFER
CDF PRGFLD /BACK TO OUR FIELD
JMS I (REMPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
JMP I REMUPDATE /COULDN'T DO IT, SO JUST RETURN /047 CJL
NL0001 /SET BUFFER INCREMENT
TAD REMREMOVE /BUMP REMOVAL POINTER
AND [BUFSIZE-1] /JUST BUFFER BITS
TAD [REMBUFFER] /MAKE IT ABSOLUTE
DCA REMREMOVE /STORE UPDATED POINTER
JMP I REMUPDATE /RETURN
REMTEMP=REMUPDATE /REMOTE OUTPUT TEMPORARY
/ LOW-LEVEL CONSOLE OUTPUT ROUTINE. /047 CJL
/ CALLING SEQUENCE:
/ [CHARACTER TO OUTPUT IN THE AC]
/ JMS I (CONPUT) /CALL ROUTINE
/ NO OUTPUT /RETURNS HERE IF OUTPUT UNAVAILABLE
/ OUTPUT /RETURNS HERE IF CHARACTER WAS OUTPUT
CONPUT, .-. /CONSOLE OUTPUT ROUTINE
CONTSF, TSFIOT /FLAG UP?
JMP CONCLEAR /NO, FORGET IT
CONTLS, TLSIOT /YES, OUTPUT THE CHARACTER NOW
ISZ CONPUT /TAKE SKIP RETURN
CONCLEA,CLA /CLEAN UP
JMP I CONPUT /RETURN EITHER WAY
/ CONSOLE RESET ROUTINE. /026 CJL
/ CALLING SEQUENCE:
/ JMS I (CONRESET) /CALL ROUTINE
/ RETURN /RETURN WITH CLEAR AC
/ RETURNS WITH CLEAR AC AND ALL CONSOLE VARIABLES RESET.
CONRESE,.-. /CONSOLE RESET ROUTINE
TAD [CONBUFFER] /SETUP THE
DCA I (CONINSERT) /CONSOLE OUTPUT INSERTION POINTER
TAD [CONBUFFER] /SETUP THE
DCA I (CONREMOVE) /CONSOLE OUTPUT REMOVAL POINTER
TAD [KEYBUFFER] /SETUP THE
DCA I (KEYINSERT) /KEYBOARD INSERTION POINTER
TAD [KEYBUFFER] /SETUP THE
DCA I (KEYREMOVE) /KEYBOARD REMOVAL POINTER
DCA I (CONWAIT) /CLEAR OUTPUT WAIT
DCA KEYERROR /CLEAR KEYBOARD ERROR
JMP I CONRESET /RETURN
/ LOW-LEVEL REMOTE LINE OUTPUT ROUTINE. /047 CJL
/ CALLING SEQUENCE:
/ [CHARACTER TO OUTPUT IN THE AC]
/ JMS I (REMPUT) /CALL ROUTINE
/ NO OUTPUT /RETURNS HERE IF OUTPUT UNAVAILABLE
/ OUTPUT /RETURNS HERE IF CHARACTER WAS OUTPUT
REMPUT, .-. /REMOTE LINE OUTPUT ROUTINE
DM1AN2, AND [377] /ENSURE EIGHT BIT /049 CJL
/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
/ FOR KL8 INTERFACES.
*DM1AN2 /OVERLAY DECMATE II CODE /049 CJL
DM1AN2, SKP /WE'RE NOT A DECMATE I /049 CJL
TAD [400] /SET WRITE BIT /049 CJL
REMTSF, DCA RMPTEMP /SAVE PASSED VALUE
RMPUT0, TAD OUTFLAG /CHECK IF OUTPUT IS AVAILABLE
REMTLS, SNA CLA /SKIP IF SO
RMPUT1, JMP I REMPUT /RETURN IF NOT
REMCLEA,TAD RMPTEMP /GET THE PASSED VALUE
RMPUT2, OLS /OUTPUT THE CHARACTER NOW
/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
/ ARE FOR KL8 INTERFACES.
*REMTSF /OVERLAY DECMATE II CODE
REMTSF, RTSFIOT /FLAG UP?
RMPUT0, JMP REMCLEAR /NO, FORGET IT
REMTLS, RTLSIOT /YES, OUTPUT THE CHARACTER NOW
RMPUT1, ISZ REMPUT /TAKE SKIP RETURN
REMCLEA,CLA /CLEAN UP
RMPUT2, JMP I REMPUT /RETURN EITHER WAY
CLA /CLEAN UP
DCA OUTFLAG /INDICATE OUTPUT IS UNAVAILABLE
ISZ REMPUT /TAKE SKIP RETURN
JMP I REMPUT /RETURN TO CALLER
RMPTEMP=CONRESET /REMOTE OUTPUT TEMPORARY
PAGE
/ SEVEN-BIT COMMAND TABLES. /034 CJL
CMDTBL= . /COMMAND TABLE HERE
"C&177; "O&177; "N&177 /\
"N&177; "E&177; "C&177 / >CONNECT COMMAND
"T&177; -1 //
CONSRV /CONNECT ROUTINE ADDRESS
"F&177; "I&177; "N&177 /\
"I&177; "S&177; "H&177 / >FINISH COMMAND
-1 //
FINSRV /FINISH ROUTINE ADDRESS
"E&177; "X&177; "I&177 /EXIT
"T&177; -1 /COMMAND
EXITKERMIT /EXIT ROUTINE ADDRESS
"S&177; "E&177; "N&177 /SEND
"D&177; -1 /COMMAND
SNDSRV /SEND ROUTINE ADDRESS
"G&177; "E&177; "T&177 /GET
-1 /COMMAND
GETSRV /GET ROUTINE ADDRESS
"R&177; "E&177; "C&177 /\
"E&177; "I&177; "V&177 / >RECEIVE COMMAND
"E&177; -1 //
RECSRV /RECEIVE ROUTINE ADDRESS
"H&177; "E&177; "L&177 /HELP
"P&177; -1 /COMMAND
HELPSRV /HELP ROUTINE ADDRESS
-1 /THIS ENDS THE TABLE /034 CJL
/ REMOTE PACKET INPUT BUFFER. /014 CJL
RRBUF, 0 /MARK
RRLEN, 0 /PACKET LENGTH
RRSEQ, 0 /PACKET SEQ
RRTYP, 0 /PACKET TYPE
DECIMAL
RRDTA, ZBLOCK 91 /DATA GOES HERE
OCTAL
RTERMI, 0 /ADD LOCATION WHERE TERMINATOR IS STORED/A004
/ON RECEIVE IF BUFFER IS MAXIMUM LENGTH /A004
/ REMOTE PACKET OUTPUT BUFFER
RSBUF, CNTRLA /PACKET BUFFER (BEGINS WITH "SOH") /034 CJL
RSLEN, 0 /PACKET LENGTH GOES HERE
RSSEQ, 0 /PACKET SEQUENCE GOES HERE
RSTYP, 0 /PACKET TYPE GOES HERE
DECIMAL
RSDTA, ZBLOCK 91 /DATA GOES HERE
0 /CHECKSUM HERE ON MAX PACKET
0 /EOL (IF USED HERE ON MAX PACKET)
0 /INTERNAL TERMINATOR HERE ON MAX PACKET
OCTAL
/ SEND-INIT PACKET DEFINITION
INIDAT, DECIMAL
94+32 /94 CHARS MAX
OCTAL
"/&177 /15 SECOND TIME-OUT /M013/014 CJL
" &177 /NO PADDING
0+100&177 /NO PADDING CHAR
" &177+15 /CR FOR EOL
"#&177 /QUOTE CHAR
"N&137 /NO 8TH BIT QUOTING
"1&177 /CHECK TYPE 1
" &177 /NO REPEAT CHAR
" &177+0 /NO EXTRA CAPABILITY
NODATA, -1 /END OF DATA (USE THIS FOR SENDING NO-DATA)
PAGE /GET TO NEXT PAGE /028 CJL
/ NO-INTERRUPT CONSOLE INPUT/OUTPUT SUPPORT ROUTINES. /023 CJL
/ MODIFIED FOR FORCED-ECHO AND COLUMN-COUNTING. /043 CJL
/ CONSOLE INPUT ROUTINE. RETURNS LATEST CHARACTER WITHOUT ECHOING. MAY BE
/ CALLED WITH DIRTY AC. RETURNS LATEST SEVEN-BIT CHARACTER TYPED WHILE FIELDING
/ POTENTIAL <^S>/<^Q> PROTOCOL.
INPUT, .-. /CONSOLE INPUT ROUTINE
INPWAIT,JMS CHKUP /TRY TO GET A CHARACTER
TAD INCHAR /GET THE CHARACTER
SNA /SKIP IF ANYTHING CAME IN
JMP INPWAIT /WAIT FOR ANYTHING
JMP I INPUT /RETURN WITH LATEST CHARACTER
/ CONSOLE OUTPUT ROUTINE. OUTPUTS CHARACTER IN AC (INCLUDING <HT> VIA
/ SIMULATION). RETURNS WITH CLEAR AC. SUBJECT TO CONSOLE ECHO STATUS (ECHOSW).
P7CH, .-. /CONSOLE OUTPUT ROUTINE
TAD (-CNTRLI) /COMPARE TO <HT>
SNA /SKIP IF OTHER
JMP DOTAB /JUMP IF <HT>
TAD L11/(CNTRLI) /RESTORE THE CHARACTER
JMS P7CHAR /PRINT IT (UPDATING COLUMN COUNT)
JMP I P7CH /RETURN
DOTAB, TAD [" &177] /GET A <SPACE>
JMS P7CHAR /OUTPUT IT
TAD COLUMN /GET CURRENT COLUMN COUNT
AND [7] /JUST TAB BITS
SZA CLA /SKIP IF NOW AT NEW TAB STOP
JMP DOTAB /ELSE KEEP GOING
JMP I P7CH /RETURN
/ FORCED-ECHO CONSOLE OUTPUT ROUTINE. SAME AS P7CH BUT CLEARS ECHOSW BEFORE
/ OUTPUT OF THE CHARACTER.
P7ECHO, .-. /CONSOLE OUTPUT WITH FORCED-ECHO ROUTINE
DCA P7TEMP /SAVE PASSED VALUE
DCA ECHOSW /CLEAR ECHO STATUS
TAD P7TEMP /RESTORE THE CHARACTER
JMS P7CH /CALL MAIN ROUTINE
JMP I P7ECHO /RETURN
CHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE
JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE
SNA /SKIP IF ANYTHING CAME BACK
JMP CHKCLR /ELSE FORGET IT
TAD (-CNTRLP) /COMPARE TO <^P>
SNA /SKIP IF OTHER
JMP DOUP /GO HANDLE <^P> THERE
IAC /TAD (-CNTRLO+CNTRLP)/COMPARE TO <^O>
SNA /SKIP IF OTHER
JMP DOUO /GO HANDLER <^O> THERE
TAD (-CNTRLS+CNTRLO) /COMPARE TO <^S>
SZA CLA /SKIP IF IT MATCHES
JMP I CHKUP /RETURN ON UNIMPORTANT CHARACTERS
UQWAIT, JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE
TAD (-CNTRLQ) /COMPARE TO <^Q>
SZA CLA /SKIP IF IT MATCHES
JMP UQWAIT /ELSE WAIT FOR <^Q> FOREVER
CHKCLR, DCA INCHAR /OBLITERATE INPUT CHARACTER
JMP I CHKUP /RETURN
/ COMES HERE TO HANDLE <^P>.
DOUP, TAD ("P&177) /GET A "P"
JMS UPRINT /PRINT "^P"
JMP I UPADDRESS /GO WHERE YOU SHOULD
/ COMES HERE TO HANDLE <^O>.
DOUO, TAD ("O&177) /GET AN "O"
JMS UPRINT /PRINT "^O"
NL4000 /SET REVERSING BIT
TAD ECHOSW /REVERSE THE ECHO STATE
DCA ECHOSW /STORE BACK
JMP CHKCLR /OBLITERATE <^O> AND RETURN
CTLCTST,.-. /LOW-LEVEL <^C> TEST ROUTINE
CLA /CLEAN UP
KSFLOC, KSFIOT /FLAG UP?
JMP I CTLCTST /NO, JUST RETURN
KRSZAP, KRSIOT /**** 6120 **** KRBIOT
AND [177] /JUST SEVEN-BIT
DCA INCHAR /SAVE THE CHARACTER
NL7775 /SET -<^C> VALUE
TAD INCHAR /COMPARE TO CHARACTER
SNA CLA /SKIP IF OTHER THAN <^C>
JMP I UCADDRESS /JUMP IF <^C>
KCCZAP, KCCIOT /**** 6120 **** 0000
TAD INCHAR /GET THE CHARACTER
JMP I CTLCTST /RETURN
P7CHAR, .-. /LOWER-LEVEL CONSOLE PRINT ROUTINE
DCA P7TEMP /SAVE PASSED VALUE
P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC.
TAD ECHOSW /GET CURRENT ECHO STATUS
SPA CLA /SKIP IF ECHO ON
JMP P7OFF /JUMP IF ECHO OFF
TAD P7TEMP /GET THE PASSED VALUE BACK
JMS P7OUT /TRY TO OUTPUT IT
JMP P7AGN /COULDN'T OUTPUT, GO WAIT THERE
P7OFF, JMS CHKUP /CHECK FOR <^C>, ETC.
TAD P7TEMP /GET THE CHARACTER BACK
AND [140] /JUST QUADRANT BITS
SZA CLA /SKIP IF CONTROL CHARACTER
ISZ COLUMN /BUMP COLUMN IF PRINTING CHARACTER
L11, CNTRLI/NOP /JUST IN CASE
TAD P7TEMP /GET THE CHARACTER AGAIN
TAD (-CNTRLM) /COMPARE TO <CR>
SNA /SKIP IF NOT <CR>
DCA COLUMN /CLEAR COLUMN COUNT ON <CR>
TAD (-CNTRLH+CNTRLM)/COMPARE TO <BS>
SNA CLA /SKIP IF OTHER
NL7777 /SET BACKUP VALUE
TAD COLUMN /UPDATE COLUMN COUNT
DCA COLUMN /STORE BACK
JMP I P7CHAR /RETURN
P7OUT, .-. /LOW-LEVEL CONSOLE OUTPUT ROUTINE
P7TSF, TSFIOT /FLAG UP?
JMP I P7OUT /NO, TAKE IMMEDIATE RETURN WITH AC INTACT
P7TLS, TLSIOT /YES, OUTPUT IT
CLA /CLEAN UP
ISZ P7OUT /BUMP RETURN ADDRESS
JMP I P7OUT /TAKE SKIP RETURN TO CALLER
/ COMES HERE TO HANDLE <^C> IF SO ENABLED.
UPCPRT, TAD ("C&177) /GET A "C"
JMS UPRINT /PRINT "^C"
KCCZP2, KCCIOT /**** 6120 **** 0000
JMP I [CLOOP] /RESTART
UPRINT, .-. /"^"<CHARACTER> PRINTING ROUTINE
DCA P7TEMP /SAVE PASSED VALUE
TAD ("^&177) /GET AN "^"
JMS P7OUT /OUTPUT IT
JMP .-1 /WAIT FOR IT
TAD P7TEMP /GET PASSED VALUE
JMS P7OUT /OUTPUT IT
JMP .-1 /WAIT FOR IT
JMP I UPRINT /RETURN
P7TEMP, .-. /OUTPUT ROUTINE TEMPORARY
PAGE
/ HANDLER I/O BUFFER DEFINITIONS. /014 CJL
HNDLR= . /BUFFER FOR DISK I/O HANDLER /014 CJL
*PAGCNT^200+HNDLR /RESET ORIGIN PAST HANDLER BUFFER /014 CJL
IFNZRO SBOOT-.&4000 <ERROR .> /028 CJL
*SBOOT-1 /JUST BEFORE EXIT ADDRESS /025 CJL
EXITKER=. /WHERE TO EXIT TO /025 CJL
/ ONCE-ONLY INITIALIZATION CODE. /024 CJL
*HNDLR /OVER AVAILABLE SPACE
INITIAL,CLA CLL /CLEAN UP
COUTINI,TLSIOT /RAISE CONSOLE OUTPUT FLAG /046 CJL
TAD INITIA/(CLA CLL)/GET REPLACEMENT INSTRUCTION
DCA I [CLOOP] /DON'T COME BACK TO US
JMS I (MACHINE) /IDENTIFY CPU TYPE
DCA CPUTEMP /SAVE IT
TAD CPUTEMP /GET CPU TYPE
TAD (-13) /COMPARE TO DEADLY 6120 VALUE
SNA CLA /SKIP IF OTHER
JMP INI6120 /JUMP IF IT MATCHES
ROUTINI,RTLSIOT /INITIALIZE REMOTE OUTPUT /046 CJL
RININIT,RKRBIOT /INITIALIZE REMOTE INPUT /046 CJL
CLA /CLEAN UP
INITPRT,JMS I [SCRIBE] /GIVE THEM THE
INITMSG /OPENING MESSAGE
JMS I [SCRIBE] /GIVE THEM THE
DAYMSG /DAY MESSAGE
JMS I [SCRIBE] /GIVE THEM THE
MONMSG /MONTH MESSAGE
JMS I [SCRIBE] /GIVE THEM THE
YEARMSG /YEAR MESSAGE
JMS I [SCRIBE] /GIVE THEM THE
CPUTMSG /CPU ID MESSAGE
TAD CPUTEMP /*1
CLL RTL /*4
TAD CPUTEMP /*5
TAD (CPULIST) /POINT TO PROPER MESSAGE
DCA TST6120 /STORE IN-LINE
JMS I [SCRIBE] /TELL THEM THEIR
TST6120,0 /ACTUAL CPU ID
JMS I [SCRIBE] /GIVE THEM THE
CLOSMSG /CLOSING MESSAGE
DMPRZAP,JMP .+3 /**** DECMATE USAGE DETECTED **** 0000
JMS I [SCRIBE] /GIVE THEM THE
SPZAP, DMPOMSG /DECMATE PORT MESSAGE
JMS I [SCRIBE] /GIVE THEM THE
CRLF /END OF LINE
JMS I [SCRIBE] /GIVE THEM THE
LCLMSG /LOCAL PREFERENCE MESSAGE
JMS I [SCRIBE] /TELL THEM THEY CAN
THLPMSG /ASK FOR HELP
TAD CPUTEMP /GET CPU TYPE
CLL RTL /*4
TAD (CPUPRMPT-1) /POINT TO PROPER ENTRY
DCA XR0 /STASH THE POINTER
TAD (-4) /GET MOVE COUNT
JMS MESMOVE /MOVE THE PROPER PROMPT TEXT
PROMID-1 /TO THERE
TAD CPUTEMP /*1
CLL RTL /*4
TAD CPUTEMP /*5
TAD (CPUIDLST-1) /POINT TO PROPER ENTRY
DCA XR0 /STASH THE POINTER
TAD (-5) /GET MOVE COUNT
JMS MESMOVE /MOVE THE PROPER CPU ID TEXT
CPUMSG-1 /TO THERE
CIF USRFLD /GOTO USR FIELD /035 CJL
JMS I (USR) /CALL USER SERVICE ROUTINE /035 CJL
USRIN /LOCK USR IN /035 CJL
/ DO FURTHER INITIALIZATION HERE.
JMP I [CLOOP] /GO BACK TO KERMIT PROPER
/ COMES HERE TO INITIALIZE 6120-BASED MACHINES. /046 CJL
INI6120,DCA I (KCCZAP) /ELIMINATE KCCIOT
DCA I (KCCZP2) /ELIMINATE KCCIOT
ISZ I (KRSZAP) /TURN KRSIOT
ISZ I (KRSZAP) /INTO KRBIOT
TAD ROUTINITIALIZE /GET OUTPUT INITIALIZE INSTRUCTION /046 CJL
TAD (-6336) /COMPARE TO POSSIBLE VALUE /046 CJL
SZA CLA /SKIP IF IT MATCHES SERIAL PRINTER VALUE/046 CJL
JMP TRYDM1 /JUMP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL
TAD RININITIALIZE /GET INPUT INITIALIZE INSTRUCTION /046 CJL
TAD (-6326) /COMPARE TO POSSIBLE VALUE /046 CJL
SNA CLA /SKIP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL
JMP DMSER /JUMP IF SERIAL PORT CONFIGURATION /046 CJL
TRYDM1, CLSK /SKIP ON, CLEAR CLOCK FLAG IF DECMATE II/046 CJL
NOP /JUST IN CASE /046 CJL
CLCL /CLEAR VT278 CLOCK FLAG /046 CJL
NOP /JUST IN CASE /046 CJL
ISZ TST6120 /WASTE /046 CJL
JMP .-1 /SOME TIME /046 CJL
CLSK8A /VT278 CLOCK FLAG UP? /046 CJL
JMP TRYDM2 /NO, TRY DECMATE II, ETC. /046 CJL
DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /050 CJL
CIF CDF DMIFLD /GOTO DECMATE ONCE-ONLY CODE FIELD /046 CJL
JMP I (DM1INIT) /CONTINUE THERE /046 CJL
TRYDM2, CLSK /CLOCK FLAG UP? /046 CJL
JMP ROUTINITIALIZE /NO, MUST BE SOMEBODY ELSE! /046 CJL
DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /048 CJL
CIF CDF DMIFLD /GOTO DECMATE ONCE-ONLY FIELD /046 CJL
JMP I (DM2INIT) /CONTINUE THERE /046 CJL
/ COMES HERE IF SERIAL PORT CONFIGURATION ON DECMATE.
DMSER, DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /048 CJL
TAD (DMPPMSG) /GET OUR MESSAGE ADDRESS /048 CJL
DCA SPZAP /STORE IN-LINE /048 CJL
JMP ROUTINITIALIZE /CONTINUE THERE
MESMOVE,.-. /MESSAGE MOVE ROUTINE
DCA MMOVCNT /SAVE PASSED COUNT
TAD I MESMOVE /GET THE PASSED ARGUMENT
DCA XR1 /SET IT UP
ISZ MESMOVE /BUMP PAST ARGUMENT
CDF MSGFLD /GOTO BUFFER FIELD
MESMVLP,TAD I XR0 /GET A WORD
DCA I XR1 /PUT A WORD
ISZ MMOVCNT /DONE YET?
JMP MESMVLP /NO, GO BACK
CDF PRGFLD /BACK TO OUR FIELD
JMP I MESMOVE /YES, RETURN
CPUTEMP,.-. /TEMPORARY FOR MACHINE TYPE
MMOVCNT,.-. /TEMPORARY FOR MOVE COUNT
PAGE
/ CPU IDENTIFYING ROUTINE. /024 CJL
/ RETURNS VALUE IN AC ACCORDING TO THE FOLLOWING RULE:
/ AC CPU TYPE
/ 0 UNKNOWN (DCC112, MP-12?)
/ 1 PDP-5 (THE INCOMPATIBLE ONE!)
/ 2 PDP-8 (THE REAL ONE!)
/ 3 PDP-8/S (THE SLOW ONE!)
/ 4 LINC-8 (THE STRANGE ONE!)
/ 5 PDP-8/I (THE ORANGE ONE!)
/ 6 PDP-8/L (THE STRIPPED-DOWN ONE!)
/ 7 PDP-12 (THE GREEN ONE! (BLUE?))
/ 10 PDP-8/E (THE FAST ONE!)
/ 11 PDP-8/A (THE WIDE ONE!)
/ 12 6100 (THE MICRO ONE!)
/ 13 6120 (THE HARRIS ONE!)
MACHINE,.-. /MACHINE IDENTIFYING ROUTINE
CLA CLL /THIS WORKS ON EVERYBODY!
TAD 0 /GET PDP-5 PC
DCA MACHTEMP /SAVE IT
TAD (IMA5-1) /GET PDP-5 NEW PC
DCA 0 /STORE IT
/ IF WE GET HERE, WE'RE NOT A PDP-5.
TAD MACHTEMP /GET OLD LOCATION ZERO
DCA 0 /RESTORE IT
NL3776 /PDP-8/I, L WEIRDNESS
TAD (-3776) /COMPARE TO POSSIBLE VALUE
SNA CLA /SKIP IF NOT THOSE TWO
JMP IMA8IL /JUMP IF ONE OF THEM
/ IF WE GET HERE, WE'RE NOT A PDP-8/I OR PDP-8/L.
NL7776 /SETUP -2
TAD (-7776) /COMPARE TO EXPECTED VALUE
SZA CLA /SKIP IF OK
JMP IMA8S /JUMP IF RETARDED BROTHER
/ IF WE GET HERE, WE'RE NOT A PDP-8/S.
NL0100 /SETUP 0100
TAD (-100) /COMPARE TO EXPECTED VALUE
SNA CLA /SKIP IF STRAIGHT PDP-8
JMP IMAOMNIBUS /JUMP IF NEWER CPU
/ IF WE GET HERE, WE ARE A PDP-8, BUT ARE WE A LINC-8?
NL7777 /SETUP LINC TEST VALUE
IACA /LOAD LINC "A" REGISTER
CLA /CLEAN UP
IAAC /GET IT BACK
IAC /ADD ONE
SNA CLA /SKIP IF NO LINC HARDWARE
JMP IMAL8 /JUMP IF LINC-8
/ SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE A PDP-8.
JMP IMA8 /GO TELL THEM WE ARE A PDP-8
/ COMES HERE IF PDP-8/I OR PDP-8/L.
IMA8IL, NL7777 /SETUP TEST VALUE
CLA!401 /DO PDP-8/I GROUP THREE EAE CLA
SZA CLA /SKIP IF PDP-8/I
JMP IMA8L /JUMP IF NOT
/ IF WE GET HERE, WE ARE A PDP-8/I, BUT ARE WE A PDP-12?
LINC /GOTO LINC MODE
COM /COMPLEMENT AC IF PDP-12, ELSE A HARMLESS AND
PDP /GOTO PDP8 MODE IF PDP-12, ELSE HARMLESS AND
IAC /ADD ONE FOR TEST
SNA CLA /SKIP IF JUST PDP-8/I
JMP IMA12 /JUMP IF ACTUALLY A LINC-8/I
/ SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE JUST A PDP-8/I.
JMP IMA8I /TELL THEM WE ARE A PDP-8/I
IMAOMNI,RTL RTR /DO STRANGE OMNIBUS INSTRUCTION
PC8A, SNA /SKIP IF NOT A MICRO CHIP
JMP IMA61 /JUMP IF ONE OF THOSE THINGS
TAD (.&7600+16^7777) /CHECK FOR PDP-8/E VALUE
SNA /SKIP IF NOT HIM
JMP IMA8E /JUMP IF IT IS A PDP-8/E (/F OR /M OR 8A-6XX)
TAD (.&7600+16-PC8A) /COMPARE TO PDP-8/A VALUE /051 CJL
SNA CLA /SKIP IF SOMEBODY ELSE
JMP IMA8A /JUMP IF IT MATCHES
/ IF WE GET HERE, SOME STRANGE PROCESSOR IS RUNNING US.
JMP IMAUNKNOWN /YOU FIGURE IT OUT!
/ IF WE GET HERE, WE ARE A 6100 OR 6120.
IMA61, NL0010 /DO 6120 SPECIAL INSTRUCTION
TAD (-10) /COMPARE TO EXPECTED VALUE
SNA CLA /SKIP IF OTHER
JMP IMA6120 /JUMP IF IT MATCHES
/ WE APPARENTLY ARE ON A 6100, SO TELL THEM SO.
JMP IMA6100 /TELL THEM WE ARE A 6100 MACHINE (VT-78, ETC.)
/ RETURN GAUNTLET.
IMA6120,IAC /SET 6120 VALUE
IMA6100,IAC /SET 6100 VALUE
IMA8A, IAC /SET PDP-8/A VALUE
IMA8E, IAC /SET PDP-8/E VALUE
IMA12, IAC /SET PDP-12 VALUE
IMA8L, IAC /SET PDP-8/L VALUE
IMA8I, IAC /SET PDP-8/I VALUE
IMAL8, IAC /SET LINC-8 VALUE
IMA8S, IAC /SET PDP-8/S VALUE
IMA8, IAC /SET PDP-8 VALUE
IMA5, IAC /SET PDP-5 VALUE
IMAUNKN,JMP I MACHINE /RETURN
MACHTEM,.-. /TEMPORARY FOR LOCATION ZERO
PAGE
FIELD PRGFLD%10 /DUMP THE LITERALS NOW
/ LAYOUT OF FIELD ONE (PERMANENT CONTENTS). /046 CJL
NOPUNCH /FOOL THE ASSEMBLER /046 CJL
FIELD USRFLD%10 /USR FIELD /046 CJL
*0 /WHERE IT LOADS /046 CJL
USRLOAD,ZBLOCK 200-. /GET TO ENTRY POINT /046 CJL
USRENTR=. /LOCKED-IN USR ENTRY POINT /046 CJL
USRENTR,ZBLOCK 2000-. /USR OWNS REST OF THIS AREA /046 CJL
FILBUFF=. /FILE I/O DONE HERE /046 CJL
FIELD BUFFLD%10 /FILE I/O BUFFER FIELD /046 CJL
*FILBUFFER /RESET ORIGIN /046 CJL
FILBUFF,ZBLOCK PAGCNT^200 /THIS IS THE FILE I/O BUFFER /046 CJL
DIRBUFF=. /DIRECTORY LOOKUP I/O DONE HERE /028 CJL
FIELD DIRFLD%10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL
*DIRBUFFER /RESET ORIGIN /028 CJL
FILECNT,.-. /-(NUMBER OF ENTRIES IN THIS SEGMENT)
FRSTREC,.-. /FIRST RECORD OF FIRST ENTRY IN THIS SEGMENT
DIRLINK,.-. /LINK TO NEXT SEGMENT; 0 IF LAST ACTIVE ONE
.-. /TENTATIVE ENTRY POINTER STORED HERE
AIWNUMB,.-. /-(NUMBER OF ADDITIONAL INFORMATION WORDS)
ENTSTRT=. /FILE ENTRIES START HERE /046 CJL
ZBLOCK PAGCNT^200+DIRBUFFER-. /DIRECTORY ENTRIES HERE /046 CJL
/ CONNECT MODE I/O BUFFERS. /026 CJL
KEYBUFF,ZBLOCK BUFSIZE /KEYBOARD BUFFER /026 CJL
CONBUFF,ZBLOCK BUFSIZE /CONSOLE OUTPUT BUFFER /026 CJL
RINBUFF,ZBLOCK BUFSIZE /REMOTE INPUT BUFFER /026 CJL
REMBUFF,ZBLOCK BUFSIZE /REMOTE OUTPUT BUFFER /026 CJL
FLD1ADR=. /SPACE AVAILABLE FOR TEXT, ETC. /046 CJL
ENPUNCH /UN-FOOL THE ASSEMBLER /046 CJL
/ DECMATE ONCE-ONLY CODE. /046 CJL
FIELD DMIFLD%10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL
*USRLOAD /OVER USR ROUTINE /046 CJL
/ PAGE ZERO FOR ONCE-ONLY CODE. /046 CJL
*10 /GET TO AUTO-INDEX AREA /048 CJL
XR0, .-. /AUTO-INDEX ZERO /048 CJL
*USRENTRY /OVER USR ENTRY POINT /046 CJL
/ DECMATE I ONCE-ONLY CODE. /046 CJL
DM1INIT,JMS I (DM1PORT) /INITIALIZE THE REMOTE PORTS /050 CJL
TAD (DM1LIST-1) /POINT TO REPLACEMENT LIST /050 CJL
JMS REPLACE /ZAP IN ALL OF OUR PATCHES /050 CJL
CDF PRGFLD /GOTO MAIN FIELD /050 CJL
TAD I (DIRXR) /GET PORT SELECTION /050 CJL
SNA CLA /SKIP IF PORT 1 REQUIRED /050 CJL
JMP USEP0 /JUMP IF PORT 0 REQUIRED /050 CJL
TAD (DM1SEC-1) /POINT TO REPLACEMENT LIST /050 CJL
JMS REPLACE /ZAP IN SECONDARY PATCHES /050 CJL
USEP0, CIF CDF PRGFLD /BACK TO REST OF INITIALIZATION /046 CJL
JMP I (INITPRT) /CONTINUE THERE /046 CJL
/ DECMATE II, ETC. ONCE-ONLY CODE. /046 CJL
DM2INIT,JMS I (DMIPORT) /INITIALIZE THE REMOTE PORT /048 CJL
TAD (DM2LIST-1) /POINT TO REPLACEMENT LIST /048 CJL
JMS REPLACE /ZAP IN ALL OF OUR PATCHES /048 CJL
CIF CDF PRGFLD /BACK TO REST OF INITIALIZATION /046 CJL
JMP I (INITPRT) /CONTINUE THERE /046 CJL
REPLACE,.-. /REPLACEMENT ROUTINE /048 CJL
DCA XR0 /SAVE PASSED LIST POINTER /048 CJL
REPLUP, CDF DMIFLD /BACK TO OUR FIELD /048 CJL
TAD I XR0 /GET AN ADDRESS /048 CJL
SNA /SKIP IF NOT AT END OF LIST /048 CJL
JMP I REPLACE /RETURN IF END OF LIST /048 CJL
DCA REPADR /STASH THE ADDRESS /048 CJL
TAD I XR0 /GET THE REPLACEMENT VALUE /048 CJL
CDF PRGFLD /GOTO ZAPPING FIELD /048 CJL
DCA I REPADR /ZAP IT IN /048 CJL
JMP REPLUP /KEEP GOING /048 CJL
REPADR, .-. /REPLACEMENT ADDRESS TEMPORARY /048 CJL
/ DECMATE I PORT INITIALIZE ROUTINE /050 CJL
DM1PORT,.-. /DECMATE I PORT INITIALIZE ROUTINE
TAD (234) /GET PORT 0 SCD ENABLE VALUE
WCON0 /WRITE PORT 0 CONTROL REGISTER
NL0000 /INDICATE PORT 0
JMS PRTINIT /INITIALIZE PORT 0
/ CHANGE ALL IOTS TO PORT 1 VALUES.
IOCLUP, ISZ PSETF1 /BUMP SET FLAG INSTRUCTION
ISZ PDUMRD /BUMP DUMMY READ INSTRUCTION
ISZ PSETF2 /BUMP SET FLAG INSTRUCTION
ISZ PSKIP /BUMP SKIP ON FLAG INSTRUCTION
ISZ PLOAD /BUMP LOAD INSTRUCTION
ISZ IOTCNT /DONE YET?
JMP IOCLUP /NO, KEEP GOING
TAD (234) /GET PORT 1 SCD ENABLE VALUE
WCON1 /WRITE PORT 1 CONTROL REGISTER
NL4000 /INDICATE PORT 1
JMS PRTINIT /INITIALIZE PORT 1
JMP I DM1PORT /RETURN
PRTINIT,.-. /LOW-LEVEL PORT INTIALIZE ROUTINE
RACD /RESET DESIRED PORT
ISZ PWASTE /WASTE
JMP .-1 /SOME TIME
CLA /CLEAN UP
PSETF1, RTFL0 /SET THE FLAG NOW
TAD (2516) /SETUP FOR 8 BITS, NO PARITY, ETC.
JMS PSEND /SEND TO MODE REGISTER 1
CDF PRGFLD /GOTO MAIN FIELD
TAD I (RATE) /GET BAUD RATE NOW
CDF DMIFLD /BACK TO OUR FIELD
TAD (2460) /ADD ON CLOCK ENABLES, ETC.
JMS PSEND /SEND TO MODE REGISTER 2
TAD (3425) /GET ENABLE AND RESET VALUE
JMS PSEND /SEND TO COMMAND REGISTER
PDUMRD, RKRB0 /DO A DUMMY READ NOW
PSETF2, RTFL0 /SET THE FLAG NOW
CLA /CLEAN UP
JMP I PRTINIT /RETURN
PSEND, .-. /PORT WRITE ROUTINE
PSKIP, RTSF0 /FLAG UP?
JMP PSKIP /NO, WAIT FOR IT
PLOAD, RTLS0 /YES, LOAD THE VALUE
CLA /CLEAN UP
JMP I PSEND /RETURN
IOTCNT, RKFL0-RKFL1 /INTER-DEVICE IOT COUNT
PWASTE, 0 /TIMER TEMPORARY
PAGE
/ DECMATE II, ETC. PORT INITIALIZE ROUTINE. /048 CJL
/ THIS ROUTINE IS MOSTLY "DARK GREY MAGIC" WHICH IS PRIMARILY DERIVED FROM THE
/ "OFFICIAL" INFORMATION TAKEN FROM THE ONLY KNOWN DOCUMENTATION, THE DECMATE II
/ PROGRAMMER'S REFERENCE MANUAL: EK-DECM2-RM-001. VARIOUS EMPLOYEES OF DIGITAL
/ EQUIPMENT CORPORATION (A MULTI-NATIONAL COMPANY) HAVE ADDITIONALLY CONTRIBUTED
/ TO THIS EFFORT BY PROVIDING PORTIONS OF THE "SACRED SLUSHWARE NOTES" ON A NOT
/ NECESSARILY WILLING BASIS THROUGH THEIR RELEASED WORKS, SUCH AS, BUT NOT
/ LIMITED TO, THE SOURCES OF THE PARTICULAR VERSION OF KERMIT-8 KNOWN AS K278.
/ IT IS ASSUMED THAT THESE PEOPLE HAVE ACCESS TO BETTER DOCUMENTATION OF THE
/ HARDWARE, AND ESPECIALLY DOCUMENTATION OF THE THREE DIFFERENT MODELS OF
/ DECMATE (II, III, III+) THAT THESE ISSUES APPLY TO.
/ SINCE IT IS NOT KNOWN WHETHER THE K278, ETC. CODE IS SPECIFIC AND PRECISE, OR
/ MERELY SLOPPY, VARIOUS "QUIRKY" CODING TECHNIQUES HAVE BEEN LEFT "AS IS", WITH
/ COMMENTS REGARDING POTENTIAL VARIANCE WITH DOCUMENTATION NOTED WHERE
/ NECESSARY. THE ORDER OF ACCESS TO THE REGISTERS HAS BEEN LEFT INTACT IN CASE
/ OF POTENTIAL INTERACTION. SEVERAL CHANGES HAVE BEEN MADE BEYOND THIS WORK AS
/ A RESULT OF TRIAL-AND-ERROR, AND ALSO HAND DIS-ASSEMBLY OF SEVERAL DECMATE
/ DISKETTES' CONTENTS.
/ IT IS HOPED THAT FUTURE "NEGOTIATIONS" WITH DEC ALLOW FOR PROPER DISCLOSURE OF
/ THESE ISSUES TO AVOID POTENTIAL SOFTWARE FAILURES EVIDENT IN THESE ROUTINES
/ DUE TO LACK OF PROPER DOCUMENTATION.
DMIPORT,.-. /COMMUNICATIONS PORT INITIALIZE ROUTINE
/ ACCORDING TO THE DECMATE II MANUAL, THE FOLLOWING INSTRUCTION IS UNDEFINED.
MPRESET /RESET MULTIPROTOCOL COMMUNICATIONS CONTROLLER CHIP
/ THE DECMATE III HAS AN INTERNAL MODEM OPTION WHICH IS NOT AVAILABLE IN THE
/ DECMATE II. THE INTERFACE TO THIS DEVICE IS APPARENTLY SHARED WITH THE MPSCC
/ MODEM INTERFACE WE NORMALLY USE, SO THE REGISTER ACCESS MUST BE MORE CAREFULLY
/ DEFINED. THE APPARENT DIFFERENTIATION IS THE CURRENT VALUE OF THE DATA FIELD,
/ NAMELY EITHER FIELD 0 OR 1. IT IS NOT KNOWN WHETHER THE THREE-BIT VALUE OF
/ THE DATA FIELD IS SIGNIFICENT (PRESUMABLY FOR FUTURE EXPANSION), OR MERELY THE
/ DATA FIELD'S LOW-ORDER BIT IS USED, AS ALL KNOWN EXAMPLES OF ALLEDGEDLY
/ FUNCTIONAL CODE USE APPROPRIATE CDF 00 AND CDF 10 ONLY. APPARENTLY THE MODEM
/ INTERFACE IS REFERRED TO AS "A" AND THE MPSCC INTERFACE IS REFERRED TO AS "B".
TAD (030) /GET RESET VALUE
CDF 00 /TALKING TO REGISTER 0A
MPSCC /RESET COMMUNICATIONS CHIP
CDF 10 /TALKING TO REGISTER 0B
MPSCC /RESET COMMUNICATIONS CHIP
/ ACCORDING TO THE DECMATE II MANUAL, CONTROL REGISTER 2 "HAS NO RELEVANT
/ BITS... IF IT IS EVER WRITTEN, IT MUST BE WRITTEN WITH ALL ZEROS." APPARENTLY
/ THE MODEM INTERFACE DEMANDS A NON-ZERO VALUE BE WRITTEN TO REGISTER 2
/ (PRESUMABLY TO DISABLE IT). TO SATISFY THE ABOVE REQUIREMENT (WHATEVER THIS
/ IMPLIES!), REGISTER 2(B) IS WRITTEN WITH ALL ZEROS *LAST* IN CASE THIS IS A
/ DECMATE II WHERE THE DATA FIELD CONSIDERATIONS ARE MEANINGLESS.
CDF 00 /TALKING TO REGISTER 0A
NL0002 /WANT REGISTER 2A
MPSCC /SELECT IT
TAD (020-2) /GET RESET VALUE
MPSCC /LOAD IT
CDF 10 /TALKING TO REGISTER 0B
NL0002 /WANT REGISTER 2B
MPSCC /SELECT IT
NL0000 /GET RESET VALUE (000)
MPSCC /LOAD IT
/ THE K278 CODE DOES NOT HAVE SETUP CODE FOR REGISTER 4B, PRESUMABLY BECAUSE THE
/ CODE PERFORMS A PANEL REQUEST (PRQ3) WHICH SETS UP THE EQUIVALENT VALUES FOR
/ ASYNCHRONOUS OPERATION WITH ONE STOP BIT AND NO PARITY. IT IS NOT KNOWN IF
/ THE DECMATE III EVEN *HAS* A REGISTER 4B, BUT PRESUMABLY IT IS AVAILABLE FOR
/ LOADING THE RIGHT VALUES COMPATIBLE WITH THE DECMATE II, OR ATTEMPTING TO LOAD
/ IT IS INNOCUOUS.
CDF 00 /TALKING TO REGISTER 0A
NL0004 /WANT REGISTER 4A
MPSCC /SELECT IT
TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY
MPSCC /LOAD IT
CDF 10 /TALKING TO REGISTER 0B
NL0004 /WANT REGISTER 4B
MPSCC /SELECT IT
TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY
MPSCC /LOAD IT
/ THE DOCUMENTED VALUES (FOR DECMATE II) REGARDING CONTROL REGISTER 1 INDICATE
/ THE PROPER VALUE OF 022, WHERE BIT[9] IS DEFINED AS A ZERO. THE VALUE OF 026
/ IS TAKEN FROM K278 WHERE PRESUMABLY THE EXTRA BIT IS NECESSARY FOR SOME
/ DECMATE III OBSCURITY.
/ THE FOLLOWING CODE IS REDUNDANT FOR LOADING REGISTER 0A BEFORE AND AFTER
/ LOADING REGISTER 0B. THIS IS EITHER A MISTAKE OR OBSCURELY NECESSARY (TAKEN
/ FROM K278).
CDF 00 /TALKING TO REGISTER 0A
NL0001 /WANT REGISTER 1A
MPSCC /SELECT IT
TAD (026-1) /GET SETUP VALUE
MPSCC /LOAD IT
CDF 10 /TALKING TO REGISTER 0B
NL0001 /WANT REGISTER 1B
MPSCC /SELECT IT
TAD (026-1) /GET SETUP VALUE
MPSCC /LOAD IT
CDF 00 /TALKING TO REGISTER 0A
NL0001 /WANT REGISTER 1A
MPSCC /SELECT IT
TAD (026-1) /GET SETUP VALUE
MPSCC /LOAD IT
/ THE DECMATE III INTERNAL MODEM IS PROBABLY ASYNCHRONOUS 8 BIT ONLY. ASSUMING
/ THE RECEIVE SIDE OF THE INTERNAL MODEM IS ALWAYS "ENABLED", REGISTER 3A WOULD
/ BE UNNECESSARY. THE K278 CODE DOES NOT ADDRESS REGISTER 3 AS AN A/B PAIR,
/ PRESUMABLY BECAUSE REGISTER 3 IS NOT DECODED AND IS EFFECTIVELY REGISTER 3B
/ REGARDLESS OF THE DATA FIELD. THIS IS EITHER TRUE, OR THE K278 CODING FAILS
/ TO PROPERLY INITIALIZE THE DECMATE III MPSCC PORT.
NL0003 /WANT REGISTER 3
MPSCC /SELECT IT
TAD (301-3) /SETUP FOR 8 BITS AND ENABLE RECIVER
MPSCC /LOAD IT
/ A SIMILAR SITUATION EXISTS FOR THE TRANSMITTER SIDE OF THE DECMATE III
/ INTERNAL MODEM. REGISTER 5 IS UTILIZED ACCORDINGLY.
TAD (5-301) /WANT REGISTER 5
MPSCC /SELECT IT
TAD (150-5) /GET TRANSMITTER ENABLE, 8 BITS VALUE
MPSCC /LOAD IT
/ THE DECMATE II REFERENCE MANUAL INDICATES THE PROPER SETTING FOR THE MODEM
/ CONTROL REGISTER AS EITHER 030 OR 130 DEPENDING ON WHETHER BIT[5] INDICATES
/ INTERNAL OR EXTERNAL TIMING (WHERE ONE OF THESE IS ILLEGAL FOR ASYNCHRONOUS
/ OPERATION!). THE SETTING OF BITS [10] AND [11] WOULD INDICATE ENABLING OF
/ BOTH LOCAL AND REMOTE LOOPBACKS, YET WE SET ONLY THESE BITS (ALA K278)
/ ALLEDGEDLY FOR THE PURPOSE OF SETTING RTS AND DTR (WHICH ARE DOCUMENTED AS
/ BEING BITS[7] AND [8] RESPECTIVELY).
NL0003 /SET VALUE
MLC /LOAD IT
CLA /CLEAN UP
/ THE BAUD RATE SHOULD BE SET HERE IF DESIRED.
/ TAD BAUD /GET BAUD RATE
/ MSB /LOAD IT
CLA /CLEAN UP
JMP I DMIPORT /RETURN
/ DECMATE II, ETC. REPLACEMENT LIST. /048 CJL
DM2LIST,CLDMZAP / *CLDMZAP
DMINIT&177+JMSC /CLDMZAP,JMS DMINIT
SETBAUD / *SETBAUD /050 CJL
MSB /SETBAUD,MSB /050 CJL
INLUP / *INLUP
TAD INFLAG /INLUP, TAD INFLAG
INSKIP / *INSKIP
NOTYET&177+JMPC /INSKIP, JMP NOTYET
INLUP1; DCA INFLAG /INLUP1, DCA INFLAG
INREAD; IRB /INREAD, IRB
INSTATUS / *INSTATUS
UPSTATUS&177+JMSC /INSTATU,JMS UPSTATUS
GETFL1 / *GETFL1
UPSTATUS&177+JMSC /GETFL1, JMS UPSTATUS
COMWAIT / *COMWAIT
GETFLOW&177+JMSC /COMWAIT,JMS GETFLOW
NOWAIT / *NOWAIT
TAD OUTFLAG /NOWAIT, TAD OUTFLAG
CMOUT1; SNA CLA /CMOUT1, SNA CLA
CMOUT2; OWAIT&177+JMPC /CMOUT2, JMP OWAIT
DM1AND; DCA OUTFLAG /DM1AND, DCA OUTFLAG
CMOUT3; OUTEMP&177+TADC /CMOUT3, TAD OUTEMP
CMOUT4; OLS /CMOUT4, OLS
BUFCHECK / *BUFCHECK
PUPSTATUS&177+JMSIC /BUFCHEC,JMS I PUPSTATUS
KERRLUP / *KERRLUP
PUPSTATUS&177+JMSIC /KERRLUP,JMS I PUPSTATUS
RINTEST / *RINTEST
TAD INFLAG /RINTEST,TAD INFLAG
RINGT0; SNA CLA /RINGT0, SNA CLA
RINREAD;RINGNONE&177+JMPC /RINREAD,JMP RINGNONE
RINGT1; DCA INFLAG /RINGT1, DCA INFLAG
RINGT2; IRB /RINGT2, IRB
REMTSF / *REMTSF
RMPTEMP&177+DCAC /REMTSF, DCA RMPTEMP
RMPUT0; TAD OUTFLAG /RMPUT0, TAD OUTFLAG
REMTLS; SNA CLA /REMTLS, SNA CLA
RMPUT1; REMPUT&177+JMPIC /RMPUT1, JMP I REMPUT
REMCLEA;RMPTEMP&177+TADC /REMCLEA,TAD RMPTEMP
RMPUT2; OLS /RMPUT2, OLS
0 /THIS ENDS THE LIST
PAGE
/ DECMATE I REPLACEMENT LIST. /050 CJL
DM1LIST,CLDMZAP / *CLDMZAP
DMINIT&177+JMSC /CLDMZAP,JMS DMINIT
SETBAUD / *SETBAUD
NOP /SETBAUD,NOP
DMI01 / *DMI01
DM234&177+TADC /DMI01, TAD DM234/(234)
DMI02; WCON0 /DMI02, WCON0
DMI03; NL0000 /DMI03, NL0000
DMI04; RACD /DMI04, RACD
DMI05; DMWASTE&177+ISZC /DMI05, ISZ DMWASTE
DMI06; DMI05&177+JMPC /DMI06, JMP DMI05
DMI07; DMWASTE&177+ISZC /DMI07, ISZ DMWASTE
DMI08; DMI07&177+JMPC /DMI08, JMP DMI07
DMI09; RTFL0 /DMI09, RTFL0
DMI10; DM2516&177+TADC /DMI10, TAD DM2516/(2516)
DMI11; DMSEND&177+JMSC /DMI11, JMS DMSEND
DMI12; TAD RATE /DMI12, TAD RATE
DMI13; DM2460&177+TADC /DMI13, TAD DM2460/(2460)
DMI14; DMSEND&177+JMSC /DMI14, JMS DMSEND
DMI15; DM3425&177+TADC /DMI15, TAD DM3425/(3425)
DMI16; DMSEND&177+JMSC /DMI16, JMS DMSEND
DMI17; RKRB0 /DMI17, RKRB0
DMISET / *DMISET
RTFL0 /DMISET, RTFL0
DMISKP / *DMISKP
RTSF0 /DMISKP, RTSF0
DMIOUT / *DMIOUT
RTLS0 /DMIOUT, RTLS0
INSKIP / *INSKIP
RKSF0 /INSKIP, RKSF0
INREAD / *INREAD
RKRB0 /INREAD, RKRB0
COMWAIT / *COMWAIT
GETFLOW&177+JMSC /COMWAIT,JMS GETFLOW
NOWAIT / *NOWAIT
RTSF0 /NOWAIT, RTSF0
CMOUT1; OWAIT&177+JMPC /CMOUT1, JMP OWAIT
DM1AND / *DM1AND
AND377 /DM1AND, AND [377]
CMOUT4 / *CMOUT4
RTLS0 /CMOUT4, RTLS0
RINTEST / *RINTEST
RKSF0 /RINTEST,RKSF0
RINREAD / *RINREAD
RKRB0 /RINREAD,RKRB0
RINGT1; SKP /RINGT1, SKP
DM1AN2 / *DM1AN2
AND377 /DM1AN2, AND [377]
REMTSF / *REMTSF
RTSF0 /REMTSF, RTSF0
REMTLS / *REMTLS
RTLS0 /REMTLS, RTLS0
0 /THIS ENDS THE LIST
/ DECMATE I SECONDARY REPLACEMENT LIST /050 CJL
DM1SEC, DMI02 / *DMI02
WCON1 /DMI02, WCON1
DMI03; NL4000 /DMI03, NL4000
DMI09 / *DMI09
RTFL1 /DMI09, RTFL1
DMI17 / *DMI17
RKRB1 /DMI17, RKRB1
DMISET / *DMISET
RTFL1 /DMISET, RTFL1
DMISKP / *DMISKP
RTSF1 /DMISKP, RTSF1
DMIOUT / *DMIOUT
RTLS1 /DMIOUT, RTLS1
INSKIP / *INSKIP
RKSF1 /INSKIP, RKSF1
INREAD / *INREAD
RKRB1 /INREAD, RKRB1
NOWAIT / *NOWAIT
RTSF1 /NOWAIT, RTSF1
CMOUT4 / *CMOUT4
RTLS1 /CMOUT4, RTLS1
RINTEST / *RINTEST
RKSF1 /RINTEST,RKSF1
RINREAD / *RINREAD
RKRB1 /RINREAD,RKRB1
REMTSF / *REMTSF
RTSF1 /REMTSF, RTSF1
REMTLS / *REMTLS
RTLS1 /REMTLS, RTLS1
0 /THIS ENDS THE LIST
/ ONCE-ONLY TEXT MESSAGES. /024 CJL
FIELD BUFFLD%10 /FILE I/O BUFFER FIELD
*FILBUFFER /OVER FILE I/O BUFFER
/ LOCAL PREFERENCE MESSAGE. /024 CJL
/ USE SOMETHING APPROPRIATE HERE TO CUSTOMIZE KERMIT-12 TO YOUR MACHINE.
/ THIS LOCATION SHOULD BE MAINTAINED SINCE IT IS DOCUMENTED TO BE HERE.
XLIST OFF
IFZERO GENMSG <
XLIST ON
LCLMSG, *LCLMSG+40 /EMPTY HOLE FOR USER MESSAGE /039 CJL
XLIST OFF >
IFNZRO GENMSG <
IFNZRO LEDERLE <
XLIST ON
LCLMSG, TEXT "%^T^HANKS TO: ^B^ILL ^S^MITH AND ^D^INGER ^M^ILLER%"
XLIST OFF >
IFNZRO UMSG <
XLIST ON
LCLMSG, TEXT "%^I^NSERT LOCAL USER MESSAGE HERE!%^"
XLIST OFF >
IFZERO LEDERLE!UMSG <
XLIST ON
LCLMSG, TEXT "^^^^^^^^^^^^^^^^^^^^^^"/DEFAULT IS NO MESSAGE
XLIST OFF >
IFNZRO LCLMSG+40-. <
XLIST ON
ZBLOCK LCLMSG+40-. /LEAVE PATCHING SPACE
XLIST OFF >
>
XLIST ON
CLOSMSG,TEXT "^]^" /CPU TYPE CLOSING MESSAGE
/ CPU IDENTIFICATION LIST; ALL MUST BE 5 WORDS LONG (EXCEPT LAST)./024 CJL
CPULIST,TEXT "^U^NKNOWN" /00=UNKNOWN
TEXT "^PDP^-5^^" /01=PDP-5
TEXT "^PDP^-8^^" /02=PDP-8
TEXT "^PDP^-8/S" /03=PDP-8/S
TEXT "^LINC^-8^" /04=LINC-8
TEXT "^PDP^-8/I" /05=PDP-8/I
TEXT "^PDP^-8/L" /06=PDP-8/L
TEXT "^PDP^-12^" /07=PDP-12
TEXT "^PDP^-8/E" /10=PDP-8/E
TEXT "^PDP^-8/A" /11=PDP-8/A
TEXT "6100^^^^^" /12=6100
TEXT "6120^" /13=6120; LAST CAN BE SHORT!
CPUTMSG,TEXT "%^[C^PU TYPE IS: " /CPU TYPE MESSAGE
DAYMSG, DAY%12^66+DAY+6060 /DAY MESSAGE
TEXT " "
DMPOMSG,TEXT " ^[U^SING ^C^OMMUNICATIONS" /DECMATE PORT MESSAGE
TEXT " ^P^ORT^]"
DMPPMSG,TEXT " ^[U^SING ^P^RINTER ^P^ORT^]^" /DECMATE SERIAL PORT MESSAGE
INITMSG,TEXT "%^PS/8 PS/12 OS/8 OS/12 " /INITIAL MESSAGE
TEXT "OS/78 OS/278 K^ERMIT-12 ^V"
INMSG2, VERSION%12^66+VERSION+6060 /VERSION DIGITS
INMSG3, "^^100+REVISION /REVISION
TEXT " " /END OF MESSAGE
XLIST OFF
IFZERO MONTH-1 <
XLIST ON
MONMSG, TEXT "^J^ANUARY ^" /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-2 <
XLIST ON
MONMSG, TEXT "^F^EBRUARY " /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-3 <
XLIST ON
MONMSG, TEXT "^M^ARCH ^" /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-4 <
XLIST ON
MONMSG, TEXT "^A^PRIL ^" /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-5 <
XLIST ON
MONMSG, TEXT "^M^AY ^" /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-6 <
XLIST ON
MONMSG, TEXT "^J^UNE " /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-7 <
XLIST ON
MONMSG, TEXT "^J^ULY " /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-10 <
XLIST ON
MONMSG, TEXT "^A^UGUST " /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-11 <
XLIST ON
MONMSG, TEXT "^S^EPTEMBER ^" /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-12 <
XLIST ON
MONMSG, TEXT "^O^CTOBER ^" /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-13 <
XLIST ON
MONMSG, TEXT "^N^OVEMBER " /MONTH MESSAGE
XLIST OFF >
IFZERO MONTH-14 <
XLIST ON
MONMSG, TEXT "^D^ECEMBER " /MONTH MESSAGE
XLIST OFF >
IFNZRO MONMSG+7-. <
XLIST ON
ZBLOCK MONMSG+7-. /EMPTY SPACE FOR ALIGNMENT
XLIST OFF >
XLIST ON
THLPMSG,TEXT "%^T^YPE ^HELP<CR>^ FOR HELP%^" /TYPE HELP MESSAGE
YEARMSG,TEXT "19" /YEAR MESSAGE
YEAR%12^66+YEAR+6060 /YEAR DIGITS
TEXT "^" /END OF MESSAGE
/ CPU-SPECIFIC PROMPT LIST. /024 CJL
CPUPRMP,TEXT "??^>^^^" /UNKNOWN
TEXT "5^>^^^^" /PDP-5
TEXT "8^>^^^^" /PDP-8
TEXT "8^/S>^^" /PDP-8/S
TEXT "LINC-8>" /LINC-8
TEXT "8^/I>^^" /PDP-8/I
TEXT "8^/L>^^" /PDP-8/L
TEXT "12^>^^^" /PDP-12
TEXT "8^/E>^^" /PDP-8/E
TEXT "8^/A>^^" /PDP-8/A
TEXT "78^>^^^" /6100
TEXT "278^>^^" /6120
/ CPU-SPECIFIC IDENTIFICATION LIST. /025 CJL
CPUIDLS,TEXT "^U^NKNOWN" /UNKNOWN
TEXT "^PDP^-5^^" /PDP-5
TEXT "^PDP^-8^^" /PDP-8
TEXT "^PDP^-8/S" /PDP-8/S
TEXT "^LINC^-8^" /LINC-8
TEXT "^PDP^-8/I" /PDP-8/I
TEXT "^PDP^-8/L" /PDP-8/L
TEXT "^PDP^-12^" /PDP-12
TEXT "^PDP^-8/E" /PDP-8/E
TEXT "^PDP^-8/A" /PDP-8/A
TEXT "^VT^-78^^" /VT-78
TEXT "^DEC^MATE" /6120
FIELD MSGFLD%10 /MESSAGE FIELD
*FLD1ADR /PERMANENT LOAD ADDRESS /046 CJL
/TEXT MESSAGES LOAD HERE/046 CJL
ABMSG, TEXT "%^F^ILE ^A^BORT%^" /FILE ABORT MESSAGE
CMERMSG,TEXT "?^I^NVALID COMMAND^" /COMMAND ERROR MESSAGE
CONNMSG,TEXT "%(^C^ONNECTING TO HOST, TYPE " /FIRST CONNECT MESSAGE
CONTMSG,TEXT "^C^ONTROL-^" /CONTROL CHARACTER MESSAGE
CON2MSG,TEXT " ^C^ TO RETURN TO ^" /BRIDGING CONNECT MESSAGE
CON3MSG,TEXT ")%^" /FINAL CONNECT MESSAGE
CPUMSG, ZBLOCK 5 /CPU ID MESSAGE GOES HERE
/CRLF, TEXT "%" /<CR>, <LF> MESSAGE
DNERMSG,TEXT "?^E^RROR IN DEVICE NAME" /DEVICE NAME ERROR MESSAGE
DSFLMSG,TEXT "?^D^ISK FULL!" /DISK OUT OF ROOM ERROR MESSAGE
FCLEMSG,TEXT "?^E^RROR CLOSING FILE" /FILE CLOSE ERROR MESSAGE
FNERMSG, TEXT "?^E^RROR IN FILE NAME" /FILE NAME ERROR MESSAGE
FRECMSG,TEXT "^R^ECEIVING FILE: ^" /RECEIVING FILE MESSAGE
FSENMSG,TEXT "^S^ENDING FILE: ^" /SENDING FILE MESSAGE
FSERMSG,TEXT "?^F^ILE NAME SYNTAX ERROR" /FILE NAME ERROR MESSAGE
HELPMSG,TEXT "%^S^UPPORTED COMMANDS ARE:%%" /HELP MESSAGE
TEXT "^CONNECT^ (TO REMOTE SYSTEM) %"
TEXT "^SEND DEV:FILNAM.EX^ %"
TEXT "^RECEIVE DEV:^ (FILENAME AND EXTENSION ^NOT^ ALLOWED)%"
TEXT "^GET DEV:FILNAM.EX^%"
TEXT "^FINISH^ (SERVER)%"
TEXT "^EXIT^ (TO OPERATING SYSTEM) %"
TEXT "^HELP^ (THIS MESSAGE)%"
TEXT "%^E^SCAPE CHARACTER: "
KERRMSG,TEXT "%^K^EYBOARD INPUT ERROR!%" /KEYBOARD ERROR MESSAGE
CRLF= .-1 /<CR>, <LF> MESSAGE
NOFINIS,TEXT "?^U^NABLE TO TELL HOST THAT " /FINISH ERROR MESSAGE
TEXT "SESSION IS FINISHED"
NOTFND, TEXT "?^U^NABLE TO LOCATE FILE^" /FILE NOT FOUND MESSAGE
PRMTMSG,TEXT "^K^ERMIT-^" /STATIC PORTION OF PROMPT MESSAGE
PROMID, ZBLOCK 23 /MODIFIED PORTION OF PROMPT MESSAGE
RERRMSG,TEXT "?^R^ECEIVE FAILURE^" /GENERAL RECEIVE FAILURE MESSAGE
RFLNMSG,TEXT "?^E^RROR IN RECEIVED FILE NAME"/RECEIVED NAME ERROR MESSAGE
TEXT "^"
RHFEMSG,TEXT "^U^NABLE TO RECEIVE - HANDLER" /HANDLER FETCH ERROR MESSAGE
TEXT " ERROR^"
RIDEMSG,TEXT "?^U^NABLE TO RECEIVE -" /DIRECTORY FULL ERROR MESSAGE
TEXT " INSUFFICIENT DIRECTORY SPACE"
RIERMSG,TEXT "%^R^EMOTE LINE INPUT ERROR!%^" /REMOTE LINE ERROR MESSAGE
RPERMSG,TEXT "?^U^NABLE TO RECEIVE LATEST " /LATEST PACKET ERROR MESSAGE
TEXT "PACKET^"
SDERMSG,TEXT "?^U^NABLE TO SEND - DIRECTORY "/DIRECTORY INPUT ERROR MESSAGE
TEXT "ERROR"
SHFEMSG,TEXT "?^U^NABLE TO SEND - HANDLER " /HANDLER FETCH ERROR MESSAGE
TEXT "ERROR"
SNDEMSG,TEXT "?^U^NABLE TO SEND" /GENERAL SEND ERROR MESSAGE
UPERMSG,TEXT "?^U^NABLE TO RECEIVE - DATA " /RECEIVED DATA ERROR MESSAGE
TEXT "ERROR"
$ /THAT'S ALL FOLK!