X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=sw%2Ftools%2FKERMIT.PA;fp=sw%2Ftools%2FKERMIT.PA;h=d71cabbabccc68fafb5d3a13f08094416dad2487;hb=7af5ad59491ddf2066641aef1e0025a337c0f247;hp=0000000000000000000000000000000000000000;hpb=919757fd611e482003ce51f366f6783cab73dea3;p=pdp8.git diff --git a/sw/tools/KERMIT.PA b/sw/tools/KERMIT.PA new file mode 100644 index 0000000..d71cabb --- /dev/null +++ b/sw/tools/KERMIT.PA @@ -0,0 +1,6721 @@ +/ MODIFIED SILENT VERSION, HACHTI 2008 +/ KERMIT FOR DEC 12-BIT MACHINES + +/ LAST EDIT: 06-SEP-1990 11:00:00 CJL + + XLIST OFF + IFNDEF OFF /TURN LISTING OFF + IFNDEF ON /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 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 EXITROUTINE 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 WHEN THE BUFFER +/ IS 3/4 FULL. WHEN THE BUFFER REACHES 1/4 FULL, THE REMOTE WILL BE SENT +/ 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 , THE BUFFER WILL FILL WITH OUTPUT +/ CHARACTERS. WHEN THE USER RELEASES THE CONSOLE WITH , 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 +/ 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 +/ , , AND (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 CHARACTER IS REQUIRED FOR +/ VISUAL RUBOUT ( ) 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 +/ 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 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 , . + / 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 /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 /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 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 OF ASCII +/ FILES. +/ SETTING OCLOSE= 1 CAUSES <^Z> TO BE SENT AT 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 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 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 /USE DEVICE 30/31 VALUES + IFNDEF DEV40 /USE DEVICE 40/41 VALUES + IFNDEF LEDERLE /USE LEDERLE LABS VALUES + IFNDEF ORIGNAL /USE ORIGINAL VALUES + IFNDEF SPRINT /USE DEVICE 32/33 VALUES + IFNDEF USER /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 /DEFAULT TO DEVICE 40/41 VERSION + +/ DEV30 PARAMETERS. + + IFNZRO DEV30 < + + IFNDEF REC /DEVICE 30 INPUT + IFNDEF SEN /DEVICE 31 OUTPUT + + > + +/ DEV40 PARAMETERS (DEFAULT). + + IFNZRO DEV40 < + + IFNDEF REC /DEVICE 40 INPUT + IFNDEF SEN /DEVICE 41 OUTPUT + + > + +/ LEDERLE PARAMETERS. /038 CJL + + IFNZRO LEDERLE < + + IFNDEF REC /DEVICE 43 INPUT + IFNDEF SEN /DEVICE 44 OUTPUT + IFNDEF GENMSG /GENERATE LOCAL HEADER MESSAGE + IFNDEF UMSG /DON'T GENERATE USER MESSAGE + + > + +/ ORIGNAL PARAMETERS. + + IFNZRO ORIGNAL < + + IFNDEF REC /DEVICE 33 INPUT + IFNDEF SEN /DEVICE 34 OUTPUT + + > + / SPRINT PARAMETERS. /046 CJL + + IFNZRO SPRINT < + + IFNDEF REC /DEVICE 32 INPUT + IFNDEF SEN /DEVICE 33 OUTPUT + + > + +/ USER PARAMETERS. + + IFNZRO USER < + + IFNDEF XX /DEFAULT TO DEVICE 40 + IFNDEF XY /DEFAULT TO DEVICE 41 + IFNDEF REC /DEVICE XX INPUT + IFNDEF SEN /DEVICE XY OUTPUT + IFNDEF GENMSG /GENERATE LOCAL HEADER MESSAGE + IFNDEF UMSG /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 /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 /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 /DEFAULT IS CONTROL-] + +/ DEFAULT LOWER-CASE ENABLE DEFINITION. /030 CJL + + IFNDEF LOWER /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 /DEFAULT IS FIVE RETRIES + +/ DEFAULT FILE MODE DEFINITION. /031 CJL + + IFNDEF FMODE /DEFAULT IS ASCII FILE MODE + /4377 IS BINARY FILE MODE + +/ DEFAULT FLOW-CONTROL MODE DEFINITION. /031 CJL + + IFNDEF FLOW /DEFAULT IS FLOW-CONTROL ENABLED + +/ DEFAULT ASCII INPUT FILE <^Z> DISPOSITION. /031 CJL + + IFNDEF ICLOSE /ENSURE <^Z> AT ASCII + +/ DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION. /031 CJL + + IFNDEF OCLOSE /<^Z> NOT SENT AT ASCII + +/ DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS. /038 CJL + + IFNDEF GENMSG /DEFAULT IS TO GENERATE A MESSAGE + IFNDEF UMSG /DEFAULT IS NO DUMMY USER MESSAGE + IFNDEF LEDERLE /DEFAULT IS NO LEDERLE MESSAGE + +/ THE NULL MESSAGE WILL BE GENERATED BY DEFAULT. + +/ ECHO DEFINITION. /039 CJL + + IFNDEF INIECHO /DEFAULT IS NO LOCAL ECHO + +/ DEFAULT DECMATE I PORT DEFINITION. /050 CJL + + IFNDEF PORT /DEFAULT IS PORT ZERO + +/ DEFAULT BAUD RATE DEFINITION. /050 CJL + + IFNDEF BRATE /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 + 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 CHARACTER /044 CJL + DELETE= 177 / DELETE OR 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 /REVISION DATE (LOCATION 17666) + + IFNDEF REVDGRP /REVISION 8 YEAR DATE GROUP (LOCATION 07777) + + IFNDEF REVISIO /REVISION OF KERMIT-12 + + IFNDEF VERSION /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 /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 /, /025 CJL + JMS I [SCRIBE] /GIVE THEM THE /025 CJL +/ PRMTMSG /PROMPT MESSAGE /025 CJL + PRMT2 + 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 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 /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- 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 /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 /014 CJL + JMP DFDEV /GOT AN , 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 /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 /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 /034 CJL + SNA /SKIP IF NOT A RETURN + JMP LIN2 /LINE IS INPUT + TAD (-DELETE+CNTRLM)/COMPARE TO /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 /, /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 /025 CJL + JMS I [P7ECHO] /PRINT IT /043 CJL + TAD [" &177] /GET A /025 CJL + JMS I [P7ECHO] /PRINT IT /043 CJL + TAD (CNTRLH) /GET A /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 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 /, + 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 /, /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 + .-. / 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 , 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 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 /, + 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 ; THE NEXT CALL +/ WILL YIELD THE RETURN. IF OCTLZFLAG CONTAINS ZERO, THEN DETECTION OF +/ <^Z> YIELDS THE 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 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 / 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 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 + JMP GETEND /JUMP IF ASCII MODE +GETUPZ, TAD [CNTRLZ] /RESTORE THE CHARACTER + AND [377] /ENSURE EIGHT-BIT (MIGHT ALREADY BE SEVEN-BIT) + ISZ GETBYTE /BUMP PAST RETURN +GETEOF, ISZ GETBYTE /BUMP PAST I/O ERROR RETURN + JMP I GETBYTE /RETURN TO MAIN CALLER + +/ GOT IN ASCII MODE. + +GETEND, TAD OCTLZFLAG /GET <^Z> DISPOSITION FLAG + SNA CLA /SKIP IF SET + JMP GETEOF /JUST RETURN CONDITION + TAD (GETEOF) /POINT TO + 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 , + /NON-ZERO=SEND <^Z> AT + + 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 INDICATOR, ELSE JUST +/ CLOSE THE FILE. + +/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES PRIOR TO CLOSE ARE EIGHT-BIT +/ CHARACTERS. IF NECESSARY, 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 /, /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 /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 AND 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 + JMS I MSGOUT /PRINT IT + TAD [CNTRLJ] /GET A + 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 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 SEEN FLAG + TAD ESCHAR /GET THE 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 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 / 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 CHARACTER. + +NOESCAP,TAD TESTCHAR /GET THE LATEST CHARACTER + TAD ESCHAR /COMPARE TO CHARACTER + SZA CLA /SKIP IF IT MATCHES + JMP OUTCHAR /JUMP IF NOT + NL7777 /SET THE +/ DCA ESCFLAG / SEEN FLAG +/ JMP BUFCHECK /CONTINUE THERE + JMP NOESENTRY /CONTINUE THERE + +/ COMES HERE IF BOTH PREVIOUS AND LATEST ARE THE CHARACTER. + +ESCTYPE,DCA ESCFLAG /CLEAR THE SEEN FLAG AND OUTPUT + +/ COMES HERE IF PREVIOUS AND LATEST CHARACTER ARE NOT THE 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 CHARACTER AND THE LATEST IS NOT +/ A VALID COMMAND CHARACTER. + +ESCOMPL,TAD [CNTRLG] /GET A + JMS I (CONOUT) /OUTPUT TO CONSOLE +NOESENT,DCA ESCFLAG /CLEAR 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 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 + +/ CHARACTER SEARCH LIST. + +ESCLIST,UPPERC; ESCLOSE / C(LOSE) + LOWERC; ESCLOSE / C(LOSE) (LOWER-CASE) +ESCH, .-.; ESCTYPE / + 0 /THIS ENDS THE LIST + +/ LOCAL ECHO FLAG FOR CONNECT MODE. + +ECHOFLA,INIECHO /0=DON'T ECHO, NON-ZERO=ECHO /039 CJL +ESCFLAG,.-. / 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 VIA +/ SIMULATION). RETURNS WITH CLEAR AC. SUBJECT TO CONSOLE ECHO STATUS (ECHOSW). + +P7CH, .-. /CONSOLE OUTPUT ROUTINE + TAD (-CNTRLI) /COMPARE TO + SNA /SKIP IF OTHER + JMP DOTAB /JUMP IF + TAD L11/(CNTRLI) /RESTORE THE CHARACTER + JMS P7CHAR /PRINT IT (UPDATING COLUMN COUNT) + JMP I P7CH /RETURN + +DOTAB, TAD [" &177] /GET A + 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 + SNA /SKIP IF NOT + DCA COLUMN /CLEAR COLUMN COUNT ON + TAD (-CNTRLH+CNTRLM)/COMPARE TO + 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, .-. /"^" 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 /028 CJL + + *SBOOT-2 /JUST BEFORE EXIT ADDRESS /025 CJL +EXITKER=. /WHERE TO EXIT TO /025 CJL + 0 + CAF /PHPH + / 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, +/PHPHPH +/ 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 + SKP /PHPH +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^ 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 "%" /, 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^EC: ^" /RECEIVING FILE MESSAGE +FSENMSG,TEXT "^S^END: ^" /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 /, 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 +PRMT2, TEXT "^K12>" /PHPH +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!