A large commit.
[pdp8.git] / sw / kermit / hachti / K12MIT.PA
CommitLineData
81e70d48
PH
1/ KERMIT FOR DEC 12-BIT MACHINES
2
3/ LAST EDIT: 06-SEP-1990 11:00:00 CJL
4
5 XLIST OFF
6 IFNDEF OFF <OFF= 1> /TURN LISTING OFF
7 IFNDEF ON <ON= 0> /TURN LISTING ON
8 XLIST ON; IFZERO 1 <
9
10
11
12
13
14
15
16
17*** **** *********** ********* *** *** *** *********** ***** ****
18*** **** *********** ********** **** **** *** *********** ***** ******
19*** **** *** *** **** **** **** *** *** *** *** ***
20*** **** *** *** *** ***** ***** *** *** *** ** ****
21*** **** *** *** *** ***** ***** *** *** *** ** ***
22******* *** *** **** ************ *** *** *** **
23****** ********** ********** *** **** *** *** *** ***** *** **
24******* ********** ********* *** **** *** *** *** ***** *** **
25*** **** *** *** **** *** ** *** *** *** *** **
26*** **** *** *** **** *** ** *** *** *** *** **
27*** **** *** *** **** *** *** *** *** *** **
28*** **** *********** *** **** *** *** *** *** *** *********
29*** **** *********** *** **** *** *** *** *** *** *********
30 > XLIST ON
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50/ COPYRIGHT (C) 1989, 1990 BY THE TRUSTEES OF COLUMBIA UNIVERSITY IN THE CITY OF
51/ NEW YORK.
52
53
54
55/ PERMISSION IS GRANTED TO ANY INDIVIDUAL OR INSTITUTION TO COPY OR USE THIS
56/ DOCUMENT AND THE PROGRAM(S) DESCRIBED IN IT, EXCEPT FOR EXPLICITLY COMMERCIAL
57/ PURPOSES.
58\f/ EDIT HISTORY. /014 CJL
59
60/ 052 06-SEP-1990 BUG FIX. CHARLES LASNER (CJL)
61
62/ SENDING A FILE WHICH EXACTLY FILLS THE LAST DATA PACKET AT THE
63/ END OF THE FILE WILL CAUSE THE PACKET TO BE SENT TWICE. THE
64/ ROUTINE DIDN'T CHECK FOR AN EMPTY OUTPUT BUFFER AT EOF.
65
66/ 051 29-AUG-1990 BUG FIX. CJL
67
68/ PDP-8/A NOT IDENTIFIED CORRECTLY IN CPUID ROUTINE. THE UPDATED
69/ PC IS WHAT IS LOADED INTO THE AC WHEN 7016 IS EXECUTED ON THE
70/ KK-8/A CPU. THE ROUTINE WAS CHECKING FOR THE NON-UPDATED VALUE.
71/ ALSO NEW DOCUMENTATION FOR PRE-CLEARING MEMORY FOR BENEFIT OF
72/ ENCODED BINARY FILES.
73\f/ 050 06-SEP-1989 DECMATE I SUPPORT, ETC. CJL
74
75/ THIS EDIT IMPLEMENTS DECMATE I SUPPORT USING THE DP278-A OR -B.
76/ A NEW CONDITIONAL 'PORT' SELECTS WHICH PORT IS TO BE USED. IF
77/ KERMIT-12 IS RUN ON DECMATE I (WHILE NOT CONFIGURED FOR SERIAL
78/ PRINTER PORT COMMUNICATIONS; SEE EDIT 048.) THEN REMOTE
79/ COMMUNICATIONS TAKES PLACE ON THE PORT SELECTED AT ASSEMBLY TIME
80/ ('PORT=0' OR 'PORT=1'). ADDED BAUD RATE PARAMETER 'BRATE' TO
81/ SELECT REMOTE COMMUNICATIONS BAUD RATE FROM THE STANDARD TABLE;
82/ DEFAULTS TO 1200 BAUD ('BRATE=7').
83
84/ 049 30-AUG-1989 REMOTE FLOW CONTROL, ETC. CJL
85
86/ THIS EDIT IMPLEMENTS FLOW CONTROL SUPPORT (IF FLOW CONTROL IS
87/ ENABLED) FOR THE REMOTE LINE WHILE SENDING PACKETS TO THE REMOTE
88/ KERMIT REGARDLESS OF STATE. PREVIOUSLY, FLOW CONTROL ONLY
89/ APPLIED TO CONNECT MODE. LOCAL FLOW CONTROL (TOWARDS THE REMOTE
90/ KERMIT) IS UNNECESSARY AS LOCAL BUFFERS FOR REMOTE INPUT ARE
91/ ALWAYS AVAILABLE. CERTAIN ROUTINE CHANGES MADE FOR BENEFIT OF
92/ DECMATE I SUPPORT IN A SUBSEQUENT EDIT.
93
94/ 048 24-AUG-1989 DECMATE II, ETC. SUPPORT. CJL
95
96/ ONCE-ONLY CODE ADDED TO IMPLEMENT DECMATE II, ETC. REMOTE LINE
97/ SUPPORT ON SERIAL COMMUNICATIONS PORT. SELECTED PORT IS
98/ INDICATED ON OPENING BANNER IF OPERATING ON DECMATE.
99
100/ THIS EDIT PROVIDES BASIC SUPPORT OF THE DECMATE II COMMUNICATIONS PORT AS AN
101/ AUTOMATIC FEATURE OF THE STANDARD RELEASE OF K12MIT. AUTOMATIC DETECTION OF
102/ DECMATE II, ETC. HARDWARE IS PERFORMED UNLESS THE PDP-8-TYPE REMOTE LINE
103/ SUPPORT IS ASSEMBLED FOR THE SERIAL PRINTER AS THE REMOTE LINE ('SPRINT' IS
104/ SET OR EQUIVALENT).
105
106/ THIS EDIT INCORPORATES ALL OF THE INFORMATION TAKEN FROM VARIOUS SOURCES
107/ REGARDING DECMATE PORT INITIALIZATION, ETC. EVERY ATTEMPT HAS BEEN MADE TO
108/ COMPLETELY SET ALL APPROPRIATE REGISTERS, ETC. FOR DECMATE II, III, III+
109/ OPERATION. NO SUPPORT EXISTS FOR THE DECMATE III BUILT-IN MODEM OPTION, AS
110/ EXPLICIT DOCUMENTATION IS NOT AVAILABLE (SOME OF THE INITIALIZATION CODE IS
111/ APPARENTLY USED TO DISABLE THE MODEM). THESE ROUTINES ARE ONLY KNOWN TO WORK
112/ ON THE DECMATE II, AS THE III (ESPECIALLY WITH OPTIONAL MODEM) AND THE III+
113/ HAVEN'T BEEN AVAILABLE TO THE AUTHOR FOR TESTING. THE INITIALIZATION CODE
114/ WILL BE UPDATED LATER TO INCLUDE PANEL REQUESTS, ETC. TO CORRECT ANY
115/ PROBLEMS, ETC. DECMATE-SPECIFIC FEATURES (SUCH AS SETUP COMMANDS) WILL BE
116/ ADDED LATER AND ENABLED FROM THESE ROUTINES.
117
118/ THIS EDIT INCORPORATES NON-INTERRUPT ROUTINES WHICH HAVE BEEN TESTED AT THE
119/ MAXIMUM COMMUNICATIONS SPEED OF THE DECMATE II (19200 BAUD). THEY WILL
120/ SUFFICE FOR ALL KERMIT IMPROVEMENTS SHORT OF SLIDING WINDOWS AT WHICH TIME
121/ INTERRUPT-DRIVEN I/O WILL BE REQUIRED. (INTERRUPT-DRIVEN I/O IS ILLEGAL ON
122/ CERTAIN OS/8 SYSTEMS WHERE INTERRUPTS ARE HARMFUL TO THE SYSTEM OR NON-SYSTEM
123/ HANDLERS.)
124\f/ 047 21-AUG-1989 CODE CLEANUP. CJL
125
126/ STREAM-LINED CONNECT MODE ROUTINES FOR MINIMUM USE OF IOTS. THIS
127/ IS IN PREPARATION FOR EVENTUAL DECMATE II OPERATION, AND TO
128/ MINIMIZE K12PCH PATCH FILE SIZE. CERTAIN NON-CONNECT ROUTINES
129/ MOVED TO FACILIATE CONNECT ROUTINE REORGANIZATION.
130
131/ 046 15-AUG-1989 CODE CLEANUP. CJL
132
133/ ADDED NEW (NON-CONNECT) MODE COMMUNICATIONS ROUTINES FOR EVENTUAL
134/ DECMATE USE. ELIMINATION OF 'IREM' AND 'IREMW' ROUTINES IN FAVOR
135/ OF 'COMIN'. ELIMINATION OF 'OREM' IN FAVOR OF 'COMOUT'. ADDED
136/ STATUS UPDATE ROUTINE ('UPSTATUS') FOR EVENTUAL DECMATE II, ETC.
137/ USAGE. ELIMINATED PDP-8, DECMATE I, DECMATE II CONDITIONALS.
138/ REORGANIZED SERIAL LINE CONDITIONALS AND ADDED NEW 'SPRINT'
139/ PARAMETER FOR SERIAL PRINTER PORT USAGE AS COMMUNICATIONS PORT.
140/ ADDED ONCE-ONLY CODE ADDED TO AUTOMATICALLY RECOGNIZE DECMATE I
141/ AND II OPERATION UNLESS ASSEMBLED FOR REMOTE COMMUNICATIONS ON
142/ SERIAL PRINTER PORT ('SPRINT' SET). UPDATED K12PCH.PAL TO
143/ CORRESPOND TO NEW DEFINITIONS. DEFINED EVENTUALLY NEEDED
144/ COMMUNICATIONS PORT INSTRUCTIONS FOR DECMATE II; ACTUAL DECMATE
145/ II OPERATION WILL BE DEFINED IN A SUBSEQUENT EDIT. DOCUMENTED
146/ NEW LOADING AND SAVING INSTRUCTIONS FOR K12MIT TO ALLOW FOR
147/ ONCE-ONLY CODE IN 10000-11777 WITHOUT SWAPPING THE CODE OUT FOR
148/ THE USR. THIS ELIMINATES OVERHEAD WHEN LOADING K12MIT, BUT IS
149/ DIFFERENT FROM THE FORMER INSTRUCTIONS WHICH ASSUMED NO OTHER
150/ USAGE OF 10000-11777 OTHER THAN THE (LOCKED-IN) USR.
151
152/ THIS EDIT PROVIDES THE FRAMEWORK FOR AUTOMATIC DETECTION OF PROGRAM EXECUTION
153/ OF K12MIT ON ANY MEMBER OF THE DECMATE FAMILY (I, II, III, III+). WHEN
154/ 6120-TYPE CPU DETECTION OCCURS, THE DECMATE I OR II-TYPE COMMUNICATIONS PORT
155/ INITIALIZE CODE IS AUTOMATICALLY SELECTED AS NECESSARY UNLESS THE PDP-8-TYPE
156/ ROUTINES ARE ASSEMBLED (WITH 'SPRINT' SET OR EQUIVALENT USER SETTINGS, ETC.)
157/ FOR THE VT-78-TYPE PRINTER PORT (32/33), IN WHICH CASE THE COMMUNICATIONS IS
158/ DONE VIA THE PRINTER PORT ON THE DECMATE (WHICH IS ALMOST PDP-8 COMPATIBLE AND
159/ IS ACCOMODATED AS SUCH).
160
161/ SUBSEQUENT EDITS SHOULD PROVIDE FOR A DECMATE I PARAMETER TO CONTROL THE PORT
162/ SELECTION, AS THERE ARE AT LEAST TWO VARIANT OPTIONS BOARDS (DP-278A AND
163/ DP-278B) EACH CONSISTING OF TWO PORTS.
164\f/ 045 12-AUG-1989 BUG FIX. CJL
165
166/ FINISH, GET, AND RECEIVE COMMANDS FAIL TO ABORT PROPERLY
167/ (ESPECIALLY AFTER THE SEND COMMAND HAS BEEN USED), AS THE CURRENT
168/ OPERATING MODE ('KMODE') IS NEVER PROPERLY SET, OR IS SET AFTER
169/ SEVERAL PACKETS HAVE BEEN SENT. EACH COMMAND NOW SETS ITS OWN
170/ OPERATING MODE BEFORE INITIATING ANY PACKETS.
171
172/ 044 11-AUG-1989 CODE CLEANUP. CJL
173
174/ CHANGED 'CCMSG' TO 'ABMSG' WITH CLEARER MESSAGE. CHANGED
175/ 'CCFLAG' TO 'ABFLAG' FOR CONSISTENCY. CHANGED ABORT CHARACTER
176/ FROM <^C> TO CHOICE OF <^X> OR <^Z> FOR CONSISTENCY. ELIMINATED
177/ 'ITTY' AND 'ITTYW' ROUTINES BY USING 'CTLCTST' AND 'INPUT'
178/ ROUTINES ALREADY AVAILABLE A/O EDIT 043. ELIMINATED 'TCHAR' IN
179/ FAVOR OF 'INCHAR' AVAILABLE A/O EDIT 043.
180
181/ 043 07-AUG-1989 CODE CLEANUP, ETC. CJL
182
183/ REWRITE OF CONSOLE SUPPORT ROUTINES INCLUDING FORCED-ECHO OUTPUT
184/ AND COLUMN COUNT FOR <HT> SIMULATION IN PREPARATION FOR IMPENDING
185/ USER-INTERFACE REWRITE. 'SCRIBE', 'LININP', AND 'ESCPRNT'
186/ ROUTINES NOW CALL "P7ECHO" ROUTINE TO ENSURE PRINTING OF CRUCIAL
187/ MESSAGES.
188
189/ 042 13-JUN-1989 CODE CLEANUP. CJL
190
191/ FIXED VARIOUS NAK-RELATED BUGS AND SEND-INIT PROBLEMS AS IN K278
192/ (SOME OF THE K278 STUFF IS DEFICIENT!). CALCULATION OF PROPER
193/ SEQUENCE NUMBER FOR NAK CORRECTED OVER FORMER (K08MIT AND K278)
194/ VERSIONS. ADDED ERROR MESSAGE FOR FULL-DISK PROBLEM.
195
196/ 041 12-MAY-1989 BUG FIX. CJL
197
198/ VARIOUS VERSIONS (DECMATE) WON'T FUNCTION REMOTELY WHILE KL-8
199/ VERSIONS WORK FINE. ADDED REMOTE LINE READ IOT TO INITIALIZE
200/ REMOTE LINE AT STARTUP TIME FOR VERSIONS REQUIRING THIS.
201/ CORRESPONDING CHANGES IN PATCH FILE MADE FOR REMOTE LINE READ IOT
202/ IN TWO PLACES.
203\f/ 040 07-MAR-1989 COSMETIC CLEANUP. CJL
204
205/ CLEANUP OF EDIT HISTORY AND OTHER COMMENTS.
206
207/ 039 21-MAY-1988 CODE CLEANUP. CJL
208
209/ ADDED VARIABLE 'INIECHO' TO ALLOW DEFAULT CONNECT-MODE STATE TO
210/ BE HALF-DUPLEX ("SET LOCAL-ECHO ON"). MODIFIED INPUT SERVICE
211/ ERROR ADDRESSES TO SIMPLIFY ERROR TABLES.
212
213/ 038 19-MAY-1988 CODE CLEANUP. CJL
214
215/ ELIMINATED TRAILER FILES DURING ASSEMBLY BY CREATING VARIABLES
216/ 'GENMSG' AND 'UMSG.' THIS ALLOWS THE HEADER FILE (PARAM.PA) TO
217/ CONTAIN THE LOCAL MESSAGE TEXT WITHOUT SUBSEQUENT OVERLAY (WHICH
218/ WAS WHY THERE FORMERLY WAS A TRAILER FILE CAPABILITY). OVERLAY
219/ BY K12PCH.BN WILL DEFAULT TO CREATION OF A DUMMY USER MESSAGE
220/ (WITHIN K12PCH) ENCOURAGING LOCAL CUSTOMIZATION. K12MIT.BN WILL
221/ CONTAIN A NULL MESSAGE BY DEFAULT UNLESS CUSTOMIZED IN PARAM.PA.
222
223/ 037 21-JAN-1988 BUG FIX. CJL
224
225/ RESET OS/8 DEVICE CONTROL WORD TABLE TO DELETE TENTATIVE FILE IN
226/ CASE OF PRIOR INPUT SERVICE ERROR.
227
228/ 036 20-JAN-1988 BUG FIX. CJL
229
230/ RESET 'OFFLG' WHEN DOING INPUT SERVICE IN CASE PRIOR ERRORS LEAVE
231/ THE FLAG SET.
232
233/ 035 14-JAN-1988 USR RESIDENT CODING. CJL
234
235/ CALLS TO USR NOW USE 10200 INSTEAD OF 17700. NO SWAP OVERHEAD
236/ WHEN OPENING OR CLOSING FILES.
237
238/ 034 13-JAN-1988 CODE CLEANUP. CJL
239
240/ ALL EIGHT-BIT ORIENTED CONSOLE CODE ELIMINATED; NOW IGNORES
241/ PARITY (JUST SEVEN BITS).
242
243/ 033 12-JAN-1988 CODE CLEANUP. CJL
244
245/ 'TTYOUT' AND 'OTTY' ROUTINES ELIMINATED; NOW USES 'P7CH' FOR ALL
246/ CONSOLE OUTPUT (EXCEPT FOR CONNECT MODE).
247
248/ 032 12-JAN-1988 CODE CLEANUP. CJL
249
250/ VARIOUS ROUTINES REWRITTEN TO ELIMINATE DEPENDENCIES ON CPU TYPE
251/ BEYOND THE CLASSIC PDP-8.
252\f/ 031 11-JAN-1988 CODE CLEANUP. CJL
253
254/ ELIMINATED 'RTDISP' AND CHANGED CALLING CONVENTION FOR DISPATCH
255/ ROUTINE. ALL CALLERS NOW LOCAL OR VIA LOCAL POINTERS. ADDED
256/ SEVERAL CONDITIONAL PARAMETERS AND LABELS FOR BENEFIT OF
257/ K12PCH.PAL.
258
259/ 030 05-JAN-1988 CODE CLEANUP. CJL
260
261/ CHANGED LOWER/UPPER CASE CONDITIONAL ASSEMBLY PARAMETERS AND MORE
262/ EFFICIENT CODE.
263
264/ 029 21-DEC-1987 CODE CLEANUP. CJL
265
266/ CHANGED CALLING CONVENTIONS FOR 'SCRIBE' AND SIMILAR ROUTINES AND
267/ REWROTE 'COMMAND' ROUTINE.
268
269/ 028 15-DEC-1987 CODE CLEANUP. CJL
270
271/ COMPLETE REWRITE OF FILE LOOKUP ROUTINE. 'LUKUP' NOW USES FIELD
272/ ONE BUFFER AND ITS OWN AUTO-INDEX REGISTER CONSERVING PROGRAM
273/ SPACE.
274
275/ 027 05-DEC-1987 CODE CLEANUP. CJL
276
277/ CHANGED DISPATCH ('DISPA0') ROUTINE TO USE 'SRCHTABLE' ROUTINE.
278/ ALL CALLS MADE COMPATIBLE. ELIMINATED 'SCANC' CODE. ELIMINATED
279/ CODE WITHIN 'DPARS' ROUTINE. 'LUKUP' ROUTINE NOW DOES ITS OWN
280/ DISK I/O. ELIMINATED 'BLKIN' ROUTINE.
281
282/ 026 27-NOV-1987 NEW CONNECT MODE CODE. CJL
283
284/ TOTAL REWRITE OF ALL CONNECT MODE CONSOLE AND REMOTE INPUT AND
285/ OUTPUT TERMINAL ROUTINES. CONNECT IS NOW FULLY BUFFERED IN ALL
286/ DIRECTIONS. IF FLOW CONTROL IS OBEYED, ANY BAUD RATE CAN BE
287/ ACCOMODATED BOTH LOCALLY AND REMOTE (UP TO 9600 BAUD TESTED,
288/ SHOULD WORK TO AT LEAST 19200 BAUD BY INSPECTION). TESTED WITH
289/ FAST VT-100 EMULATOR CONSOLE TO PROVE ESCAPE SEQUENCES ARE NOT
290/ DROPPED WHEN LOCAL TERMINAL IS FASTER THAN REMOTE LINE. LIMITED
291/ USE OF SUBROUTINES TO IMPROVE HIGH BAUD RATE OPERATION. ADDED
292/ TABLE-DRIVEN ERROR EXIT ROUTINE FOR SEND ROUTINES.
293
294/ THIS EDIT PROVIDES FULLY BUFFERED INPUT/OUTPUT ROUTINES FOR BOTH LOCAL AND
295/ REMOTE PORTS. NO INTERRUPTS ARE USED FOR MAXIMUM COMPATIBILITY WITH OS/8
296/ DEVICES (SOME OF WHICH ARE INTOLERANT OF INTERRUPTS, SUCH AS TD-8/E). REMOTE
297/ FLOW CONTROL (IF ENABLED) WILL SIGNAL BUFFER FILLING VIA <DC3> WHEN THE BUFFER
298/ IS 3/4 FULL. WHEN THE BUFFER REACHES 1/4 FULL, THE REMOTE WILL BE SENT <DC1>
299/ TO ALLOW FURTHER OUTPUT. REMOTE FLOW CONTROL IS SUPPORTED IN BOTH DIRECTIONS;
300/ LOCAL FLOW CONTROL IS FROM THE KEYBOARD ONLY.
301
302/ WHILE THE CONSOLE OUTPUT IS PAUSED BY <DC3>, THE BUFFER WILL FILL WITH OUTPUT
303/ CHARACTERS. WHEN THE USER RELEASES THE CONSOLE WITH <DC1>, THE BUFFER WILL
304/ RAPIDLY EMPTY (ASSUMING THE CONSOLE IS FASTER THAN THE REMOTE LINE). THIS
305/ ALLOWS THE USER TO PAUSE THE CONSOLE WITHOUT BACKING UP THE REMOTE LINE UP TO
306/ THE LIMITS OF BOTH LOCAL OUTPUT AND REMOTE INPUT BUFFERS.
307\f/ 025 24-NOV-1987 NEW FEATURES AND CODE CLEANUP. CJL
308
309/ PROPER INTERRUPT SETUP FOR <^C> AND <^P>, ECHO STATE. ALL
310/ MESSAGES IN NEW FORMAT, (SOME NEW ONES HAVE BETTER CONTENT).
311/ ELIMINATED 'PRI6B' AND 'REM6B' ROUTINES. NEW AND IMPROVED INPUT
312/ SERVICE ERROR CODE MOVED TO PROPER PAGE. REWROTE CONNECT
313/ ROUTINES TO ALLOW NON-INTERRUPT BUFFERED I/O LATER. CREATED NEW
314/ VARIABLE 'ESCHAR' AND PARAMETER 'ESCAPE' TO SET DEFAULT ESCAPE
315/ CHARACTER. ESCAPE CHARACTER CAN BE CHANGED IN MEMORY AND WILL BE
316/ USED CORRECTLY BY ALL ROUTINES. ADDED 'ESCPRNT' ROUTINE TO
317/ HANDLE ALL CASES (INCLUDING NON-CONTROL CHARACTERS). DEFAULT
318/ ESCAPE PARAMETER VALUE COMPATIBLE WITH K08V2, BUT IS A USER
319/ PARAMETER, CONFIGURED AS OTHER PARAMETERS DEFINED IN EDIT 017.
320/ CREATED ESCAPE FUNCTION TABLE FOR EXPANSION LATER. NOW SUPPORTS
321/ ESCAPE C(LOSE) IN UPPER OR LOWER CASE, ESCAPE ESCAPE (SEND ONE
322/ ESCAPE CHARACTER). ALL BAD ESCAPE COMMANDS WILL ISSUE <BEL>
323/ CHARACTER TO WARN USER THAT COMMAND IS ILLEGAL AND OTHERWISE WAS
324/ IGNORED. CREATED NEW VARIABLE 'ECHOFLAG' TO ALLOW LOCAL ECHO IN
325/ CONNECT MODE.
326
327/ 024 19-NOV-1987 NEW FEATURES. CJL
328
329/ NEW STARTUP MESSAGES AND HELP METHOD VIA COMMAND. CPU TYPE
330/ IDENTIFICATION TO ALLOW FUTURE VERSIONS TO CHECK FOR QUIRKS AND
331/ MODEL DEPENDENCIES. THE DEFAULT PROMPT REFLECTS THE ACTUAL CPU
332/ TYPE (THUS "KERMIT-12>" ON PDP-12). VERSION, REVISION, AND DATE
333/ NOW EQUATED SYMBOLS.
334
335/ 023 18-NOV-1987 NEW CONSOLE I/O PACKAGE. CJL
336
337/ NEW CONSOLE I/O ROUTINES WITH DC1/DC3 SUPPORT FOR CONSOLE
338/ TERMINAL MESSAGES NOT ASSOCIATED WITH ANY REMOTE ACTIVITY (NOT TO
339/ BE USED DURING CONNECT MODE). USES FIELD ONE FOR MESSAGE TEXT TO
340/ ALLOW FOR MORE PROGRAM SPACE. THE MESSAGES ARE NOW GIVEN IN
341/ UPPER/LOWER SIXBIT FORMAT. SUPPORT FOR <^P> RESTART AND <^O> TO
342/ FLIP ECHO. UPPER-CASE CAN BE FORCED BY CHANGING A VARIABLE
343/ ('UPONLY').
344
345/ 022 17-NOV-1987 BUG FIX. CJL
346
347/ EXTRA-LONG INIT PACKETS CORRUPTING PROGRAM; NOW CHECKS FOR AND
348/ IGNORES EXTRA CAPABILITIES BEYOND 'CAPAS' BYTE.
349\f/ 021 17-NOV-1987 CODE CLEANUP. CJL
350
351/ REWROTE TENTATIVE OUTPUT FILE LENGTH CODE FOR MORE CONSISTENCY.
352/ RENAMED "FINISH" COMMAND CORRECTLY (FORMERLY "BYE").
353
354/ FORMER CODE REGARDING THE TENTATIVE FILE MAXIMUM LENGTH WAS ACCEPTABLY
355/ ORGANIZED FOR ORIGINAL PS/8, OS/8 CONVENTIONS. WITH THE EVOLUTION OF THE
356/ OPERATING SYSTEM INTO OS/78 (VERSIONS 1-4) AND OS/278 (VERSIONS 1-2), THE
357/ ENTER OPERATION HAS BEEN CHANGED WITH DANGEROUS CONSEQUENCES.
358
359/ THE ORIGINAL DEFINITION OF THE LENGTH RETURNED BY ENTER IS THE ACTUAL LENGTH
360/ OF THE LARGEST EMPTY (IN TWO'S COMPLEMENT FORM). IF RECORD 7777 IS PART OF
361/ THE ACTUAL LARGEST EMPTY (FULL SIZE DEVICE AND THE LARGEST EMPTY IS LAST ON
362/ THE DEVICE), THEN THE LENGTH RETURNED IS ONE LESS (THIS IS A LONG STANDING
363/ BUG). SINCE THERE IS NO STRAIGHT-FORWARD WAY TO DETERMINE THIS, THE LENGTH IS
364/ ASSUMED TO BE CORRECT.
365
366/ TESTS WITH THE DECUS VERSION OF OS/278 (DM-101) REVEAL A DANGEROUS CHANGE:
367/ THE LENGTH RETURNED IS TWO LARGER THAN ACTUALLY EXISTS!
368
369/ TO COUNTERACT THIS, EDIT 010 INSERTED A DECREMENT OF TWO INTO THE LENGTH
370/ BEFORE PASSING IT BACK TO THE KERMIT FILE WRITING ROUTINE. THE FILE WRITING
371/ ROUTINE THEN ADDS ONE TO THE LENGTH TO CREATE A "DANGER COUNT", I.E., IN TWO'S
372/ COMPLEMENT NOTATION, THIS IS THE AMOUNT THAT WILL INDICATE FILE OVERFLOW
373/ SHOULD IT REACH ZERO.
374
375/ THIS HAS NOW BEEN REORGANIZED TO ALLOW THE ENTER ROUTINE TO SET THE DANGER
376/ COUNT DIRECTLY. OS/8 USERS MUST ALLOW FOR THE EXTRA ROOM (WHICH MUST BE
377/ PRESENT BUT WILL NOT BE USED), SINCE NO CHECK FOR SYSTEM VERSION WILL BE
378/ PERFORMED.
379
380/ 020 16-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL
381
382/ REWROTE ENTIRE OUTPUT FILE PACK ROUTINE. NOW SUPPORTS
383/ ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES OUTPUT
384/ BUFFER IN FIELD ONE (SAME DEFINITIONS AS INPUT BUFFER) TO ALLOW
385/ MORE PROGRAM SPACE. END OF FILE CONVENTION IN ASCII MODE NOW
386/ INCLUDES ENSURING <^Z> CHARACTER PACKED INTO FILE (OR NOT).
387/ REWROTE ENTIRE OUTPUT FILE CLOSE ROUTINE TO IMPLEMENT <^Z>
388/ SCHEME. ELIMINATED SEPARATE OUTPUT FILE INITIALIZE ROUTINE; USE
389/ SPECIAL ROUTINE CALL INSTEAD. FIXED PACKET WRITE BUG.
390
391/ 019 15-NOV-1987 NEW ROUTINES AND CODE CLEANUP. CJL
392
393/ FIXED UNPACK <^Z> BUG. REWROTE ENTIRE INPUT FILE UNPACK ROUTINE.
394/ NOW SUPPORTS ASCII/BINARY INTERNAL FILE MODE FOR LATER USE. USES
395/ INPUT BUFFER IN FIELD ONE TO ALLOW MORE PROGRAM SPACE. BUFFER
396/ FIELD DEFINED VIA SYMBOLS TO ALLOW CHANGES IN THE FUTURE. END OF
397/ FILE CONVENTION IN ASCII MODE NOW INCLUDES SENDING <^Z> CHARACTER
398/ OR NOT. ELIMINATED SEPARATE INPUT FILE INITIALIZE ROUTINE; USE
399/ SPECIAL ROUTINE CALL INSTEAD.
400
401/ 018 09-NOV-1987 BUG FIX AND CODE CLEANUP. CJL
402
403/ FIXED RECEIVE BUG; NOW ALLOW DEV: ON RECEIVE.
404\f/ 017 05-NOV-1987 NEW FEATURES. CJL
405
406/ CONDITIONAL ASSEMBLY PARAMETERS ADDED FOR MACHINE TYPE (PDP-8,
407/ DECMATE I, DECMATE II/III/III+), REMOTE LINE AND LOCAL TERMINAL
408/ INTERFACE DEFINITIONS.
409
410/ 016 05-NOV-1987 CODE CLEANUP. CJL
411
412/ OPTIMIZATION OF CODE, LITERALS, CONSTANTS.
413
414/ 015 04-NOV-1987 BUG FIX. CJL
415
416/ INPUT SERVICE ROUTINE ERROR DOES JMP INSTEAD OF JMS WHEN CALLING
417/ COMMON ERROR HANDLER.
418
419/ 014 02-NOV-1987 SOURCE FILE CLEANUP. CJL
420
421/ SOURCE FILE COSMETICALLY CLEANED UP AND RENAMED TO K12MIT.PAL
422/ WHICH CONFORMS WITH CUCCA NAMING CONVENTION. NO ACTUAL BINARY
423/ CODE CHANGES BEYOND K08V2. THIS EDIT HISTORY ADDED. ENTRIES
424/ PRIOR TO 014 TRANSCRIBED BY CJL.
425
426/ SINCE THE PDP-12 (AND OTHER 12-BIT DEC MACHINES) IS THE INTENDED ENVIRONMENT
427/ FOR THIS PROGRAM, IT IS NOW KNOWN AS KERMIT-12.
428
429/ ASSEMBLING THE SOURCE FILE PRODUCES BINARY IDENTICAL TO K08V2.PA CONFIRMING
430/ THAT SOURCE CLEANUP DOESN'T DAMAGE THE CODING (K08V2 IS NOW OBSOLETE).
431
432/ 013 01-OCT-1987 CHANGE TO VERSION 2.0. R. SCHLERF (RICH)
433
434/ CHANGED 'RKIOT'/'RTIOT' TO 43/44 REMOTE LINE IOT (LOCAL
435/ PREFERENCE). CHANGED 'ESCAPE' CHARACTER TO ^] ('CONX1') FOR
436/ GENERIC CONFORMITY. ADDED VERSION/COMMAND BANNER AT STARTUP FOR
437/ MINI-HELP. INCORPORATED K278 CHANGES 003-006, 009-010 (NO
438/ INTERRUPTS). DELETED 'ERRMSG.' NOW USES 'STXERR' AT 'CLOOP9'+2
439/ FOR PROGRAM SPACE. TO CONFORM TO GENERIC KERMIT, "BACK ON PDP8"
440/ MESSAGE DELETED AND REPLACED WITH BEEP <^G>. MESSAGE "SENDING
441/ FILE XXXXXX.XX CREATED ON DD-MM-YY" REDUCED TO "SENDING FILE
442/ XXXXXX.XX" TO CONFORM TO GENERIC KERMIT. PARITY BIT IS IGNORED
443/ ON BOTH REMOTE AND TTY LINES. OUTPUT PARITY IS SET TO SPACE.
444
445/ PROGRAM RENAMED TO K08V2.PA AND MADE AVAILABLE TO CUCCA BY:
446
447/ RICHARD SCHLERF (RICH)
448/ AMERICAN CYANAMID COMPANY
449/ MEDICAL RESEARCH DIVISION
450/ LEDERLE LABORATORIES
451/ BUILDING 190 ROOM 115H
452/ PEARL RIVER, NEW YORK 10965
453/ (914) 732-2186 (09:00 TO 16:00)
454
455/ SINCE PRIMARY APPLICATION OF K08V2 IS FOR PDP-8 USAGE, THE MODIFICATIONS NOT
456/ SPECIFIC TO DECMATE II/III FROM K278 WERE MOVED TO THE K08MIT VERSION. FUTURE
457/ VERSIONS WILL INCORPORATE THE DECMATE FEATURES AND THUS OBSOLETE ALL OTHER
458/ VERSIONS AT THAT TIME.
459\f/ 012 04-JUN-1986 PROGRAM FIX. SEPP STADELMANN (SSTA)
460
461/ RE-INITIALIZE VIA 'V30ST' AS ROM SETUP CLEARS COMPOSETABLE, ETC.
462
463/ 04-JUN-1986 VERSION RELEASED TO CUCCA BY MARTYN HEMMINGS (DEC GERMANY) AND
464/ SEPP STADELMANN (DEC SWITZERLAND) OF:
465
466/ DIGITAL EQUIPMENT CORPORATION (DEC)
467/ 146 MAIN STREET
468/ MAYNARD, MASS 01754
469/ (617) 897-5111
470
471/ CUCCA RENAMED FILES (KERMIT.PA AND KERCOM.PA) TO K278.PA AND K278COM.PA (WHICH
472/ DOESN'T REALLY CONFORM TO THE NAMING CONVENTION).
473
474/ CUCCA VERSION OF K278.PA FOUND TO BE DEFECTIVE. FILE REPAIRED BY:
475
476/ CHARLES LASNER (CJL)
477/ CLA SYSTEMS
478/ 72-55 METROPOLITAN AVENUE
479/ MIDDLE VILLAGE, NEW YORK 11379-2107
480/ (718) 894-6499
481
482/ REPAIRED FILE (K278.PA) NOW AVAILABLE AT CUCCA.
483
484/ PROGRAM IS NOW THE DECMATE II/III (III-PLUS) KERMIT ONLY. HOOKS WERE LEFT IN
485/ FOR PDP-8 VERSION, BUT NOT IMPLEMENTED. K278 DOES WORK WITH ADDITIONAL
486/ IMPLEMENTATIONS OF KERMIT, BUT RECEIVE COMMAND DOES NOT WORK. PROGRAM YIELDS
487/ RECOVERABLE SYSTEM ERROR/HALT WHEN EXITING TO FLOPPY-BASED DECMATE II SYSTEM.
488/ CONNECT MODE IS VT200 8-BIT WHICH CONFUSES EVEN/ODD PARITY SYSTEMS. K278 DOES
489/ NOT SUPPORT SETUP KEY OF DECMATE, BUT IMPLEMENTS SETUP COMMAND.
490
491/ 011 04-JUN-1986 NEW FEATURES. SSTA
492
493/ 'PRQ3' CODE CONDITIONALS. ROM SETUP COMMAND IMPLEMENTED FOR DMII/III.
494/ AUTOMATIC UPPERCASE SELECT ON RETURN FROM CONNECT.
495
496/ 010 13-MAR-1986 BUG FIX. MARTYN HEMMINGS (MART)
497
498/ FULL DISK HANDLED WELL.
499
500/ 009 13-MAR-1986 BUG FIX. MART
501
502/ CLEAN UP BREAK AND GET.
503\f/ 008 12-MAR-1986 BUG FIX. MART
504
505/ CLEAR INPUT CHARACTERS FROM COMMUNICATIONS PORT WHEN IN IDLE
506/ LOOP.
507
508/ 007 11-MAR-1986 NEW FEATURES AND BUG FIX. MARTYN HEMMINGS AND
509/ SSEP STADELMANN
510/ (MART+SSTA)
511
512/ INTERRUPT DRIVEN AND BUG FIX.
513
514/ 006 10-MAR-1986 NEW FEATURE. MART+SSTA
515
516/ DEVICE PARSE ON GET.
517
518/ 005 10-MAR-1986 BUG FIX. MART+SSTA
519
520/ NO DATE IN FILE WITH <^Z> INTACT.
521
522/ 004 10-MAR-1986 NEW FEATURES AND BUG FIX. MART+SSTA
523
524/ MAXIMUM RECEIVE BUFFER FIXUP ('RTERMI'), 15 SECOND TIME-OUT
525/ DURING CONNECT.
526
527/ 003 10-MAR-1986 BUG FIX. SSTA
528
529/ TWO PAGE HANDLER FIX.
530
531/ K08MIT.PAL COPIED TO DEC ENGINEERING NETWORK (NODE LSMVAX::) ULTIMATELY TO
532/ EUROPE (NODE VIRGIN::) WHERE PROGRAM BECAME KERMIT.PAL AND KERCOM.PAL.
533
534/ KERMIT.PAL AND KERCOM.PAL ARE TWO SOURCE FILES ASSEMBLED TOGETHER TO PRODUCE
535/ THE RUNNING KERMIT-8. *THEY ARE FOR THE DECMATE II/III/III-PLUS ONLY.*
536
537/ 002 18-JUL-1985 ORIGINAL RELEASE. RANDY HIPPE
538
539/ 18-JUL-1985 VERSION RELEASED TO CUCCA BY JERRY SANDS AND RANDY HIPPE OF:
540
541/ BUREAU OF ENGRAVING, INC.
542/ 3311 BROADWAY N.E.
543/ MINNEAPOLIS, MN 55413
544/ (612) 623-0900 X218
545
546/ CUCCA RENAMED FILE (KER8.PAL) TO K08MIT.PAL WHICH CONFORMS TO NAMING
547/ CONVENTION OF KERMIT FILES.
548
549/ K08MIT SUPPORTS CONNECT, BYE (REALLY FIN), EXIT, SEND, GET, RECEIVE ONLY.
550
551/ PROGRAM PRONE TO GETTING "CONFUSED" AND OUTPUTS FILE DATE ATTRIBUTE BOTH AS
552/ 'CAPAS' BYTE FEATURE AND ASCII TEXT INSERTED INTO CONTENTS OF FILE AHEAD OF
553/ FILE DATA. COMMAND PROCESSOR ACCEPTS UPPER-CASE COMPLETE COMMANDS ONLY. <^C>
554/ ABORT FEATURE TAKES VERY LONG TIME TO ACT (IF AT ALL!). MANY KERMITS WILL NOT
555/ WORK WITH K08MIT; HOWEVER, K08MIT WAS TESTED SUCCESSFULLY WITH KERMIT-20.
556
557/ 001 30-JUL-1984 FIRST VERSION (KER8.PAL). JERRY SANDS
558\f/ HARDWARE HINTS AND KINKS.
559
560
561/ KERMIT-12 REQUIRES THE FOLLOWING STANDARD OS/8 FAMILY CONFIGURATION:
562
563/ PDP-8 FAMILY MEMBER WITH AT LEAST 8K MEMORY.
564
565/ OS/8 SYSTEM DEVICE (WITH OS/8 FAMILY OPERATING SYSTEM RESIDENT).
566
567/ KL8-COMPATIBLE CONSOLE INTERFACE.
568
569/ 7/8-BIT ASCII EXTERNAL CONSOLE TERMINAL DEVICE (TTY:).
570
571/ KL8-COMPATIBLE REMOTE INTERFACE TO OTHER KERMIT.
572
573/ NOTE: ASSEMBLY PARAMETERS OF KERMIT-12 ALLOW FOR LOCAL KERMIT CONTROLLING
574/ TERMINALS TO BE OTHER THAN THE PRIMARY OS/8 CONSOLE DEVICE. THE ACTUAL
575/ HARDWARE MUST STILL CONFORM TO THE SAME REQUIREMENTS (THE DEVICE CODES WOULD
576/ THEN BE USER-SPECIFIED AND DIFFER FROM THE STANDARD 03/04) AS THE STANDARD
577/ CONSOLE INTERFACE AND TERMINAL.
578
579/ SPECIAL DECMATE CONSIDERATIONS:
580
581/ DECMATE USAGE IS USUALLY OBTAINED BY ASSEMBLING FOR THE STANDARD CONSOLE
582/ DEVICE (03/04), AS THE BUILT-IN FIRMWARE/SLUSHWARE OF THE DECMATES IS
583/ SUFFICIENTLY COMPATIBLE WITH THE PDP-8 HARDWARE FOR KERMIT-12'S REQUIREMENTS.
584/ (THE ONLY OTHER ACCEPTABLE CONSOLE DEVICE ON THE DECMATE IS THE PRINTER PORT.)
585
586/ DECMATE REMOTE COMMUNICATIONS PORTS ARE *RADICALLY* DIFFERENT FROM
587/ KL8-COMPATIBLE PORTS. THESE ARE HANDLED AUTOMATICALLY BY ONCE-ONLY CODE WHICH
588/ DETECTS THE USAGE OF KERMIT-12 ON THE SPECIFIC DECMATE SYSTEM, AND
589/ SELF-CONFIGURATION AS APPROPRIATE. THERE IS ONE EXCEPTION TO THIS, NAMELY IF
590/ THE COMMUNICATIONS PORT CODE IS ASSEMBLED FOR THE PRINTER PORT (32/33), THEN
591/ THE PRINTER PORT, *NOT* THE COMMUNICATIONS PORT WILL BE USED. THE STANDARD
592/ ASSEMBLY OF KERMIT-12 IS FOR A PDP-8 WITH DEVICE 40/41 COMMUNICATIONS PORT.
593/ THIS DESIGNATED VERSION WILL SELF-CONFIGURE WHEN EXECUTED ON A DECMATE.
594\f/ CONFIGURATION RESTRICTIONS:
595
596/ WHEN INTERRUPTS ARE SUPPORTED AGAIN, DEVICES SUCH AS THE TD-8/E WON'T WORK.
597/ THE NON-INTERRUPT VERSION SHOULD WORK TO 19200 BAUD ON THE PDP-8/E CPU, SO
598/ THIS SHOULD NOT BE A PROBLEM. INTERRUPT-DRIVEN VERSIONS OF KERMIT-12 MUST BE
599/ RUN ONLY ON SYSTEMS WHERE *ALL* INTENDED DEVICES CAN HAVE THEIR HANDLERS
600/ INTERRUPTED BY THE CONSOLE AND REMOTE LINE INTERRUPT HANDLERS. WHEN IN DOUBT,
601/ THE NON-INTERRUPT VERSION MUST BE USED (CURRENTLY THE ONLY VERSION).
602
603/ IF FLOW CONTROL IS DISABLED (DUE TO XON/XOFF BEING UNAVAILABLE) THEN THE
604/ CONSOLE BAUD RATE MUST MEET OR EXCEED THE REMOTE LINE RATE. THE USER MUST
605/ TAKE MINIMAL CARE NOT TO OVERLOAD THE INTERNAL BUFFERS OF KERMIT-12, AS THIS
606/ WILL YIELD THE ERROR MESSAGE: KEYBOARD INPUT ERROR!
607
608/ THIS IS NOT LIKELY TO OCCUR UNLESS ONE "PLAYS" WITH A KEYBOARD WHICH CAN
609/ GENERATE NUMEROUS ESCAPE SEQUENCES AS THE BUFFERS ARE QUITE ADEQUATE FOR ALL
610/ REASONABLE TERMINAL APPLICATIONS. SIMILARLY, IF THE REMOTE LINE DOES NOT OBEY
611/ XON/XOFF PROTOCOL (WHILE KERMIT-12 HAS IT ENABLED), THEN INTERNAL BUFFER
612/ OVERFLOW WILL YIELD THE ERROR MESSAGE: REMOTE LINE INPUT ERROR!
613
614/ THESE ERRORS ARE EXTREMELY UNLIKELY AND CAN ONLY BE CREATED BY MISUSE OF FLOW
615/ CONTROL (THE ONLY EXCEPTION TO THIS IS THE ATTEMPT TO USE KERMIT-12 WITH THE
616/ CONSOLE BAUD RATE SLOWER THAN THE REMOTE LINE BAUD RATE WITH FLOW CONTROL
617/ DISABLED). IF FLOW CONTROL IS ENABLED AND OBEYED THEN THE BUFFERING OF REMOTE
618/ LINE INPUT WILL OCCUR WHILE SHORT PAUSES OCCUR ON THE CONSOLE (ASSUMING THE
619/ USER FREEZES/UNFREEZES THE DISPLAY OFTEN AND THE CONSOLE DISPLAY BAUD RATE IS
620/ FASTER THAN THE REMOTE LINE BAUD RATE) WITH PRACTICALLY NO REMOTE LINE DELAY.
621
622/ FLOW CONTROL IS NOT YET SUPPORTED DURING KERMIT TRANSFERS. SINCE KERMIT-12
623/ DOES NOT SUPPORT SLIDING WINDOWS, KERMIT-12 WILL NEVER GENERATE OUTGOING
624/ XON/XOFF SEQUENCES. FUTURE REVISIONS WILL SUPPORT INCOMING XON/XOFF FROM THE
625/ REMOTE KERMIT. XON/XOFF PROTOCOL DURING CONNECT MODE IS COMPLETELY AVAILABLE
626/ AT THE USER'S OPTION.
627
628/ CONSOLE TERMINALS ARE REQUIRED TO SUPPORT "GLASS TTY:" FEATURES, I.E. THE
629/ PRINTING ASCII CHARACTER SET (LOWER-CASE DESIRABLE) AND THE CONTROL CHARACTERS
630/ <CR>, <LF>, AND <BEL> (THE LAST FOR VARIOUS AUDIBLE REPORTS ONLY). TERMINALS
631/ LACKING LOWER-CASE SUPPORT SHOULD "FOLD" LOWER-CASE CHARACTERS TO UPPER-CASE
632/ AUTOMATICALLY. TERMINALS SUCH AS THE VT05 CAN HAVE THE KEYBOARD LOWER-CASE
633/ ENABLED, AS KERMIT-12 SUPPORTS OPTIONAL OUTPUT FOLDING. THE UPPER-CASE ONLY
634/ OPTION SHOULD BE ENABLED FOR TERMINALS WHICH IGNORE LOWER-CASE INPUT FROM THE
635/ HOST, AS KERMIT-12 GENERATES NUMEROUS LOWER-CASE MESSAGE CHARACTERS (WHICH
636/ BECOME UPPER-CASE IF THIS OPTION IS SET). THE <BS> CHARACTER IS REQUIRED FOR
637/ VISUAL RUBOUT (<BS> <SPACE> <BS>) ONLY. FUTURE VERSIONS WILL SUPPORT
638/ HARD-COPY BACKSPACE TO REMOVE THIS REQUIREMENT. ALL TERMINAL FEATURES (SUCH
639/ AS ACTUAL VT-100 FUNCTIONALITY) ARE FREELY PASSED TO THE HOST DURING CONNECT
640/ MODE; THE ONLY CHARACTER ACTUALLY RESERVED IS THE ESCAPE CHARACTER WHICH WILL
641/ BE TREATED AS A SEVEN-BIT CHARACTER ONLY. IF THE USER PRESSES THE ESCAPE
642/ CHARACTER TWICE, THEN THE SEVEN-BIT REPRESENTATION OF THE CHARACTER IS SENT
643/ ONCE; THERE IS NO WAY TO SEND THE ESCAPE CHARACTER WITH THE HIGH-BIT SET.
644/ SINCE THE ESCAPE CHARACTER ITSELF CAN BE SET TO ALMOST ANY SEVEN-BIT VALUE,
645/ THIS SHOULD NOT BE A SERIOUS LIMITATION. TERMINALS THAT DON'T "BEEP" WHEN THE
646/ <BEL> CHARACTER IS SENT SHOULD NOT OUTPUT A PRINTABLE RENDITION OF THE <^G>
647/ CHARACTER, AS THIS WOULD DISRUPT THE TERMINAL OUTPUT AND INTERNAL COLUMN COUNT
648/ DURING VARIOUS MESSAGE SEQUENCES, ETC.
649\f/ KL-8/E INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS:
650
651/ 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA.
652
653/ FUNCTIONAL BAUD RATES INCLUDE 110, 150, 300, 600, 1200, 2400, 4800, 9600,
654/ 19200, 38400 AND 76800. 2400 BAUD REQUIRES A REVISION "B" OR BETTER M8650
655/ MODULE (IF ONE USES DEC'S DOCUMENTATION OF AVAILABLE SPLIT-LUG OPTIONS).
656/ ACTUAL BAUD RATES UP TO APPROXIMATELY 100 KBAUD SHOULD WORK WHEN KERMIT-12
657/ BECOMES INTERRUPT-DRIVEN. RATES OTHER THAN 110 BAUD REQUIRE A 19.6608 MHZ
658/ BAUD-RATE OSCILLATOR.
659
660/ THE BAUD RATES STATED ABOVE ARE ACTUALLY AVAILABLE ON THE KL-8/E, BUT REQUIRE
661/ A SINGLE SOLDER JUMPER TO IMPLEMENT THE PROPER BAUD RATE ABOVE 2400 BAUD.
662/ CHANGING BAUD-RATE GENERATOR CRYSTALS WILL PRODUCE OTHER RATES AS NECESSARY.
663/ (SEND INQUIRIES TO CLA SYSTEMS FOR INFORMATION REGARDING KL-8/E MODIFICATIONS
664/ INCLUDING UPGRADED BAUD-RATE OSCILLATORS, ETC.) KERMIT-12 HAS BEEN TESTED TO
665/ 9600 BAUD AND SHOULD WORK TO 19200 BAUD (AS OF THE CURRENT VERSION).
666
667
668/ KL8-J/A INTERFACES SHOULD BE SETUP WITH THE FOLLOWING STANDARD SETTINGS:
669
670/ 1 STOP BIT ABOVE 110 BAUD WITH 8 BITS DATA NO PARITY.
671
672/ FUTURE VERSIONS OF KERMIT-12 WILL SUPPORT VARIOUS SOFTWARE-GENERATED PARITY
673/ OPTIONS. THE FRAMING AND OVERRUN ERRORS CAN BE ENABLED AND WILL EVENTUALLY BE
674/ SUPPORTED (BUT THE PARITY GENERATOR SHOULD BE DISABLED TO PREVENT INTERACTION
675/ WITH THE SOFTWARE USE OF PARITY GENERATION/DETECTION).
676
677/ ALL BAUD RATES ARE SUPPORTABLE:
678
679/ 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200.
680
681/ 19200 BAUD IS ACHIEVED BY CUTTING JUMPER "W2" AND ADDING JUMPER "W5" AND THEN
682/ SETTING THE BOARD FOR WHAT IS NORMALLY 9600 BAUD. A WESTERN DIGITAL TR-1602-B
683/ OR EQUIVALENT UART IS REQUIRED TO SUPPORT 19200 BAUD; MOST OF THE RECENT
684/ PRODUCTION DEC M8655 BOARDS USE THE SMC COMM 2017 UART WHICH MEETS OR EXCEEDS
685/ THIS REQUIREMENT. EARLY M8655 BOARDS USE GI UARTS IN CERAMIC PACKAGES WHICH
686/ *CANNOT* BE USED AT 19200 BAUD (MANY ARE FLAKY AT 9600 BAUD!).
687
688/ RECEIVE BAUD RATE SHOULD BE IDENTICAL TO TRANSMIT BAUD RATE. (DO NOT SET THE
689/ RECEIVE=150 BAUD SWITCH!)
690\f/ OTHER INTERFACES:
691
692/ DKC-8/A (8/A OPTION BOARD #1) INTERFACES SHOULD BE SETUP AS PER THE KL8-J/A
693/ SPECIFICATIONS INCLUDING THE REQUIREMENTS OF THE UART. SOME DEC DOCUMENTATION
694/ INDICATED A PROHIBITION ON THE USE OF 19200 BAUD, BUT THIS IS OBVIATED BY THE
695/ USE OF THE SAME UARTS AS IN THE KL8-J/A.
696
697/ EARLIER DEVICES SUCH AS PT08, DP-12, KL-8/F OR DC02 (CHANNEL ZERO ONLY) SHOULD
698/ WORK CORRECTLY AS FACTORY WIRED (MOST OF THESE DEVICES DO NOT SUPPORT OPTIONS
699/ KERMIT-12 WOULD REQUIRE TO BE DISABLED ANYWAY. THESE INCLUDE PARITY
700/ GENERATION, FRAMING ERROR DETECTION, ETC.). TO UTILIZE THESE DEVICES, THE
701/ ASSEMBLY PARAMETERS FOR USER DEVICES AND THEIR RESPECTIVE DEVICE CODE VALUES
702/ SHOULD BE GIVEN DURING ASSEMBLY (SEE ASSEMBLY INSTRUCTIONS). PROPER DEVICE
703/ CODE VALUES MUST BE OBTAINED FOR THE SELECTED INTERFACE, AS THERE ARE MANY
704/ ACTUAL POSSIBILITIES. (DP-12 DEVICES ARE GENERALLY DEVICE 40/41; PT08/DC02
705/ INTERFACES ARE GENERALLY DEVICE 11/12, ETC.)
706\f/ ASSEMBLY INSTRUCTIONS.
707
708/ KERMIT-12 CAN BE ASSEMBLED BY EITHER OF TWO METHODS:
709
710
711/ P?S/8 METHOD:
712
713/ ASSUMING THE EXTENDED-LENGTH FILE KERM12 IS THE SOURCE FILE, THE FOLLOWING
714/ COMMAND WILL PRODUCE A FULLY ORNAMENTED LISTING:
715
716/ .PAL KB1,KB2,KB3,KB4<KERM12(ACEJLMNPQSX8)
717
718/ OPTION SWITCH BREAKDOWN:
719
720/ /A ALL SYMBOLS IN SYMBOL PRINTOUT.
721
722/ /C OPTIMIZE CORE DURING ASSEMBLY FOR MORE SYMBOLS, LESS BUFFERS.
723/ THIS OPTION SHOULD BE DELETED IF MORE THAN 8K IS AVAILABLE FOR
724/ ASSEMBLY.
725
726/ /E FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE.
727
728/ /J *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD.
729
730/ /L PERFORM SECOND-PASS LISTING.
731
732/ /M CHAIN TO MAP FOR BITMAP OUTPUT AT END OF ASSEMBLY.
733
734/ /N ENABLE NEATNESS ADORNMENTS TO LISTING OUTPUT.
735
736/ /P ENABLE PRINTER-ORIENTED (WIDE MODE) LISTING OUTPUT.
737
738/ /Q ENABLE LITERALS ONLY, GENERATED LINKS ARE ERRORS.
739
740/ /S ENABLE SYMBOL TABLE PRINTOUT.
741
742/ /X ENABLE CROSS-REFERENCE OUTPUT AT END OF ASSEMBLY.
743
744/ /8 ENABLE FULL SYMBOL TABLE INCLUDING LINC MODE CROSS ASSEMBLY.
745
746/ THE NUMBER OF BINARY FILES REQUIRED (KB1, KB2, KB3, ETC.) IS TO BE DETERMINED
747/ AT ASSEMBLY TIME, AS KERMIT-12 WILL TEND TO GROW LARGER AS FEATURES ARE ADDED.
748
749/ P?S/8 PAL IS THE PREFERRED METHOD OF ASSEMBLING K12MIT DURING DEVELOPMENT DUE
750/ TO SUPERIOR ERROR DIAGNOSTICS AND OVERALL SPEED. K12MIT COULD GROW TO A SIZE
751/ BEYOND THE CAPABILITIES OF OS/8 CREF. THIS LIMITATION CANNOT APPLY TO THE
752/ P?S/8 DEVELOPMENT ENVIRONMENT.
753
754/ P?S/8 PAL CAN PRODUCE A LISTING OF K12MIT, BUT THE BINARY FILES CREATED BY THE
755/ ASSEMBLY MUST BE TRANSFERRED TO AN OS/8 ENVIRONMENT FOR USE, SINCE K12MIT (AS
756/ SPECIFICALLY WRITTEN) IS FOR THE OS/8 FAMILY OF SYSTEMS ONLY.
757
758/ NOTE: P?S/8 IS *NOT* A DEC PRODUCT; IT IS SOLD COMMERCIALLY AND IS AVAILABLE
759/ FREE OF CHARGE (EXCEPT FOR MEDIA HANDLING CHARGES, ETC.) *ONLY* TO QUALIFIED
760/ INSTITUTIONS. CONTACT CJL FOR ADDITIONAL INFORMATION ON ACQUIRING P?S/8.
761\f/ OS/8 FAMILY OF SYSTEMS METHOD:
762
763/ K12MIT.PA CAN BE ASSEMBLED WITH PAL8 VERSION B0 WHICH IS AVAILABLE FROM DECUS
764/ AS PART OF THE OS/278 RELEASE. PAL8 VERSION B0 WILL RUN ON ANY OS/8 FAMILY
765/ SYSTEM, AS IT HAS NO HARDWARE DEPENDENCIES BEYOND THE ORIGINAL PDP-8
766/ REQUIREMENT (NO BSW OR IAC ROTATE OR CAF OR R3L INSTRUCTIONS AS WAS INTENDED).
767/ THIS ALSO APPLIES TO CREF VERSION B0 WHICH IS REQUIRED WHEN A CROSS-REFERENCE
768/ IS REQUESTED. PAL8 VERSION B0 AND CREF VERSION B0 ARE AVAILABLE AS PART OF
769/ THE KERMIT-12 DISTRIBUTION AS K12PL8.ENC AND K12CRF.ENC RESPECTIVELY. SEE THE
770/ DOCUMENTATION OF K12DEC FOR INFORMATION ON PRODUCING PAL8.SV AND CREF.SV FROM
771/ THESE ENCODED FILES.
772
773/ ASSUMING CCL IS ENABLED, THE FOLLOWING COMMAND WILL PRODUCE A BINARY AND FULLY
774/ ORNAMENTED LISTING:
775
776/ .PAL DEV:K12MIT.BN,DEV:K12MIT.LS,DEV:KSCR.TM<DEV:PARAM.PA,DEV:K12MIT.PA(CEFMW)
777
778/ DEV: IS THE APPLICABLE DEVICE WHERE THE FILES RESIDE. STANDARD EXTENSIONS
779/ ARE ASSUMED (.BN FOR BINARY, .LS FOR LISTING, .PA FOR PAL SOURCE). THE
780/ KSCR.TM TEMPORARY OUTPUT FILE SPECIFICATION IS OPTIONAL, BUT IS DEFAULTED TO
781/ SYS:CREFLS.TM IF NOT EXPLICITLY GIVEN. MANY SYSTEM DEVICES ARE TOO SMALL TO
782/ SUPPORT THIS TEMPORARY FILE, THUS THE FILE MAY BE DIRECTED TO ANOTHER
783/ AVAILABLE DEVICE WITH SUFFICIENT SPACE.
784
785/ THE PARAM.PA FILE IS OPTIONAL AND USED TO PASS SHORT USER PARAMETERS, ETC. TO
786/ THE ASSEMBLY.
787
788/ OPTION SWITCH BREAKDOWN:
789
790/ /C CHAIN TO CREF.SV TO PRODUCE A CROSS-REFERENCED LISTING FILE.
791
792/ /E GENERATED LINKS ARE ERRORS.
793
794/ /F *DO NOT* TERMINATE TEXT STRINGS WITH EXTRA ZERO WORD.
795
796/ /M USE MAMMOTH SYMBOL TABLE OPTION FOR CREF.
797
798/ /W FORGET LITERAL BOUNDARIES WHEN LEAVING THE CURRENT PAGE.
799
800/ LOADING INSTRUCTIONS:
801
802/ .LOAD DEV:K12CLR,K12MIT.BN THIS LOADS THE BINARY CLEAR AND KERMIT
803/ .SAVE DEV K12MIT.SV=1 THIS SAVES THE CORE IMAGE
804
805/ THE JOB STATUS WORD (=1) INDICATED THAT K12MIT.SV LOADS INTO 10000-11777, BUT
806/ SHOULD NOT BE SAVED/RESTORED WHEN THE USR IS LOADED OVER THIS AREA OR
807/ DISMISSED (THE USR IS ACTUALLY NEVER DISMISSED IN NORMAL K12MIT OPERATION).
808/ OTHER BITS MAY BE SET AT THE USER'S OPTION, BUT ARE UNNECESSARY; THE BIT
809/ INDICATED SERVES ONLY TO REDUCE SYSTEM OVERHEAD REGARDING THE DISPOSITION OF
810/ 10000-11777. THE BINARY FILE K12CLR.BN (CREATED BY ASSEMBLING K12CLR.PA)
811/ LOADS ZEROES INTO ALL OF MEMORY TO CREATE A "CLEAN" CORE IMAGE FILE, WHICH
812/ MAKES THE ENCODED BINARY FILE SMALLER DUE TO REPEAT COMPRESSION.
813\f/ PASSING SHORT PARAMETER FILES.
814
815/ WHEN INSERTING A SHORT USER MODIFICATION FILE IN THE INPUT STREAM (PARAM.PAL)
816/ THE FOLLOWING SHOULD BE NOTED:
817
818/ ALWAYS PUT THE SHORT PARAMETER FILE (CONTAINING EQUATED SYMBOLS SUCH AS
819/ USER=1, ETC.) IN FRONT OF K12MIT.PAL.
820
821/ IF TTY: IS USED FOR DIRECT TYPE-IN OF THESE PARAMETERS, THE INFORMATION NEED
822/ ONLY BE TYPED ENDING WITH <^Z> DURING PASS 1. SUBSEQUENT PASSES REQUIRE THE
823/ ENDING <^Z> ONLY. IF THIS METHOD IS USED, A LISTING WITHOUT THE USER INPUT
824/ WHICH DID THE CUSTOMIZING OF KERMIT-12 CAN BE CREATED. NOTE: IF BINARY IS
825/ GENERATED BY THE CONTENTS OF THE PARAMETER FILE (SUCH AS USE OF THE LOCAL TEXT
826/ MESSAGE, ETC.), THE INFORMATION MUST BE TYPED IN DURING PASS 2. THE PASS 3
827/ LISTING MAY CONTAIN THE INFORMATION IF SO DESIRED, REQUIRING A REPETITION OF
828/ THE INPUT. PASS 1 INPUT OF THE INFORMATION IS EFFECTIVELY IGNORED, AS NO
829/ DEFINITIONS ARE CREATED ('LCLMSG' IS DEFINED ELSEWHERE, ETC.).
830
831/ EXPERIENCED PDP-8 USERS NEW TO PAL8 VERSION B0 TAKE SPECIAL NOTICE:
832
833/ DUE TO HARDWARE LIMITATIONS OF THE DECMATES, THE KEYBOARD FLAG WILL BE CLEARED
834/ DURING PDP-8 PAL8 B0 OPERATION. THE KL8E TTY: HANDLER WILL NO LONGER BE ABLE
835/ TO BUFFER <^Z> DURING THE ASSEMBLY; YOU MUST WAIT UNTIL THE HANDLER ACCESSES
836/ THE KEYBOARD ON EACH PASS *THEN* PRESS <^Z> TO CONTINUE THE ASSEMBLY.
837
838
839/ CREATING A CUSTOM MESSAGE FROM THE PARAMETER FILE.
840
841/ IF SO DESIRED, A CUSTOM LOCAL HEADER MESSAGE MAY BE ADDED BY INSERTING THE
842/ FOLLOWING INTO THE PARAMETER FILE:
843
844/ BUFFLD= 10 /THESE PROBABLY
845/ FILBUFF=2000 /WON'T CHANGE!
846
847/ GENMSG= 0 /DON'T GENERATE STANDARD (NULL) MESSAGE
848/ UMSG= 0 /DON'T GENERATE STANDARD (DUMMY) USER MESSAGE
849
850/ FIELD BUFFLD%10 /FIELD FOR TEXT MESSAGE
851
852/ *FILBUFFER /LOCAL MESSAGE LOADS THERE
853
854/LCLMSG,TEXT "%^I^NSERT ^L^OCAL ^M^ESSAGE ^H^ERE!%"
855
856/ ZBLOCK LCLMSG+40-. /ZERO REST OF MESSAGE AREA
857
858/ TEXT IS IN UPPER/LOWER-CASE SIXBIT WITH '^' MEANING SHIFT CASE (INITIALLY
859/ LOWER-CASE) AND '%' MEANING <CR>, <LF>.
860\f/ OTHER METHODS:
861
862/ KERMIT-12 *CANNOT* BE ASSEMBLED BY PAL10 (LAST KNOWN VERSION OF PDP-8
863/ CROSS-ASSEMBLER FOR TOPS10 (142)) BECAUSE IT LACKS CERTAIN FEATURES:
864
865/ DOES NOT SUPPORT 'RELOC' PSEUDO-OP.
866
867/ DOES NOT SUPPORT PAGE ZERO REDEFINE (CAUSES "Z" ERROR ON SOURCE FILES WHICH
868/ DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8).
869
870/ INCORRECTLY HANDLES 'ZBLOCK' PSEUDO-OP (LEADS TO "Q" ERROR ON SOURCE FILES
871/ WHICH DON'T HAVE ERRORS WHEN ASSEMBLED BY EITHER P?S/8 PAL OR OS/8 PAL8).
872
873/ DOES NOT SUPPORT LITERAL "FORGETTING" (P?S/8 PAL OPTION /E OR OS/8 PAL8 OPTION
874/ /W) WHICH IS REQUIRED FOR DEFINING OVERLAY AREAS, ETC.
875
876/ DOES NOT SUPPORT TEXT WITHOUT ZERO WORD FILL (P?S/8 PAL OPTION /J OR OS/8 PAL8
877/ OPTION /F FULFILLS THIS REQUIREMENT) WHICH IS REQUIRED FOR TEXT MESSAGES.
878
879
880/ P?S/8 PAL IS AN IMPROPER SUPERSET OF PAL10. PAL10 SUPPORTS MACRO-8 MODE AS AN
881/ OPTION AND AUTOMATIC FIELD DUMP BITMAPS; ALL OTHER KNOWN PAL10 FEATURES EXIST
882/ IN P?S/8 PAL INCLUDING THE SUPPORT OF THE AUTOMATIC FIELD DUMP BITMAP
883/ PSEUDO-OPS ('ENBITS' AND 'NOBITS').
884
885/ OS/8 PAL8 (VERSION B0) IS A SUBSET OF P?S/8 PAL WHICH HAS SEVERAL SYNTACTIC
886/ QUIRKS (WHICH ARE AVOIDABLE, BUT NONETHELESS ARE INCOMPATIBLE WITH BOTH P?S/8
887/ PAL AND PAL10 IN CERTAIN MINOR WAYS); REGARDLESS, PAL8 LACKS THE
888/ COMPATIBILITY PROBLEMS OF PAL10.
889
890/ MAINTAINING SOURCE COMPATIBILITY.
891
892/ KERMIT-12 SOURCE FILE CONVENTIONS DEMAND THE USE OF THE COMMON SUBSET OF P?S/8
893/ PAL AND OS/8 PAL8 (VERSION B0). CERTAIN FORMS OF STATEMENTS SHOULD BE
894/ AVOIDED:
895
896/ TAD /NOT LEGAL IN PAL8
897/ 0+TAD /NOT LEGAL IN PAL10, AND POSSIBLY WRONG IN PAL8
898/ TAD (3)+1 /GENERATES SAME AS "TAD (3+1)" IN PAL8
899/ -A!-B /UNARY OPERATOR HANDLED WRONG IN PAL8
900/ I+N /NOT LEGAL IN PAL8
901/ N+I /NOT LEGAL IN PAL8
902/ I I /NOT LEGAL IN PAL8
903
904/ THIS REQUIREMENT IS EASILY MET BY KERMIT-12 AS MOST OF THESE CASES ARE
905/ ESOTERIC QUIRKS AND NOT NEEDED FOR THIS ASSEMBLY.
906
907/ THE RESTRICTIONS OF PAL10 (EVEN THOUGH IT HAS OTHER DESIRABLE FEATURES, MOST
908/ OF WHICH IT SHARES WITH P?S/8 PAL) ARE TOO SEVERE TO ALLOW USABLE ASSEMBLY OF
909/ THIS PROGRAM. BETTER CROSS-ASSEMBLERS MAY EXIST ELSEWHERE WHICH ARE
910/ SOURCE-COMPATIBLE WITH KERMIT-12.
911\f/ USE OF P?S/8 LANGUAGE EXTENSIONS.
912
913/ P?S/8 OFFERS SEVERAL USEFUL FEATURES OVER PAL8 (AND PAL10) WHICH MAY BE USEFUL
914/ FOR ASSEMBLY DEVELOPMENT OF KERMIT-12. THESE INCLUDE LANGUAGE ELEMENTS SUCH
915/ AS "TAD (3)+1" HANDLED CORRECTLY, OR PSEUDO-OPS SUCH AS "PAUSE EXPR" WHERE THE
916/ VALUE OF 'EXPR' WILL BE DISPLAYED ON THE SYSTEM CONSOLE DURING THE ASSEMBLY
917/ WHEN THAT POINT IN THE ASSEMBLY IS REACHED. TO ACCESS THESE FEATURES AND
918/ STILL PROVIDE COMPATIBILITY WITH PAL8 (VERSION B0), THE FOLLOWING CODING
919/ TECHNIQUE IS SUGGESTED:
920
921
922/ IFNDEF PQS <PQS=0> /WILL BE 0 ON PAL8, PAL10
923
924
925/ IFZERO PQS < /DO PAL8, ETC. STUFF HERE
926
927/ FOO= (TABLE) /DEFINE POINTER TO ADDRESS OF TABLE
928
929/ TAD FOO-1 /GET (POINTER TO ADDRESS OF TABLE)-1
930/ DCA XR1 /SETUP AUTO-INDEX REGISTER
931
932/ WISH WE HAD PAUSE AND ERROR PSEUDO-OPS IN PAL8.
933
934/ > /END OF PAL8, ETC. VARIANT
935
936
937/ IFNZRO PQS < /DO P?S/8 PAL STUFF HERE
938
939/ TAD (TABLE)-1 /GET (POINTER TO ADDRESS OF TABLE)-1
940/ DCA XR1 /SETUP AUTO-INDEX REGISTER
941
942/ IFNDEF PASS <PASS=0>/DEFINE PASS VARIABLE
943
944/ PASS= PASS+1 /BUMP EVERY ASSEMBLER PASS
945
946/ PAUSE PASS /DISPLAY PASS NUMBER
947
948/ IFNZRO .&4000 <
949
950/ ERROR 1234 /DISPLAY ERROR MESSAGE IF THERE ARE PROBLEMS
951
952/ >
953
954/ > /END OF P?S/8 PAL VARIANT
955
956
957/ THIS ALLOWS TEMPORARY DEVELOPMENT FEATURES OR PERMANENT ELEMENTS WHICH MAY BE
958/ MORE ELEGANTLY EXPRESSED IN P?S/8 PAL VARIANT CODING, WHILE THE PAL8 (VERSION
959/ B0) VERSION CAN STILL BE USED (VIA DIRECT OCTAL, MULTIPLE EQUATE STATEMENTS,
960/ CONDITIONAL FLUSH AS IN THE ABOVE EXAMPLE, ETC. AS NECESSARY) FOR STANDARD
961/ ASSEMBLY OF KERMIT-12.
962\f/ ASSEMBLY PARAMETERS.
963
964/ SEVERAL PARAMETERS MUST BE CHANGED WITHIN K12MIT.PA (OR PASSED TO THE
965/ ASSEMBLER VIA A SHORT FILE INSERTED INTO THE ASSEMBLY STREAM BEFORE THE MAIN
966/ FILE):
967
968/ SETTING KEY= [RECEIVE IOT CODE FOR CONSOLE KEYBOARD] DEFINES THE CONSOLE
969/ KEYBOARD IOT CODE (DEFAULT IS 03).
970
971/ SETTING TTY= [TRANSMIT IOT CODE FOR CONSOLE OUTPUT] CHANGES THE CONSOLE
972/ PRINTER IOT CODE (DEFAULT IS 04).
973
974/ THE FOLLOWING DEFINITIONS ARE ESSENTIALLY FOR KL8-TYPE DEVICES ONLY, AS THE
975/ CODE DEMANDS KL8 HARDWARE COMPATIBILITY. MODELS OTHER THAN PDP-8 (SUCH AS
976/ DECMATE) GENERALLY EITHER PLACE RESTRICTIONS ON AVAILABLE INTERFACES (OTHER
977/ SOFTWARE DESIGNATES A SERIAL INTERFACE AS A LOGICAL PRINTER PORT; DECMATES
978/ SUPPORT A FIRMWARE "PRINT SCREEN" KEY WHICH ENFORCES THIS.), OR DON'T ALLOW
979/ USABLE PLUG-IN OPTIONS.
980
981/ IGNORING BUILT-IN DECMATE SUPPORT, THE FOLLOWING PARAMETERS ARE ACTIVE:
982
983/ SETTING DEV30= 1 CREATES DEVICE 30/31 REMOTE LINE IOTS.
984
985/ SETTING DEV40= 1 CREATES DEVICE 40/41 REMOTE LINE IOTS.
986
987/ SETTING LEDERLE=1 CREATES DEVICE 43/44 REMOTE LINE IOTS (AND A CUSTOM
988/ HEADER).
989
990/ SETTING ORIGNAL=1 CREATES DEVICE 33/34 REMOTE LINE IOTS (ORIGINAL
991/ SETTINGS).
992
993/ SETTING SPRINT= 1 CREATES DEVICE 32/33 REMOTE LINE IOTS (SERIAL PRINTER
994/ PORT).
995
996/ SETTING USER= 1 CREATES DEVICE XX/XY REMOTE LINE IOTS.
997
998/ IF NONE OF THESE ARE SET, THEN DEV40=1 APPLIES BY DEFAULT.
999
1000
1001
1002/ SETTING USER= 1 REQUIRES THE USER TO DEFINE TWO ADDITIONAL VALUES:
1003
1004/ XX= [RECEIVE IOT DEVICE CODE] (DEFAULT IS 40).
1005
1006/ XY= [TRANSMIT IOT DEVICE CODE] (DEFAULT IS 41).
1007\f/ SETTING SPRINT= 1 INHIBITS THE BUILT-IN CHECK FOR DECMATE OPERATION AND
1008/ USES THE SERIAL PRINTER PORT FOUND ON ALL
1009/ WPS-8-CONFIGURED PDP-8/E, PDP-8/A CONFIGURATIONS,
1010/ VT-78, AND ALL DECMATES (VT-278, DECMATE II, III,
1011/ III+) FOR REMOTE COMMUNICATIONS.
1012
1013/ THE USE OF THE SERIAL PRINTER PORT FOR REMOTE COMMUNICATIONS PURPOSES MAY BE
1014/ PROBLEMATIC DUE TO CONSIDERATIONS SUCH AS THE RS-232 CONNECTION TO THE PRINTER
1015/ IS A MODEM (DCE), RATHER THAN A TERMINAL (DTE) (DECMATE II, ETC. REQUIRES A
1016/ GENDER CHANGER.), OR THE SOFTWARE DESIGNATION OF THE PORT AS BEING ALLEDGEDLY
1017/ *ONLY* FOR A PRINTER, SUCH AS WHEN CERTAIN SYSTEMS SUPPORT THE "PRINT SCREEN"
1018/ KEY AS A SCREEN DUMP TO THE SERIAL PRINTER PORT, ETC. THESE ISSUES ARE NOT
1019/ RELEVANT TO KERMIT-12 OPERATION, AS THE "PRINT SCREEN" KEY IS NOT SUPPORTED BY
1020/ KERMIT-12 IN THIS CONFIGURATION AS SUCH (FUTURE VERSIONS COULD REDEFINE THE
1021/ "PRINT SCREEN" KEY TO SUCH FUNCTIONS AS DUMP SCREEN TO A FILE, ETC.).
1022
1023/ SETTING BRATE= NN SETS THE DEFAULT BAUD RATE (FOR SYSTEMS THAT SUPPORT
1024/ THIS FEATURE) FROM A TABLE OF VALUES (0-15) AS
1025/ FOLLOWS:
1026
1027/ NN BAUD RATE
1028
1029/ 00 50
1030/ 01 75
1031/ 02 110
1032/ 03 134.5
1033/ 04 150
1034/ 05 300
1035/ 06 600
1036/ 07 1200
1037/ 08 1800
1038/ 09 2000
1039/ 10 2400
1040/ 11 3600
1041/ 12 4800
1042/ 13 7200
1043/ 14 9600
1044/ 15 19200
1045
1046/ SETTING ESCAPE= NNNN SETS THE DEFAULT ESCAPE CHARACTER TO NNNN.
1047
1048/ SETTING FLOW= 1 ENABLES FLOW-CONTROL BY DEFAULT.
1049/ SETTING FLOW= 0 DISABLES FLOW-CONTROL BY DEFAULT.
1050
1051/ SETTING FMODE= 0177 SETS THE DEFAULT FILE MODE TO ASCII.
1052/ SETTING FMODE= 4377 SETS THE DEFAULT FILE MODE TO BINARY.
1053\f/ SETTING GENMSG= 0 CAUSES NO BINARY TO BE GENERATED WHERE 'LCLMSG' IS
1054/ DEFINED. THIS ALLOWS THE PARAMETER FILE (PARAM.PA) OR
1055/ SUBSEQUENT OVERLAY BY K12PCH.BN TO DEFINE THE LOCAL
1056/ HEADER MESSAGE. THIS PARAMETER SHOULD NOT BE SET
1057/ UNLESS ONE OF THESE METHODS IS USED, ELSE THE HEADER
1058/ MESSAGE WILL BE UNDEFINED. (NOTE: IF K12PCH.BN
1059/ GENERATES A HEADER MESSAGE, THEN THIS PARAMETER IS
1060/ UNIMPORTANT, AS K12PCH.BN OVERLAYS THE BINARY OF
1061/ K12MIT.)
1062/ SETTING GENMSG= 1 CAUSES A HEADER MESSAGE TO BE GENERATED. THE CONTENTS
1063/ OF THE MESSAGE ARE CREATED BY SETTING LEDERLE=1 OR
1064/ UMSG=1. IF EITHER IS ZERO, A DEFAULT (NULL) MESSAGE
1065/ WILL BE GENERATED.
1066
1067/ SETTING ICLOSE= 1 ENSURES A <^Z> AT <EOF> OF ASCII INPUT FILES BY
1068/ DEFAULT.
1069/ SETTING ICLOSE= 0 CLOSES ASCII INPUT FILES AS RECEIVED BY DEFAULT.
1070
1071/ SETTING INIECHO=0 CAUSES A FULL-DUPLEX CONNECT MODE STATE WITH NO LOCAL
1072/ CHARACTER ECHOING BY DEFAULT.
1073/ SETTING INIECHO=1 CAUSES A HALF-DUPLEX CONNECT MODE STATE WITH LOCAL
1074/ ECHO OF ALL CONSOLE CHARACTERS BY DEFAULT.
1075
1076/ SETTING LOWER= 0 ALLOWS LOWER-CASE CONSOLE OUTPUT BY DEFAULT.
1077/ SETTING LOWER= -40 FOLDS LOWER-CASE CONSOLE OUTPUT TO UPPER-CASE BY
1078/ DEFAULT.
1079
1080/ SETTING OCLOSE= 0 PREVENTS DEFAULT SENDING OF <^Z> AT <EOF> OF ASCII
1081/ FILES.
1082/ SETTING OCLOSE= 1 CAUSES <^Z> TO BE SENT AT <EOF> OF ASCII FILES BY
1083/ DEFAULT.
1084
1085/ SETTING PORT= 0 CAUSES THE DP-278 PORT 0 TO BE USED IF KERMIT-12 IS
1086/ RUN ON A DECMATE 1 (ASSUMING SPRINT=0).
1087/ SETTING PORT= 1 CAUSES THE DP-278 PORT 1 TO BE USED IF KERMIT-12 IS
1088/ RUN ON A DECMATE 1 (ASSUMING SPRINT=0).
1089
1090/ SETTING RETCNT= NNNN SETS THE PACKET RETRY COUNT TO NNNN BY DEFAULT.
1091/ SETTING UMSG= 0 PREVENTS THE LOCAL USER HEADER MESSAGE FROM BEING
1092/ GENERATED.
1093/ SETTING UMSG= 1 CAUSES THE LOCAL USER HEADER MESSAGE TO BE GENERATED.
1094/ THE PARAMETER GENMSG=1 IS REQUIRED TO BE SET. THE
1095/ SOURCE MUST BE MODIFIED LOCALLY TO CHANGE THE MESSAGE
1096/ TEXT FROM "INSERT LOCAL USER MESSAGE HERE!," AS THIS
1097/ IS THE DEFAULT CONTENTS.
1098\f/ KERMIT-12 FOR THE FAMILY OF 12-BIT DEC MACHINES.
1099
1100/ BRIEF USAGE DESCRIPTION.
1101
1102/ KERMIT-12 IS AN IMPLEMENTATION OF THE KERMIT PROTOCOL FOR THE FAMILY OF 12-BIT
1103/ DEC (AND COMPATIBLE) MACHINES GENERALLY KNOWN AS PDP-8 OR DECMATE.
1104
1105/ AS OF THE CURRENT IMPLEMENTATION, THE FOLLOWING COMMANDS ARE EFFECTIVE:
1106
1107/ 1. CONNECT (TO REMOTE SYSTEM AS TERMINAL).
1108
1109/ 2. SEND FILESPEC (TO REMOTE RECEIVER OR SERVER).
1110
1111/ 3. RECEIVE FILESPEC (FROM REMOTE SENDER).
1112
1113/ 4. GET FILESPEC (FROM REMOTE SERVER).
1114
1115/ 5. FINISH (SERVING).
1116
1117/ 6. SETUP (ON DECMATE II/III/III-PLUS ONLY). **** NOT IMPLEMENTED ****
1118
1119/ 7. EXIT (TO OPERATING SYSTEM).
1120
1121/ 8. HELP (DISPLAYS HELP MESSAGE).
1122
1123/ FILESPEC MAY BE ANY LOCAL (OS/8) FILE-STRUCTURED DEVICE:FILENAME.EXTENSION,
1124/ WHERE THE FILENAME AND EXTENSION WILL BE TRUNCATED TO 6 ALPHANUMERICS AND 2
1125/ ALPHANUMERICS RESPECTIVELY, AS NECESSARY (THIS IS REFERRED TO AS 6.2 FILENAME
1126/ FORMAT). THE DEVICE: FIELD IS OPTIONAL; ALL COMMANDS USING THE DEVICE:
1127/ FIELD FOR LOCAL DEVICE SPECIFICATION WILL USE THIS DEVICE AS THE SOURCE OR
1128/ DESTINATION AS NECESSARY FOR THE LOCAL FILES. IF THE DEVICE: FIELD IS
1129/ OMITTED, THE DEFAULT DEVICE DSK: WILL BE USED. THE ACTUAL DEVICE USED MAY BE
1130/ SELECTED BEFORE INVOKING KERMIT-12 BY USING THE OS/8 ASSIGN COMMAND:
1131
1132/ .ASSIGN DEV DSK
1133
1134/ WHERE DEV IS ANY AVAILABLE FILE-STRUCTURED DEVICE.
1135
1136/ KERMIT-12 USES AN UNUSUAL SCHEME FOR ITS PROMPT: THE ACTUAL DEFAULT PROMPT
1137/ TEXT IS PARTIALLY TAKEN FROM THE ACTUAL MACHINE KERMIT-12 IS CURRENTLY
1138/ EXECUTING ON. FOR EXAMPLE, IF KERMIT-12 HAS DETERMINED THE CPU TYPE AS
1139/ PDP-8/E, THE PROMPT WILL BE:
1140
1141/ KERMIT-8/E>
1142
1143/ THIS ALLOWS KERMIT-12 USERS (WITH DIFFERENT CPU-TYPE MACHINES) TO DISTINGUISH
1144/ MESSAGES ORIGINATING FROM THE RESPECTIVE SYSTEMS. FUTURE VERSIONS WILL
1145/ SUPPORT USER PROMPT STRINGS TO ALLOW MORE DISTINCTIVE SYSTEM MESSAGES.
1146
1147/ THE HELP OR CONNECT COMMANDS MAY BE USED TO DETERMINE THE CURRENT CONNECT MODE
1148/ ESCAPE CHARACTER.
1149\f/ COMMAND RESTRICTIONS.
1150
1151/ THE SEND COMMAND ALLOWS DEVICE:FILENAME.EXTENSION (6.2) WITH WILD-CARD
1152/ SUBSTITUTION. A * MAY BE GIVEN FOR AN ENTIRE FIELD (EITHER FILENAME OR
1153/ EXTENSION OR BOTH) ONLY. A ? WILL MATCH ANY SINGLE CHARACTER WHICH MUST
1154/ EXIST IN THE ACTUAL FILENAME OR EXTENSION, UNLESS RIGHT-MOST IN THE FIELD.
1155/ ALL MATCHING FILES WILL BE SENT. NO OUTBOUND FILENAME (AS-NAME) FACILITY
1156/ EXISTS AT THIS TIME.
1157
1158/ THE RECEIVE COMMAND ALLOWS OPTIONAL DEVICE: ONLY. *THE FILENAME AND
1159/ EXTENSION ARE NOT ALLOWED*. NAMES OF RECEIVED FILES WILL BE MODIFIED IF
1160/ NECESSARY TO CONFORM TO THE 6.2 FORMAT. *IMPLEMENTATION RESTRICTION* :
1161/ CERTAIN REMOTE FILENAMES CONTAINING NON-ALPHANUMERIC CHARACTERS MAY CAUSE
1162/ KERMIT-12 TO HASTILY ABORT THE TRANSMISSION AND RETURN TO COMMAND LEVEL.
1163
1164/ THE GET COMMAND ALLOWS OPTIONAL DEVICE: TO DETERMINE DESTINATION OF THE
1165/ INCOMING FILES. THE OUTBOUND FILESPEC MUST CONFORM TO LOCAL CONVENTIONS
1166/ (FILENAME AND EXTENSION ARE NOT LIMITED TO 6.2 FORMAT; THE DEVICE: FIELD
1167/ WILL NOT BE SENT TO THE REMOTE KERMIT UNLESS IT IS ILLEGAL WITHIN OS/8
1168/ SPECIFICATIONS, SUCH AS TOO MANY DEVICE LETTERS. IN THIS CASE, THE DEFAULT
1169/ DEVICE DSK: APPLIES, AND THE ENTIRE "DEVICE" FIELD IS SENT ALONG WITH ANY
1170/ FILENAME AND EXTENSION). CERTAIN REMOTE SYSTEMS ARE INCOMPATIBLE WITH THIS
1171/ IMPLEMENTATION, AS IMBEDDED SPACES OR NON-ALPHANUMERIC CHARACTERS ARE NOT
1172/ ALLOWED, EVEN THOUGH THEY MAY BE REQUIRED ON THE REMOTE SYSTEM. WILD-CARD
1173/ CHARACTERS ARE ALLOWED, BUT ONLY AS SPECIFIED IN THE SEND COMMAND ABOVE.
1174
1175/ <^X> OR <^Z> CAN BE USED TO ABORT KERMIT TRANSMISSIONS (EVENTUALLY) BUT IS
1176/ NORMALLY A SLOW PROCESS, SINCE THE CHECKING IS DONE BY A SOFTWARE TIMEOUT
1177/ SCHEME. AT THE PRESENT TIME, THERE IS NO DISTINCTION BETWEEN THESE THO
1178/ CHARACTERS, SO IT IS NOT POSSIBLE TO ABORT A SINGLE FILE; THE ENTIRE BATCH OF
1179/ FILES INVOLVED IN THE TRANSFER IS ABORTED.
1180
1181/ DECMATE II/III/III-PLUS CONSIDERATIONS:
1182
1183/ FUNCTION KEYS SEND <ESC> SEQUENCES SPECIFIED BY SLUSHWARE/FIRMWARE. ALL SOFT
1184/ FUNCTION KEYS ARE THEREFORE INEFFECTIVE (EXCEPT FOR HOLD SCREEN WHICH ALWAYS
1185/ WORKS).
1186
1187/ CONNECT MODE RUNS IN 8-BIT MODE.
1188
1189/ THE COMPOSE KEY IS ENABLED FOR USE WITH A LOADED COMPOSE TABLE.
1190
1191/ ANY VALID DECMATE II/III/III-PLUS CHARACTER SET IS ALLOWED WHILE IN CONNECT
1192/ MODE (MCS TCS LINE, ETC.). ALL <ESC> SEQUENCES ARE PASSED TO THE
1193/ SLUSHWARE/FIRMWARE UNMODIFIED.
1194
1195/ KEYBOARD UPPER-CASE LOCK WILL ALWAYS BE AUTOMATICALLY APPLIED UPON RETURN FROM
1196/ CONNECT MODE.
1197\f/ DEFINITIONS. /017 CJL
1198
1199 *200 /FOR DEFINITIONS /047 CJL
1200
1201/ REMOTE LINE PARAMETERS; SET ONLY ONE AS NECESSARY. /046 CJL
1202
1203 IFNDEF DEV30 <DEV30= 0> /USE DEVICE 30/31 VALUES
1204 IFNDEF DEV40 <DEV40= 0> /USE DEVICE 40/41 VALUES
1205 IFNDEF LEDERLE <LEDERLE=0> /USE LEDERLE LABS VALUES
1206 IFNDEF ORIGNAL <ORIGNAL=0> /USE ORIGINAL VALUES
1207 IFNDEF SPRINT <SPRINT=0> /USE DEVICE 32/33 VALUES
1208 IFNDEF USER <USER= 0> /USE USER-DEFINED VALUES
1209
1210 REMOTE= DEV30+DEV40+LEDERLE+ORIGNAL /SET REMOTE LINE IOT CODE
1211 REMOTE= REMOTE+SPRINT+USER /SET REMOTE LINE IOT CODE
1212
1213 IFZERO REMOTE <DEV40= 1> /DEFAULT TO DEVICE 40/41 VERSION
1214
1215/ DEV30 PARAMETERS.
1216
1217 IFNZRO DEV30 <
1218
1219 IFNDEF REC <REC= 30> /DEVICE 30 INPUT
1220 IFNDEF SEN <SEN= 31> /DEVICE 31 OUTPUT
1221
1222 >
1223
1224/ DEV40 PARAMETERS (DEFAULT).
1225
1226 IFNZRO DEV40 <
1227
1228 IFNDEF REC <REC= 40> /DEVICE 40 INPUT
1229 IFNDEF SEN <SEN= 41> /DEVICE 41 OUTPUT
1230
1231 >
1232
1233/ LEDERLE PARAMETERS. /038 CJL
1234
1235 IFNZRO LEDERLE <
1236
1237 IFNDEF REC <REC= 43> /DEVICE 43 INPUT
1238 IFNDEF SEN <SEN= 44> /DEVICE 44 OUTPUT
1239 IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE
1240 IFNDEF UMSG <UMSG= 0> /DON'T GENERATE USER MESSAGE
1241
1242 >
1243
1244/ ORIGNAL PARAMETERS.
1245
1246 IFNZRO ORIGNAL <
1247
1248 IFNDEF REC <REC= 33> /DEVICE 33 INPUT
1249 IFNDEF SEN <SEN= 34> /DEVICE 34 OUTPUT
1250
1251 >
1252\f/ SPRINT PARAMETERS. /046 CJL
1253
1254 IFNZRO SPRINT <
1255
1256 IFNDEF REC <REC= 32> /DEVICE 32 INPUT
1257 IFNDEF SEN <SEN= 33> /DEVICE 33 OUTPUT
1258
1259 >
1260
1261/ USER PARAMETERS.
1262
1263 IFNZRO USER <
1264
1265 IFNDEF XX <XX= 40> /DEFAULT TO DEVICE 40
1266 IFNDEF XY <XY= 41> /DEFAULT TO DEVICE 41
1267 IFNDEF REC <REC= XX> /DEVICE XX INPUT
1268 IFNDEF SEN <SEN= XY> /DEVICE XY OUTPUT
1269 IFNDEF GENMSG <GENMSG=1> /GENERATE LOCAL HEADER MESSAGE
1270 IFNDEF UMSG <UMSG= 1> /GENERATE USER MESSAGE
1271
1272 >
1273
1274/ REMOTE LINE IOT DEFINITIONS.
1275
1276/ RECEIVE DEFINITIONS.
1277
1278 RKRBIOT=REC^10+6006 /READ REMOTE, CLEAR FLAG
1279 RKSFIOT=REC^10+6001 /SKIP ON REMOTE INPUT FLAG
1280
1281/ TRANSMIT DEFINITIONS.
1282
1283 RSBIOT= SEN^10+6003 /SET BAUD RATE FROM AC[8-11]
1284 RTLSIOT=SEN^10+6006 /TRANSMIT CHARACTER, CLEAR FLAG
1285 RTSFIOT=SEN^10+6001 /SKIP ON TRANSMIT FLAG
1286
1287/ CONSOLE TTY: DEFINITIONS. /017 CJL
1288
1289/ KEYBOARD DEFINITIONS. /017 CJL
1290
1291 IFNDEF KEY <KEY= 03> /KEYBOARD DEVICE CODE
1292
1293 KCCIOT= KEY^10+6002 /CLEAR CONSOLE KEYBOARD FLAG, AC
1294 KRBIOT= KEY^10+6006 /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG
1295 KRSIOT= KEY^10+6004 /READ CONSOLE KEYBOARD BUFFER STATIC
1296 KSFIOT= KEY^10+6001 /SKIP ON CONSOLE KEYBOARD FLAG
1297
1298/ TELEPRINTER DEFINITIONS. /017 CJL
1299
1300 IFNDEF TTY <TTY= 04> /TELEPRINTER DEVICE CODE
1301
1302 TLSIOT= TTY^10+6006 /PRINT CHARACTER, CLEAR FLAG
1303 TSFIOT= TTY^10+6001 /SKIP ON TELEPRINTER FLAG
1304\f/ DEFAULT ESCAPE CHARACTER DEFINITION. /025 CJL
1305
1306 IFNDEF ESCAPE <ESCAPE="]&37> /DEFAULT IS CONTROL-]
1307
1308/ DEFAULT LOWER-CASE ENABLE DEFINITION. /030 CJL
1309
1310 IFNDEF LOWER <LOWER= 0/-40> /LOWER-CASE IS ALLOWED AS IS
1311 /CHANGE TO -40 IF LOWER-CASE
1312 /SHOULD BE FOLDED TO UPPER-CASE
1313
1314/ DEFAULT RETRY COUNT DEFINITION. /031 CJL
1315
1316 IFNDEF RETCNT <RETCNT=5> /DEFAULT IS FIVE RETRIES
1317
1318/ DEFAULT FILE MODE DEFINITION. /031 CJL
1319
1320 IFNDEF FMODE <FMODE= 0177> /DEFAULT IS ASCII FILE MODE
1321 /4377 IS BINARY FILE MODE
1322
1323/ DEFAULT FLOW-CONTROL MODE DEFINITION. /031 CJL
1324
1325 IFNDEF FLOW <FLOW= 1> /DEFAULT IS FLOW-CONTROL ENABLED
1326
1327/ DEFAULT ASCII INPUT FILE <^Z> DISPOSITION. /031 CJL
1328
1329 IFNDEF ICLOSE <ICLOSE=1> /ENSURE <^Z> AT ASCII <EOF>
1330
1331/ DEFAULT ASCII OUTPUT FILE <^Z> DISPOSITION. /031 CJL
1332
1333 IFNDEF OCLOSE <OCLOSE=0> /<^Z> NOT SENT AT ASCII <EOF>
1334
1335/ DEFAULT LOCAL MESSAGE GENERATION DEFINITIONS. /038 CJL
1336
1337 IFNDEF GENMSG <GENMSG=1> /DEFAULT IS TO GENERATE A MESSAGE
1338 IFNDEF UMSG <UMSG= 0> /DEFAULT IS NO DUMMY USER MESSAGE
1339 IFNDEF LEDERLE <LEDERLE=0> /DEFAULT IS NO LEDERLE MESSAGE
1340
1341/ THE NULL MESSAGE WILL BE GENERATED BY DEFAULT.
1342
1343/ ECHO DEFINITION. /039 CJL
1344
1345 IFNDEF INIECHO <INIECHO=0> /DEFAULT IS NO LOCAL ECHO
1346
1347/ DEFAULT DECMATE I PORT DEFINITION. /050 CJL
1348
1349 IFNDEF PORT <PORT= 0> /DEFAULT IS PORT ZERO
1350
1351/ DEFAULT BAUD RATE DEFINITION. /050 CJL
1352
1353 IFNDEF BRATE <BRATE= 7> /DEFAULT IS 1200 BAUD
1354\f/ STATE DEFINITIONS.
1355
1356 STDAT= "D&137 /DATA
1357 STACK= "Y&137 /ACK
1358 STNAK= "N&137 /NAK
1359 STSIN= "S&137 /SEND-INIT
1360 STBRK= "B&137 /BREAK LINK
1361 STFIL= "F&137 /FILENAME HEADER
1362 STEOF= "Z&137 /END OF FILE OR REPLY
1363 STERR= "E&137 /ERROR PACKET
1364 STATT= "A&137 /FILE ATTRIBUTES
1365 STRIN= "R&137 /RECEIVE-INIT
1366 STEOT= "B&137 /BREAK TRANSMISSION
1367 STGEN= "G&137 /KERMIT GENERIC COMMAND
1368
1369/ DEFAULT INIT PARAMETERS.
1370
1371 DEFCK= "1&177 /DEFAULT 1 CHARACTER CHECKSUM /014 CJL
1372 DEFEOL= 15+40 /CR IS DEFAULT <EOL>
1373 DEFQCTL= "#&177 /"#" IS DEFAULT QCTL
1374
1375/ BUFFER DEFINITIONS. /014 CJL
1376
1377 DECIMAL /MAKE IT EASIER /014 CJL
1378
1379 DEFMAXL=94 /DEFAULT MAXIMUM PACKET SIZE
1380
1381 LINSIZ= 32 /KEYBOARD LINE BUFFER SIZE
1382
1383 OCTAL /BACK TO NORMAL /014 CJL
1384
1385 BUFSIZE=200 /128 CHARACTER RING BUFFERS /026 CJL
1386 /FOR NO-INTERRUPT CONNECT MODE
1387\f/ CONTROL CHARACTER DEFINITIONS. /023 CJL
1388
1389 CNTRLA= "A&37 /<^A> DEFAULT MARK CHARACTER /023 CJL
1390 CNTRLB= "B&37 /<^B> /046 CJL
1391 CNTRLC= "C&37 /<^C> PROGRAM EXIT CHARACTER /023 CJL
1392 CNTRLD= "D&37 /<^D> /046 CJL
1393 CNTRLE= "E&37 /<^E> /046 CJL
1394 CNTRLF= "F&37 /<^F> /046 CJL
1395 CNTRLG= "G&37 /<^G> BELL CHARACTER /023 CJL
1396 CNTRLH= "H&37 /<^H> BACKSPACE CHARACTER /023 CJL
1397 CNTRLI= "I&37 /<^I> HORIZONTAL TAB CHARACTER /043 CJL
1398 CNTRLJ= "J&37 /<^J> LINEFEED CHARACTER /023 CJL
1399 CNTRLK= "K&37 /<^K> VERTICAL TAB CHARACTER /046 CJL
1400 CNTRLL= "L&37 /<^L> FORM FEED CHARACTER /046 CJL
1401 CNTRLM= "M&37 /<^M> CARRIAGE RETURN CHARACTER /023 CJL
1402 CNTRLN= "N&37 /<^N> /046 CJL
1403 CNTRLO= "O&37 /<^O> ECHO FLIP CHARACTER /023 CJL
1404 CNTRLP= "P&37 /<^P> PROGRAM RESTART CHARACTER /023 CJL
1405 CNTRLQ= "Q&37 /<^Q> OUTPUT RESUME CHARACTER /023 CJL
1406 CNTRLR= "R&37 /<^R> /046 CJL
1407 CNTRLS= "S&37 /<^S> OUTPUT WAIT CHARACTER /023 CJL
1408 CNTRLT= "T&37 /<^T> /046 CJL
1409 CNTRLU= "U&37 /<^U> /046 CJL
1410 CNTRLV= "V&37 /<^V> /046 CJL
1411 CNTRLW= "W&37 /<^W> /046 CJL
1412 CNTRLX= "X&37 /<^X> FILE ABORT CHARACTER /044 CJL
1413 CNTRLY= "Y&37 /<^Y> /046 CJL
1414 CNTRLZ= "Z&37 /<^Z> ABORT AND <EOF> CHARACTER /044 CJL
1415 DELETE= 177 /<DEL> DELETE OR <RO> CHARACTER /034 CJL
1416 LOWERC= "C&177+40 /LOWER-CASE C (CLOSE CHARACTER) /025 CJL
1417 UPPERC= "C&177 /UPPER-CASE C (CLOSE CHARACTER) /025 CJL
1418
1419/ I/O AND FIELD DEFINITIONS. /019 CJL
1420
1421 BUFFLD= 10 /I/O BUFFER FIELD /019 CJL
1422 DIRFLD= 10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL
1423 DMIFLD= 10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL
1424 MSGFLD= 10 /TEXT MESSAGE FIELD /023 CJL
1425 PAGCNT= 2 /I/O BUFFER SIZE IN PAGES /019 CJL
1426 PRGFLD= 00 /PROGRAM FIELD /019 CJL
1427 USRFLD= 10 /USR FIELD /020 CJL
1428
1429/ OS/8 MONITOR DEFINITIONS. /014 CJL
1430
1431 SBOOT= 7600 /MONITOR EXIT LOCATION IS 07600 /014 CJL
1432 USR= 7700 /NON-LOCKED USR ENTRY POINT /035 CJL
1433\f/ USER SERVICE ROUTINE AND HANDLER DEFINITIONS. /020 CJL
1434
1435 CLOSE= 4 /CLOSE TENTATIVE OUTPUT FILE /020 CJL
1436 ENTER= 3 /ENTER TENTATIVE OUTPUT FILE /020 CJL
1437 FETCH= 1 /FETCH HANDLER /020 CJL
1438 INQUIRE=12 /INQUIRE ABOUT HANDLER /020 CJL
1439 LOOKUP= 2 /LOOKUP FILE /020 CJL
1440 RESET= 13 /RESET DEVICE CONTROL WORD TABLE/037 CJL
1441 USRIN= 10 /LOCK USR IN CORE /020 CJL
1442 WRITE= 4000 /I/O CALL WRITE BIT /020 CJL
1443
1444/ INSTRUCTION DEFINITIONS.
1445
1446 CLCL= 6136 /CLEAR CLOCK FLAG (8/A, ETC.) /046 CJL
1447 CLSK= 6131 /SKIP ON, CLEAR CLOCK FLAG /046 CJL
1448 CLSK8A= 6137 /SKIP ON CLOCK FLAG (8/A, ETC.) /046 CJL
1449 COM= 0017 /COMPLEMENT AC
1450 DCAC= DCA . /CURRENT PAGE DCA INSTRUCTION /047 CJL
1451 IAAC= 6171 /"A" REGISTER TO AC
1452 IACA= 6167 /AC TO "A" REGISTER
1453 ISZC= ISZ . /CURRENT PAGE ISZ INSTRUCTION /050 CJL
1454 JMPC= JMP . /CURRENT PAGE JMP INSTRUCTION /047 CJL
1455 JMPIC= JMP I . /CURRENT PAGE JMP I INSTRUCTION /047 CJL
1456 JMSC= JMS . /CURRENT PAGE JMS INSTRUCTION /047 CJL
1457 JMSIC= JMS I . /CURRENT PAGE JMS I INSTRUCTION /047 CJL
1458 LINC= 6141 /GOTO LINC MODE
1459 PDP= 0002 /GOTO PDP-8 MODE
1460 PRQ3= 6236 /TYPE THREE PANEL REQUEST /046 CJL
1461 TADC= TAD . /CURRENT PAGE TAD INSTRUCTION /047 CJL
1462 R3L= 7014 /ROTATE AC (NOT LINK) LEFT 3 /046 CJL
1463
1464/ NUMERIC LOAD DEFINITIONS. /014 CJL
1465
1466 NL0000= CLA /LOAD AC WITH 0000 /046 CJL
1467 NL0001= CLA IAC /LOAD AC WITH 0001 /014 CJL
1468 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 /014 CJL
1469 NL0003= CLA STL IAC RAL /LOAD AC WITH 0003 (8/I ON UP) /046 CJL
1470 NL0004= CLA CLL IAC RTL /LOAD AC WITH 0004 (8/I ON UP) /046 CJL
1471 NL0006= CLA STL IAC RTL /LOAD AC WITH 0006 (8/I ON UP) /046 CJL
1472 NL0010= CLA IAC RAL RAR /LOAD AC WITH 0010 (6120) /024 CJL
1473 NL0100= CLA IAC BSW /LOAD AC WITH 0100 (8/E ON UP) /024 CJL
1474 NL3776= CLA CLL CMA RAR RAL /LOAD AC WITH 3776 (8/I OR 8/L) /024 CJL
1475 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 /046 CJL
1476 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 /014 CJL
1477 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 /046 CJL
1478 NL6000= CLA STL IAC RTR /LOAD AC WITH 6000 (8/I ON UP) /046 CJL
1479 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 /014 CJL
1480 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 /014 CJL
1481 NL7777= CLA CMA /LOAD AC WITH 7777 /014 CJL
1482\f/ DECMATE I COMMUNICATIONS PORT DEFINITIONS. /050 CJL
1483
1484 IPORT0= 30 /COMMUNICATIONS PORT 0 INPUT DEVICE CODE
1485
1486 RKFL0= IPORT0^10+6000 /SET COMMUNICATIONS PORT 0 INPUT FLAG
1487 RKSF0= IPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 INPUT FLAG
1488 RKCC0= IPORT0^10+6002 /CLEAR AC
1489 RKIE0= IPORT0^10+6005 /PORT 0 INPUT INTERRUPT ENABLE PER AC[11]
1490 RKRB0= IPORT0^10+6006 /READ COMMUNICATIONS PORT 0 INTO AC
1491
1492 OPORT0= 31 /COMMUNICATIONS PORT 0 OUTPUT DEVICE CODE
1493
1494 RTFL0= OPORT0^10+6000 /SET COMMUNICATIONS PORT 0 OUTPUT FLAG
1495 RTSF0= OPORT0^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 0 OUTPUT FLAG
1496 RTCF0= OPORT0^10+6002 /NOP
1497 RTIE0= OPORT0^10+6005 /PORT 0 OUTPUT INTERRUPT ENABLE PER AC[11]
1498 RTLS0= OPORT0^10+6006 /WRITE COMMUNICATIONS PORT 0 FROM AC
1499
1500 IPORT1= 34 /COMMUNICATIONS PORT 1 INPUT DEVICE CODE
1501
1502 RKFL1= IPORT1^10+6000 /SET COMMUNICATIONS PORT 1 INPUT FLAG
1503 RKSF1= IPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 INPUT FLAG
1504 RKCC1= IPORT1^10+6002 /CLEAR AC
1505 RKIE1= IPORT1^10+6005 /PORT 1 INPUT INTERRUPT ENABLE PER AC[11]
1506 RKRB1= IPORT1^10+6006 /READ COMMUNICATIONS PORT 1 INTO AC
1507
1508 OPORT1= 35 /COMMUNICATIONS PORT 1 OUTPUT DEVICE CODE
1509
1510 RTFL1= OPORT1^10+6000 /SET COMMUNICATIONS PORT 1 OUTPUT FLAG
1511 RTSF1= OPORT1^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT 1 OUTPUT FLAG
1512 RTCF1= OPORT1^10+6002 /NOP
1513 RTIE1= OPORT1^10+6005 /PORT 1 OUTPUT INTERRUPT ENABLE PER AC[11]
1514 RTLS1= OPORT1^10+6006 /WRITE COMMUNICATIONS PORT 1 FROM AC
1515
1516 PCON= 36 /PORT STATUS AND CONTROL DEVICE CODE
1517
1518 SMFL= PCON^10+6000 /SET MODEM CHANGE FLAG
1519 MFSK= PCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG
1520 WCON0= PCON^10+6002 /WRITE COMMUNICATIONS PORT 0 CONTROL REGISTER
1521 PSR= PCON^10+6003 /READ PORT STATUS REGISTER
1522 PMR= PCON^10+6004 /READ PORT MODEM REGISTER
1523 MFIE= PCON^10+6005 /LOAD MODEM CHANGE INTERRUPT ENABLE PER AC[11]
1524 WCON1= PCON^10+6006 /WRITE COMMUNICATIONS PORT 1 CONTROL REGISTER
1525 RACD= PCON^10+6007 /RESET ACTIVE COMMUNICATIONS PORT PER AC[0]
1526\f/ DECMATE II, ETC. COMMUNICATIONS PORT DEFINITIONS. /046 CJL
1527
1528 PORTIN= 30 /COMMUNICATIONS PORT INPUT DEVICE CODE
1529
1530 IFL= PORTIN^10+6000 /SET COMMUNICATIONS PORT INPUT/OUTPUT FLAG
1531 ISF= PORTIN^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT INPUT/OUTPUT FLAG
1532 ICF= PORTIN^10+6002 /NOP (CLEAR THE AC?)
1533 INOP1= PORTIN^10+6003 /(NOP?)
1534 IRS= PORTIN^10+6004 /READ COMMUNICATIONS PORT RECEIVE BUFFER
1535 IIE= PORTIN^10+6005 /COMMUNICATIONS PORT I/O INTERRUPT ENABLE PER AC[11]
1536 IRB= PORTIN^10+6006 /READ COMMUNICATIONS PORT RECEIVE BUFFER
1537 INOP2= PORTIN^10+6007 /(NOP?)
1538
1539 PORTOUT=31 /COMMUNICATIONS PORT OUTPUT DEVICE CODE
1540
1541 DUMBFL= PORTOUT^10+6000 /SET COMMUNICATIONS PORT DUMMY FLAG
1542 DUMBSF= PORTOUT^10+6001 /SKIP ON, CLEAR COMMUNICATIONS PORT DUMMY FLAG
1543 DUMBCF= PORTOUT^10+6002 /NOP (CLEAR THE AC?)
1544 ONOP1= PORTOUT^10+6003 /(NOP?)
1545 OPC= PORTOUT^10+6004 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
1546 DUMBIE= PORTOUT^10+6005 /COMMUNICATIONS PORT DUMMY INTERRUPT ENABLE PER AC[11]
1547 OLS= PORTOUT^10+6006 /LOAD COMMUNICATIONS PORT TRANSMIT BUFFER
1548 ONOP2= PORTOUT^10+6007 /(NOP?)
1549
1550 PORTCON=36 /COMMUNICATIONS PORT CONTROL DEVICE CODE
1551
1552 MFL= PORTCON^10+6000 /SET MODEM CHANGE FLAG
1553 MSF= PORTCON^10+6001 /SKIP ON, CLEAR MODEM CHANGE FLAG
1554 MLC= PORTCON^10+6002 /LOAD MODEM CONTROL REGISTER
1555 MSB= PORTCON^10+6003 /LOAD BAUD RATE REGISTER
1556 MRS= PORTCON^10+6004 /READ MODEM STATUS REGISTER
1557 MIE= PORTCON^10+6005 /MODEM CHANGE INTERRUPT ENABLE PER AC[11]
1558 MPSCC= PORTCON^10+6006 /ACCESS MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER
1559 MPRESET=PORTCON^10+6007 /RESET MULTIPROTOCOL SERIAL COMMUNICATIONS CONTROLLER
1560\f/ MISCELLANEOUS DEFINITIONS. /014 CJL
1561
1562/ STATIC DATE CALCULATIONS. /024 CJL
1563
1564/ THESE EQUATIONS CAUSE PRINTABLE TEXT OF THE DATE PARTICULARS, WHICH ARE GIVEN
1565/ IN OS/8 INTERNAL FORMAT. PROGRAM MAINTAINENCE REQUIRES THE UPDATE OF VERSION,
1566/ REVISION, REVDATE, AND REVDGRP. REVDATE AND REVDGRP SHOULD BE OBTAINED FROM
1567/ THE SYSTEM WHEN RELEASING A NEW VERSION AFTER FIRST CORRECTLY INVOKING THE
1568/ SYSTEM DATE COMMAND.
1569
1570/ VERSION=[ANY NUMBER IN THE RANGE 00-143 (DECIMAL 00-99)]
1571
1572/ REVISIO=[ANY SIX-BIT ALPHA (A-Z); DO NOT FORGET &77]
1573
1574/ REVDATE=[THE CONTENTS OF 17666 (DATE WORD)]
1575
1576/ REVDGRP=[THE CONTENTS OF 07777 (ONLY BITS[3-4] ARE USED)]
1577
1578
1579
1580 IFNDEF REVDATE <REVDATE=4464> /REVISION DATE (LOCATION 17666)
1581
1582 IFNDEF REVDGRP <REVDGRP=0400> /REVISION 8 YEAR DATE GROUP (LOCATION 07777)
1583
1584 IFNDEF REVISIO <REVISIO="G&77> /REVISION OF KERMIT-12
1585
1586 IFNDEF VERSION <VERSION=12> /VERSION OF KERMIT-12
1587
1588
1589 DAY= REVDATE&370%10 /REVISION DAY
1590
1591 DGROUP= REVDGRP&600%20 /REVISION DATE GROUP (WHICH 8 YEARS)
1592
1593 MONTH= REVDATE&7400%400 /REVISION MONTH
1594
1595 YEAR= REVDATE&7+DGROUP+106 /REVISION YEAR (SINCE 1900)
1596\f FIELD PRGFLD%10 /STARTING FIELD /038 CJL
1597
1598 *0 /START AT THE BEGINNING /014 CJL
1599
1600INTPC, .-. /PC FROM INTERRUPT (IF ANY) /014 CJL
1601 JMP I INTPC /RETURN WITH INTERRUPTS OFF /014 CJL
1602
1603ABFLAG, .-. /FILE ABORT FLAG /044 CJL
1604TABLEJU,.-. /MATCHING VALUE FOR SRCHTABLE ROUTINE /025 CJL
1605
1606 IFNZRO .-4 <ERROR .> /014 CJL
1607ODT, ZBLOCK 7-. /RESERVED FOR OS/8 ODT /014 CJL
1608RATE, BRATE /BAUD RATE /050 CJL
1609
1610 *10 /GET TO AUTO-INDEX AREA /014 CJL
1611
1612XR0, .-. /AUTO-INDEX ZERO /014 CJL
1613XR1, .-. /AUTO-INDEX ONE /014 CJL
1614DIRXR, PORT /DIRECTORY LOOKUP DEDICATED AUTO-INDEX /028 CJL
1615 /INITIALIZED FOR DECMATE I ONCE-ONLY /050 CJL
1616
1617/ THE REMAINING LOCATIONS THROUGH 000017 MUST BE USED DIRECTLY ONLY, SO AS TO
1618/ NOT CAUSE INADVERTANT AUTO-INDEXING.
1619
1620/ COLUMN COUNTER FOR CONSOLE ROUTINES (NEVER USED INDIRECTLY). /043 CJL
1621
1622COLUMN, .-. /CONSOLE OUTPUT COLUMN COUNTER /043 CJL
1623
1624/ CONSOLE TERMINAL ECHO SWITCH (NEVER USED INDIRECTLY). /020 CJL
1625
1626ECHOSW, 0 /0=ECHO, 4000=DON'T ECHO /020 CJL
1627
1628/ LATEST (NON-CONNECT MODE) CHARACTER (NEVER USED INDIRECTLY). /043 CJL
1629
1630INCHAR, .-. /LATEST INPUT CHARACTER FROM CONSOLE /043 CJL
1631
1632/ CURRENT KERMIT MODE (NEVER USED INDIRECTLY). /025 CJL
1633
1634KMODE, .-. /CURRENT MODE OF KERMIT /025 CJL
1635
1636/ KERMIT MODE FLAG VALUES. /014 CJL
1637
1638/ MLINE= 1 /KERMIT IS ON-LINE
1639 MSEND= 2 /KERMIT IS IN SEND MODE
1640 MREC= 3 /KERMIT IS IN RECEIVE MODE
1641
1642/ LATEST CHARACTER SENT TO OUTPUT FILE (NEVER USED INDIRECTLY). /020 CJL
1643
1644LATEST, .-. /LATEST CHARACTER SENT TO OUTPUT FILE /020 CJL
1645\f *20 /GET PAST AUTO-INDEX AREA
1646
1647INFLAG, .-. /DECMATE INPUT AVAILABLE FLAG /046 CJL
1648OUTFLAG,.-. /DECMATE OUTPUT AVAILABLE FLAG /046 CJL
1649TEMP, 0
1650RCHAR, 0 /REMOTE LINE CURRENT INPUT CHAR
1651SCAN1, 0 /
1652SCAN2, 0 /
1653KEYDSP, 0 /DISPATCH ADDRESS FOR KEYWORD MATCH
1654BININP, 0 /BINARY REGISTER FOR DECIMAL INPUT
1655PTABLE, 0 /
1656LPTR, 0 /HOLDS LINE POINTER
1657STATE, 0 /CURRENT STATE
1658RETRY, -RETCNT /PACKET ERROR RETRY COUNTER /031 CJL
1659RTRYC, 0 /USE THIS FOR ACTUAL COUNTER
1660
1661/ CURRENT PACKET I/O DATA. /014 CJL
1662
1663PAKPTR, 0 /POINTER TO OUTPUT PACKET POINTER
1664PAKCKS, 0 /HOLDS CURRENT OUTPUT PACKET CHECKSUM TOTAL
1665CURSEQ, 0 /CURRENT SEQ NUMBER
1666QFLAG, 0 /NON-ZERO WHEN NO CONTROL QUOTING
1667
1668/ RECEIVE "INIT" REGISTERS. /014 CJL
1669
1670RMAXL, DEFMAXL+40 /MAX LENGTH FOR DATA PACKET (DEFAULT)
1671RTIME, 0 /TIME-OUT VALUE
1672RNPAD, 0 /NUMBER OF PADDING CHARS
1673RPADC, 0 /CHAR USED FOR PADDING
1674REOL, DEFEOL /TERMINATOR CHAR USED FOR END OF PACKET
1675RQCTL, DEFQCTL /CONTROL CHAR PREFIX CHAR
1676RQBIN, 0 /PARITY CHAR PREFIX CHAR (CHARS GT 177)
1677RCHKT, DEFCK /CHECKSUM TYPE (DEFAULT TYPE 1)
1678RREPT, 0 /PREFIX CHAR FOR REPEATED CHARS
1679RCAPAS, 0 /EXTRA CAPABILITY BIT MASK
1680
1681/ ZBLOCK 4 /RESERVED FOR EXTRA CAPABILITIES /022 CJL
1682
1683 INITEND=. /END OF INIT REGISTERS /022 CJL
1684
1685HNDADR, 0 /FILE DEVICE HANDLER ADDRESS
1686FORCEP, 0 /FLAG FOR FORCED OUTPUT OF PACKET WHEN THERE IS
1687 / NO DATA (JUST SOH, LEN, SEQ, AND CHECKSUM)
1688PRSERR, 0 /HOLDS PARSE POSITION FOR REPORTING ERRORS
1689PACK6P, 0 /POINTER TO STORAGE OF 6 BIT CHARS
1690PACK6F, 0 /FLAG FOR WHICH BYTE TO STORE
1691GET6P, 0 /POINTER USED IN THE GET6 ROUTINE
1692GET6F, 0 /FLAG USED IN THE GET6 ROUTINE
1693MOVE4, 0 /COUNTER FOR "MOVE"
1694INIFLG, 0 /INIT DONE FLAG
1695MQ, .-. /"MQ" TEMPORARY REGISTER /032 CJL
1696\f/ FILE NAME PARSE REGISTERS. /014 CJL
1697
1698FNPTR, 0 /POINTER TO WHERE TO PUT A PARSED FILE NAME
1699WILDF, 0 /WILD CARD IN FILE NAME FLAG
1700
1701/ FILE INFORMATION. /014 CJL
1702
1703FSBLK, 0 /FILE START BLOCK
1704FLEN, 0 /FILE LENGTH
1705DEVNUM, 0 /PARSED DEVICE NUMBER HERE
1706OFFLG, 0 /OUTPUT FILE OPEN FLAG
1707ODNAME, 0 /POINTER TO USER SPECIFIED DEVICE FOR OUTPUT
1708ODNUMB, 0 /OUTPUT DEVICE NUMBER
1709
1710/ PARITY VARIABLES. /014 CJL
1711
1712/MARK, 0200 /SET BIT [8] FOR COMMAND INPUTS /A013
1713/PARITY,0 /PARITY MASK (0=SPACE, 200=MARK) /AM013
1714
1715/ INTERNAL FILE MODE FLAG. /019 CJL
1716
1717FILMODE,FMODE /ASCII=0177, BINARY=4377 /019 CJL
1718
1719/ UPPER-CASE ONLY FLAG. /023 CJL
1720
1721UPONLY, LOWER /0=UPPER/LOWER CASE, -40=UPPER-CASE ONLY/030 CJL
1722
1723/ <^C> DISPATCH ADDRESS. /023 CJL
1724
1725UCADDRE,SBOOT /<^C> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL
1726
1727/ <^P> DISPATCH ADDRESS. /023 CJL
1728
1729UPADDRE,CHKCLR /<^P> ADDRESS SHOULD BE SET AS NECESSARY/023 CJL
1730
1731/ ESCAPE CHARACTER FOR CONNECT MODE. /025 CJL
1732
1733ESCHAR, ESCAPE /ESCAPE CHARACTER FOR CONNECT MODE /025 CJL
1734
1735/ FLOW CONTROL FLAG. /026 CJL
1736
1737FLOWFLA,-FLOW /0=NO FLOW CONTROL, 7777=FLOW CONTROL /049 CJL
1738 /VIA <^S>/<^Q>
1739
1740/ KEYBOARD INPUT ERROR FLAG. /026 CJL
1741
1742KEYERRO,.-. /0=NO ERROR, NON-ZERO=BAD CHARACTER /026 CJL
1743 /OR BUFFER OVERRUN
1744\f/ REMOTE LINE INPUT ERROR FLAG. /026 CJL
1745
1746RINERRO,.-. /0=NO ERROR, NON-ZERO=BAD CHARACTER /026 CJL
1747 /OR BUFFER OVERRUN
1748
1749/ REMOTE LINE OUTPUT FLOW CONTROL WAIT FLAG. /026 CJL
1750
1751REMWAIT,.-. /0=DON'T WAIT, 4000=WAIT FOR <^Q> /026 CJL
1752
1753/ REMOTE INPUT WAIT FLAG. /026 CJL
1754
1755/ FLAG STATES:
1756
1757/ VALUE ACTION
1758
1759/ 0000 BUFFER IS LESS THAN 3/4 FULL. INPUT FREELY ALLOWED
1760/ WITHOUT FLOW CONTROL RESTRICTIONS. IF BUFFER BECOMES
1761/ 3/4 FULL AND FLOW CONTROL IS IN EFFECT THEN CHANGE
1762/ STATE TO 0001.
1763
1764/ 0001 BUFFER IS NOW 3/4 FULL. OUTPUT <^S> TO REMOTE AND
1765/ THEN CHANGE STATE TO 4000.
1766
1767/ 4000 WAITING FOR BUFFER TO EMPTY TO LESS THAN 1/4 FULL. IF
1768/ FLOW CONTROL IS BEING OBEYED, THEN BUFFER SHOULD NOW
1769/ BE EMPTYING.
1770
1771/ 7777 BUFFER IS NOW LESS THAN 1/4 FULL. OUTPUT <^Q> TO
1772/ REMOTE AND THEN CHANGE STATE TO 0000.
1773
1774RINWAIT,.-. /REMOTE INPUT WAIT FLAG /026 CJL
1775
1776/ REMOTE LINE OUTPUT BUFFER POINTERS. /026 CJL
1777
1778REMINSE,.-. /REMOTE OUTPUT INSERTION POINTER /026 CJL
1779REMREMO,.-. /REMOTE OUTPUT REMOVAL POINTER /026 CJL
1780\f/ POINTER FOR THE PACKET INPUT AND OUTPUT ROUTINES
1781
1782 SPACK= JMS I . /SEND A PACKET TO REMOTE
1783 SPACK0 /PUT IN A POINTER
1784
1785 FPACK= JMS I . /FORMAT PACKET
1786 FPACK0 /PUT IN THE POINTER
1787
1788 RPACK= JMS I . /RECEIVE A PACKET FROM REMOTE
1789 ILINK /PUT IN A POINTER
1790
1791/ POINTERS FOR OUTPUT ROUTINES
1792
1793 PRI8B= JMS I . /PRINT 8 BIT STRING ON TTY
1794 PRI8B0 /PUT IN THE POINTER
1795
1796 REM8B= JMS I . /SEND 8 BIT STRING DOWN REMOTE LINE
1797 REM8B0 /PUT IN THE POINTER
1798
1799/ MISC.
1800
1801 PACK6= JMS I . /DEFINE CALL TO ROUTINE
1802 PACK60 /POINTER TO ROUTINE
1803
1804 GET6= JMS I . /DEFINE THE INSTRUCTION
1805 GET60 /PUT IN THE POINTER
1806
1807 MOVE= JMS I . /DEFINE CALL TO MOVE ROUTINE
1808 MOVE0 /POINTER
1809
1810 CLEAR= JMS I . /DEFINE CALL FOR "CLEAR" ROUTINE
1811 CLEAR0 /POINTER
1812\f PAGE /START ON NEW PAGE /A014 CJL
1813
1814/ KERMIT-12 PROGRAM STARTS HERE. /A014 CJL
1815
1816CLOOP, JMP I (INITIALIZE) /**** INITIALIZED **** CLA CLL /024 CJL
1817 JMS I [CRESET] /RESET CONSOLE ROUTINE STUFF
1818 DCA ABFLAG /CLEAR ABORT FLAG /044 CJL
1819 DCA REMWAIT /CLEAR REMOTE FLOW CONTROL WAIT /049 CJL
1820CLDMZAP,JMS DMINIT /INITIALIZE DECMATE PORT /048 CJL
1821
1822/ THE PREVIOUS INSTRUCTION IS FOR DECMATE OPERATION ONLY. THE DEFAULT
1823/ INSTRUCTION IS FOR KL8 INTERFACES ONLY.
1824
1825 *CLDMZAP /OVERLAY DECMATE CODE /048 CJL
1826
1827CLDMZAP,NOP /DON'T INITIALIZE DECMATE PORT /048 CJL
1828 TAD RATE /GET BAUD RATE
1829SETBAUD,MSB /SET REMOTE BAUD RATE /050 CJL
1830
1831/ THE PREVIOUS INSTRUCTION IS FOR DECMATE II OPERATION ONLY. /050 CJL
1832
1833 *SETBAUD /OVERLAY DECMATE II CODE /050 CJL
1834
1835SETBAUD,NOP /NOT APPLICABLE ON DECMATE I /050 CJL
1836
1837/ THE PREVIOUS INSTRUCTION IS FOR DECMATE I OPERATION ONLY. THE DEFAULT
1838/ INSTRUCTION IS FOR KL8 INTERFACES ONLY.
1839
1840 *SETBAUD /OVERLAY DECMATE I CODE /050 CJL
1841
1842SETBAUD,RSBIOT /SET REMOTE BAUD RATE /050 CJL
1843 JMS I [SCRIBE] /DO A /025 CJL
1844 CRLF /<CR>, <LF> /025 CJL
1845 JMS I [SCRIBE] /GIVE THEM THE /025 CJL
1846/ PRMTMSG /PROMPT MESSAGE /025 CJL
1847 PRMT2
1848 JMS I (LININP) /GET INPUT LINE FROM USER
1849 TAD (CMDTBL) /GET ADDRESS OF PARSE TABLE /M014 CJL
1850 DCA PTABLE /STORE FOR PARSER
1851 TAD (LINBUF) /GET INPUT LINE BUFFER ADDRESS /M014 CJL
1852
1853CLOOP1, JMS I (KEYPRS) /PARSE OFF A KEYWORD
1854 JMP CLOOP9 /NO MATCH ON KEYWORD
1855 JMP CLOOP /END OF LINE DETECTED
1856 DCA LPTR /STORE POINTER TO NEXT POS ON LINE
1857 JMS I KEYDSP /DISPATCH TO SERVICE
1858 JMP CLOOP7 /ERROR RETURN FROM SERVICE DISPATCH
1859 TAD LPTR /RE-GET COMMAND LINE POINTER
1860 JMP CLOOP1 /CONTINUE LINE PARSE
1861
1862CLOOP7, SNA /SKIP IF A RETURNING MESSAGE PASSED /029 CJL
1863 JMP CLOOP /JUST GO BACK TO COMMAND LOOP /029 CJL
1864 DCA RETARG /STORE IN-LINE /029 CJL
1865 JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE
1866RETARG, .-. /WILL BE PASSED MESSAGE ADDRESS
1867 JMP CLOOP /KEEP GOING
1868\fCLOOP9, JMS I [SCRIBE] /COMPLAIN OF /025 CJL
1869 CMERMSG /BAD COMMAND /025 CJL
1870 JMP CLOOP /GO AGAIN
1871
1872/ ROUTINE TO FORMAT A PACKET OF DATA
1873/ CALL: FPACK
1874/ DATA ADDRESS (DATA MUST ALREADY BE CONTROL/QUOTED AND MUST
1875/ NOT BE LONGER THAN THE LARGEST PACKET)
1876/ PACKET TYPE
1877
1878FPACK0, 0
1879 CLA CLL /INSURE CLEAR AC
1880 TAD I FPACK0 /GET THE DATA ADDRESS
1881 DCA FP1 /STORE IN SOURCE POINTER
1882 ISZ FPACK0 /BUMP ARGUMENT POINTER
1883 TAD I FPACK0 /NOW GET TYPE
1884 DCA I (RSTYP) /STORE
1885 ISZ FPACK0 /BUMP ARGUMENT POINTER
1886 TAD (RSDTA /GET ADDRESS OF DATA BUFFER
1887 DCA FP2 /STORE IN DESTINATION POINTER
1888
1889 TAD (40+3 /SET FOR LENGTH COUNTER
1890 DCA I (RSLEN) /STORE IN PACKET
1891 DCA FP3 /INIT CHECKSUM
1892 TAD CURSEQ /GET CURRENT SEQ NUMBER
1893 AND [77] /MODULO 64 /014/016 CJL
1894 TAD [40] /TAKE CHAR(SEQUENCE NUMBER) /014/016 CJL
1895 DCA I (RSSEQ) /PUT INTO PACKET
1896FPACK2, TAD I FP1 /GET A CHAR FROM SOURCE
1897 SPA /SKIP IF NOT END
1898 JMP FPACK3 /END
1899 TAD FP3 /COMBINE WITH CHECKSUM
1900 DCA FP3 /AND RETURN
1901 TAD I FP1 /GET CHAR BACK AGAIN
1902 DCA I FP2 /NOW PUT INTO DESTINATION
1903 ISZ I (RSLEN) /BUMP THE LENGTH
1904 ISZ FP1 /BUMP THE SOURCE POINTER
1905 ISZ FP2 /BUMP THE DESTINATION POINTER
1906 JMP FPACK2 /LOOP
1907\fFPACK3, CLA CLL /CLEAR THE AC
1908 TAD FP3 /GET CALCULATED CHECKSUM
1909 TAD I (RSLEN) /INCLUDE THE LENGTH
1910 TAD I (RSSEQ) /AND THE SEQUENCE
1911 TAD I (RSTYP) /AND THE TYPE
1912 JMS I [CKSUM] /GET IT CORRECT
1913 DCA I FP2 /STORE WITH PACKET
1914 ISZ FP2 /BUMP PACKET POINTER
1915 TAD REOL /GET ANY END OF LINE TO INCLUDE
1916 TAD [-40] /MAKE IT A REAL CHARACTER /014/016 CJL
1917 SNA /SKIP IF EOL CHAR REQUIRED
1918 JMP FPACK4 /NO EOL CHAR
1919 DCA I FP2 /STORE EOL CHAR WITH PACKET
1920 ISZ FP2 /BUMP POINTER
1921FPACK4, NL7777 /SET -1 /032 CJL
1922 DCA I FP2 /PACKET NOW COMPLETE
1923 TAD RETRY /SET UP RE-TRY COUNTER
1924 DCA RTRYC
1925 ISZ CURSEQ /BUMP SEQUENCE NUMBER FOR NEXT TIME
1926 NOP /PROTECT ISZ
1927 JMP I FPACK0 /RETURN
1928
1929FP1, 0 /POINTER TO SOURCE DATA
1930FP2, 0 /POINTER TO PACKET BUFFER
1931FP3, 0 /RUNNING CHECKSUM
1932
1933/ DECMATE INITIALIZE ROUTINE. /048 CJL
1934
1935DMINIT, .-. /DECMATE PORT INITIALIZE ROUTINE/048 CJL
1936DMI01, TAD DM234/(234) /GET SCD ENABLE VALUE /050 CJL
1937DMI02, WCON0 /WRITE CONTROL REGISTER 0 (1) /050 CJL
1938DMI03, NL0000 /INDICATE PORT 0 (1) /050 CJL
1939DMI04, RACD /RESET THE ACTIVE PORT /050 CJL
1940DMI05, ISZ DMWASTE /WASTE /050 CJL
1941DMI06, JMP DMI05 /SOME TIME /050 CJL
1942DMI07, ISZ DMWASTE /WASTE /050 CJL
1943DMI08, JMP DMI07 /SOME TIME /050 CJL
1944DMI09, RTFL0 /SET PORT 0 (1) OUTPUT FLAG /050 CJL
1945DMI10, TAD DM2516/(2516) /SETUP FOR 8 BITS, NO PARITY /050 CJL
1946DMI11, JMS DMSEND /SEND TO MODE REGISTER 1 /050 CJL
1947DMI12, TAD RATE /GET BAUD RATE /050 CJL
1948DMI13, TAD DM2460/(2460) /ADD ON CLOCK ENABLE VALUES /050 CJL
1949DMI14, JMS DMSEND /SEND TO MODE REGISTER 2 /050 CJL
1950DMI15, TAD DM3425/(3425) /GET ENABLE AND RESET VALUE /050 CJL
1951DMI16, JMS DMSEND /SEND TO COMMAND REGISTER /050 CJL
1952DMI17, RKRB0 /DO A DUMMY READ ON PORT 0 (1) /050 CJL
1953\f/ THE PREVIOUS INSTRUCTIONS ARE FOR DECMATE I OPERATION ONLY. THE DEFAULT
1954/ INSTRUCTIONS ARE FOR DECMATE II, ETC. INTERFACES ONLY.
1955
1956 *DMI01 /OVERLAY DECMATE I CODE /050 CJL
1957
1958DMI01, ISZ DMWASTE /WASTE /048 CJL
1959DMI02, JMP DMI01 /SOME TIME /048 CJL
1960DMI03, ISZ DMWASTE /WASTE /048 CJL
1961DMI04, JMP DMI03 /SOME TIME /048 CJL
1962DMI05, ISF /SKIP ON AND CLEAR PORT FLAG /048 CJL
1963DM50, 50/NOP /JUST IN CASE /048 CJL
1964DMI07, IRB /READ THE PORT BUFFER /048 CJL
1965DMI08, CLA /CLEAN UP /048 CJL
1966DMI09, TAD DM50/(50) /GET OUTPUT INTERRUPT VALUE /048 CJL
1967DMI10, MPSCC /CLEAR OUTPUT INTERRUPT /048 CJL
1968DMI11, TAD (60-50) /GET ERROR RESET VALUE /048 CJL
1969DMI12, MPSCC /CLEAR OVERRUN ERRORS /048 CJL
1970DMI13, TAD (70-60) /SET END OF INTERRUPT VALUE /048 CJL
1971DMI14, MPSCC /CLEAR THE INTERRUPT /048 CJL
1972DMI15, DCA OUTFLAG /INDICATE OUTPUT IS AVAILABLE /048 CJL
1973DMI16, DCA INFLAG /CLEAR INPUT AVAILABLE FLAG /048 CJL
1974DMI17, JMP I DMINIT /RETURN /048 CJL
1975
1976/ DECMATE I INITIALIZE CODE CONTINUES HERE. /050 CJL
1977
1978DMISET, RTFL0 /SET PORT 0 (1) OUTPUT FLAG /050 CJL
1979 CLA /CLEAN UP /050 CJL
1980 JMP I DMINIT /RETURN /050 CJL
1981
1982DMSEND, .-. /DECMATE I SEND ROUTINE /050 CJL
1983DMISKP, RTSF0 /SKIP ON PORT 0 (1) OUTPUT FLAG /050 CJL
1984 JMP DMISKP /WAIT FOR IT /050 CJL
1985DMIOUT, RTLS0 /SEND TO PORT 0 (1) REGISTER /050 CJL
1986 CLA /CLEAN UP /050 CJL
1987 JMP I DMSEND /RETURN /050 CJL
1988
1989DMWASTE,.-. /TIMER TEMPORARY /050 CJL
1990DM234, 234 /CONSTANT 0234 /050 CJL
1991DM2460, 2460 /CONSTANT 2460 /050 CJL
1992DM2516, 2516 /CONSTANT 2516 /050 CJL
1993DM3425, 3425 /CONSTANT 3425 /050 CJL
1994
1995 PAGE
1996\f/ ROUTINE TO SEND THE FORMATTED PACKET /027 CJL
1997/ ARGUMENTS: CALL+1 NON-ZERO = AWAIT RESPONSE
1998/ ZERO = DO NOT AWAIT RESPONSE
1999/ CALL + 2 DISPATCH TABLE-2 /027 CJL
2000
2001SPACK0, 0
2002 REM8B; RSBUF /SEND PACKET JUST COMPLETED
2003 TAD I SPACK0 /DO WE GET A RESPONSE?
2004 ISZ SPACK0 /BUMP POINTER PAST ARGUMENT
2005 SNA CLA /SKIP IF YES
2006 JMP I SPACK0 /ALL DONE HERE
2007 RPACK /GET PACKET BACK FROM REMOTE
2008 TAD I SPACK0 /DID WE WANT A DISPATCH?
2009 ISZ SPACK0 /BUMP PAST ARGUMENT
2010 SNA /SKIP IF YES
2011 JMP I SPACK0 /EXIT IF NO
2012 DCA SPACARG /STORE IN-LINE /031 CJL
2013 JMS DISPATCH /CALL DISPATCH ROUTINE /031 CJL
2014SPACARG,.-. /WILL BE DISPATCH TABLE-2 /031 CJL
2015 JMP I SPACK0 /NOT FOUND, GOTTA RETURN
2016
2017/ CONSOLE RESET ROUTINE. /024 CJL
2018
2019CRESET, .-. /CONSOLE RESET ROUTINE
2020 CLA CLL /CLEAN UP
2021 DCA ECHOSW /ENABLE OUTPUT ECHO
2022 TAD (UPCPRT) /ALLOW THEM TO
2023 DCA UCADDRESS /RESTART VIA <^C>
2024 TAD [CLOOP] /ALLOW THEM TO
2025 DCA UPADDRESS /RESTART VIA <^P>
2026 JMP I CRESET /RETURN
2027
2028/ ALTERNATE CONSOLE RESET ROUTINE. /025 CJL
2029
2030CREST2, .-. /ALTERNATE CONSOLE RESET ROUTINE
2031 JMS CRESET /CLEAR AC AND ENABLE OUTPUT ECHO
2032 TAD (KCCZAP) /RENDER <^C>
2033 DCA UCADDRESS /TOTALLY HARMLESS
2034 TAD (CHKCLR) /MAKE <^P> PRINT "^P"
2035 DCA UPADDRESS /AND THEN GO AWAY
2036 JMP I CREST2 /RETURN
2037\f/ ROUTINE TO CLEAR WORDS OF MEMORY
2038/ ENTER WITH: AC = MINUS NUMBER OF WORDS TO CLEAR
2039/ MQ = ADDRESS OF WHERE TO START THE CLEAR
2040
2041CLEAR0, 0
2042 DCA CLEAR5 /STORE COUNT OF WORDS
2043 TAD MQ /GET ADDRESS TO CLEAR /032 CJL
2044 DCA CLEAR6 /STORE IN POINTER
2045 DCA I CLEAR6 /ZERO A WORD
2046 ISZ CLEAR6 /BUMP POINTER
2047 ISZ CLEAR5 /BUMP COUNTER
2048 JMP .-3 /LOOP
2049 JMP I CLEAR0 /DONE
2050
2051CLEAR5, 0 /TEMP FOR "CLEAR" ROUTINE
2052CLEAR6, 0 /TEMP FOR "CLEAR" ROUTINE
2053
2054/ ROUTINE TO DISPATCH TO ROUTINE BASED ON VALUE OF "RRTYP". /027 CJL
2055
2056/ CALLING SEQUENCE:
2057
2058/ CLA /AC MUST BE CLEAR
2059/ JMS DISPATCH /CALL ROUTINE
2060/ ADDRESS-2 /DISPATCH TABLE ADDRESS-2
2061/ NO MATCH RETURN /RETURNS HERE WITH CLEAR AC IF NO MATCH
2062
2063/ CALL WILL DISPATCH TO THE CORRESPONDING ROUTINE ON A MATCH IN THE SPECIFIED
2064/ TABLE (WHICH ENDS WITH ZERO) WITH A CLEAR AC.
2065
2066DISPATC,.-. /MATCH "RRTYP" AND DISPATCH ROUTINE
2067 CLA /JUST IN CASE /031 CJL
2068 TAD I DISPATCH /GET PASSED ARGUMENT
2069 ISZ DISPATCH /BUMP PAST THE ARGUMENT
2070 DCA DISPA2 /SAVE PASSED ARGUMENT IN-LINE
2071 TAD I (RRTYP) /GET VALUE OF "RRTYP"
2072 CIA /INVERT FOR TESTING
2073 JMS I [SRCHTABLE] /CALL TABLE SEARCH ROUTINE
2074DISPA2, .-. /WILL BE TABLE ADDRESS-2
2075 SNA CLA /SKIP IF MATCH FOUND
2076 JMP I DISPATCH /RETURN ON NO MATCH
2077 JMP I TABLEJUMP /DISPATCH TO MATCHING ADDRESS
2078\f/ ROUTINE TO PUT CHARS INTO A BUFFER TO GET READY TO FORMAT A PACKET.
2079/ ENTER WITH CHAR IN THE AC; IF THE CHAR NEEDS CONTROL QUOTING, IT WILL BE ADDED
2080/ EXIT + 2 IF EVERYTHING IS OK
2081/ EXIT + 1 IF BUFFER IS FULL
2082
2083OPBUF, 0 /PUT CHARACTERS INTO BUFFER FOR PACKET ROUTINE
2084 JMS I (OPRE) /CHECK FOR PREFIX
2085 JMP OPBUF1 /NO PREFIX
2086 DCA OP1 /SAVE CONVERTED CHAR
2087 TAD RQCTL /GET QUOTE CHAR TO USE
2088 DCA I OP2 /PUT RETURNED PREFIX INTO BUFFER
2089 ISZ OP2 /BUMP POINTER
2090 TAD OP1 /GET BACK CONVERTED CHAR
2091OPBUF1, DCA I OP2 /PUT INTO BUFFER
2092 ISZ OP2 /BUMP POINTER
2093 NL7777 /SET -1 /032 CJL
2094 DCA I OP2 /ALWAYS TERMINATE BUFFER
2095 TAD RMAXL /GET MAX BUFFER LENGTH
2096 TAD (-40+HOLDBF-4 /
2097 CIA
2098 TAD OP2 /COMPARE WITH WHAT WE HAVE
2099 SPA CLA /SKIP IF NO ROOM
2100 JMP OPBUF2 /HAVE ROOM
2101 JMS INIOPB /RESET BUFFER
2102 JMP I OPBUF /TAKE RETURN + 1
2103
2104OPBUF2, ISZ OPBUF /BUMP RETURN FOR BUFFER NOT FULL
2105 JMP I OPBUF /DONE
2106
2107OP1, 0 /TEMP LOCATION
2108OP2, HOLDBF /POINTER FOR HOLD BUFFER
2109
2110/ ROUTINE TO RE-SET THE HOLD BUFFER.
2111
2112INIOPB, 0
2113 TAD (HOLDBF /RE-SET BUFFER POINTER
2114 DCA OP2
2115 JMP I INIOPB
2116
2117/ ROUTINE TO CALCULATE A 1 BYTE CHECKSUM.
2118
2119CKSUM, 0
2120 DCA CKSUM1 /STORE TEMP
2121 TAD CKSUM1 /GET BACK
2122 RTR;RTR;RTR /GET TWO HIGHEST INTO TWO LOWEST /032 CJL
2123 AND (3 /KEEP ONLY BITS 0-1
2124 TAD CKSUM1 /GET ORIGINAL
2125 AND [77] /KEEP ONLY BITS 0-5 /016 CJL
2126 TAD [40] /MAKE A CHAR(CHECKSUM)
2127 JMP I CKSUM /DONE, RETURN IN AC
2128
2129CKSUM1, 0 /TEMP FOR "CKSUM"
2130\f PAGE
2131\f/ ROUTINE TO INPUT CHARS FROM REMOTE UNTIL A "SOH" CHAR IS FOUND.
2132
2133GETSOH, 0
2134 JMS COMIN /GET A CHARACTER FROM THE REMOTE LINE /046 CJL
2135 JMP I GETSOH /TIME-OUT
2136 AND [177] /IGNORE PARITY BIT /034 CJL
2137 TAD (-CNTRLA) /COMPARE WITH "SOH" /034 CJL
2138 SZA CLA /SKIP IF SAME
2139 JMP GETSOH+1 /LOOP TILL WE GET ONE
2140 ISZ GETSOH /BUMP FOR GOOD RETURN
2141 JMP I GETSOH /GOT ONE, DONE
2142
2143
2144/ ROUTINE TO GET A CHAR FROM THE REMOTE LINE AND UPDATE CHECKSUM.
2145
2146GETIR, 0
2147 JMS COMIN /GET A CHARACTER FROM THE REMOTE LINE /046 CJL
2148 JMP I GETIR /TIME-OUT RETURN
2149 DCA GETIR1 /STORE TEMP
2150 TAD GETIR1 /GET CHAR BACK
2151 TAD I (ILINK9) /ADD CHECKSUM
2152 DCA I (ILINK9) /RETURN UPDATED CHECKSUM
2153 TAD GETIR1 /RE-GET CURRENT INPUT CHAR
2154 TAD [-15] /CHECK FOR A RETURN
2155 SNA CLA /SKIP IF NOT A RETURN
2156 JMP I GETIR /WAS A RETURN, TAKE EXIT + 1
2157 TAD GETIR1 /RE-GET CHAR FOR RETURN
2158 ISZ GETIR /BUMP FOR GOOD RETURN
2159 JMP I GETIR /AND RETURN IN THE AC
2160
2161GETIR1, 0 /TEMP LOCAL TO "GETIR"
2162\f/ REMOTE COMMUNICATIONS ROUTINES FOR NON-CONNECT USAGE. /046 CJL
2163
2164/ REMOTE INPUT ROUTINE. /046 CJL
2165
2166COMIN, .-. /REMOTE INPUT ROUTINE /046 CJL
2167 CLA /CLEAN UP /046 CJL
2168 TAD [-15] /SETUP THE /049 CJL
2169 DCA TIMEOUT /TIME-OUT FACTOR /046 CJL
2170INLUP, TAD INFLAG /IS INPUT AVAILABLE? /046 CJL
2171
2172/ THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS
2173/ FOR KL8 INTERFACES.
2174
2175 *INLUP /OVERLAY DECMATE II CODE /049 CJL
2176
2177INLUP, SKP /WE'RE NOT A DECMATE II /049 CJL
2178 SNA CLA /SKIP IF INPUT AVAILABLE (ON DECMATE II)/049 CJL
2179INSKIP, JMP NOTYET /JUMP IF NOT /049 CJL
2180INLUP1, DCA INFLAG /CLEAR INPUT AVAILABILITY FLAG /049 CJL
2181INREAD, IRB /GET THE CHARACTER /049 CJL
2182
2183/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
2184/ ARE FOR KL8 INTERFACES.
2185
2186 *INSKIP /OVERLAY DECMATE II CODE /049 CJL
2187
2188INSKIP, RKSFIOT /INPUT FLAG UP? /049 CJL
2189INLUP1, JMP NOTYET /NO, CHECK FOR ABORT, ETC. /049 CJL
2190INREAD, RKRBIOT /YES, READ IN THE CHARACTER /049 CJL
2191 AND [177] /JUST SEVEN-BIT /046 CJL
2192 DCA RCHAR /SAVE THE CHARACTER /046 CJL
2193 TAD RCHAR /GET IT BACK /046 CJL
2194 ISZ COMIN /BUMP TO GOOD RETURN /046 CJL
2195 JMP I COMIN /RETURN /046 CJL
2196
2197/ COMES HERE IF INPUT NOT AVAILABLE.
2198
2199NOTYET, JMS I (CTLCTST) /CHECK FOR <^C>, ETC. /044 CJL
2200 TAD [-CNTRLZ] /COMPARE POSSIBLE CHARACTER TO <^Z> /044 CJL
2201 SZA /SKIP IF IT ALREADY MATCHES /044 CJL
2202 TAD [-CNTRLX+CNTRLZ]/ELSE COMPARE TO <^X> /044 CJL
2203 SNA CLA /SKIP IF NEITHER ABORT CHARACTER /049 CJL
2204 ISZ ABFLAG /SET ABORT FLAG /049 CJL
2205 SKP /SKIP IF NOT TOO MANY TIMES /049 CJL
2206 JMP .-2 /ENSURE FLAG SETTING /049 CJL
2207\fINSTATU,JMS UPSTATUS /UPDATE THE PORT STATUS /049 CJL
2208
2209/ THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS
2210/ FOR KL8 INTERFACES.
2211
2212 *INSTATUS /OVERLAY DECMATE II CODE /049 CJL
2213
2214INSTATU,NOP /WE'RE NOT A DECMATE II /049 CJL
2215 ISZ WASTIME /WASTE SOME TIME /046 CJL
2216 JMP INLUP /KEEP TRYING /046 CJL
2217 ISZ TIMEOUT /WAITING TOO LONG? /046 CJL
2218 JMP INLUP /NO, KEEP TRYING /046 CJL
2219 JMP I COMIN /YES, TAKE ERROR RETURN /046 CJL
2220
2221/ FLOW-CONTROL STATUS ROUTINE. /049 CJL
2222
2223GETFLOW,.-. /GET FLOW-CONTROL STATUS
2224GETFL1, JMS UPSTATUS /UPDATE THE CURRENT STATUS
2225
2226/ THE ABOVE INSTRUCTION IS FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTION IS
2227/ FOR KL8 INTERFACES.
2228
2229 *GETFL1 /OVERLAY DECMATE II CODE
2230
2231GETFL1, NOP /WE'RE NOT A DECMATE II
2232 JMS I (RINGET) /GET REMOTE CHARACTER (IF ANY)
2233 CLA /THROW IT AWAY
2234 TAD REMWAIT /GET REMOTE FLOW STATUS
2235 JMP I GETFLOW /RETURN
2236
2237/ REMOTE OUTPUT ROUTINE. /046 CJL
2238
2239COMOUT, .-. /REMOTE OUTPUT ROUTINE /046 CJL
2240 DCA OUTEMP /SAVE PASSED VALUE /046 CJL
2241CMRESET,TAD [-15] /SETUP THE /049 CJL
2242 DCA OTIME /TIME-OUT COUNTER /049 CJL
2243COMWAIT,JMS GETFLOW /GET REMOTE WAIT STATUS /049 CJL
2244
2245/ THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR
2246/ KL8 INTERFACES.
2247
2248 *COMWAIT /OVERLAY DECMATE CODE /049 CJL
2249
2250COMWAIT,NL7777 /SETUP FOR FLOW CONTROL FLAG LOAD /049 CJL
2251 AND FLOWFLAG /SHOULD WE WAIT FOR REMOTE FLOW CONTROL?/049 CJL
2252 SNA CLA /SKIP IF SO /049 CJL
2253 JMP NOWAIT /JUMP IF NOT /049 CJL
2254\fFLOWAIT,JMS GETFLOW /GET REMOTE WAIT STATUS /049 CJL
2255 SZA CLA /SKIP IF NOT WAITING /049 CJL
2256 JMP FLOWAIT /JUMP IF STILL WAITING /049 CJL
2257NOWAIT, TAD OUTFLAG /CHECK IF OUTPUT IS AVAILABLE /049 CJL
2258CMOUT1, SNA CLA /SKIP IF SO /049 CJL
2259CMOUT2, JMP OWAIT /JUMP IF NOT /049 CJL
2260DM1AND, DCA OUTFLAG /CLEAR OUTPUT AVAILABILITY FLAG /049 CJL
2261CMOUT3, TAD OUTEMP /GET THE PASSED VALUE /049 CJL
2262CMOUT4, OLS /OUTPUT IT /049 CJL
2263
2264/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
2265/ ARE FOR KL8 INTERFACES.
2266
2267 *NOWAIT /OVERLAY DECMATE II CODE /049 CJL
2268
2269NOWAIT, RTSFIOT /OUTPUT FLAG UP? /049 CJL
2270CMOUT1, JMP OWAIT /NO, WAIT FOR IT THERE /049 CJL
2271
2272/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
2273/ FOR KL8 INTERFACES.
2274
2275 *CMOUT1 /OVERLAY DECMATE I CODE /049 CJL
2276
2277CMOUT1, JMP COMWAIT /NO, WAIT FOR IT /049 CJL
2278CMOUT2, TAD OUTEMP /YES, GET PASSED VALUE /049 CJL
2279DM1AND, AND [377] /ENSURE EIGHT BITS (FOR DECMATE I) /049 CJL
2280
2281/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
2282/ FOR KL8 INTERFACES.
2283
2284 *DM1AND /OVERLAY DECMATE I CODE /049 CJL
2285
2286DM1AND, SKP /WE'RE NOT A DECMATE I /049 CJL
2287CMOUT3, TAD [400] /FORCE OUTPUT WRITE FOR DECMATE I /049 CJL
2288CMOUT4, RTLSIOT /OUTPUT THE CHARACTER /049 CJL
2289 CLA /CLEAN UP /049 CJL
2290 JMP I COMOUT /RETURN /049 CJL
2291
2292/ COMES HERE IF OUTPUT NOT READY. /049 CJL
2293
2294OWAIT, ISZ OWASTE /WASTE SOME TIME /049 CJL
2295 JMP COMWAIT /KEEP TRYING /049 CJL
2296 ISZ OTIME /WAITING TOO LONG? /049 CJL
2297 JMP COMWAIT /NO, KEEP TRYING /049 CJL
2298 JMS I (DMINIT) /YES, RESET EVERYTHING /049 CJL
2299 JMP CMRESET /TRY, TRY AGAIN /049 CJL
2300\f/ DECMATE II, ETC. STATUS UPDATE ROUTINE. /046 CJL
2301
2302UPSTATU,.-. /UPDATE THE STATUS ROUTINE /046 CJL
2303 ISF /COMMUNICATIONS PORT FLAG UP? /046 CJL
2304 JMP I UPSTATUS /NO, RETURN /046 CJL
2305 NL4000 /SETUP READ OF REGISTER ZERO /046 CJL
2306 MPSCC /TELL THE MPSCC CHIP /046 CJL
2307 CLA /CLEAN UP /046 CJL
2308 MPSCC /READ REGISTER ZERO NOW /046 CJL
2309 AND (5) /JUST INPUT AND OUTPUT BITS /046 CJL
2310 CLL RAR /MOVE INPUT TO LINK /046 CJL
2311 SNA CLA /SKIP IF OUTPUT INTERRUPT /046 CJL
2312 JMP INCHK /JUMP IF NOT /046 CJL
2313 TAD (050) /GET OUTPUT CLEAR VALUE /046 CJL
2314 MPSCC /CLEAR THE OUTPUT INTERRUPT /046 CJL
2315 DCA OUTFLAG /INDICATE OUTPUT AVAILABLE NOW /046 CJL
2316INCHK, CLA RAL /GET RECEIVE STATUS /046 CJL
2317 SZA /SKIP IF INPUT NOT AVAILABLE RIGHT NOW /046 CJL
2318 DCA INFLAG /INDICATE NEW INPUT STATUS /046 CJL
2319 CLA /CLEAN UP EITHER WAY /046 CJL
2320 TAD (070) /GET END OF INTERRUPT VALUE /046 CJL
2321 MPSCC /CLEAR THE INTERRUPT /046 CJL
2322 CLA /CLEAN UP /046 CJL
2323 JMP I UPSTATUS /RETURN /046 CJL
2324
2325 AND377= AND [377] /INSTRUCTION CONSTANT /049 CJL
2326 OUTEMP= COMIN /OUTPUT ROUTINE TEMPORARY /049 CJL
2327 TIMEOUT=GETFLOW /TIME-OUT TEMPORARY /049 CJL
2328 WASTIME=COMOUT /TIME-OUT TEMPORARY /049 CJL
2329
2330OTIME, .-. /TIME-OUT TEMPORARY /049 CJL
2331OWASTE, .-. /TIME-OUT TEMPORARY /049 CJL
2332
2333 PAGE
2334
2335/ HOLD BUFFER FOR CHAR OUTPUT
2336
2337 DECIMAL
2338
2339HOLDBF, ZBLOCK 92
2340
2341 OCTAL
2342\f/ ROUTINE TO CHECK FOR CONTROL PREFIX.
2343/ ENTER WITH CHAR TO CHECK IN THE AC.
2344/ EXIT + 1 WITH CHAR IN THE AC IF NO PREFIX QUOTING.
2345/ EXIT + 2 WITH PROPER CHAR IN THE AC AND QUOTING IS REQUIRED.
2346
2347OPRE, 0 /CHECK FOR CONTROL PREFIX ROUTINE
2348 DCA PRETEMP /SAVE THE CHARACTER /032 CJL
2349 TAD QFLAG /CHECK FOR IN CTRL QUOTE MODE
2350 SZA CLA /SKIP IF YES
2351 JMP OPRE1 /NO QUOTE PREFIX
2352 TAD PRETEMP /GET THE CHARACTER /032 CJL
2353 AND [7740] /QUICK CHECK FOR <40 /014/016 CJL
2354 SNA CLA /SKIP IF NOT CONTROL
2355 JMP OPRE2 /PREFIX QUOTE
2356 TAD PRETEMP /GET THE CHARACTER /032 CJL
2357 TAD (-177 /CHECK FOR "DELETE"
2358 SNA CLA /SKIP IF NOT
2359 JMP OPRE2 /PREFIX QUOTE
2360 TAD PRETEMP /GET THE CHARACTER /032 CJL
2361 CIA /NEGATE FOR COMPARE
2362 TAD RQCTL /SEE IF SAME AS QUOTE CHAR
2363 SZA CLA /SKIP IF PREFIX QUOTE
2364 JMP OPRE1 /NO PREFIX QUOTE
2365 TAD RQCTL /PREFIX WITH PREFIX
2366 JMP OPRE3 /PREFIX WITH THE PREFIX
2367
2368OPRE1, TAD PRETEMP /GET THE CHARACTER /032 CJL
2369 JMP I OPRE /DONE
2370
2371OPRE2, TAD PRETEMP /GET THE CHARACTER /032 CJL
2372 TAD [100] /MAKE IT PRINTABLE /016 CJL
2373 AND [177] /IN CASE IT WAS 177 /014/016 CJL
2374
2375OPRE3, ISZ OPRE /BUMP FOR PREFIX RETURN
2376 JMP I OPRE /DONE
2377
2378PRETEMP,.-. /PREFIX TEMPORARY /032 CJL
2379
2380 PAGE /014 CJL
2381\f/ ROUTINE TO SCAN A TEXT LINE FOR KEYWORD DELIMITERS.
2382
2383/ THIS ROUTINE EXPECTS THE AC TO POINT TO A TEXT LINE TO SCAN AND FINDS THE
2384/ FIRST NON-SPACE, NON-END OF LINE CHAR IN THE LINE AND SETS "SCAN1" TO POINT TO
2385/ IT. NEXT WE FIND THE LAST CHAR IN THE LINE THAT IS A NON-SPACE, NON-END OF
2386/ LINE AND STORE A POINTER TO IT IN "SCAN2". KEYWORDS ARE DELIMITED BY A
2387/ BEGINNING OF LINE OR SPACE AT THE BEGINNING AND AN END OF LINE OR A SPACE AT
2388/ THE END.
2389
2390/ ENTER: AC = POINTER TO COMMAND LINE
2391
2392/ EXIT: (SUCCESS) SCAN1 = POINTER TO FIRST CHAR OF KEYWORD.
2393/ SCAN2 = POINTER TO LAST CHAR OF KEYWORD.
2394/ RETURN = RETURN + 2 (NO WORDS LEFT IN LINE).
2395
2396/ EXIT: (FAIL) RETURN = RETURN + 1.
2397
2398SCNEL, 0 /SCAN ROUTINE
2399 JMS I [NOSP] /FIND FIRST NON-SPACE
2400 JMP I SCNEL /END OF LINE RETURN
2401 DCA SCAN1 /RETURN SCAN LINE POINTER
2402 TAD SCAN1 /RE-GET SCAN LINE POINTER
2403 JMS I [SP] /FIND FIRST SPACE OR EOL
2404 NOP /RETURN HERE ON EOL
2405 TAD (-1 /BACK UP TO PREVIOUS CHAR
2406 DCA SCAN2 /SET END ELEMENT POINTER
2407 ISZ SCNEL /TAKE SUCCESS RETURN
2408 JMP I SCNEL /DONE
2409
2410
2411/ ROUTINE TO SCAN THRU A TEXT LINE LOOKING FOR THE NEXT SPACE.
2412/ ENTER ROUTINE WITH THE LINE POINTER IN THE AC.
2413
2414/ EXIT: RETURN + 2 WITH AC = POINTER TO SPACE.
2415/ RETURN + 1 WITH AC = POINTER TO END OF LINE.
2416
2417SP, 0 /CHECK FOR A <SPACE> ROUTINE
2418 DCA SCANTP /USE A TEMP POINTER
2419 SKP /SKIP INTO LOOP BELOW
2420SP1, ISZ SCANTP /BUMP LINE POINTER
2421 TAD I SCANTP /GET A CHAR
2422 SPA /SKIP IF NOT END OF LINE
2423 JMP SP3 /GOT AN END OF LINE
2424 TAD [-" !200] /COMPARE WITH <SP> /034 CJL
2425 SZA CLA /SKIP IF IS A SPACE
2426 JMP SP1 /LOOP TILL SPACE OR EOL
2427 ISZ SP /BUMP RETURN FOR SPACE FOUND
2428
2429SP3, CLA CLL /INSURE A CLEAR AC
2430 TAD SCANTP /GET POINTER VALUE
2431 JMP I SP /RETURN IN AC
2432\f/ ROUTINE TO SCAN THRU A TEXT LINE FOR THE FIRST NON-SPACE.
2433/ ENTER ROUTINE WITH POINTER TO THE LINE IN THE AC.
2434
2435/ EXIT: RETURN + 2 WITH AC = POINTER TO NON-SPACE.
2436/ RETURN + 1 WITH AC = POINTER TO END OF LINE.
2437
2438NOSP, 0 /FIND A NON-<SPACE> ROUTINE
2439 DCA SCANTP /USE A TEMP POINTER
2440 SKP /SKIP INTO LOOP BELOW
2441NOSP1, ISZ SCANTP /BUMP THE LINE POINTER
2442 TAD I SCANTP /GET A CHAR FROM THE LINE
2443 SPA /SKIP IF NOT EOL
2444 JMP NOSP3 /EXIT IF EOL
2445 TAD [-" !200] /COMPARE WITH <SP> /034 CJL
2446 SNA CLA /SKIP IF NOT SPACE
2447 JMP NOSP1 /LOOP TILL SPACE OR EOL
2448 ISZ NOSP /BUMP RETURN FOR SPACE FOUND
2449NOSP3, CLA CLL /INSURE CLEAR AC
2450 TAD SCANTP /GET POINTER
2451 JMP I NOSP /RETURN IN AC
2452
2453
2454
2455/ ROUTINE TO FIND AN END CHAR IN A STRING.
2456/ ENTER ROUTINE WITH POINTER TO THE STRING IN THE AC.
2457/ EXIT WITH THE POINTER TO THE FIRST MINUS CHAR IN THE AC.
2458
2459FNDEND, 0 /FIND END CHAR ROUTINE
2460 DCA SCANTP /PUT POINTER IN SCANTP
2461FEND1, TAD I SCANTP /GET A CHAR FROM THE STRING
2462 SPA CLA /SKIP IF NOT END
2463 JMP FEND2 /EXIT IF END OF STRING
2464 ISZ SCANTP /BUMP THE POINTER
2465 JMP FEND1 /LOOP TILL NON-END OF STRING
2466
2467FEND2, TAD SCANTP /GET POINTER TO NON-END OF STRING
2468 JMP I FNDEND /EXIT WITH POINTER IN AC
2469
2470SCANTP, 0 /USED IN THE SCAN ROUTINES "SP", "NOSP", "FNDNUL"
2471\f/ ROUTINE TO LOOKUP THE KEY WORD POINTED TO BY THE AC IN THE /014 CJL
2472/ TABLE POINTED TO BY PTABLE.
2473
2474/ RETURN + 1 IF NO MATCH IS FOUND WITH AC = ENTRY VALUE.
2475/ RETURN + 2 IF NO KEYWORD IS FOUND (EOL DETECTED).
2476/ RETURN + 3 IF MATCH IS FOUND WITH THE NEXT PARSE POSITION IN THE LINE IN
2477/ THE AC AND THE DISPATCH ADDRESS FROM THE TABLE IN "KEYDSP".
2478
2479KEYPRS, .-. /KEYWORD PARSE ROUTINE
2480 DCA LOOK3 /SAVE IN CASE OF FAIL
2481 TAD LOOK3 /RE-GET
2482/ AND (137) /MAKE CHARACTER UPPER-CASE, NO PARITY /MD013
2483 JMS SCNEL /TRY TO SCAN OFF A KEYWORD
2484 JMP KP45 /END OF LINE ENCOUNTERED
2485 TAD PTABLE /GET ADDRESS OF TABLE
2486 DCA LOOK2 /STORE IN LOCAL POINTER
2487
2488KP10, TAD SCAN1 /GET ADDRESS OF SCAN ELEMENT
2489 DCA LOOK1 /INTO LOCAL POINTER
2490
2491KP20, TAD I LOOK1 /GET A CHARACTER FROM THE SCAN ELEMENT
2492 CIA /NEGATE FOR COMPARE
2493 TAD I LOOK2 /GET A CHAR FROM THE TABLE ELEMENT
2494 SZA CLA /SKIP IF MATCH
2495 JMP KP90 /NO MATCH, SET TO LOOK AT NEXT TABLE ENTRY
2496 TAD LOOK1 /CHECK IF ALL ENTERED CHARS MATCH
2497 CIA /NEGATE TO COMPARE
2498 TAD SCAN2 /HAVE WE MATCHED TO THE TERMINATOR?
2499 SNA CLA /SKIP IF NO
2500 JMP KP40 /YES, GOT ENOUGH TO MATCH
2501 ISZ LOOK1 /MORE TO MATCH, BUMP SCAN ELEMENT POINTER
2502 ISZ LOOK2 /BUMP TABLE ELEMENT POINTER
2503 JMP KP20 /CONTINUE MATCH LOOP
2504
2505KP40, TAD LOOK2 /GET CURRENT TABLE POINTER
2506 JMS FNDEND /FIND A NULL MARK
2507 IAC /BUMP BY 1
2508 DCA LOOK1 /STORE IN A POINTER
2509 TAD I LOOK1 /GET DISPATCH ADDRESS
2510 DCA KEYDSP /PUT INTO DISPATCH ADDRESS
2511 ISZ KEYPRS /BUMP RETURN
2512 ISZ KEYPRS /BUMP AGAIN
2513 CLA CLL IAC /AC = 1
2514 TAD SCAN2 /GET POINTER TO END OF CURRENT KEY
2515 JMP I KEYPRS /RETURN
2516
2517/ END OF LINE ENCOUNTERED ON PARSE.
2518
2519KP45, ISZ KEYPRS /BUMP RETURN ONCE FOR EOL
2520
2521/ NO MATCHES IN THE TABLE HERE.
2522
2523KP50, TAD LOOK3 /GET ORIGINAL AC
2524 JMP I KEYPRS /RETURN
2525\f/ FAILURE ON CURRENT TABLE ENTRY, SET FOR NEXT ENTRY (IF THERE IS ONE) AND TRY
2526/ AGAIN.
2527
2528KP90, TAD LOOK2 /GET TABLE POINTER
2529 JMS FNDEND /FIND NEXT TABLE ENTRY
2530 IAC;IAC /NEXT ENTRY IS 2 PAST THE NULL
2531 DCA LOOK2 /RE-SET LOCAL TABLE POINTER
2532 TAD I LOOK2 /CHECK END OF TABLE
2533 SNA CLA /SKIP IF NOT END OF THE TABLE
2534 JMP KP50 /TAKE NOT FOUND EXIT
2535 JMP KP10 /TRY MATCH ON THIS ENTRY
2536
2537LOOK1, .-. /TEMPORARY FOR KEYPRS /014 CJL
2538LOOK2, .-. /TEMPORARY FOR KEYPRS /014 CJL
2539LOOK3, .-. /TEMPORARY FOR KEYPRS /014 CJL
2540
2541/ ROUTINE TO MOVE WORDS OF MEMORY. /014 CJL
2542
2543/ CALLING SEQUENCE:
2544
2545/ TAD (DESTINATION) /GET DESTINATION ADDRESS
2546/ DCA MQ /INTO MQ /032 CJL
2547/ TAD (-COUNT) /GET -NUMBER OF WORDS TO MOVE
2548/ DCA MOVE4 /SETUP MOVE COUNTER
2549/ TAD (SOURCE) /GET SOURCE ADDRESS
2550/ JMS I (MOVE0) /CALL MOVE ROUTINE
2551/ RETURN /RETURNS HERE
2552
2553MOVE0, .-. /MOVE ROUTINE /014 CJL
2554 DCA MOVE5 /STORE SOURCE ADDRESS IN LOCAL POINTER
2555 TAD MQ /GET DESTINATION ADDRESS /032 CJL
2556 DCA MOVE6 /STORE IN LOCAL POINTER
2557MOVE1, TAD I MOVE5 /GET A WORD FROM THE SOURCE
2558 DCA I MOVE6 /MOVE TO DESTINATION
2559 ISZ MOVE5 /BUMP SOURCE POINTER
2560 ISZ MOVE6 /BUMP DESTINATION COUNTER
2561 ISZ MOVE4 /BUMP COUNTER
2562 JMP MOVE1 /LOOP
2563 JMP I MOVE0 /DONE
2564
2565MOVE5, .-. /SOURCE POINTER FOR "MOVE"
2566MOVE6, .-. /DESTINATION POINTER FOR "MOVE"
2567
2568 PAGE /014 CJL
2569\f/ ROUTINE TO PARSE OFF A DEVICE NAME FROM THE COMMAND LINE. /O14 CJL
2570
2571/ CALLING SEQUENCE:
2572
2573/ TAD (POINTER) /AC CONTAINS POINTER TO COMMAND LINE
2574/ JMS I [DPARS] /CALL ROUTINE
2575/ ERROR RETURN /AC UNCHANGED
2576/ GOOD RETURN /AC NOW POINTS TO REST OF LINE
2577
2578/ DEVNUM= DEVICE NUMBER TO USE.
2579/ ":" IS THE FIFTH CHARACTER IF NOT USING DEFAULT DEVICE.
2580
2581DPARS, .-. /DEVICE PARSE ROUTINE /014 CJL
2582 DCA DPAR10 /SAVE INITIAL POINTER TO LINE
2583 TAD DPAR10 /GET POINTER
2584 JMS I [NOSP] /GET PAST ANY LEADING SPACES
2585 JMP DFDEV /GOT END OF LINE, USE DEFAULT DEVICE
2586 DCA DPAR11 /SAVE POINTER TO LINE
2587 DCA DEVNAME /INITIALIZE THE DEVICE NAME /014 CJL
2588 DCA DEVNAME+1 /FOR "INQUIRE" FUNCTION /014 CJL
2589 TAD (DEVNAM) /GET ADDRESS OF WHERE TO PUT DEVICE NAME/014 CJL
2590 DCA PACK6P /STORE IN PACK6 POINTER
2591 DCA PACK6F /INITIALIZE PACK6 FLAG FOR LOW BYTE /014 CJL
2592 TAD (-4) /SET UP A COUNTER /014 CJL
2593 DCA DPAR13 /FOR NO MORE THAN 4 CHARS
2594DPAR1, TAD I DPAR11 /GET A CHAR FROM THE LINE
2595 SNA /SKIP IF NOT <EOL> /014 CJL
2596 JMP DFDEV /GOT AN <EOL>, USE DEFAULT DEVICE /014 CJL
2597 TAD (-":!200) /CHECK FOR ":" /034 CJL
2598 SNA CLA /SKIP IF NOT END OF DEVICE NAME
2599 JMP DPAR2 /DEVICE NAME SET UP
2600 TAD I DPAR11 /RE-GET CHAR
2601 ISZ DPAR11 /BUMP LINE POINTER
2602 PACK6 /PACK SIX-BIT /014 CJL
2603 ISZ DPAR13 /BUMP CHARACTER COUNTER /014 CJL
2604 JMP DPAR1 /CAN CONTINUE
2605 TAD I DPAR11 /GET CHARACTER AFTER THE FOURTH /014 CJL
2606 TAD (-":!200) /CHECK FOR ":" /034 CJL
2607 SZA CLA /SKIP IF YES, ALL IS OK
2608 JMP DFDEV /USE THE DEFAULT DEVICE
2609DPAR2, ISZ DPAR11 /BUMP POINTER PAST ":"
2610 TAD (DEVNAM) /GET PARSED DEVICE NAME ADDRESS /014 CJL
2611 JMP DPAR4 /DO AN OS/8 "INQUIRE"
2612
2613DFDEV, CLA CLL /CLEAN UP /019 CJL
2614 TAD DPAR10 /GET ORIGINAL AC FOR
2615 DCA DPAR11 /RETURN POINTER
2616DPAR4, JMS DVNUM /GET DEVICE NUMBER
2617 JMP DPAR8 /DEVICE NAME ERROR
2618 DCA DEVNUM /RETURN FOR CALLING PROGRAM
2619 TAD DPAR11 /GET CURRENT POINTER
2620 ISZ DPARS /BUMP RETURN
2621 JMP I DPARS /RETURN /014 CJL
2622\fDPAR8, CLA CLL /INSURE CLEAR AC
2623 TAD DPAR10 /GET ORIGINAL AC
2624 JMP I DPARS /TAKE ERROR EXIT
2625
2626DPAR10, .-. /TEMPORARY FOR DPARS /014 CJL
2627DPAR11, .-. /TEMPORARY FOR DPARS /014 CJL
2628DPAR13, .-. /TEMPORARY FOR DPARS /014 CJL
2629DEFDEV, DEVICE DSK /DEFAULT DEVICE
2630DEVNAM, FILENAM ZZZZZZ.ZZ /DEFAULT FILENAME /014 CJL
2631
2632/ ROUTINE TO RETURN A DEVICE NUMBER FOR A DEVICE NAME. /014 CJL
2633
2634/ CALLING SEQUENCE:
2635
2636/ TAD (ADDRESS) /AC=ADDRESS OF DEVICE NAME
2637/ /*OR* 0000 IF "DSK:" IS TO BE USED
2638/ ERROR RETURN /INVALID DEVICE
2639/ GOOD RETURN /AC=DEVICE NUMBER
2640
2641DVNUM, .-. /DEVICE NUMBER ROUTINE /014 CJL
2642 SNA /SKIP IF DEVICE NAME SPECIFIED
2643 TAD (DEFDEV) /ELSE USE DEFAULT /014 CJL
2644 DCA DVNUM9 /SAVE IN LOCAL POINTER
2645 TAD I DVNUM9 /GET FIRST TWO CHARACTERS OF NAME /014 CJL
2646 DCA DVNUM5 /PUT INTO CALL
2647 ISZ DVNUM9 /BUMP POINTER
2648 TAD I DVNUM9 /GET LAST TWO CHARACTERS OF NAME /014 CJL
2649 DCA DVNUM5+1 /PUT INTO CALL
2650 CIF USRFLD /GOTO USR FIELD /020 CJL
2651 JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
2652 INQUIRE /INQUIRE ABOUT HANDLER /020 CJL
2653DVNUM5, .-. /FIRST TWO BYTES OF DEVICE NAME /014 CJL
2654 .-. /LAST TWO BYTES OF DEVICE NAME /014 CJL
2655 0 /ENTRY POINT OF HANDLER RETURNED HERE
2656 JMP I DVNUM /ERROR, TAKE ERROR EXIT
2657 TAD DVNUM5+1 /DEVICE NUMBER
2658 ISZ DVNUM /BUMP RETURN FOR NO ERROR
2659 JMP I DVNUM /RETURN
2660
2661DVNUM9, .-. /LOCAL FOR "DVNUM" /014 CJL
2662\f/ DEVICE HANDLER FETCH ROUTINE. /020 CJL
2663
2664/ CALLING SEQUENCE:
2665
2666/ TAD (HANDLERNUMBER) /AC CONTAINS DEVICE HANDLER NUMBER
2667/ JMS I [HFETCH] /CALL ROUTINE
2668/ ERROR RETURN /COULDN'T LOAD HANDLER
2669/ GOOD RETURN /HANDLER LOADED
2670
2671/ IF THE HANDLER WAS LOADED, THEN HNDADR CONTAINS THE HANDLER ENTRY POINT.
2672
2673HFETCH, .-. /HANDLER FETCH ROUTINE
2674 DCA HANDNUMBER /STORE HANDLER NUMBER
2675 TAD (HNDLR+1) /GET OUR BUFFER+(TWO PAGE ALLOWED)
2676 DCA HADR /STORE IN-LINE
2677 TAD HANDNUMBER /GET HANDLER NUMBER AGAIN
2678 CIF USRFLD /GOTO USR FIELD
2679 JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
2680 FETCH /FETCH HANDLER
2681HADR, .-. /WILL BE OUR SUGGESTED ADDRESS+TWO PAGES ALLOWED
2682 SKP /COULDN'T DO IT
2683 ISZ HFETCH /BUMP TO GOOD RETURN
2684 CLA CLL /CLEAN UP
2685 TAD HADR /GET ACTUAL HANDLER ADDRESS
2686 DCA HNDADR /STASH THE POINTER
2687 JMP I HFETCH /RETURN EITHER WAY
2688
2689HANDNUM,.-. /HANDLER NUMBER TEMPORARY
2690
2691\f/ ROUTINE TO HANDLE THE "FINISH" COMMAND. /021 CJL
2692
2693FINSRV, 0
2694 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
2695 TAD (MSEND) /GET SEND MODE VALUE /045 CJL
2696 DCA KMODE /SETUP PROPER MODE /045 CJL
2697 FPACK /FORMAT A PACKET
2698 SRVFIN /PACKET DATA ADDRESS
2699 STGEN /PACKET TYPE
2700
2701FIN2, SPACK /SEND PACKET
2702 1 /AWAIT RESPONSE
2703 FIN20-2 /DISPATCH LIST FOR RESPONSE /027 CJL
2704
2705/ NAK OR UNDEFINED RESPONSE HERE
2706
2707FIN5, ISZ RTRYC /BUMP RE-TRY COUNTER
2708 JMP FIN2 /GET RESPONSE AND TRY AGAIN
2709 TAD (NOFINISH) /FAILED, RETURN MESSAGE /025 CJL
2710 JMP I FINSRV
2711
2712/ ACK HERE
2713
2714FIN10, ISZ FINSRV /BUMP FOR NON-ERROR EXIT
2715 JMP I FINSRV /DONE
2716
2717FIN20, STACK; FIN10 /ACK
2718 STNAK; FIN5 /NAK
2719 0
2720
2721SRVFIN, "F&137 /SERVER KERMIT COMMAND TO SHUT DOWN
2722 -1 /END OF DATA
2723
2724 PAGE
2725\f/ ROUTINE TO PARSE OFF A FILE NAME.
2726/ FILE NAME TO BE PARSED MUST BE LETTERS OR DIGITS AND BE NO MORE THAN
2727/ SIX CHARS FOR THE NAME AND TWO CHARS FOR THE EXTENSION.
2728
2729/ ENTER WITH: AC = POINTER TO FILE NAME TO PARSE.
2730/ FNPTR = POINTER TO WHERE TO PUT THE PARSED FILE NAME.
2731
2732/ NON-ERROR EXIT: AC = POINTER TO REMAINDER OF COMMAND LINE.
2733/ RETURN THE CALL + 2.
2734
2735/ ERROR EXIT: AC = ORIGINAL POINTER.
2736/ RETURN THE CALL + 1.
2737
2738PFNAM, 0
2739 DCA PFN10 /SAVE POINTER TO FILE NAME STRING
2740 TAD FNPTR /GET POINTER TO FILE NAME BLOCK
2741 DCA MQ /SET FOR "CLEAR" ROUTINE /032 CJL
2742 TAD (-4 /FOUR WORDS TO CLEAR OUT
2743 CLEAR /INIT THE FILE NAME BLOCK
2744 TAD PFN10 /GET THE STRING POINTER
2745 JMS I [NOSP] /GET PAST ANY LEADING SPACES
2746 JMP PFNAM9 /GOT EOL, NO FILE NAME
2747 DCA PFN11 /SAVE POINTER
2748 TAD FNPTR /GET FILE NAME BLOCK POINTER
2749 DCA PACK6P /SET UP THE "PACK6" POINTER
2750 DCA PACK6F /INIT THE "PACK6" FLAG
2751 TAD (-6 /MAX OF 6 CHARS FOR FILE NAME
2752 DCA PFN15 /PUT INTO COUNTER
2753 DCA WILDF /INIT THE WILD CARD FLAG
2754 JMS NAM /MOVE AND PACK FILE NAME
2755 TAD I PFN11 /GET THE TERM CHAR
2756 SPA /SKIP IF NOT EOL
2757 JMP PFNAM7 /EOL MEANS END OF FILE NAME
2758 TAD (-".!200) /COMPARE TO "." /034 CJL
2759 SNA /SKIP IF NO
2760 JMP PFNAM3 /GO HANDLE EXTENSION
2761 TAD (-" +".) /COMPARE TO <SP> /034 CJL
2762 SZA CLA /SKIP IF WAS A SPACE
2763 JMP PFNAM9 /NOT A SPACE, GOT AN ERROR
2764 JMP PFNAM7 /IS A SPACE, END OF FILE NAME
2765\fPFNAM3, ISZ PFN11 /BUMP PAST THE "."
2766 TAD FNPTR /GET FILE NAME BLOCK POINTER
2767 TAD (3) /POINT TO EXTENSION /032 CJL
2768 DCA PACK6P /SET "PACK6" POINTER
2769 DCA PACK6F /INIT "PACK6" FLAG
2770 NL7776 /SET -2 /032 CJL
2771 DCA PFN15 /COUNTER FOR 2 EXT CHARS
2772 JMS NAM /NOW DO THE EXTENSION
2773 TAD I PFN11 /GET THE TERM CHAR
2774 SPA /SKIP IF NOT EOL
2775 JMP PFNAM7 /GOT COMPLETE FILE NAME HERE
2776 TAD [-" !200] /COMPARE TO <SP> /034 CJL
2777 SZA CLA /SKIP IF IT WAS
2778 JMP PFNAM9 /GOT A FILE NAME ERROR
2779PFNAM7, ISZ PFNAM /BUMP RETURN FOR GOOD FILE NAME
2780 CLA CLL /INSURE CLEAR AC
2781 TAD PFN11 /GET CURRENT STRING POINTER
2782 JMP I PFNAM /AND RETURN
2783
2784PFNAM9, CLA CLL /INSURE CLEAR AC
2785 TAD PFN10 /GET ORIGINAL STRING POINTER
2786 JMP I PFNAM /TAKE ERROR RETURN
2787
2788PFN10, 0 /TEMP FOR PFNAM ROUTINE
2789PFN11, 0 /TEMP FOR PFNAM ROUTINE
2790PFN15, 0 /TEMP FOR PFNAM ROUTINE
2791\f/ LOCAL ROUTINE TO "PFNAM" TO MOVE IN THE FILE NAME OR FILE EXTENSION.
2792/ ENTER WITH "PFN11" POINTING TO WHERE TO GET THE NAME OR EXTENSION.
2793/ AND "PFN15" EQUAL TO THE MAX NUMBER OF CHARS (6 FOR NAME, 2 FOR EXT).
2794/ THIS ROUTINE CHECKS FOR WILD CARD CHARS "*" AND "?" AND PUTS THE
2795/ "?" CHAR IN FOR ANY CHARS IN THE NAME THAT ARE WILD. ALSO IF ANY
2796/ WILD CARD CHARS ARE FOUND THE FLAG "WILDC" IS SET SO BEFORE PARSING
2797/ ANY FILE NAME THE "WILDC" FLAG SHOULD BE INITIALIZED.
2798
2799NAM, 0
2800NAM0, TAD I PFN11 /GET A CHAR FROM THE STRING
2801 JMS I (ALPNUM) /MUST BE ALPHA OR NUMBER
2802 SKP /NOT A ALPHA NUMERIC
2803 JMP NAM3 /IS ALPHA NUMERIC
2804 TAD (-"?!200) /COMPARE TO "?" /034 CJL
2805 SNA /SKIP IF NO
2806 JMP NAM2 /YES, JUST PUT IT IN
2807 TAD (-"*+"?) /COMPARE TO "*" /034 CJL
2808 SZA CLA /SKIP IF YES
2809 JMP I NAM /TAKE THE FILE NAME ERROR EXIT
2810 ISZ WILDF /SET FLAG FOR WILD CARD FOUND
2811NAM1, TAD ["?&77] /GET WILD CARD CHARACTER /034 CJL
2812 PACK6 /PUT IN NAME BLOCK
2813 ISZ PFN15 /BUMP CHAR COUNTER
2814 JMP NAM1 /LOOP TILL ALL FILLED
2815 ISZ PFN11 /BUMP THE STRING POINTER
2816 JMP NAM9 /EXIT WITH "PFN11" POINTING TO NEXT CHAR
2817NAM2, ISZ WILDF /SET FLAG FOR WILD CARD FOUND
2818 TAD ["?&77] /GET WILD CARD CHARACTER /034 CJL
2819NAM3, PACK6 /PUT THE CHAR INTO THE FILE NAME BLOCK
2820 ISZ PFN11 /BUMP THE STRING POINTER
2821 ISZ PFN15 /BUMP THE CHAR COUNTER
2822 JMP NAM0 /LOOP
2823
2824NAM4, TAD I PFN11 /NOW GET TO A TERMINATOR CHAR
2825 JMS I (ALPNUM) /BY FINDING FIRST NON-ALPHNUMERIC
2826 JMP NAM9 /NOW WE CAN QUIT
2827 CLA CLL /IGNORE EXCESS CHARS
2828 ISZ PFN11 /BUMP THE STRING POINTER
2829 JMP NAM4 /LOOP
2830
2831NAM9, CLA CLL /LEAVE WITH A CLEAR AC
2832 JMP I NAM /RETURN
2833\f/ ROUTINE TO SEND A PACKET.
2834/ ENTER WITH ADDRESS OF PACKET DATA IN CALL + 1.
2835/ AND TYPE OF PACKET IN CALL + 2.
2836/ EXIT CALL + 4 IF ACK RETURNED.
2837/ EXIT CALL + 3 IF NAK OR OTHER PACKET TYPE RETURNED.
2838
2839SNDP, 0
2840 TAD I SNDP /GET DATA ADDRESS
2841 DCA SNDP1 /STORE IN CALL
2842 ISZ SNDP /BUMP POINTER
2843 TAD I SNDP /GET PACKET TYPE
2844 DCA SNDP2 /STORE IN CALL
2845 ISZ SNDP /BUMP
2846
2847 FPACK /FORMAT A PACKET
2848SNDP1, 0 /DATA ADDRESS GOES HERE
2849SNDP2, 0 /PACKET TYPE GOES HERE
2850
2851SNDP3, SPACK /SEND A DATA PACKET
2852 1 /GET RESPONSE
2853 SNDP9-2 /RESPONSE DISPATCH TABLE ADDRESS /027 CJL
2854
2855/ HERE ON NOT "NAK" OR "ACK" RESPONSE.
2856
2857 SKP
2858
2859/ HERE ON "ACK".
2860
2861SNDP5, ISZ SNDP /BUMP RETURN
2862
2863 ISZ SNDP /BUMP RETURN
2864 JMP I SNDP /EXIT
2865
2866/ HERE ON NAK.
2867
2868SNDP4, ISZ RTRYC /BUMP THE RE-TRY COUNTER
2869 JMP SNDP3 /RE-TRY
2870 JMP I SNDP /TAKE RETURN + 3
2871
2872SNDP9, STACK; SNDP5 /ACK
2873 STACK; SNDP4 /NAK
2874 0
2875
2876 PAGE /014 CJL
2877\f IFZERO 1 <
2878
2879/ ROUTINE TO PARSE OFF A DECIMAL NUMBER.
2880/ ENTER ROUTINE WITH A POINTER TO THE PARSE LINE IN THE AC.
2881/ EXIT: RETURN + 1 FOR NO NUMBER.
2882/ RETURN + 2 FOR INVALID NUMBER.
2883/ RETURN + 3 FOR VALID NUMBER.
2884
2885/ IN ALL CASES ON RETURN THE AC WILL CONTAIN A POINTER TO THE NEXT CHAR TO PARSE
2886/ IN THE LINE. ANY NUMBER PARSED WILL BE CONVERTED TO BINARY AND PUT INTO THE
2887/ REGISTER "BININP".
2888
2889DECPRS, 0
2890 JMS I [NOSP] /GET PAST ANY LEADING SPACES
2891 JMP I DECPRS /GOT AN END OF LINE, AC POINTS TO IT
2892 DCA DP10 /SAVE POINTER TO LINE
2893 TAD DP10 /RE-GET POINTER TO LINE
2894 DCA DP11 /STORE IN OUR LINE POINTER
2895 DCA BININP /INIT BINARY REGISTER
2896 DCA DP13 /INIT PARSED NUMBER FLAG
2897 SKP /SKIP INTO LOOP BELOW
2898DP1, ISZ DP11 /BUMP THE LINE POINTER
2899 TAD I DP11 /GET A CHAR FROM THE LINE
2900 JMS DECCK /CHECK FOR PROPER ASCII DECIMAL
2901 JMP DP5 /NOT PROPER ASCII DECIMAL
2902 ISZ DP13 /FLAG NUMBER INPUT
2903 TAD (-"0 /MAKE BINARY
2904 DCA DP12 /AND STORE
2905 TAD BININP /GET PREVIOUS INPUT
2906 JMS MUL10 /AND MULTIPLY TIMES 10
2907 SZL /SKIP IF NO OVERFLOW ENCOUNTERED
2908 JMP DP6 /GOT AN OVERFLOW ERROR
2909 TAD DP12 /COMBINE WITH CURRENT INPUT
2910 SZL /SKIP IF NO OVERFLOW ERROR
2911 JMP DP6 /GOT AN OVERFLOW ERROR
2912 DCA BININP /RETURN ACCUMULATED SUM
2913 JMP DP1 /LOOP
2914
2915DP5, CLA CLL /AC MAY NOT BE CLEAR
2916 TAD DP13 /ANY NUMBERS INPUT YET?
2917 SNA CLA /SKIP IF YES
2918 JMP DP6 /TAKE THE NO NUMBER INPUT RETURN
2919 ISZ DECPRS /BUMP THE RETURN
2920 ISZ DECPRS /TWICE FOR GOOD NUMBER INPUT RETURN
2921 TAD DP11 /GET POINTER TO LINE
2922 JMP I DECPRS /AND RETURN
2923
2924DP6, CLA CLL /AC MAY NOT BE CLEAR
2925 TAD DP10 /GET ORIGINAL LINE POINTER
2926 ISZ DECPRS /BUMP THE RETURN
2927 JMP I DECPRS /TAKE THE INVALID NUMBER RETURN
2928
2929 >
2930\f IFZERO 1 <
2931
2932DP10, 0 /TEMP FOR DECPRS
2933DP11, 0 /TEMP FOR DECPRS
2934DP12, 0 /TEMP FOR DECPRS
2935DP13, 0 /TEMP FOR DECPRS
2936
2937/ ROUTINE TO MULTIPLY THE VALUE OF THE AC TIMES 10.
2938/ VALUE IN THE AC IS ASSUMED BINARY.
2939
2940/ THE NUMBER IS RETURNED IN THE AC. IF THE LINK IS SET THE MULTIPLY
2941/ OVERFLOWED 12 BITS.
2942
2943MUL10, 0
2944 DCA MULTMP /SAVE THE NUMBER
2945 TAD MULTMP /GET THE NUMBER BACK
2946 CLL RTL /MULTIPLY TIMES 4
2947 TAD MULTMP /TIMES 5
2948 SNL /SKIP IF ALREADY OVERFLOWED /025 CJL
2949 RAL /TIMES 10
2950 JMP I MUL10 /RETURN NUMBER IN AC
2951 /THE LINK HAS ANY OVERFLOW
2952
2953MULTMP, 0 /TEMP STORAGE FOR MUL10 ROUTINE
2954
2955
2956
2957/ ROUTINE TO CHECK FOR A VALID ASCII DECIMAL VALUE.
2958
2959/ ENTER WITH ASCII CHAR IN THE AC.
2960/ EXIT RETURN + 1 IF NON-VALID ASCII DECIMAL WITH CHAR IN AC.
2961/ EXIT RETURN + 2 IF VALID ASCII DECIMAL WITH CHAR IN AC.
2962
2963DECCK, 0
2964 DCA DECCK5 /STORE THE CHAR TO CHECK
2965 TAD DECCK5 /GET THE CHAR
2966 TAD (-"0 /CHECK FOR LESS THAN 0
2967 SPA /SKIP IF NOT LESS THAN 0
2968 JMP DECCK1 /NON-ASCII DECIMAL
2969 TAD ("0-"9-1 /CHECK GREATER THAN 9
2970 SMA CLA /SKIP IF LE 9
2971 JMP DECCK1 /INVALID ASCII DECIMAL
2972 ISZ DECCK /BUMP RETURN FOR VALID ASCII DECIMAL
2973DECCK1, TAD DECCK5 /RE-GET ORIGINAL CHAR IN AC
2974 JMP I DECCK /RETURN
2975
2976
2977DECCK5, 0 /TEMP FOR "DECCK" ROUTINE
2978
2979 >
2980\f/ ROUTINE TO INPUT A COMMAND LINE FROM THE KEYBOARD. /013/014 CJL
2981
2982LININP, 0
2983 TAD (LINBUF /GET ADDRESS OF LINE BUFFER
2984 DCA LIN50 /STORE IN A POINTER
2985LIN1, JMS I (INPUT) /GET A CHARACTER FROM THE KEYBOARD /044 CJL
2986 TAD (-CNTRLM) /COMPARE TO <CR> /034 CJL
2987 SNA /SKIP IF NOT A RETURN
2988 JMP LIN2 /LINE IS INPUT
2989 TAD (-DELETE+CNTRLM)/COMPARE TO <DEL> /034 CJL
2990 SNA CLA /SKIP IF NOT A DELETE
2991 JMP LIN5 /OFF TO HANDLE A DELETE
2992 TAD LIN50 /GET VALUE OF LINE POINTER
2993 TAD (-LINBUF-LINSIZ /COMPARE WITH END OF LINE BUFFER
2994 SMA CLA /SKIP IF ROOM IN LINE BUFFER
2995 JMP LIN10 /BEEP FOR FULL BUFFER
2996 TAD INCHAR /GET THE KEYBOARD CHARACTER AGAIN /044 CJL
2997 TAD (-140) /COMPARE TO LOWER-CASE LIMIT /034 CJL
2998 SMA /SKIP IF BELOW LIMIT /034 CJL
2999 TAD [-40] /ELSE MAKE IT UPPER-CASE /034 CJL
3000 TAD (140) /RESTORE THE CHARACTER /034 CJL
3001 DCA I LIN50 /STORE IN THE LINE BUFFER
3002 ISZ LIN50 /BUMP THE LINE BUFFER POINTER
3003 NL7777 /SET -1 /032 CJL
3004 DCA I LIN50 /TERMINATE THE LINE
3005 TAD INCHAR /GET THE LATEST KEYBOARD CHARACTER BACK /044 CJL
3006 JMS I [P7ECHO] /PRINT IT /043 CJL
3007 JMP LIN1 /LOOP TILL A RETURN TYPED
3008
3009LIN2, NL7777 /SET -1 /032 CJL
3010 DCA I LIN50 /INSURE STRING TERMINATED
3011 JMS I [SCRIBE] /DO A /025 CJL
3012 CRLF /<CR>, <LF> /025 CJL
3013 JMP I LININP /DONE
3014
3015/ HANDLE A DELETE TYPED IN
3016
3017LIN5, TAD LIN50 /FIND OUT FIRST IF...
3018 TAD (-LINBUF /WE ARE AT THE BEGINNING OF THE LINE
3019 SNA CLA /SKIP IF NO
3020 JMP LIN1 /JUST IGNORE THE DELETE
3021 NL7777 /SET -1 /032 CJL
3022 TAD LIN50 /GET THE LINE POINTER
3023 DCA LIN50 /RETURN BACKED UP
3024 DCA I LIN50 /ZERO THE CHAR
3025 TAD (CNTRLH) /GET A <BS> /025 CJL
3026 JMS I [P7ECHO] /PRINT IT /043 CJL
3027 TAD [" &177] /GET A <SPACE> /025 CJL
3028 JMS I [P7ECHO] /PRINT IT /043 CJL
3029 TAD (CNTRLH) /GET A <BS> /025 CJL
3030 JMS I [P7ECHO] /PRINT IT /043 CJL
3031 JMP LIN1 /BACK TO INPUT
3032\f/ HANDLE FULL LINE BUFFER HERE
3033
3034LIN10, CLA CLL /ENSURE CLEAR AC
3035 TAD [CNTRLG] /GET A <BEL> CHARACTER /025 CJL
3036 JMS I [P7ECHO] /PRINT IT /043 CJL
3037 JMP LIN1 /WAIT FOR EITHER RETURN OF DELETE KEY
3038
3039LIN50, 0 /TEMP POINTER FOR "LININP" ROUTINE
3040\f/ ROUTINE TO PACK TWO SIX-BIT CHARACTERS INTO A WORD. /032 CJL
3041
3042/ CALLING SEQUENCE:
3043
3044/ [PACK6PTR => CHARACTER PACKING AREA].
3045/ [PACK6FLAG=0 IF PACKING INTO HIGH-ORDER BYTE.
3046/ PACK6FLAG=4000 IF PACKING INTO LOW-ORDER BYTE].
3047
3048/ TAD CHAR /AC CONTAINS CHARACTER TO BE PACKED
3049/ PACK6 /CALL VIA PAGE ZERO POINTER
3050
3051/ RETURNS WITH AC CLEAR AND PACK6PTR AND PACK6FLAG UPDATED FOR NEXT PACKING.
3052
3053PACK60, .-. /PACK SIX-BIT ROUTINE
3054 AND [77] /JUST SIX-BIT
3055 DCA PACK6TEMP /SAVE FOR NOW
3056 NL4000 /SET INVERSION BIT
3057 TAD PACK6FLAG /REVERSE THE FLAG
3058 DCA PACK6FLAG /STORE BACK
3059 SZL /WAS IT CLEAR?
3060 JMP PACKIT /NO, GO DO LOW-ORDER
3061 TAD PACK6TEMP /GET THE CHARACTER
3062 RTL;RTL;RTL /MOVE UP
3063 DCA I PACK6PTR /STORE IT
3064 JMP I PACK60 /RETURN
3065
3066PACKIT, TAD I PACK6PTR /GET PREVIOUS HIGH-ORDER HALFWORD
3067 TAD PACK6TEMP /ADD ON LATEST
3068 DCA I PACK6PTR /STORE BOTH
3069 ISZ PACK6PTR /BUMP FOR NEXT TIME
3070 JMP I PACK60 /RETURN
3071
3072PACK6TE,.-. /PACK6 TEMPORARY
3073\f/ ROUTINE TO COMPARE TWO FILE NAMES FOR EQUALITY.
3074/ THE ROUTINE WILL CHECK EACH OF THE 8 FILE NAME CHARS AND IF A
3075/ CHAR IN THE FIRST FILE NAME (THE ONE WE ARE LOOKING FOR) CONTAINS
3076/ A "?" IT WILL MATCH ON THE SECOND FILE NAME CHAR.
3077/ ENTER WITH "FCMP1" POINTING TO THE FILE NAME TO FIND, AND "FCMP2"
3078/ POINTING TO THE FILE NAME TO TRY AND MATCH. EXIT + 1 IF NO MATCH
3079/ AND EXIT + 2 IF MATCH. (IF NON-ZERO AC ON ENTRY, THE AC IS ASSUMED
3080/ TO HAVE THE VALUE FOR "FCMP2".)
3081
3082FMATCH, 0
3083 SZA /SKIP IF NO ARGUMENT IN AC
3084 DCA FCMP2 /THIS ARGUMENT CAME IN THE AC
3085 TAD FCMP1 /GET ADDRESS OF FIRST FILE NAME BLOCK
3086 DCA GET6P /STORE IN A POINTER
3087 DCA GET6F /INIT FLAG FOR "GET6" ROUTINE
3088 TAD FCMP2 /GET ADDRESS OF SECOND FILE NAME BLOCK
3089 DCA FMATP /STORE IN A LOCAL POINTER
3090 DCA FMATF /INIT LOCAL FLAG
3091 TAD (-10 /8 CHARS TO DO
3092 DCA FMATC /STORE IN LOCAL COUNTER
3093
3094FMAT1, NL4000 /SET 4000 /032 CJL
3095 TAD FMATF /GET FLAG
3096 DCA FMATF /RETURN FLAG, LINK CONTAINS STATUS
3097 TAD I FMATP /GET A WORD FROM THE SECOND NAME
3098 SZL /SKIP IF HIGH-ORDER WANTED NOW /032 CJL
3099 JMP FSWIT /JUMP IF LOW-ORDER WANTED NOW /032 CJL
3100 RTR;RTR;RTR /MOVE DOWN HIGH-ORDER /032 CJL
3101 SKP /DON'T BUMP YET /032 CJL
3102FSWIT, ISZ FMATP /BUMP THE POINTER /032 CJL
3103 AND [77] /KEEP ONLY BOTTOM 6 BITS /016 CJL
3104 DCA FMATT /STORE IN A TEMP
3105 GET6 /NOW GET A CHAR FROM FIRST NAME
3106 TAD (-77 /CHECK IF WILD
3107 SNA /SKIP IF NO
3108 JMP FMAT2 /NO MATCH CHECK ON A WILD CARD
3109 TAD [77] /RESTORE THE CHARACTER /014/016 CJL
3110 CIA /NEGATE FOR COMPARE
3111 TAD FMATT /COMPARE WITH SECOND FILE NAME
3112 SZA CLA /SKIP IF IS A MATCH
3113 JMP I FMATCH /THIS IS NOT A MATCH
3114
3115FMAT2, ISZ FMATC /BUMP COUNTER
3116 JMP FMAT1 /LOOP, MORE TO CHECK
3117 ISZ FMATCH /BUMP RETURN FOR MATCH
3118 JMP I FMATCH /GOT A MATCH
3119
3120FMATP, 0 /POINTER FOR "FMATCH"
3121FMATC, 0 /COUNTER FOR "FMATCH"
3122FMATF, 0 /FLAG FOR "FMATCH"
3123FMATT, 0 /TEMP FOR "FMATCH"
3124FCMP1, 0 /POINTER FOR FIRST FILE NAME BLOCK
3125FCMP2, 0 /POINTER FOR SECOND FILE NAME BLOCK
3126\f PAGE /014 CJL
3127\f/ REMOTE LINK INPUT ROUTINE.
3128/ CALL = RPACK.
3129
3130ILINK, 0
3131 TAD RETRY /SET UP A RE-TRY COUNT
3132 DCA ILINK6 /RE-TRY COUNT FOR INPUT ERRORS
3133
3134ILINK0, JMS I (GETSOH) /FIRST GET THE "SOH" BYTE
3135 JMP ILINK2 /RETURN HERE ON TIME-OUT
3136 DCA ILINK9 /INIT CHECKSUM REGISTER
3137 TAD [RRLEN] /GET REMOTE RECEIVE BUFFER ADDRESS
3138 DCA ILINK8 /STORE IN LOCAL POINTER
3139 JMS I (GETIR) /GET A CHAR
3140 JMP ILINK2 /GOT A RETURN OR TIME-OUT
3141 DCA I ILINK8 /STORE LENGTH IN BUFFER
3142 TAD I ILINK8 /GET LENGTH CHAR BACK
3143 TAD (-40-1 /CHAR FUNCTION - LENGTH BYTE
3144 CIA /NEGATE FOR COUNTER
3145 DCA ILINK7 /STORE IN LOCAL COUNTER
3146
3147ILINK1, ISZ ILINK8 /BUMP POINTER
3148 JMS I (GETIR) /GET NEXT CHAR
3149 JMP ILINK2 /GOT A RETURN
3150 DCA I ILINK8 /STORE IN BUFFER
3151 ISZ ILINK7 /BUMP COUNTER
3152 JMP ILINK1 /LOOP
3153
3154 ISZ ILINK8
3155 NL7777 /SET -1 /032 CJL
3156 DCA I ILINK8
3157 TAD ILINK9 /GET CALCULATED CHECKSUM
3158 JMS I [CKSUM] /CALCULATE 1 BYTE CHECKSUM
3159 CIA /NEGATE FOR COMPARE
3160 DCA ILINK7 /STORE TEMP
3161 JMS I (GETIR) /NOW GET CHECKSUM
3162 JMP ILINK2 /GOT A RETURN
3163 TAD ILINK7 /COMPARE WITH CALCULATED CHECKSUM
3164 SNA CLA /SKIP IF NOT SAME
3165 JMP ILINK4 /ARE SAME
3166
3167ILINK2, CLA CLL /INSURE CLEAR AC
3168 ISZ ILINK6 /BUMP RE-TRY COUNTER
3169 JMP ILINK3 /CAN RE-TRY
3170 TAD (RPERMSG) /GET MESSAGE FOR FATAL PACKET ERROR /025 CJL
3171 JMP I [CLOOP7] /AND ABORT THE MESS
3172
3173ILINK3, TAD ABFLAG /GET ABORT FLAG /044 CJL
3174 SZA CLA /SKIP IF NO
3175 JMP I (ABORT) /ABORT THIS
3176 JMS I (SNDNAK) /SEND BACK A "NAK"
3177 JMP ILINK0 /AND TRY AGAIN
3178\fILINK4, TAD ABFLAG /GET ABORT FLAG /044 CJL
3179 SNA CLA /SKIP IF YES
3180 JMP I ILINK /NOPE, RETURN
3181 JMP I (ABORT)
3182
3183ILINK6, 0 /LOCAL TO "ILINK"
3184ILINK7, 0 /LOCAL TO "ILINK"
3185ILINK8, 0 /LOCAL TO "ILINK"
3186ILINK9, 0 /LOCAL TO "ILINK"
3187
3188/ HELP COMMAND ROUTINE. /024 CJL
3189
3190HELPSRV,.-. /HELP ROUTINE
3191 JMS I [CRESET] /RESET CONSOLE ROUTINE STUFF
3192 JMS I [SCRIBE] /GIVE THEM THE
3193 HELPMSG /HELP MESSAGE
3194 TAD ESCHAR /GET THE ESCAPE CHARACTER
3195 JMS I [ESCPRNT] /PRINT IT
3196 JMS I [SCRIBE] /DO A
3197 CRLF /<CR>, <LF>
3198 ISZ HELPSRV /BUMP PAST ERROR RETURN
3199 JMP I HELPSRV /RETURN
3200
3201/ ROUTINE TO PRINT THE DATA IN THE RECEIVED PACKET.
3202
3203PRIPAK, 0
3204 PRI8B; RRDTA /PRINT THE DATA
3205 JMS I [SCRIBE] /DO A /025 CJL
3206 CRLF /<CR>, <LF> /025 CJL
3207 JMP I PRIPAK /DONE
3208
3209 PAGE /014 CJL
3210\f/ ROUTINE TO SERVICE A SEND REQUEST.
3211
3212SNDSRV, 0
3213 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
3214 TAD (MSEND) /FIRST SET MODE TO SEND
3215 DCA KMODE /PUT INTO MODE FLAG
3216 TAD LPTR /GET CURRENT LINE POINTER
3217 DCA PRSERR /SAVE LINE POSITION
3218 TAD PRSERR /GET LINE POSITION
3219 JMS I [DPARS] /TRY TO PARSE OFF A DEVICE NAME
3220 JMS SNDERROR /RETURN A DEVICE NAME ERROR /026 CJL
3221SER1, DCA PRSERR /SAVE LINE POINTER /026 CJL
3222 TAD (FNBLK /GET FILE NAME BLOCK ADDRESS
3223 DCA FNPTR /STORE IN POINTER
3224 TAD PRSERR /GET STRING POINTER
3225 JMS I [PFNAM] /PARSE OFF THE FILE NAME
3226 JMS SNDERROR /FILE NAME PARSE ERROR /026 CJL
3227SER2, DCA PRSERR /SAVE THE STRING POINTER /026 CJL
3228 TAD PRSERR /GET THE STRING POINTER
3229 JMS I [NOSP] /FIND THE END OF STRING
3230 SKP /GOT END OF STRING HERE
3231 JMS SNDERROR /SYNTAX ERROR /026 CJL
3232SER3, DCA PRSERR /RETURN POINTER /026 CJL
3233 TAD DEVNUM /GET THE DEVICE NUMBER PARSED
3234 JMS I [HFETCH] /FETCH A HANDLER FOR THIS
3235 JMS SNDERROR /HANDLER FETCH ERROR /026 CJL
3236SER4, DCA FILFND /INIT FILE FOUND FLAG
3237 DCA INIFLG /CLEAR THE INIT DONE FLAG
3238 NL0001 /INITIALIZE DIRECTORY /028 CJL
3239 DCA SLFLAG /LOOKUP FLAG /028 CJL
3240SNDSV1, TAD (FNBLK /GET FILE NAME BLOCK ADDRESS
3241 DCA I (FCMP1) /SET FOR FILE TO FINE
3242 TAD SLFLAG /GET DIRECTORY FLAG /028 CJL
3243 JMS I (LUKUP) /FIND A MATCH FOR THIS FILE
3244 JMS SNDERROR /DIRECTORY I/O ERROR /026 CJL
3245SER5, JMP S00 /FILE NOT FOUND /026 CJL
3246 ISZ FILFND /BUMP FILE FOUND COUNT
3247 DCA SLFLAG /DON'T INITIALIZE LOOKUP AGAIN
3248 JMS I (SNDPRO) /PROCESS THIS FILE FOR SEND
3249 JMS SNDERROR /ERROR IN FILE SEND PROCESS /026 CJL
3250SER6, TAD WILDF /WAS WILD CARD FILE SPEC? /026 CJL
3251 SZA CLA /SKIP IF NO
3252 JMP SNDSV1 /GOT WILD CARD, TRY FOR NEXT
3253S00, TAD FILFND /CHECK FOR ANY FILES FOUND
3254 SNA CLA /SKIP IF YES
3255 JMS SNDERROR /RETURN FILE NOT FOUND ERROR /026 CJL
3256SER7, JMS BRKXMT /BREAK THE SEND /026 CJL
3257 TAD PRSERR /GET CURRENT CURSOR POSITION
3258 DCA LPTR /UPDATE
3259 ISZ SNDSRV /BUMP RETURN
3260 JMP I SNDSRV /AND DONE
3261\f/ SEND ERRORS COME HERE. /026 CJL
3262
3263SNDERRO,.-. /SEND ERROR ROUTINE
3264 CLA /CLEAN UP
3265 TAD SNDERROR /GET CALLER
3266 JMS I [SRCHTABLE] /GO MATCH IT
3267 SNERTABLE-1-1 /IN ERROR TABLE
3268 JMP I SNDSRV /TAKE ERROR EXIT WITH MESSAGE ADDRESS IN AC
3269
3270/ SEND ERROR MESSAGE DISPATCH TABLE. /026 CJL
3271
3272SNERTAB,-SER1; DNERMSG /DEVICE NAME ERROR
3273 -SER2; FNERMSG /FILE NAME ERROR
3274 -SER3; FSERMSG /FILE NAME SYNTAX ERROR
3275 -SER4; SHFEMSG /HANDLER FETCH ERROR
3276 -SER5; SDERMSG /DIRECTORY I/O ERROR
3277 -SER6; SNDEMSG /SEND ERROR
3278 -SER7; NOTFND /LOOKUP
3279 0 /THIS ENDS THE LIST
3280
3281FILFND, 0 /HOLDS COUNT OF # OF FILES FOUND
3282SLFLAG, .-. /LOOKUP INITIALIZE FLAG /028 CJL
3283FNBLK, 0
3284 0
3285 0
3286 0
3287\f/ ROUTINE TO RE-SET THE SEND.
3288
3289BRKXMT, .-.
3290 CLA CLL /INSURE CLEAR AC
3291 DCA INIFLG /CLEAR THE INIT SEND FLAG
3292 FPACK /FORMAT A PACKET
3293 NODATA /NO DATA FOR THIS PACKET
3294 STEOT /"EOT" PACKET TYPE
3295 SPACK /SEND THE PACKET
3296 1 /READ RESPONSE /042 CJL
3297 0 /DO NOT DISPATCH /042 CJL
3298 JMP I BRKXMT /DONE
3299
3300/ ROUTINE TO SEND OUT A NAK WITHOUT DISTURBING THE NORMAL PACKET BUFFER.
3301
3302SNDNAK, 0
3303 NL7777 /-1 /042 CJL
3304 TAD CURSEQ /ADD ON CURRENT SEQUENCE NUMBER /042 CJL
3305 AND [77] /MODULO 64 /042 CJL
3306 TAD [40] /TAKE CHAR(SEQUENCE NUMBER) /042 CJL
3307 DCA NAKPAK+2 /PUT IN NAK PACKET BUFFER
3308 TAD NAKPAK+1 /GET LENGTH
3309 TAD NAKPAK+2 /GET SEQ
3310 TAD NAKPAK+3 /GET TYPE
3311 JMS I [CKSUM] /CALCULATE CHECKSUM
3312 DCA NAKPAK+4 /PUT IN CHECKSUM
3313 TAD REOL /GET ANY EOL REQUIRED
3314 TAD [-40] /UN-CHAR IT /014/016 CJL
3315 SNA /SKIP IF USING
3316 NL7777 /NO EOL, PUT IN -1 INSTEAD /032 CJL
3317 DCA NAKPAK+5 /PUT EOL IN
3318 REM8B; NAKPAK /SEND NAK TO REMOTE
3319 JMP I SNDNAK /DONE
3320
3321
3322NAKPAK, CNTRLA /MARK /042 CJL
3323 " &77+3 /LENGTH OF NAK PACKET /042 CJL
3324 .-. /SEQUENCE NUMBER GOES HERE /042 CJL
3325 STNAK /DATA TYPE
3326 .-. /CHECKSUM /042 CJL
3327 .-. /<EOL> IF USED /042 CJL
3328 -1 /TERMINATE
3329
3330/ FILENAME BUFFER. /014 CJL
3331
3332NAMBUFF,ZBLOCK 12 /FILENAME.EXTENSION (WITH TERMINATOR) GOES HERE
3333\f PAGE /014 CJL
3334\f/ ROUTINE TO SERVICE A "GET" COMMAND.
3335
3336GETSRV, 0
3337 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
3338 TAD (MREC) /GET OUR MODE VALUE /045 CJL
3339 DCA KMODE /SETUP NOW /045 CJL
3340 TAD LPTR /GET CURRENT LINE POINTER
3341 DCA PRSERR /SAVE
3342 TAD PRSERR /RE-GET IT
3343 JMS I [DPARS] /PARSE OFF THE DEVICE NAME /006/014 CJL
3344 JMP GSRV50 /ERROR IN DEVICE NAME /006
3345 JMS I [NOSP] /FIND BEGINNING OF A FILE NAME
3346 JMP GSRV22 /GOT <EOL>, NO FILE NAME /006/014 CJL
3347 DCA GSRV90 /STORE BEGINNING ADDRESS
3348 TAD GSRV90 /NOW WE LOOK FOR
3349 JMS I [SP] /THE END OF THE LINE
3350 SKP /GOT THE END OF THE LINE HERE
3351 JMP .-2 /NOT END YET, CONTINUE
3352 DCA PRSERR /STORE POINTER TO EOL
3353 NL7777 /SET -1 /032 CJL
3354 DCA I PRSERR /TERMINATE FILE NAME WITH -1
3355 DCA CURSEQ /RE-SET THE SEQUENCE
3356 TAD GSRV90 /GET ADDRESS OF FILE NAME
3357
3358GSRV10, FPACK /FORMAT THE PACKET
3359GSRV90, 0 /DATA ADDRESS HERE
3360 STRIN /RECIEVE INIT PACKET
3361
3362GSRV12, SPACK /SEND THE PACKET
3363 1 /GET RESPONSE
3364 GSRV80-2 /DISPATCH TABLE /027 CJL
3365
3366/ SERVICE A NAK OR UNDEFINED.
3367
3368GSRV15, ISZ RTRYC /BUMP THE RE-TRY COUNTER
3369 JMP GSRV12 /TRY AGAIN
3370 JMP I GETSRV /GIVE UP
3371
3372/ SERVICE A SEND/INIT FROM THE REMOTE.
3373
3374GSRV20, JMS I (INPSRV) /HANDLE JUST LIKE A RECEIVE
3375 JMP GSRV21 /ERROR RETURN FROM "INPSRV"
3376 ISZ GETSRV /BUMP RETURN FOR NO ERROR
3377 TAD PRSERR /UPDATE THE CURRENT LINE POINTER
3378 DCA LPTR
3379GSRV21, JMP I GETSRV
3380
3381GSRV22, CLA CLL /MAKE SURE WE ARE CLEAR /009/014 CJL
3382 TAD [NOTFND] /GET ERROR MESSAGE ADDRESS /025 CJL
3383 JMP I GETSRV /TAKE ERROR RETURN /009/014 CJL
3384
3385/ GOT AN ERROR PACKET, DISPLAY ERROR AND ABORT.
3386
3387GSRV40, JMS I [PRIPAK] /PRINT OUT THE ERROR PACKET
3388 JMP I GETSRV /TAKE THE ERROR EXIT
3389\f/ GOT DEVICE ERROR. /006/014 CJL
3390
3391GSRV50, CLA CLL /ENSURE CLEAR AC /006/014 CJL
3392 TAD (DNERMSG) /GET ERROR MESSAGE ADDRESS /025 CJL
3393 JMP I GETSRV /TAKE ERROR RETURN /006/014 CJL
3394
3395/ DISPATCH TABLE.
3396
3397GSRV80, STERR; GSRV40 /ERROR PACKET RETURNED
3398 STSIN; GSRV20 /SEND INIT PACKET RETURNED
3399 STNAK; GSRV15 /NAK PACKET RETURNED
3400 0 /TERMINATE TABLE
3401\f/ ROUTINE TO SERVICE A "RECEIVE" COMMAND.
3402
3403RECSRV, 0
3404 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
3405 TAD (MREC) /GET OUR MODE VALUE /045 CJL
3406 DCA KMODE /SETUP NOW /045 CJL
3407 TAD LPTR /GET CURRENT LINE POINTER
3408 DCA PRSERR /SAVE IT
3409 TAD PRSERR /GET IT BACK
3410 JMS I [DPARS] /PARSE OFF DEVICE NAME /018 CJL
3411 JMP RECS30 /ERROR IN DEVICE NAME /018 CJL
3412 JMS I [NOSP] /CHECK IF BEGINNING OF FILE NAME /014 CJL
3413 SKP /GOT <EOL> HERE /018 CJL
3414 JMP RECS60 /SOMETHING ELSE ON LINE, ERROR /014 CJL
3415 DCA PRSERR /SAVE CURRENT LINE POINTER /018 CJL
3416 RPACK /GET SEND/INIT PACKET FROM REMOTE
3417 JMS I (DISPATCH) /DISPATCH BASED ON RRTYP /031 CJL
3418 RECS80-2 /TABLE ADDRESS /027/031 CJL
3419 JMP RECS60 /DON'T KNOW WHAT IT IS
3420
3421/ GOT A SEND INIT PACKET.
3422
3423RECS10, JMS I (INPSRV) /OFF TO HANDLE INPUT
3424 JMP RECS60 /ERROR RETURN
3425
3426/ TAKE THE NON-ERROR RETURN.
3427
3428RECS20, ISZ RECSRV /BUMP FOR NON-ERROR RETURN
3429 TAD PRSERR /GET CURRENT CURSOR POSITION /018 CJL
3430 DCA LPTR /UPDATE IT /018 CJL
3431 JMP I RECSRV
3432
3433/ GOT ERROR IN DEVICE NAME. /018 CJL
3434
3435RECS30, CLA CLL /CLEAN UP /018 CJL
3436 TAD (DNERMSG) /GET ERROR MESSAGE ADDRESS /025 CJL
3437 JMP I RECSRV /TAKE ERROR RETURN /018 CJL
3438
3439/ TAKE THE ERROR RETURN.
3440
3441RECS60, CLA
3442 JMP I RECSRV /TAKE ERROR EXIT
3443
3444/ DISPATCH TABLE.
3445
3446RECS80, STSIN; RECS10 /SEND INIT PACKET DISPATCH
3447 STEOT; RECS60 /END OF CONNECTION
3448 STBRK; RECS20 /BREAK TRANSMISSION
3449 0
3450
3451RECS90, 0 /TEMP FOR "RECSRV"
3452\f/ KEYBOARD LINE BUFFER. /014 CJL
3453
3454LINBUF, ZBLOCK LINSIZE /LINE BUFFER
3455
3456 PAGE /014 CJL
3457\f/ ROUTINE TO SERVICE INPUT OF A FILE.
3458
3459INPSRV, 0
3460 JMS I (SETINI) /SET UP INIT REGISTERS
3461 DCA OFFLG /INITIALIZE OUTPUT FILE FLAG /036 CJL
3462 CIF USRFLD /GOTO USR FIELD /037 CJL
3463 JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /037 CJL
3464 RESET /RESET TABLES /037 CJL
3465 DCA CURSEQ /RE-SET THE SEQUENCE NUMBER
3466
3467 FPACK /FORMAT A PACKET
3468 INIDAT /PACKET DATA ADDRESS
3469 STACK /"ACK" PACKET TYPE
3470
3471
3472INPS01, SPACK /SEND A PACKET
3473 1 /AWAIT RESPONSE
3474 INPS91-2 /DISPATCH TABLE ADDRESS /027 CJL
3475
3476/ NAK OR UNDEFINED RESPONSE HERE.
3477
3478INPS02, ISZ RTRYC /GOT A NAK, CHECK RE-TRY COUNT
3479 JMP INPS01 /RE-TRY THE INIT
3480 JMS INPERROR /GIVE UP /025 CJL
3481
3482 IER02= . /ERROR TABLE ADDRESS /039 CJL
3483
3484INPS03, FPACK /FORMAT A PACKET
3485 NODATA /NO DATA
3486 STACK /"ACK" PACKET TYPE
3487
3488INPS05, SPACK /SEND A PACKET
3489 1 /AWAIT RESPONSE
3490 INPS90-2 /DISPATCH TABLE ADDRESS /027 CJL
3491 JMS INPERROR /UNDEFINED RESPONSE /025 CJL
3492
3493 IER05= . /ERROR TABLE ADDRESS /039 CJL
3494
3495/ GOT A DATA PACKET, WRITE TO OUTPUT FILE.
3496
3497INPS10, TAD OFFLG /CHECK THE OUTPUT FILE FLAG
3498 SNA CLA /SKIP IF OUTPUT FILE OPEN
3499 JMS INPERROR /ABORT AND EXIT /025 CJL
3500IER10, JMS I (WRIPAK) /WRITE THE PACKET TO THE FILE /039 CJL
3501 JMS INPERROR /ERROR WRITING PACKET /025 CJL
3502IER11, JMP INPS03 /LOOP /039 CJL
3503\f/ GOT A FILE HEADER PACKET, OPEN FILE.
3504
3505INPS20, TAD OFFLG /CHECK IF OUTPUT FILE OPEN
3506 SZA CLA /SKIP IF NO
3507 JMS INPERROR /ABORT IF FILE ALREADY OPEN /025 CJL
3508IER20, TAD I [RRLEN] /GET CURRENT PACKET LENGTH /039 CJL
3509 TAD (-40-3 /CALCULATE LENGTH OF DATA
3510 SPA /SKIP IF DATA IN THE PACKET
3511 JMS INPERROR /ELSE AN ERROR /025 CJL
3512IER21, TAD (RRDTA) /CALCULATE LAST BYTE IN DATA /039 CJL
3513 DCA INPS81 /STORE IN POINTER
3514 NL7777 /SET -1 /032 CJL
3515 DCA I INPS81 /TERMINATE NAME WITH A MINUS WORD
3516 TAD (FNBLK /GET ADDRESS OF FILE NAME BLOCK
3517 DCA FNPTR /SAVE FOR NAME PARSE
3518 TAD (RRDTA /GET ADDRESS OF DATA IN PACKET
3519 JMS I [PFNAM] /PARSE OFF THE FILE NAME
3520 JMS INPERROR /ERROR IN FILE NAME /025 CJL
3521
3522/ GET TARGET DEVICE.
3523
3524IER23, CLA CLL /CLEAR AC FROM FILE NAME PARSE /039 CJL
3525 TAD DEVNUM /GET DEVICE NUMBER PARSED /006
3526 DCA ODNUMB /SAVE OUTPUT DEVICE NUMBER
3527 TAD ODNUMB /GET NUMBER BACK
3528 JMS I [HFETCH] /FETCH HANDLER FOR THIS DEVICE
3529 JMS INPERROR /HANDLER FETCH ERROR /025 CJL
3530IER24, TAD (FNBLK) /GET ADDRESS OF FILE NAME BLOCK /039 CJL
3531 DCA INPS22 /PUT IN CALL
3532 TAD ODNUMB /GET DEVICE NUMBER
3533 CIF USRFLD /GOTO USR FIELD /020 CJL
3534 JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
3535 ENTER /ENTER TENTATIVE FILE /020 CJL
3536INPS22, 0 /
3537 0 /
3538 JMS INPERROR /NO DIRECTORY ROOM /025 CJL
3539IER22, TAD INPS22 /GET NEW FILE START BLOCK /039 CJL
3540 DCA FSBLK /SAVE
3541 TAD INPS22+1 /GET INDICATED MAXIMUM FILE SIZE /021 CJL
3542 IAC /GIVE ONE MORE THAN 2 LESS /021 CJL
3543 DCA FLEN /SAVE AS DANGER COUNT /021 CJL
3544 ISZ OFFLG /SET FLAG FOR OUTPUT FILE OPEN
3545 NL7777 /INDICATE INITIALIZATION /020 CJL
3546 JMS I [PUTBYTE] /INITIALIZE OUTPUT FILE ROUTINE /020 CJL
3547 HLT /THIS CAN'T HAPPEN! /020 CJL
3548 TAD FNPTR /GET POINTER TO 6 BIT FILE NAME
3549 JMS I [FILN8] /MAKE 8 BIT FORMATTED STRING
3550 JMS I [SCRIBE] /TELL THEM
3551 FRECMSG /WE ARE RECEIVING
3552 PRI8B; NAMBUF /WHICH FILE WE ARE RECEIVING
3553 JMS I [SCRIBE] /DO A
3554 CRLF /<CR>, <LF>
3555 JMP INPS03 /LOOP
3556\f/ GOT AN END OF FILE PACKET.
3557
3558INPS30, TAD OFFLG /ANY OUTPUT FILE OPEN?
3559 SNA CLA /SKIP IF YES
3560 JMS INPERROR /ERROR /025 CJL
3561IER30, JMS I [FILCLOSE] /CLOSE THE FILE /020/039 CJL
3562 JMS INPERROR /ERROR CLOSING THE FILE /025 CJL
3563IER31,/ DCA OFFLG /RE-SET FILE OPEN FLAG /D009/039 CJL
3564 JMP INPS03 /CONTINUE
3565
3566/ GOT AN END OF TRANSMISSION PACKET.
3567
3568INPS40, TAD OFFLG /WAS A FILE OPEN?
3569 SZA CLA /SKIP IF NO
3570 JMS I [FILCLOSE] /CLOSE ANY OPEN FILE /020 CJL
3571 NOP /ERROR CLOSING THE FILE **** FIX THIS ****
3572 FPACK /FORMAT A PACKET
3573 NODATA /NO DATA IN PACKET
3574 STACK /"ACK" PACKET TYPE
3575
3576 SPACK /SEND THE PACKET
3577 0 /NO RESPONSE
3578 ISZ INPSRV /BUMP RETURN FOR NO ERROR
3579 JMP I INPSRV /TAKE NON-ERROR EXIT
3580
3581/ GOT AN ERROR PACKET.
3582
3583INPS50, JMS I [PRIPAK] /PRINT THE PACKET DATA
3584 JMP I INPSRV /AND TAKE THE ERROR EXIT /009/014 CJL
3585
3586/ INPUT ERRORS COME HERE. /025 CJL
3587
3588INPERRO,.-. /INPUT ERROR ROUTINE /025 CJL
3589 FPACK /FORMAT A PACKET /025 CJL
3590 NODATA /NO DATA /025 CJL
3591 STBRK /"BREAK LINK" PACKET TYPE /025 CJL
3592 SPACK /SEND THE PACKET /025 CJL
3593 0 /NO RESPONSE /025 CJL
3594 TAD INPERROR /GET CALLER /025 CJL
3595 JMS I [SRCHTABLE] /TRY TO FIND A MATCH /025 CJL
3596 INERTABLE-1-1 /IN ERROR TABLE /025 CJL
3597 SNA /SKIP IF FOUND PARTICULAR MESSAGE /025 CJL
3598 TAD (RERRMSG) /ELSE USE GENERAL MESSAGE /025 CJL
3599 JMP I INPSRV /TAKE ERROR RETURN /025 CJL
3600
3601/ TEMPS FOR "INPSRV".
3602
3603INPS80, 0
3604INPS81, 0
3605\f PAGE /014 CJL
3606\f/ DISPATCH TABLES FOR "INPSRV".
3607
3608INPS90, STDAT; INPS10 /HANDLE DATA PACKETS
3609 STEOF; INPS30 /HANDLE EOF PACKET
3610 STEOT; INPS40 /HANDLE END OF TRANSMISSION PACKET
3611 STFIL; INPS20 /HANDLE FILE NAME PACKET
3612 STERR; INPS50 /HANDLE ERROR PACKET
3613 0 /TERMINATE TABLE
3614
3615INPS91, STNAK; INPS02 /HANDLE A NAK PACKET
3616 STFIL; INPS20 /HANDLE FILE NAME PACKET
3617 STERR; INPS50 /HANDLE ERROR PACKET
3618 0 /TERMINATE TABLE
3619
3620/ INPUT ERROR MESSAGE DISPATCH TABLE. /025/039 CJL
3621
3622INERTAB,-IER05; UPERMSG /UNDEFINED PACKET ERROR /025 CJL
3623 -IER11; DSFLMSG /DISK OVERFLOW ERROR /042 CJL
3624 -IER22; RIDEMSG /DIRECTORY FULL ERROR /025 CJL
3625 -IER23; RFLNMSG /RECEIVED FILE NAME ERROR /025 CJL
3626 -IER24; RHFEMSG /HANDLER FETCH ERROR /025 CJL
3627 -IER31; FCLEMSG /FILE CLOSE ERROR /025 CJL
3628 0 /THIS ENDS THE LIST /025 CJL
3629\f/ ROUTINE TO CHECK FOR AN ALPHABETIC OR NUMERIC CHAR.
3630/ ENTER WITH THE CHAR IN THE AC.
3631/ EXIT + 2 IF ALPHABETIC OR NUMERIC WITH CHAR IN THE AC.
3632/ EXIT + 1 IF NON-ALPHABETIC OR NUMERIC WITH CHAR IN THE AC.
3633
3634ALPNUM, 0
3635 JMS ALPHA /CHECK FOR ALPHA FIRST
3636 SKP /NON-ALPHA RETURN, MUST CHECK NUMERIC
3637 JMP ALPNM1 /IS ALPHA, TAKE RETURN + 2
3638 JMS NUMRC /CHECK IF NUMERIC
3639 SKP /NOT NUMERIC
3640ALPNM1, ISZ ALPNUM /BUMP RETURN FOR ALPHA-NUMERIC
3641 JMP I ALPNUM /DONE
3642
3643
3644/ ROUTINE TO CHECK FOR AN ALPHABETIC CHARACTER.
3645/ ROUTINE ASSUMES UPPER CASE.
3646/ ENTER ROUTINE WITH CHAR IN THE AC.
3647/ EXIT + 2 IF THE CHAR IS ALPHABETIC WITH THE CHAR IN THE AC.
3648/ EXIT + 1 IF THE CHAR IS NOT ALPHABETIC WITH THE CHAR IN THE AC.
3649
3650ALPHA, 0
3651 DCA ALPHA1 /STORE THE CHAR FOR RETURN
3652 TAD ALPHA1 /GET THE CHAR
3653 TAD (-"Z!200-1) /ADD ON UPPER LIMIT /034 CJL
3654 CLL /INIT LINK FOR A FLAG
3655 TAD ("Z-"A+1
3656 SZL /SKIP IF NOT A LETTER
3657 ISZ ALPHA /IS A LETTER, BUMP RETURN
3658 CLA CLL /CLEAR AC
3659 TAD ALPHA1 /RESTORE CHAR IN THE AC
3660 JMP I ALPHA /TAKE PROPER RETURN
3661
3662ALPHA1, 0 /TEMP FOR ALPHA ROUTINE
3663
3664/ ROUTINE TO CHECK FOR A NUMERIC CHARACTER.
3665/ ENTER WITH THE CHAR TO CHECK IN THE AC.
3666/ EXIT + 2 IF NUMERIC WITH THE CHAR IN THE AC.
3667/ EXIT + 1 IF NON-NUMERIC WITH THE CHAR IN THE AC.
3668
3669NUMRC, 0
3670 DCA NUMRC1 /SAVE THE CHAR FOR RETURN
3671 TAD NUMRC1 /GET THE CHAR BACK
3672 TAD (-"9!200-1) /ADD ON UPPER LIMIT /034 CJL
3673 CLL /INIT LINK FOR A FLAG
3674 TAD ["9-"0+1] /016 CJL
3675 SZL /SKIP IF NOT A DIGIT
3676 ISZ NUMRC /BUMP RETURN FOR NUMERIC
3677 CLA CLL /CLEAR AC
3678 TAD NUMRC1 /RESTORE CHAR IN THE AC
3679 JMP I NUMRC /DONE
3680
3681NUMRC1, 0 /TEMP FOR NUMRC CHECK ROUTINE
3682\f/ ROUTINE TO WRITE THE CURRENT INPUT PACKET TO THE OUTPUT FILE.
3683/ ENTER: NOTHING.
3684/ EXIT: + 2 = WRITE SUCCESSFUL.
3685/ + 1 = WRITE NOT SUCCESSFUL.
3686
3687WRIPAK, 0
3688 TAD I [RRLEN] /GET LENGTH OF PACKET
3689 TAD (RRDTA-40-3 /CALCULATE END OF BUFFER
3690 DCA W90 /PUT INTO POINTER
3691 DCA I W90 /ZERO AFTER END OF BUFFER
3692 TAD (RRDTA /GET ADDRESS OF DATA
3693 DCA W90 /PUT INTO POINTER
3694
3695W10, TAD I W90 /GET A CHAR FROM PACKET
3696 SNA /SKIP IF NOT END
3697 JMP W60 /END, EXIT
3698 CIA /NEGATE FOR COMPARE
3699 TAD RQCTL /COMPARE WITH CURRENT QUOTE CHAR
3700 SNA CLA /SKIP IF NOT QUOTE CHAR
3701 JMP W20 /IS QUOTE, HANDLE SPECIAL
3702 TAD W92 /WAS LAST CHAR A QUOTE?
3703 SZA CLA /SKIP IF NO
3704 TAD (-100 /IT WAS, FIX UP THIS CHAR
3705 JMP W25 /HANDLE REST BELOW
3706
3707W20, TAD W92 /CURRENT CHAR A QUOTE, CHECK PREVIOUS
3708 SNA CLA /SKIP IF YES
3709 JMP W30 /JUST THIS CHAR IS QUOTE, SET FLAG
3710
3711W25, TAD I W90 /GET CHAR FROM BUFFER
3712 JMS I [PUTBYTE] /OUTPUT TO FILE /020 CJL
3713 JMP I WRIPAK /ERROR IN OUTPUT /M020 CJL
3714 JMP W35 /FINISH BELOW
3715
3716W30, NL0001 CLL /GOTA SET FLAG FOR QUOTE CHARACTER /032 CJL
3717
3718W35, DCA W92 /SET UP QUOTE FLAG
3719 ISZ W90 /BUMP POINTER
3720 JMP W10 /LOOP
3721
3722W60, ISZ WRIPAK /BUMP RETURN FOR OK
3723 JMP I WRIPAK /DONE
3724
3725W90, 0 /POINTER FOR "WRIPAK"
3726W92, 0 /TEMP FOR "WRIPAK"
3727\f/ TABLE SEARCH ROUTINE. /025 CJL
3728
3729/ CALLING SEQUENCE:
3730
3731/ TAD VALUE /AC CONTAINS VALUE TO MATCH
3732/ JMS I [SRCHTABLE] /CALL ROUTINE
3733/ TABLE-2 /ADDRESS(TABLE)-2
3734/ RETURN /ALWAYS RETURNS HERE
3735
3736/ IF AC=0 THEN NO MATCH OCCURRED.
3737
3738/ IF AC IS NON-ZERO, THEN AC CONTAINS CORRESPONDING VALUE TO MATCH WHICH IS ALSO
3739/ STORED IN TABLEJUMP.
3740
3741/ TABLE FORMAT.
3742
3743/ -VALUE; CORRESPONDING VALUE /TABLE PAIR
3744/ ""; "" /ADDITIONAL PAIRS AS NECESSARY
3745/ 0 /ZERO TERMINATES THE TABLE
3746
3747SRCHTAB,.-. /TABLE SEARCH ROUTINE
3748 DCA TABLEJUMP /SAVE PASSED VALUE TO MATCH
3749 TAD I SRCHTABLE /GET PASSED POINTER ARGUMENT
3750 DCA XR0 /STASH THE POINTER
3751 ISZ SRCHTABLE /BUMP PAST ARGUMENT
3752SRCHLUP,ISZ XR0 /BUMP TO NEXT PAIR
3753 TAD I XR0 /GET A TABLE VALUE
3754 SNA /END OF TABLE?
3755 JMP I SRCHTABLE /YES, RETURN WITH CLEAR AC
3756 TAD TABLEJUMP /COMPARE TO DESIRED
3757 SZA CLA /SKIP IF IT MATCHES
3758 JMP SRCHLUP /JUMP IF NOT
3759 TAD I XR0 /GET CORRESPONDING VALUE
3760 DCA TABLEJUMP /STASH IT
3761 TAD TABLEJUMP /GET IT BACK
3762 JMP I SRCHTABLE /RETURN WITH CORRESPONDING VAUE IN AC
3763
3764 PAGE /014 CJL
3765\f IFZERO 1 <
3766
3767/ OS8 DIRECTORY FILE DATA SETUP.
3768/ ENTER WITH THE DIRECTORY DATE WORD IN THE AC.
3769/ EXIT WITH THE DATE IN THE BUFFER "DATBUF".
3770
3771FILD8, 0
3772 DCA FILD89 /SAVE THE DATE WORD
3773 TAD FILD89 /GET DATA WORD
3774 AND (7 /KEEP ONLY YEAR BITS
3775 TAD (116 /ADD 78 YEARS
3776 MQL /PUT INTO MQ REGISTER
3777 TAD (DATEYR /GET POINTER TO YEAR
3778 JMS DECCON /CONVERT TO ASCII DATE
3779 TAD FILD89 /GET DATE WORD BACK
3780 CLL RTR /SHIFT DAY DOWN
3781 RAR
3782 AND (37 /KEEP ONLY DAY BITS
3783 MQL /PUT IN MQ REGISTER
3784 TAD (DATEDA /GET POINTER TO DAY
3785 JMS DECCON /CONVERT TO ASCII DAY
3786 TAD FILD89 /GET DATE WORD BACK
3787 BSW /GET MONTH
3788 CLL RTR /DOWN
3789 AND (17 /KEEP ONLY MONTH BITS
3790 MQL /INTO MQ REGISTER
3791 TAD (DATEMO /GET ADDRESS OF WHERE TO PUT MONTH
3792 JMS DECCON /CONVERT
3793 JMP I FILD8 /ALL DONE
3794
3795FILD89, 0 /TEMP FOR "FILD8"
3796
3797
3798/ ROUTINE TO CONVERT A BINARY VALUE INTO A TWO DIGIT ASCII DECIMAL NUMBER.
3799/ ENTER WITH WHERE TO STORE THE CONVERTED NUMBER IN THE AC AND THE NUMBER IN THE
3800/ MQ REGISTER.
3801
3802DECCON, 0
3803 DCA DECC20 /STORE THE POINTER
3804 TAD ("0&177-1 /GET AN ASCII ZERO
3805 DCA I DECC20 /START OUT WITH A ZERO
3806 MQA /GET THE BINARY VALUE
3807DECC01, ISZ I DECC20 /BUMP
3808 TAD (-12 /SUB 10
3809 SMA /SKIP IF NO MORE DIVISION
3810 JMP DECC01 /ELSE KEEP GOING
3811 TAD (12+"0&177 /CONVERT REMAINDER TO ASCII
3812 ISZ DECC20 /BUMP POINTER
3813 DCA I DECC20 /STORE
3814/ JMS FMTDAT /FORMAT FOR PRINTING /D013
3815 JMP I DECCON /DONE
3816
3817 >
3818\f IFZERO 1 <
3819
3820DECC20, 0 /LOCAL POINTER TO DECCON
3821
3822/ ROUTINE TO SET UP THE DATE IN A MM-DD-YY FORMAT TO PUT IN FRONT OF A FILE TO
3823/ PASS THE FILES DATE (TEMPORY AND NOT PART OF THE KERMIT PROTOCOL).
3824
3825FMTDAT, 0
3826 TAD DATEMO /GET FIRST CHAR OF DATE
3827 DCA FDATE /MOVE IT
3828 TAD DATEMO+1
3829 DCA FDATE+1
3830 TAD DATEDA
3831 DCA FDATE+3
3832 TAD DATEDA+1
3833 DCA FDATE+4
3834 TAD DATEYR
3835 DCA FDATE+6
3836 TAD DATEYR+1
3837 DCA FDATE+7
3838 JMP I FMTDAT /QUICK AND DIRTY
3839
3840DATBUF, "#&177 /FILE CREATION DATE ATTRIBUTE
3841 6+40 /LENGTH OF DATE (CHAR(X))
3842DATEYR, 0 /ASCII YEAR GOES HERE
3843 0
3844DATEMO, 0 /ASCII MONTH GOES HERE
3845 0
3846DATEDA, 0 /ASCII DAY GOES HERE
3847 0
3848 -1 /TERMINATE
3849
3850/ FORMATTED DATE GOES HERE.
3851
3852SETDAT,"ANGLEBRACKET&177 /COMMENT SIGN
3853
3854FDATE, 0
3855 0
3856 "-&177
3857 0
3858 0
3859 "-&177
3860 0
3861 0
3862 12
3863 15
3864 -1
3865
3866 >
3867\f/ DIRECTORY LOOKUP ROUTINE. /028 CJL
3868
3869/ CALLING SEQUENCE:
3870
3871/ NL0001 /IF INITIALIZING THE DIRECTORY
3872
3873/ OR
3874
3875/ CLA /CLEAR AC IF SUBSEQUENT CALL
3876
3877/ JMS I (LUKUP) /CALL ROUTINE
3878/ I/O ERROR /DIRECTORY I/O ERROR RETURN WITH AC DIRTY
3879/ NOT FOUND /FILE NOT FOUND RETURN
3880/ FOUND /LATEST FILE MATCHES REQUEST
3881
3882/ SETS FLEN TO -(FILE LENGTH) IN RECORDS.
3883
3884/ SETS FSBLK TO STARTING RECORD OF FILE.
3885
3886/ MODIFIES DIRECTORY SEGMENT SLIGHTLY (NOT TO BE WRITTEN BACK).
3887
3888/ DEPENDS ON DIRXR BEING UNTOUCHED BY OTHER ROUTINES.
3889
3890LUKUP, .-. /DIRECTORY LOOKUP ROUTINE
3891 SNA /INITIALIZING DIRECTORY?
3892 JMP NXTFILE /NO, JUST GET ANOTHER FILE IF POSSIBLE
3893NEXTSEG,DCA DIRRECORD /STORE LATEST DIRECTORY SEGMENT RECORD
3894 JMS I HNDADR /CALL I/O HANDLER
3895 PAGCNT^100+DIRFLD /READ IN A DIRECTORY SEGMENT
3896 DIRBUFFER /DIRECTORY I/O BUFFER
3897DIRRECO,.-. /WILL BE LATEST SEGMENT NUMBER
3898 JMP I LUKUP /I/O ERROR, TAKE DIRTY IMMEDIATE RETURN
3899 CDF DIRFLD /GOTO DIRECTORY FIELD
3900 TAD I (FRSTRECORD) /GET FIRST RECORD OF FIRST ENTRY
3901 DCA FSBLK /STASH IT
3902 TAD (ENTSTRT-1) /POINT TO
3903 DCA DIRXR /ENTRIES
3904LOOKLUP,TAD I DIRXR /GET FIRST WORD OF ENTRY
3905 SNA /SKIP IF NOT EMPTY
3906 JMP EMPENTRY /JUMP IF EMPTY ENTRY
3907 DCA FNAME /STORE FIRST FILENAME WORD
3908 TAD I DIRXR /GET NEXT
3909 DCA FNAME+1 /STORE SECOND FILENAME WORD
3910 TAD I DIRXR /GET NEXT
3911 DCA FNAME+2 /STORE THIRD FILENAME WORD
3912 TAD I DIRXR /GET NEXT
3913 DCA FNAME+3 /STORE EXTENSION WORD
3914 NL7777 /BACKUP
3915 TAD I (AIWNUMBER) /GET ADDITIONAL INFORMATION WORD COUNT
3916 DCA AIWCNT /STASH THE COUNTER
3917DCADATW,DCA DATWORD /CLEAR THE DATE WORD
3918 TAD DCADATW/(DCA DATWORD)/GET STORING INSTRUCTION
3919 DCA AIWSTORE /STORE IN-LINE
3920 JMP AIWTEST /START LOOP THERE
3921\fAIWLUP, TAD I DIRXR /GET A WORD FROM ENTRY
3922AIWSTOR,DCA DATWORD+.-. /STORE IN PROPER WORD
3923 ISZ AIWSTORE /BUMP TO NEXT INSTRUCTION
3924AIWTEST,ISZ AIWCNT /DONE ALL ADDITIONAL INFORMATION WORDS?
3925 JMP AIWLUP /NO, KEEP GOING
3926 TAD I DIRXR /GET THE FILE LENGTH
3927 SNA /SKIP IF VALID
3928 JMP TENTRY /JUMP IF ONLY TENTATIVE FILE (NO LENGTH)
3929 DCA FILENGTH /STORE FILE LENGTH
3930 CDF PRGFLD /BACK TO OUR FIELD
3931/ JMS I (FILTER) /CHECK IF WE LIKE THIS ONE
3932 TAD (FNAME) /POINT TO LATEST FILENAME
3933 JMS I (FMATCH) /CHECK FOR A MATCH
3934 JMP NXTFILE /FORGET THIS ONE, IT DIDN'T MATCH
3935 TAD FILENGTH /GET FILE LENGTH
3936 DCA FLEN /GIVE TO CALLER TO DESTROY
3937 TAD (FNAME) /POINT TO FILENAME
3938 JMS I [FILN8] /PUT IN CHARACTER FORM IN BUFFER
3939 ISZ LUKUP /BUMP TO FILE MATCH RETURN
3940 JMP FLEXIT /EXIT THERE
3941
3942/ COMES HERE FROM SUBSEQUENT CALL OR MATCH FAILURE.
3943
3944NXTFILE,CDF DIRFLD /GOTO BUFFER FIELD
3945 TAD FILENGTH /GET LATEST FILE LENGTH
3946 SKP /DON'T DO EMPTY LENGTH
3947
3948/ COMES HERE TO BYPASS AN EMPTY ENTRY.
3949
3950EMPENTR,TAD I DIRXR /GET LENGTH OF EMPTY
3951 CIA /WANT POSITIVE FORM
3952 TAD FSBLK /UPDATE TO NEXT FILE RECORD
3953 DCA FSBLK /STORE UPDATED VALUE
3954TENTRY, ISZ I (FILECNT) /DONE WITH THIS SEGMENT?
3955 JMP LOOKLUP /NO, KEEP GOING
3956 TAD I (DIRLINK) /GET LINK TO NEXT SEGMENT
3957 CDF PRGFLD /BACK TO OUR FIELD
3958 SZA /END OF DIRECTORY?
3959 JMP NEXTSEGMENT /NO, GO DO NEXT SEGMENT
3960FLEXIT, ISZ LUKUP /BUMP PAST I/O ERROR EXIT
3961 JMP I LUKUP /RETURN FOR FILE NOT FOUND
3962
3963AIWCNT, .-. /ADDITIONAL INFORMATION WORD COUNTER
3964DATWORD,.-. /DATE WORD STORED HERE (0000 IF NONE)
3965 ZBLOCK 7 /ROOM FOR MORE ADDITIONAL INFORMATION WORDS
3966FILENGT,.-. /LATEST FILE LENGTH
3967FNAME, ZBLOCK 4 /FILENAME AND EXTENSION STORED HERE
3968
3969 PAGE
3970\f/ OS/8 FILE UNPACK ROUTINE. /019 CJL
3971
3972/ THIS ROUTINE UNPACKS BYTES FROM THE INPUT FILE ACCORDING TO THE CURRENT VALUE
3973/ OF FILMODE:
3974
3975/ FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII
3976/ CHARACTERS BY STRIPPING THE HIGH-ORDER BIT. END OF FILE IS THE <^Z> CHARACTER
3977/ WHICH WILL BE SENT OR NOT ACCORDING TO THE CONTENTS OF OCTLZFLAG. IF
3978/ OCTLZFLAG CONTAINS NON-ZERO, THEN <^Z> WILL BE SENT AT <EOF>; THE NEXT CALL
3979/ WILL YIELD THE <EOF> RETURN. IF OCTLZFLAG CONTAINS ZERO, THEN DETECTION OF
3980/ <^Z> YIELDS THE <EOF> RETURN IMMEDIATELY.
3981
3982/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT
3983/ CHARACTERS AND WILL BE SENT WITHOUT <^Z> CHECK. THE NEXT CALL AFTER THE LAST
3984/ BYTE OF THE LAST RECORD HAS BEEN SENT YIELDS THE <EOF> RETURN.
3985
3986/ CALLING CONSIDERATIONS:
3987
3988/ OCTLZFLAG MUST BE SETUP ACCORDINGLY IF IN ASCII MODE.
3989
3990/ FILMODE MUST BE SETUP ACCORDINGLY.
3991
3992/ FLEN MUST CONTAIN -(FILE LENGTH IN RECORDS) WHEN INITIALIZING THE INPUT FILE.
3993/ IT WILL BE MODIFIED BY CALLING THIS ROUTINE.
3994
3995/ FSBLK MUST CONTAIN THE THE STARTING RECORD WHEN INITIALIZING THE INPUT FILE.
3996
3997/ HNDADR MUST ALREADY BE SETUP TO CALL THE INPUT HANDLER.
3998
3999/ CALLING SEQUENCE:
4000
4001/ CLA /OR NL7777 IF INITIALIZING THE INPUT FILE
4002/ JMS I (GETBYTE) /CALL ROUTINE
4003/ I/O ERROR RETURN /FATAL INPUT ERROR OCCURRED; AC CONTAINS JUNK
4004/ END OF FILE /<EOF> OCCURRED
4005/ GOOD RETURN /AC CONTAINS LATEST SEVEN/EIGHT-BIT CHARACTER
4006
4007GETBYTE,.-. /GET A BYTE ROUTINE
4008 SNA CLA /INITIALIZING?
4009 JMP I PUTC /NO, GO GET NEXT BYTE
4010 TAD FSBLK /GET STARTING RECORD OF INPUT FILE
4011 DCA GETRECORD /STORE IN-LINE
4012GETNEWR,JMS I HNDADR /CALL I/O HANDLER
4013 PAGCNT^100+BUFFLD /READ SOME PAGES INTO BUFFER FIELD
4014GETCORE,FILBUFFER /BUFFER ADDRESS
4015GETRECO,.-. /WILL BE LATEST RECORD NUMBER
4016 JMP I GETBYTE /INPUT ERROR!
4017 TAD GETCORE/(FILBUFFER) /SETUP THE
4018 DCA BUFPTR /BUFFER POINTER
4019\fGETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW
4020 JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE
4021 JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE
4022 TAD THIRD /GET THIRD BYTE
4023 JMS PUTC /SEND IT BACK
4024 TAD BUFPTR /GET THE POINTER
4025 TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT
4026 SZA CLA /SKIP IF AT END
4027 JMP GETLOOP /KEEP GOING
4028 ISZ GETRECORD /BUMP TO NEXT RECORD
4029 ISZ FLEN /DONE ALL RECORDS? (BINARY MODE ONLY)
4030 JMP GETNEWRECORD /NO, GO DO ANOTHER ONE
4031
4032/ BINARY <EOF> REACHED HERE.
4033
4034 JMP GETEOF /TAKE SKIP RETURN TO MAIN CALLER
4035
4036PUTONE, .-. /SEND BACK A BYTE ROUTINE
4037 CDF BUFFLD /GOTO BUFFER FIELD
4038 TAD I BUFPTR /GET LATEST WORD
4039 AND [7400] /JUST THIRD-BYTE NYBBLE
4040 CLL RAL /MOVE UP
4041 TAD THIRD /GET OLD NYBBLE (IF ANY)
4042 RTL;RTL /MOVE UP NYBBLE BITS
4043 DCA THIRD /SAVE FOR NEXT TIME
4044 TAD I BUFPTR /GET LATEST WORD AGAIN
4045 JMS PUTC /SEND BACK CURRENT BYTE
4046 ISZ BUFPTR /BUMP TO NEXT WORD
4047 JMP I PUTONE /RETURN
4048
4049PUTC, .-. /SEND BACK LATEST BYTE ROUTINE
4050 CDF PRGFLD /BACK TO OUR FIELD
4051 RAL /MOVE UP
4052 STL RAR /MOVE DOWN WITH BIT[0] SET
4053 AND FILMODE /KEEP ONLY GOOD BITS
4054 TAD [-CNTRLZ] /COMPARE TO <^Z>
4055 SNA /SKIP IF NOT ASCII MODE <EOF>
4056 JMP GETEND /JUMP IF ASCII MODE <EOF>
4057GETUPZ, TAD [CNTRLZ] /RESTORE THE CHARACTER
4058 AND [377] /ENSURE EIGHT-BIT (MIGHT ALREADY BE SEVEN-BIT)
4059 ISZ GETBYTE /BUMP PAST <EOF> RETURN
4060GETEOF, ISZ GETBYTE /BUMP PAST I/O ERROR RETURN
4061 JMP I GETBYTE /RETURN TO MAIN CALLER
4062
4063/ GOT <Z> IN ASCII MODE.
4064
4065GETEND, TAD OCTLZFLAG /GET <^Z> DISPOSITION FLAG
4066 SNA CLA /SKIP IF SET
4067 JMP GETEOF /JUST RETURN <EOF> CONDITION
4068 TAD (GETEOF) /POINT TO <EOF>
4069 DCA PUTC /FOR NEXT TIME
4070 JMP GETUPZ /GIVE THEM BACK <^Z> THIS TIME
4071\f/ OS/8 FILE PACK ROUTINE. /020 CJL
4072
4073/ THIS ROUTINE PACKS BYTES INTO THE OUTPUT FILE ACCORDING TO THE CURRENT VALUE
4074/ OF FILMODE:
4075
4076/ FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII
4077/ CHARACTERS BY STRIPPING THE HIGH-ORDER BIT.
4078
4079/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT
4080/ CHARACTERS AND WILL BE WRITTEN AS IS.
4081
4082/ CALLING CONSIDERATIONS:
4083
4084/ FILMODE MUST BE SETUP ACCORDINGLY.
4085
4086/ FLEN MUST CONTAIN -(MAXIMUM FILE LENGTH IN RECORDS) WHEN INITIALIZING THE
4087/ TENTATIVE OUTPUT FILE. IT WILL BE MODIFIED BY CALLING THIS ROUTINE.
4088
4089/ FSBLK MUST CONTAIN THE STARTING RECORD WHEN INITIALIZING THE TENTATIVE OUTPUT
4090/ FILE.
4091
4092/ HNDADR MUST ALREADY BE SETUP TO CALL THE OUTPUT HANDLER.
4093
4094/ CALLING SEQUENCE:
4095
4096/ NL7777 /ANY NEGATIVE VALUE
4097/ JMS I [PUTBYTE] /CALL ROUTINE TO INITIALIZE
4098/ IMPOSSIBLE /CAN'T RETURN HERE
4099/ GOOD RETURN /ALWAYS RETURNS HERE
4100
4101/ OR
4102
4103/ TAD (CHAR&377) /ANY EIGHT-BIT (OR LESS) VALUE
4104/ JMS I [PUTBYTE] /CALL ROUTINE TO PACK A CHARACTER
4105/ ERROR RETURN /I/O ERROR WHILE WRITING A BUFFER
4106/ GOOD RETURN /CHARACTER PACKED WITH NO ERRORS
4107
4108/ ALL RETURNS CLEAR THE AC.
4109
4110PUTBYTE,.-. /OUTPUT A BYTE ROUTINE
4111 SPA /ARE WE INITIALIZING?
4112 JMP PUTINITIALIZE /YES
4113 AND FILMODE /REDUCE TO SEVEN-BIT/EIGHT-BIT
4114 DCA LATEST /SAVE LATEST CHARACTER
4115 CDF BUFFLD /GOTO BUFFER FIELD
4116 TAD LATEST /GET LATEST CHARACTER
4117 JMP I PUTNEXT /GO WHERE YOU SHOULD GO
4118
4119PUTNEXT,.-. /EXIT ROUTINE
4120 ISZ PUTBYTE /BUMP TO GOOD RETURN
4121PUTERRO,CLA CLL /CLEAN UP
4122 CDF PRGFLD /BACK TO OUR FIELD
4123 JMP I PUTBYTE /RETURN TO MAIN CALLER
4124\fPUTINIT,CLA /CLEAN UP
4125 TAD FSBLK /GET STARTING RECORD OF TENTATIVE FILE
4126 DCA PUTRECORD /STORE IN-LINE
4127 DCA I (FLENGTH) /CLEAR ACTUAL FILE LENGTH
4128PUTNEWR,TAD PUTCORE/(FILEBUFFER) /SETUP THE
4129 DCA BUFPTR /BUFFER POINTER
4130PUTLOOP,JMS PUTNEXT /GET A CHARACTER
4131 DCA I BUFPTR /STORE IT
4132 TAD BUFPTR /GET POINTER VALUE
4133 DCA TEMPTR /SAVE FOR LATER
4134 ISZ BUFPTR /BUMP TO NEXT
4135 JMS PUTNEXT /GET A CHARACTER
4136 DCA I BUFPTR /STORE IT
4137 JMS PUTNEXT /GET A CHARACTER
4138 RTL;RTL /MOVE UP
4139 AND [7400] /ISOLATE HIGH NYBBLE
4140 TAD I TEMPTR /ADD ON FIRST BYTE
4141 DCA I TEMPTR /STORE COMPOSITE
4142 TAD LATEST /GET LATEST CHARACTER
4143 RTR;RTR;RAR /MOVE UP AND
4144 AND [7400] /ISOLATE LOW NYBBLE
4145 TAD I BUFPTR /ADD ON SECOND BYTE
4146 DCA I BUFPTR /STORE COMPOSITE
4147 ISZ BUFPTR /BUMP TO NEXT
4148 TAD BUFPTR /GET LATEST POINTER VALUE
4149 TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT
4150 SZA CLA /SKIP IF AT END
4151 JMP PUTLOOP /KEEP GOING
4152 CDF PRGFLD /BACK TO OUR FIELD
4153 ISZ FLEN /TOO MANY RECORDS?
4154 SKP /SKIP IF NOT
4155 JMP I PUTBYTE /TAKE ERROR RETURN
4156 JMS I HNDADR /CALL I/O HANDLER
4157 PAGCNT^100+BUFFLD+WRITE /WRITE SOME PAGES FROM BUFFER FIELD
4158PUTCORE,FILBUFFER /BUFFER ADDRESS
4159PUTRECO,.-. /WILL BE LATEST RECORD NUMBER
4160 JMP PUTERROR /OUTPUT ERROR!
4161 ISZ I (FLENGTH) /BUMP ACTUAL LENGTH
4162 ISZ PUTRECORD /BUMP TO NEXT RECORD
4163 JMP PUTNEWRECORD /KEEP GOING
4164
4165BUFPTR, .-. /INPUT/OUTPUT BUFFER POINTER
4166
4167/ ASCII FILE MODE <^Z> OUTPUT DISPOSITION FLAG.
4168
4169OCTLZFL,OCLOSE /ZERO=DON'T SEND <^Z> AT <EOF>,
4170 /NON-ZERO=SEND <^Z> AT <EOF>
4171
4172 THIRD= PUTNEXT /THIRD BYTE TEMPORARY
4173
4174 TEMPTR= PUTONE /TEMPORARY BUFFER POINTER
4175\f PAGE
4176\f/ OUTPUT FILE CLOSE ROUTINE /020 CJL
4177
4178/ THIS ROUTINE CLOSES THE OPEN OUTPUT FILE ACCORDING TO THE CURRENT VALUE OF
4179/ FILMODE:
4180
4181/ FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES PRIOR TO CLOSE ARE STRIPPED
4182/ SEVEN-BIT CHARACTERS. IF THE LAST CHARACTER SENT TO PUTBYTE (CONTENTS OF
4183/ LATEST) IS A <^Z>, THEN JUST CLOSE THE FILE. IF NOT, THEN IF ICTLZFLAG IS
4184/ NON-ZERO, INSERT A <^Z> CHARACTER INTO THE FILE AS <EOF> INDICATOR, ELSE JUST
4185/ CLOSE THE FILE.
4186
4187/ FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES PRIOR TO CLOSE ARE EIGHT-BIT
4188/ CHARACTERS. IF NECESSARY, <NUL> CHARACTERS WILL BE APPENDED TO THE END OF THE
4189/ LAST BLOCK OF THE FILE TO FILL IT. THE FILE IS CLOSED OTHERWISE UNMODIFIED.
4190
4191/ CALLING CONSIDERATIONS.
4192
4193/ OFFLG MUST BE SET (OUTPUT FILE IS OPEN).
4194
4195/ FLENGTH MUST CONTAIN THE ACTUAL FILE LENGTH.
4196
4197/ LATEST MUST CONTAIN THE LAST BYTE SENT TO THE OUTPUT FILE VIA PUTBYTE (ASCII
4198/ MODE ONLY).
4199
4200/ ICTLZFLAG MUST BE SETUP ACCORDINGLY.
4201
4202/ FILMODE MUST BE SETUP ACCORDINGLY.
4203
4204/ CALLING SEQUENCE:
4205
4206/ CLA CLL /CLEAR AC
4207/ JMS I (FILCLOSE) /CALL ROUTINE
4208/ ERROR RETURN /ERROR WHILE CLOSING FILE
4209/ GOOD RETURN /FILE CLOSED PROPERLY
4210
4211/ ON RETURN, OFFLG WILL BE CLEAR; THE AC WILL BE CLEAR ALSO.
4212
4213FILCLOS,.-. /OUTPUT FILE CLOSE ROUTINE
4214 TAD FILMODE /GET CURRENT FILE MODE
4215 SPA CLA /SKIP IF ASCII
4216 JMP CLOSIT /JUMP IF BINARY
4217 TAD LATEST /GET LATEST CHARACTER
4218 TAD [-CNTRLZ] /COMPARE TO <^Z>
4219 SZA CLA /SKIP IF <^Z> ALREADY IN FILE
4220 TAD ICTLZFLAG /GET <^Z> DISPOSITION FLAG
4221 SNA CLA /SKIP IF SET
4222 JMP CLOSIT /JUMP IF NOT
4223 TAD [CNTRLZ] /GET A <^Z>
4224\fCLOSLUP,JMS I [PUTBYTE] /OUTPUT A BYTE
4225 JMP CLOSERROR /ERROR WHILE WRITING
4226CLOSIT, TAD I (BUFPTR) /GET THE BUFFER POINTER
4227 TAD (-FILBUFFER) /COMPARE TO RESET VALUE
4228 SZA CLA /SKIP IF IT MATCHES
4229 JMP CLOSLUP /ELSE KEEP GOING
4230 TAD ODNUMBER /GET OUTPUT DEVICE NUMBER
4231 CIF USRFLD /GOTO USR FIELD
4232 JMS I [USRENTRY] /CALL USER SERVICE ROUTINE /035 CJL
4233 CLOSE /CLOSE FILE
4234 FNBLK /=> FILENAME
4235FLENGTH,.-. /ACTUAL FILE LENGTH
4236CLOSERR,SKP CLA /ERROR WHILE CLOSING THE FILE
4237 ISZ FILCLOSE /BUMP RETURN IF NO ERRORS
4238 DCA OFFLG /CLEAR OUTPUT FILE OPEN FLAG
4239 JMP I FILCLOSE /RETURN TO CALLER
4240
4241/ ASCII FILE MODE <^Z> INPUT DISPOSITION FLAG.
4242
4243ICTLZFL,ICLOSE /ZERO=DON'T ENSURE <^Z> IN FILE, NON-ZERO=PACK <^Z>
4244 /IF LAST CHARACTER WASN'T <^Z>
4245\f/ SEND PROCESSING
4246
4247SNDPRO, 0
4248 TAD INIFLG /CHECK IF SEND/INIT HAS BEEN DONE
4249 SZA CLA /SKIP IF NO
4250 JMP SNDP10 /RIGHT INTO FILE TRANSFER
4251 TAD (DEFCK /SET UP DEFAULT CHECKSUM
4252 DCA RCHKT
4253 TAD (DEFEOL /GET DEFAULT EOL
4254 DCA REOL /AND SET IT
4255 TAD (DEFQCTL /GET DEFAULT QUOTE CONTROL CHAR
4256 DCA RQCTL /AND SET IT UP
4257 TAD (DEFMAXL+40 /GET DEFAULT MAX BUFFER SIZE
4258 DCA RMAXL /SET IT UP
4259 DCA CURSEQ /RE-SET SEQUENCE NUMBER
4260 JMS I (SNDI00) /HANDLE "SEND-INIT"
4261 JMP I SNDPRO /TAKE ERROR RETURN /014 CJL
4262
4263/ SEND FILE HEADER DISPATCH ROUTINE
4264
4265SNDP10, FPACK /FORMAT A PACKET
4266 NAMBUF /ADDRESS OF FILE HEADER FOR DATA
4267 STFIL /"FIL" PACKET TYPE
4268
4269SNDP11, SPACK /SEND A PACKET
4270 1 /AWAIT RESPONSE
4271 SNDP96-2 /DISPATCH TABLE ADDRESS /026 CJL
4272
4273/ GOT A NAK OR UNDEFINED HERE
4274
4275SNDP12, ISZ RTRYC /BUMP THE COUNTER
4276 JMP SNDP11 /TRY AGAIN
4277 JMP I SNDPRO /TAKE ERROR RETURN /014 CJL
4278
4279/ FILE CREATION DATE HANDLING
4280
4281SNDP15, IFZERO 1 <
4282
4283 TAD RCAPAS /CHECK IF REMOTE SUPPORTS FILE
4284 AND (10 / ATTRIBUTES
4285 SNA CLA /SKIP IF YES
4286 JMP SNDP20 /SKIP IF NO
4287 FPACK /FORMAT PACKET
4288 DATBUF /DATE DATA
4289 STATT /"ATT" PACKET TYPE
4290
4291SNDP16, SPACK /SEND THE PACKET
4292 1 /AWAIT RESPONSE
4293 SNDP98-2 /DISPATCH TABLE ADDRESS /027 CJL
4294 JMP I SNDPRO /TAKE ERROR RETURN /014 CJL
4295
4296 >
4297\f/ GOT ACK HERE
4298
4299SNDP20, JMS I [SCRIBE] /TELL THEM /025 CJL
4300 FSENMSG /WE ARE SENDING /025 CJL
4301 PRI8B; NAMBUF /TELL THEM THE NAME OF THE FILE
4302 JMS I [SCRIBE] /DO A /025 CJL
4303 CRLF /<CR>, <LF> /025 CJL
4304 JMS SLOOP
4305 SKP /ERROR RETURN
4306 ISZ SNDPRO /BUMP FOR NON-ERROR EXIT
4307 JMP I SNDPRO
4308\f/ DATA SEND LOOP.
4309/ ROUTINE TO GET CHARS FROM THE INPUT BUFFER AND SEND THEM TO REMOTE
4310/ VIA PACKET TRANSFERS. RETURN + 1 IF ERROR, + 2 IF DONE.
4311
4312SLOOP, 0
4313 JMS I (INIOPB) /INIT OUTPUT PACKET HOLD BUFFER
4314 NL7777 /INITIALIZE INPUT FILE ROUTINE /019 CJL
4315SLOP01, JMS I (GETBYTE) /GET A FILE CHARACTER /019 CJL
4316 JMP I SLOOP /FATAL I/O ERROR /026 CJL
4317 JMP SLOP15 /HERE ON EOF
4318 JMS I (OPBUF) /PUT INTO PACKET BUFFER
4319 SKP /RETURN HERE ON BUFFER FULL
4320 JMP SLOP01 /RETURN HERE IF STILL ROOM
4321
4322/ PACKET IS FULL HERE, WE MUST SEND IT.
4323
4324 FPACK /FORMAT A PACKET
4325 HOLDBF /DATA ADDRESS
4326 STDAT /"DAT" PACKET TYPE
4327
4328SLOP05, SPACK /SEND PACKET
4329 1 /AWAIT RESPONSE
4330 SLOP90-2 /RESPONSE TABLE ADDRESS /027 CJL
4331
4332/ HERE ON NAK OR FALL THRU ON UNDEFINED RESPONSE ABOVE.
4333
4334SLOP10, ISZ RTRYC /BUMP THE RE-TRY COUNTER
4335 JMP SLOP05 /TRY AGAIN
4336 JMP I SLOOP /TAKE ERROR RETURN /026 CJL
4337
4338/ HERE ON END OF FILE -- SEND THEM WHAT WE HAVE.
4339
4340SLOP15, TAD I (OP2) /GET THE POINTER /052 CJL
4341 TAD (-HOLDBF) /COMPARE TO EMPTY VALUE /052 CJL
4342 SNA CLA /SKIP IF NOT EMPTY /052 CJL
4343 JMP SLOP35 /JUMP IF EMPTY /052 CJL
4344 FPACK /FORMAT A PACKET
4345 HOLDBF /ADDRESS OF DATA
4346 STDAT /"DAT" PACKET TYPE
4347
4348SLOP20, SPACK /SEND A PACKET
4349 1 /AWAIT RESPONSE
4350 SLOP92-2 /DISPATCH TABLE ADDRESS /027 CJL
4351
4352/ NAK FOR LAST PACKET.
4353
4354SLOP25, ISZ RTRYC /BUMP RE-TRY COUNTER
4355 JMP SLOP20 /TRY AGAIN
4356 JMP I SLOOP /TAKE ERROR RETURN /026 CJL
4357\f/ ACK FOR FINAL PACKET, SEND AN EOF PACKET.
4358
4359SLOP35, JMS I [SNDP] /SEND A PACKET
4360 NODATA /NO DATA
4361 STEOF /MAKE IT AN EOF PACKET
4362 JMP I SLOOP /NAK, TAKE ERROR RETURN
4363 JMP I SLOOP /OTHER THAN ACK, NAK; TAKE ERROR RETURN /026 CJL
4364 ISZ SLOOP /EOF ACCEPTED, BUMP FOR GOOD RETURN
4365 JMP I SLOOP /TAKE GOOD RETURN
4366
4367 PAGE
4368\fSLOP90, STACK; SLOP01 /ACK, CONTINUE
4369 STNAK; SLOP10 /NAK, HANDLE
4370 0
4371
4372SLOP92, STACK; SLOP35 /ACK, CONTINUE
4373 STNAK; SLOP25 /NAK, HANDLE
4374 0
4375
4376/ COMMAND DISPATCH TABLE FOR SEND SERVICE.
4377
4378SNDP96, STACK; SNDP15 /FILE HEADER ACKNOWLEDGED
4379 STNAK; SNDP12 /NAK RETURNED, RE-TRY
4380 0 /END OF TABLE
4381
4382SNDP98, STACK; SNDP20 /DATE ATTRIBUTE ACKNOWLEDGED
4383 0 /END OF TABLE
4384\f/ ROUTINE TO HANDLE A "SEND-INIT" COMMAND.
4385/ RETURN + 1 IF ERROR.
4386/ RETURN + 2 IF SUCCESSFUL.
4387
4388SNDI00, 0
4389 FPACK /FORMAT A PACKET
4390 INIDAT /ADDRESS OF DATA FOR PACKET
4391 STSIN /"SIN" PACKET TYPE
4392
4393SNDI02, SPACK /SEND A PACKET
4394 1 /AWAIT RESPONSE
4395 SNDI80-2 /RESPONSE TABLE TYPE /027 CJL
4396
4397/ HERE ON NAK OR UNDEFINED.
4398
4399SNDI05, ISZ RTRYC /BUMP RE-TRY COUNTER
4400 JMP SNDI02 /TRY AGAIN
4401 JMP I SNDI00 /TAKE ERROR EXIT
4402
4403/ HERE ON ACK.
4404
4405SNDI10, JMS SETINI /SET UP THE INIT REGISTERS
4406 NL0001 CLL /NOW FLAG THE SEND/INIT DONE /032 CJL
4407 DCA INIFLG /BY MAKING THIS NON-ZERO
4408 ISZ SNDI00 /BUMP FOR NON-ERROR RETURN
4409 JMP I SNDI00 /BACK TO MAIN SEND PROCESSING
4410
4411SNDI80, STACK; SNDI10 /GOT AN ACK
4412 STNAK; SNDI05 /NAK
4413 0 /END OF TABLE
4414
4415
4416/ ROUTINE TO MOVE THE SEND/INIT OR RECEIVE/INIT PACKET INTO THE INIT REGISTERS.
4417
4418SETINI, 0
4419 TAD (RMAXL /GET ADDRESS OF RECEIVE INIT REGISTERS
4420 DCA MQ /SETUP FOR CLEAR ROUTINE /032 CJL
4421 TAD (RMAXL-INITEND) /GET -(NUMBER OF REGISTERS) /022 CJL
4422 CLEAR /CLEAR OUT A CHUNK OF MEMORY /M013
4423/ TAD (RMAXL /GET ADDRESS OF RECEIVE INIT REGISTERS
4424/ DCA MQ /SETUP FOR MOVE ROUTINE /032 CJL
4425 TAD I [RRLEN] /GET LENGTH OF PACKET JUST INPUT
4426 TAD (-40-4 /COUNT OF DATA RECEIVED
4427 TAD (RMAXL-INITEND) /COMPARE TO MAXIMUM ALLOWED /022 CJL
4428 SMA SZA /SKIP IF NOT TOO MANY /022 CJL
4429 CLA /ELSE USE ALLOWED MAXIMUM /022 CJL
4430 TAD (INITEND-RMAXL) /RESTORE VALUE /022 CJL
4431 CIA /MAKE IT NEGATIVE
4432 DCA MOVE4 /SAVE FOR "MOVE" ROUTINE
4433 TAD (RRDTA /ADDRESS OF DATA IN PACKET
4434 MOVE /MOVE THE INIT REGISTERS
4435 JMP I SETINI /DONE
4436\f IFZERO 1 < /D013
4437
4438/ ROUTINE TO SEND THE DATE IN A DATA PACKET.
4439/ RETURN + 1 IF ERROR, + 2 IF SUCCESSFUL.
4440
4441DATOUT, 0
4442 JMS INIOPB /INSURE PACKET HOLD BUFFER INITIALIZED
4443 TAD (SETDAT /GET ADDRESS OF DATE
4444 DCA DATOU9 /PUT INTO POINTER
4445
4446DATOU1, TAD I DATOU9 /GET A CHAR
4447 ISZ DATOU9 /BUMP POINTER
4448 SPA /SKIP IF NOT ENT
4449 JMP DATOU2 /DONE
4450 JMS OPBUF /PUT INTO HOLD BUFFER
4451 SKP /HOLD FULL, SEND IT
4452 JMP DATOU1 /LOOP
4453
4454DATOU2, CLA CLL /INSURE CLEAR AC
4455 FPACK /FORMAT A PACKET
4456 HOLDBF /DATA ADDRESS
4457 STDAT /DATA PACKET
4458
4459DATOU3, SPACK /SEND THE PACKET
4460 1 /GET RESPONSE
4461 DATOU7-2 /DISPATCH TABLE ADDRESS /027 CJL
4462
4463/ HERE ON NAK OR UNDEFINED RESPONSE.
4464
4465DATOU4, ISZ RTRYC /BUMP RE-TRY COUNTER
4466 JMP DATOU3 /TRY AGAIN
4467 JMP I DATOUT /ABORT
4468
4469/ HERE ON ACK.
4470
4471DATOU5, ISZ DATOUT /BUMP FOR GOOD RETURN
4472 JMP I DATOUT /EXIT
4473
4474DATOU7, STACK; DATOU5 /ACK
4475 STNAK; DATOU4 /NAK
4476 0
4477
4478DATOU9, 0 /TEMP POINTER FOR DATOUT
4479
4480 > /D013
4481\f/ HANDLE AN ABORT REQUEST.
4482
4483ABORT, CLA CLL /INSURE CLEAR AC
4484 DCA ABFLAG /CLEAR ABORT FLAG NOW /044 CJL
4485 TAD KMODE /GET CURRENT MODE
4486 TAD (-MSEND /IS IT A SEND?
4487 SZA /SKIP IF YES
4488 JMP ABORT2 /NOT SEND
4489
4490 JMS I [SNDP] /SEND OUT A PACKET
4491 ABORT9 /WHICH HAS A "D" IN THE DATA
4492 STEOF /AND IS AN EOF PACKET
4493 NOP /WE GOT NAK BACK HERE
4494 NOP /WE GOT NEITHER NAK OR ACK HERE
4495 JMS I (BRKXMT) /BREAK THE SEND
4496 JMP ABORT3 /FINISH THE ABORT
4497
4498ABORT2, TAD (MSEND-MREC /CHECK IF IN RECEIVE MODE
4499 SZA CLA /SKIP IF YES
4500 JMP ABORT3 /JUST BACK TO COMMAND LOOP
4501 JMS I [SNDP] /SEND A PACKET BACK FOR AN ABORT
4502
4503 IFZERO 1 < /D009
4504
4505 ABORT8 /WHICH HAS AN "X" IN THE DATA
4506 STACK /MAKE IT AN ACK PACKET
4507 NOP /NAK HERE
4508 NOP /NOT NAK OR ACK HERE
4509
4510 > /D009
4511
4512 NODATA /NO DATA /A009
4513 STBRK /BREAK TRANSMISSION /A009
4514 NOP /NAK HERE /A009
4515 CLA /NOT ACK OR NAK HERE /A009
4516 TAD OFFLG /GET FILE OPEN FLAG /A009
4517 SZA CLA /IS IT OPEN YET? /A009
4518 JMS I [FILCLOSE] /CLOSE THE OUTPUT FILE /020 CJL
4519 CLA /ERROR DURING CLOSE **** FIX THIS ****
4520ABORT3, TAD (ABMSG) /GET MESSAGE ADDRESS /044 CJL
4521 JMP I [CLOOP7] /DISPLAY THE ABORT
4522
4523ABORT9, "D&137 /DATA PACKET FOR SEND ABORT
4524 -1
4525
4526 PAGE /014 CJL
4527\f/ ROUTINE TO PRINT 8 BIT CHARS ON THE TTY. ENTER ROUTINE WITH THE ADDRESS OF
4528/ THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1. TEXT
4529/ TERMINATES ON A MINUS WORD.
4530
4531PRI8B0, 0
4532 SZA /SKIP IF ADDRESS NOT IN AC
4533 JMP PRI8B1 /ADDRESS IS IN THE AC
4534 TAD I PRI8B0 /GET ADDRESS FROM CALL + 1
4535 ISZ PRI8B0 /BUMP RETURN POINTER
4536PRI8B1, DCA MQ /SAVE ADDRESS OF STRING /032 CJL
4537 TAD [P7ECHO] /GET CONSOLE OUTPUT ROUTINE ADDRESS /043 CJL
4538 JMS EIGHTB /AND SEND IT
4539 JMP I PRI8B0 /ALL DONE
4540
4541/ ROUTINE TO SEND 8 BIT CHARS DOWN THE REMOTE LINE. ENTER ROUTINE WITH THE
4542/ ADDRESS OF THE TEXT IN THE AC OR IF AC IS ZERO THE ADDRESS IS IN THE CALL + 1.
4543/ TEXT TERMINATES ON A MINUS WORD.
4544
4545REM8B0, 0
4546 SZA /SKIP IF ADDRESS NOT IN AC
4547 JMP REM8B1 /ADDRESS IN AC
4548 TAD I REM8B0 /GET ADDRESS FROM CALL + 1
4549 ISZ REM8B0 /BUMP RETURN
4550
4551REM8B1, DCA MQ /SAVE ADDRESS OF STRING /032 CJL
4552 TAD (COMOUT) /GET ADDRESS OF REMOTE OUTPUT ROUTINE /046 CJL
4553 JMS EIGHTB /AND SEND THE STRING
4554 JMP I REM8B0 /DONE
4555
4556
4557/ ROUTINE TO SEND 8 BIT DATA. ENTER WITH ADDRESS OF DATA IN THE MQ AND THE
4558/ ADDRESS OF THE ROUTINE TO TAKE EACH BYTE IN THE AC. TEXT TERMINATES ON A
4559/ MINUS WORD.
4560
4561EIGHTB, 0
4562 DCA EIGHT5 /STORE POINTER TO ROUTINE
4563 TAD MQ /GET STRING POINTER /032 CJL
4564 DCA EIGHT6 /STORE IN LOCAL POINTER
4565
4566EIGHT1, TAD I EIGHT6 /GET A CHAR
4567 ISZ EIGHT6 /BUMP THE POINTER
4568 SPA /SKIP IF NOT EOL
4569 JMP EIGHT2 /GOT EOL
4570 JMS I EIGHT5 /CALL OUTPUT ROUTINE
4571 CLA CLL /INSURE CLEAR AC
4572 JMP EIGHT1 /LOOP
4573
4574EIGHT2, CLA CLL /CLEAR THE AC
4575 JMP I EIGHTB /DONE
4576
4577EIGHT5, 0 /POINTER TO ROUTINE TO DO OUTPUT
4578EIGHT6, 0 /POINTER TO TEXT TO OUTPUT
4579\f/ ROUTINE TO UNPACK 6-BT CHARS FROM MEMORY. BEFORE CALLING INIT "GET6P" AS A
4580/ POINTER TO THE STRING LOCATION AND "GET6F" SHOULD BE ZEROED TO START WITH THE
4581/ TOP BYTE OF THE FIRST MEMORY LOCATION.
4582
4583GET60, 0
4584 NL4000 /SET 4000 /032 CJL
4585 TAD GET6F /GET THE FLAG
4586 DCA GET6F /RETURN THE FLAG
4587 TAD I GET6P /GET TWO BYTES
4588 SZL /HIGH-ORDER WANTED? /032 CJL
4589 JMP GETSWT /JUMP IF NOT /032 CJL
4590 RTR;RTR;RTR /MOVE DOWN HIGH-ORDER HALF /032 CJL
4591 SKP /DON'T BUMP POINTER YET /032 CJL
4592GETSWT, ISZ GET6P /BUMP TO NEXT WORD /032 CJL
4593 AND [77] /STRIP UNUSED BITS /016 CJL
4594 JMP I GET60 /DONE
4595
4596
4597/ LOCAL ROUTINE TO "FILN8" TO MAKE THE 6 BIT CHAR IN THE AC INTO 8 BITS AND
4598/ STORE IN A STRING.
4599
4600MOV8, .-. /6-BIT CHARACTER => 7-BIT CHARACTER /028 CJL
4601 SNA /SKIP IF SOMETHING PASSED /028 CJL
4602 TAD [" &77] /ELSE SUPPLY A <SPACE> /025 CJL
4603 TAD [" &77] /INVERT THE CHARACTER /028 CJL
4604 AND [77] /JUST SIX-BITS /014/016 CJL
4605 TAD [" &77] /MAKE IT SEVEN-BIT ASCII /028 CJL
4606 DCA I MOV8P /STORE IN THE STRING /028 CJL
4607 ISZ MOV8P /BUMP POINTER FOR NEXT TIME /028 CJL
4608 JMP I MOV8 /RETURN /028 CJL
4609
4610MOV8P, 0 /POINTER FOR "MOV8" ROUTINE
4611\f/ ROUTINE TO PULL A FILE NAME IN 6 BIT POINTED TO BY THE AC AND PLACE IN THE
4612/ FILE NAME BUFFER IN 8 BIT ADDING IN THE "." TO SEPARATE FILE NAME AND
4613/ EXTENSION. A MINUS WORD WILL FOLLOW THE NAME.
4614
4615FILN8, 0
4616 DCA GET6P /SET POINTER FOR "GET6"
4617 DCA GET6F /SET FLAG FOR "GET6"
4618 TAD (NAMBUF /GET ADDRESS OF THE NAME BUFFER
4619 DCA MOV8P /SET IN A POINTER
4620 TAD (-6 /6 NAME CHARS TO DO
4621 DCA FILN8C /SAVE IN COUNTER
4622 GET6 /PULL A CHAR
4623 SZA /SKIP IF A SPACE
4624 JMS MOV8 /PUT INTO THE BUFFER
4625 ISZ FILN8C /BUMP COUNTER
4626 JMP .-4 /LOOP TILL ALL 6 DONE
4627 TAD (".&177) /GET A "." /034 CJL
4628 JMS MOV8 /PUT WITH FILE NAME
4629 NL7776 /SET -2 /032 CJL
4630 DCA FILN8C /2 EXTENSION CHARS
4631 GET6 /GET NEXT CHAR
4632 SZA /SKIP IF A SPACE
4633 JMS MOV8 /PUT WITH NAME
4634 ISZ FILN8C /BUMP COUNTER
4635 JMP .-4 /LOOP
4636 NL7777 /SET -1 /032 CJL
4637 DCA I MOV8P /TERMINATE THE STRING
4638 JMP I FILN8 /AND RETURN
4639
4640FILN8C, 0 /COUNTER FOR "FILN8"
4641
4642 PAGE
4643\f/ CONSOLE I/O ROUTINES, ETC. /023 CJL
4644
4645/ CONSOLE MESSAGE PRINT ROUTINE.
4646
4647/ CALLING SEQUENCE:
4648
4649/ JMS I [SCRIBE] /CALL MESSAGE PRINT ROUTINE
4650/ MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE
4651
4652/ AC CAN BE DIRTY ON CALL.
4653
4654/ RETURNS WITH CLEAR AC.
4655
4656/ MESSAGE FORMAT:
4657
4658/ ALL UPPER-CASE CHARACTERS ARE ALLOWED TO EXIST IN THE MESSAGE EXCEPT '%' AND
4659/ '^' WHICH ARE RESERVED. A ZERO HALF-WORD TERMINATES THE MESSAGE STRING. IF
4660/ '%' IS DETECTED, A <CR> AND <LF> WILL BE OUTPUT. IF '^' IS DETECTED, THE
4661/ PREVAILING CASE WILL BE REVERSED. INITIAL CASE IS LOWER-CASE. IF 'UPONLY' IS
4662/ SET TO 7740, ALL CASE CHANGES ARE IGNORED AND THE OUTPUT IS FORCED TO
4663/ UPPER-CASE ONLY. THE MESSAGE ADDRESS MUST BE IN FIELD ONE AND MUST NOT
4664/ OVERLAP AREAS RESERVED FOR OTHER PURPOSES (OS/8 RESIDENT AT 17600-17777, USR
4665/ LOCATIONS 10000-11777, ETC.).
4666
4667
4668SCRIBE, .-. /CONSOLE MESSAGE PRINT ROUTINE
4669 CLA /CLEAN UP /029 CJL
4670 TAD [P7ECHO] /POINT TO /043 CJL
4671RSCRENT,DCA MSGOUT /CONSOLE PRINT ROUTINE
4672 TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT
4673 DCA SCRPTR /STASH THE POINTER
4674 ISZ SCRIBE /BUMP PAST ARGUMENT
4675 TAD UPONLY /GET UPPER-ONLY VALUE /030 CJL
4676 TAD [140] /ADD ON LOWER-CASE VALUE /030 CJL
4677 DCA SCRCASE /STORE INITIAL CASE VALUE
4678SCRLUP, CDF MSGFLD /GOTO MESSAGE FIELD
4679 TAD I SCRPTR /GET LEFT HALF-WORD
4680 RTR;RTR;RTR /MOVE OVER
4681 JMS SCRPRNT /PRINT IT
4682 CDF MSGFLD /GOTO MESSAGE FIELD
4683 TAD I SCRPTR /GET RIGHT HALF-WORD
4684 JMS SCRPRNT /PRINT IT
4685 ISZ SCRPTR /BUMP TO NEXT PAIR
4686 JMP SCRLUP /KEEP GOING
4687\fSCRPRNT,.-. /CHARACTER PRINT ROUTINE
4688 CDF PRGFLD /BACK TO OUR FIELD
4689 AND [77] /JUST SIX BITS
4690 SNA /END OF MESSAGE?
4691 JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER
4692 DCA SCRCHAR /NO, SAVE FOR NOW
4693 TAD SCRCHAR /GET IT BACK
4694 TAD (-"%!200) /IS IT "%"?
4695 SNA /SKIP IF NOT
4696 JMP SCRCRLF /JUMP IF IT MATCHES
4697 TAD [-"^+100+"%] /IS IT "^"
4698 SNA CLA /SKIP IF NOT
4699 JMP SCRFLIP /JUMP IF IT MATCHES
4700 TAD SCRCHAR /GET THE CHARACTER
4701 AND [40] /DOES CASE MATTER?
4702 SNA CLA /SKIP IF NOT
4703 TAD SCRCASE /ELSE GET PREVAILING CASE
4704 TAD SCRCHAR /GET THE CHARACTER
4705SCRPRLF,JMS I MSGOUT /PRINT THE CHARACTER
4706 JMP I SCRPRNT /RETURN
4707
4708SCRCRLF,TAD [CNTRLM] /GET A <CR>
4709 JMS I MSGOUT /PRINT IT
4710 TAD [CNTRLJ] /GET A <LF>
4711 JMP SCRPRLF /CONTINUE THERE
4712
4713SCRFLIP,TAD UPONLY /GET UPPER-ONLY FLAG
4714 SZA CLA /SKIP IF OFF
4715 JMP I SCRPRNT /RETURN IF ON
4716 TAD SCRCASE /GET CURRENT CASE
4717 CIA /INVERT IT
4718 TAD (140+100) /ADD SUM OF POSSIBLE VALUES
4719 DCA SCRCASE /STORE NEW INVERTED CASE
4720 JMP I SCRPRNT /RETURN
4721
4722/ REMOTE LINE MESSAGE PRINT ROUTINE.
4723
4724/ CALLING SEQUENCE:
4725
4726/ JMS I [RSCRIBE] /CALL MESSAGE PRINT ROUTINE
4727/ MESSAGEADDRESS /MESSAGE ADDRESS PASSED IN-LINE
4728
4729/ AC CAN BE DIRTY ON CALL.
4730
4731/ RETURNS WITH CLEAR AC.
4732
4733/ MESSAGE FORMAT AND RESTRICTIONS ARE IDENTICAL TO SCRIBE ROUTINE.
4734
4735RSCRIBE,.-. /REMOTE LINE MESSAGE PRINT ROUTINE
4736 CLA /CLEAN UP /029 CJL
4737 TAD RSCRIBE /GET OUR CALLER
4738 DCA SCRIBE /MAKE IT THEIRS
4739 TAD (COMOUT) /POINT TO REMOTE OUTPUT ROUTINE
4740 JMP RSCRENTRY /CONTINUE THERE
4741\f/ ESCAPE CHARACTER PRINT ROUTINE.
4742
4743/ CALLING SEQUENCE:
4744
4745/ TAD ESCHAR /OR OTHER CHARACTER TO PRINT
4746/ JMS I [ESCPRNT] /CALL ROUTINE
4747/ RETURNS WITH CLEAR AC HERE
4748
4749/ CAUSES CHARACTER TO PRINT LITERALLY IF CHARACTER>37.
4750/ CAUSES MESSAGE "CONTROL-" FOLLOWED BY CHARACTER+100 IF CHARACTER<40.
4751
4752ESCPRNT,.-. /ESCAPE CHARACTER PRINT ROUTINE
4753 DCA ESCTEMP /SAVE PASSED VALUE
4754 TAD ESCTEMP /GET IT BACK
4755 TAD [-40] /COMPARE TO CONTROL LIMIT
4756 SMA CLA /SKIP IF LESS THAN LIMIT
4757 JMP ESPRINT /JUMP IF NOT
4758 JMS I [SCRIBE] /GIVE THEM THE
4759 CONTMSG /CONTROL MESSAGE
4760 TAD [100] /MAKE IT UPPER-CASE, NOT CONTROL
4761ESPRINT,TAD ESCTEMP /GET ORIGINAL VALUE
4762 JMS I [P7ECHO] /PRINT IT /043 CJL
4763 JMP I ESCPRNT /RETURN
4764
4765 MSGOUT= RSCRIBE /OUTPUT ROUTINE POINTER
4766
4767ESCTEMP,.-. /TEMPORARY FOR ESCPRNT ROUTINE
4768SCRCASE,.-. /CURRENT MESSAGE CASE
4769SCRCHAR,.-. /LATEST MESSAGE CHARACTER
4770SCRPTR, .-. /MESSAGE POINTER
4771
4772 PAGE
4773\f/ ROUTINE TO HANDLE THE "CONNECT" COMMAND. /025 CJL
4774
4775CONSRV, .-. /CONNECT SERVICE ROUTINE
4776 JMS I [CREST2] /SETUP CONSOLE OUTPUT ROUTINES /025 CJL
4777 JMS I [SCRIBE] /GIVE THE
4778 CONNMSG /OPENING MESSAGE
4779 TAD ESCHAR /GET THE CURRENT <ESCAPE> CHARACTER
4780 JMS I [ESCPRNT] /PRINT IT
4781 JMS I [SCRIBE] /GIVE THEM THE
4782 CON2MSG /BRIDGING MESSAGE
4783 JMS I [SCRIBE] /PRINT OUT THE
4784 CPUMSG /ACTUAL CPU TYPE
4785 JMS I [SCRIBE] /GIVE THEM THE
4786 CON3MSG /CLOSING MESSAGE
4787CORESET,DCA ESCFLAG /CLEAR <ESCAPE> SEEN FLAG
4788 TAD ESCHAR /GET THE <ESCAPE> CHARACTER
4789 DCA ESCH /STORE IN SEARCH LIST
4790 JMS I (CONRESET) /RESET CONSOLE ROUTINES
4791 JMS I (REMRESET) /RESET REMOTE LINE ROUTINES
4792CONNLUP,TAD KEYERROR /GET KEYBOARD ERROR FLAG
4793 SNA /SKIP IF KEYBOARD ERROR
4794 TAD RINERROR /ELSE GET REMOTE ERROR FLAG
4795 SZA CLA /SKIP IF NEITHER KEYBOARD NOR REMOTE LINE ERRORS
4796 JMP KERROR /JUMP IF KEYBOARD ERROR
4797 JMS I (CONTEST) /TEST IF CONSOLE CAN TAKE OUTPUT
4798 JMP TESTKEYBOARD /JUMP IF NOT
4799 JMS I (REMINPUT) /TEST IF ANY REMOTE INPUT
4800 SKP /SKIP IF NONE
4801 JMS I (CONOUT) /OUTPUT TO CONSOLE
4802TESTKEY,TAD ECHOFLAG /GET LOCAL ECHO FLAG
4803 TAD ESCFLAG /ADD ON <ESCAPE> SEEN FLAG
4804 SNA CLA /SKIP IF LOCAL ECHO POSSIBLY NEEDED
4805 JMP NOLOCALECHO /JUMP IF NOT
4806 JMS I (CONTEST) /TEST IF CONSOLE CAN TAKE OUTPUT
4807 JMP BUFCHECK /JUMP IF NOT
4808NOLOCAL,JMS I (REMTEST) /TEST IF REMOTE CAN TAKE OUTPUT
4809 JMP BUFCHECK /JUMP IF NOT
4810 JMS I (KEYINPUT) /TEST IF ANY KEYBOARD INPUT
4811 JMP BUFCHECK /JUMP IF NOT
4812 DCA KEYLATEST /SAVE FOR LATER
4813 TAD KEYLATEST /GET IT BACK
4814 AND [177] /WANT SEVEN-BIT VERSION FOR TESTS
4815 CIA /INVERT IT
4816 DCA TESTCHAR /SAVE FOR LATER
4817 TAD ESCFLAG /<ESCAPE> SEEN LAST TIME?
4818 SNA CLA /SKIP IF SO
4819 JMP NOESCAPE /JUMP IF NOT
4820 TAD TESTCHAR /GET TEST VAUE
4821 JMS I [SRCHTABLE] /SEARCH FOR IT
4822 ESCLIST-1-1 /SEARCH TABLE POINTER
4823 SNA CLA /SKIP IF FOUND
4824 JMP ESCOMPLAIN /JUMP IF NOT
4825 JMP I TABLEJUMP /GO WHERE YOU'RE SUPPOSED TO
4826\f/ COMES HERE IF PREVIOUS WAS NOT THE <ESCAPE> CHARACTER.
4827
4828NOESCAP,TAD TESTCHAR /GET THE LATEST CHARACTER
4829 TAD ESCHAR /COMPARE TO <ESCAPE> CHARACTER
4830 SZA CLA /SKIP IF IT MATCHES
4831 JMP OUTCHAR /JUMP IF NOT
4832 NL7777 /SET THE
4833/ DCA ESCFLAG /<ESCAPE> SEEN FLAG
4834/ JMP BUFCHECK /CONTINUE THERE
4835 JMP NOESENTRY /CONTINUE THERE
4836
4837/ COMES HERE IF BOTH PREVIOUS AND LATEST ARE THE <ESCAPE> CHARACTER.
4838
4839ESCTYPE,DCA ESCFLAG /CLEAR THE <ESCAPE> SEEN FLAG AND OUTPUT
4840
4841/ COMES HERE IF PREVIOUS AND LATEST CHARACTER ARE NOT THE <ESCAPE> CHARACTER.
4842
4843OUTCHAR,TAD ECHOFLAG /GET LOCAL ECHO FLAG
4844 SNA CLA /SKIP IF SET
4845 JMP NOECHO /JUMP IF NOT
4846 TAD KEYLATEST /GET LATEST CHARACTER
4847 JMS I (CONOUT) /OUTPUT TO CONSOLE
4848NOECHO, TAD KEYLATEST /GET LATEST CHARACTER
4849 JMS I (REMOUT) /OUTPUT TO REMOTE
4850 JMP BUFCHECK /CONTINUE THERE
4851
4852/ COMES HERE IF PREVIOUS WAS THE <ESCAPE> CHARACTER AND THE LATEST IS NOT
4853/ A VALID <ESCAPE> COMMAND CHARACTER.
4854
4855ESCOMPL,TAD [CNTRLG] /GET A <BEL>
4856 JMS I (CONOUT) /OUTPUT TO CONSOLE
4857NOESENT,DCA ESCFLAG /CLEAR <ESCAPE> SEEN FLAG
4858BUFCHEC,JMS I PUPSTATUS /UPDATE THE PORT STATUS /047 CJL
4859
4860/ THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR
4861/ KL8 INTERFACES.
4862
4863 *BUFCHECK /OVERLAY DECMATE CODE /047 CJL
4864
4865BUFCHEC,NOP /DON'T CHECK PORT STATUS /047 CJL
4866
4867 JMS I (RINUPDATE) /CHECK FOR MORE REMOTE INPUT
4868 JMS I (KEYUPDATE) /CHECK FOR MORE KEYBOARD INPUT
4869 JMS I (REMUPDATE) /CHECK FOR MORE REMOTE OUTPUT
4870 JMS I (CONUPDATE) /CHECK FOR MORE CONSOLE OUTPUT
4871 JMP CONNLUP /GO BACK FOR MORE
4872
4873/ COMES HERE ON <ESCAPE> C(LOSE).
4874
4875ESCLOSE,ISZ CONSRV /BUMP TO GOOD RETURN
4876 JMP I CONSRV /RETURN
4877\fKERRLUP,JMS I PUPSTATUS /UPDATE THE PORT STATUS /047 CJL
4878
4879/ THE ABOVE INSTRUCTION IS FOR DECMATE USE ONLY. THE DEFAULT INSTRUCTION IS FOR
4880/ KL8 INTERFACES.
4881
4882 *KERRLUP /OVERLAY DECMATE CODE /047 CJL
4883
4884KERRLUP,NOP /DON'T CHECK PORT STATUS /047 CJL
4885
4886 JMS I (RINUPDATE) /CHECK FOR MORE REMOTE INPUT
4887 JMS I (KEYUPDATE) /CHECK FOR MORE KEYBOARD INPUT
4888 JMS I (REMUPDATE) /CHECK FOR MORE REMOTE OUTPUT
4889 JMS I (CONUPDATE) /CHECK FOR MORE CONSOLE OUTPUT
4890
4891/ COMES HERE ON KEYBOARD INPUT ERROR.
4892
4893KERROR, JMS I (CONTEST) /CONSOLE READY FOR OUTPUT?
4894 JMP KERRLUP /NO, GO WAIT AWHILE
4895 TAD I (CONINSERT) /GET CONSOLE INSERTION POINTER
4896 CIA /INVERT FOR TEST
4897 TAD I (CONREMOVE) /COMPARE TO CONSOLE REMOVAL POINTER
4898 SZA CLA /SKIP IF CONSOLE OUTPUT BUFFER EMPTY
4899 JMP KERRLUP /GO WAIT FOR AWHILE
4900 TAD KEYERROR /KEYBOARD INPUT ERROR?
4901 SNA CLA /SKIP IF SO
4902 JMP RIERTST /JUMP IF NOT
4903 JMS I [SCRIBE] /TELL THEM
4904 KERRMSG /WE HAD A KEYBOARD ERROR
4905RIERTST,TAD RINERROR /REMOTE INPUT ERROR?
4906 SNA CLA /SKIP IF SO
4907 JMP CORESET /JUMP IF NOT
4908 JMS I [SCRIBE] /TELL THEM
4909 RIERMSG /WE HAD A REMOTE LINE ERROR
4910 JMP CORESET /RESTART
4911
4912/ <ESCAPE> CHARACTER SEARCH LIST.
4913
4914ESCLIST,UPPERC; ESCLOSE /<ESCAPE> C(LOSE)
4915 LOWERC; ESCLOSE /<ESCAPE> C(LOSE) (LOWER-CASE)
4916ESCH, .-.; ESCTYPE /<ESCAPE> <ESCAPE>
4917 0 /THIS ENDS THE LIST
4918
4919/ LOCAL ECHO FLAG FOR CONNECT MODE.
4920
4921ECHOFLA,INIECHO /0=DON'T ECHO, NON-ZERO=ECHO /039 CJL
4922ESCFLAG,.-. /<ESCAPE> CHARACTER SEEN FLAG
4923KEYLATE,.-. /LATEST KEYBOARD CHARACTER
4924PUPSTAT,UPSTATUS /POINTER TO DECMATE STATUS UPDATE /047 CJL
4925TESTCHA,.-. /LATEST KEYBOARD TEST CHARACTER
4926\f PAGE
4927\f/ CONNECT-MODE SUPPORT ROUTINES. /047 CJL
4928
4929/ CONSOLE KEYBOARD ROUTINES. /047 CJL
4930
4931/ KEYBOARD INPUT ROUTINE. /026 CJL
4932
4933/ CALLING SEQUENCE:
4934
4935/ JMS I (KEYINPUT) /CALL ROUTINE
4936/ NO INPUT /RETURN IF NO INPUT
4937/ INPUT /RETURN IF INPUT AVAILABLE
4938
4939/ THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT.
4940
4941/ THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN.
4942
4943KEYINPU,.-. /KEYBOARD INPUT ROUTINE
4944 TAD KEYINSERT /GET INSERTION POINTER
4945 CIA /INVERT FOR TEST
4946 TAD KEYREMOVE /COMPARE TO REMOVAL POINTER
4947 SNA CLA /SKIP IF BUFFER NOT EMPTY
4948 JMP KEYCHECK /JUMP IF BUFFER EMPTY
4949 TAD KEYREMOVE /GET REMOVAL POINTER
4950 DCA KEYTEMP /SAVE FOR LATER
4951 NL0001 /SET INCREMENT
4952 TAD KEYREMOVE /UPDATE REMOVAL POINTER
4953 AND [BUFSIZE-1] /JUST BUFFER BITS
4954 TAD [KEYBUFFER] /MAKE IT ABSOLUTE
4955 DCA KEYREMOVE /STORE UPDATED POINTER
4956 CDF BUFFLD /GOTO BUFFER FIELD
4957 TAD I KEYTEMP /GET THE LATEST CHARACTER
4958 CDF PRGFLD /BACK TO OUR FIELD
4959 SKP /DON'T GET ANOTHER CHARACTER /047 CJL
4960
4961/ COMES HERE IF BUFFER IS EMPTY.
4962
4963KEYCHEC,JMS KEYGET /TRY TO GET A CHARACTER NOW /047 CJL
4964 ISZ KEYINPUT /GOT ONE, SO TAKE SKIP RETURN /047 CJL
4965 JMP I KEYINPUT /RETURN EITHER WAY
4966\f/ KEYBOARD BUFFER UPDATE ROUTINE. /026 CJL
4967
4968/ CALLING SEQUENCE:
4969
4970/ JMS I (KEYUPDATE) /CALL ROUTINE
4971
4972/ RETURNS WITH CLEAR AC. ANY KEYBOARD INPUT WHICH JUST OCCURRED WILL BE
4973/ BUFFERED; CALLS TO KEYINPUT WILL RETRIEVE THE CHARACTERS.
4974
4975KEYUPDA,.-. /KEYBOARD BUFFER UPDATE ROUTINE
4976 JMS KEYGET /TRY TO GET A CHARACTER NOW /047 CJL
4977 SKP /GOT ONE, DON'T LEAVE YET /047 CJL
4978 JMP I KEYUPDATE /CHARACTER NOT AVAILABLE NOW, RETURN /047 CJL
4979 CDF BUFFLD /GOTO BUFFER FIELD
4980 DCA I KEYINSERT /STORE IN THE BUFFER
4981 CDF PRGFLD /BACK TO OUR FIELD
4982 NL0001 /SET INCREMENT
4983 TAD KEYINSERT /UPDATE POINTER
4984 AND [BUFSIZE-1] /JUST BUFFER BITS
4985 TAD [KEYBUFFER] /MAKE IT ABSOLUTE
4986 DCA KEYINSERT /STORE BACK UPDATED POINTER
4987 TAD KEYINSERT /GET INSERTION POINTER
4988 CIA /INVERT FOR TEST
4989 TAD KEYREMOVE /COMPARE TO REMOVAL POINTER
4990 SNA CLA /SKIP IF NOT EQUAL
4991KSERROR,ISZ KEYERROR /INDICATE KEYBOARD ERROR
4992 JMP I KEYUPDATE /RETURN
4993 JMP KSERROR /MAKE SURE ERROR IS INDICATED
4994\f/ KEYBOARD GET A CHARACTER ROUTINE. /047 CJL
4995
4996/ CALLING SEQUENCE:
4997
4998/ JMS KEYGET /CALL ROUTINE
4999/ CHARACTER AVAILABLE /RETURNS HERE WITH LATEST CHARACTER
5000/ NO CHARACTER AVAILABLE /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL
5001
5002/ NORMAL RETURN HAS LATEST CHARACTER IN AC.
5003
5004/ SKIP RETURN HAS CLEAR AC.
5005
5006/ IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN.
5007
5008KEYGET, .-. /KEYBOARD GET A CHARACTER ROUTINE
5009KGTEST, KSFIOT /FLAG UP?
5010 JMP KEYGNONE /NO, TAKE SKIP RETURN
5011KGREAD, KRBIOT /YES, READ THE CHARACTER
5012 SPA /SKIP IF NO UART ERRORS
5013 ISZ KEYERROR /INDICATE KEYBOARD ERROR
5014 SKP /SKIP IF NOT TOO MANY ERRORS
5015 JMP .-2 /ENSURE KEYBOARD ERROR IS INDICATED
5016 AND [377] /JUST EIGHT-BIT
5017 DCA KEYTEMP /SAVE FOR NOW
5018 TAD FLOWFLAG /GET FLOW CONTROL FLAG
5019 SNA CLA /SKIP IF SET
5020 JMP KEYGEXIT /JUMP IF NOT
5021 TAD KEYTEMP /GET THE CHARACTER
5022 AND [177] /JUST SEVEN-BIT
5023 TAD [-CNTRLS] /COMPARE TO <^S>
5024 SNA /SKIP IF OTHER
5025 JMP KWATSET /JUMP IF IT MATCHES
5026 TAD [-CNTRLQ+CNTRLS]/COMPARE TO <^S>
5027 SNA CLA /SKIP IF OTHER
5028 JMP KWATCLEAR /JUMP IF IT MATCHES
5029KEYGEXI,TAD KEYTEMP /GET THE CHARACTER
5030 JMP I KEYGET /TAKE IMMEDIATE RETURN
5031
5032/ COMES HERE ON <^S> TO SET OUTPUT WAIT.
5033
5034KWATSET,NL4000 /SET WAIT VALUE
5035
5036/ COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT.
5037
5038KWATCLE,DCA CONWAIT /STORE NEW STATE
5039KEYGNON,ISZ KEYGET /BUMP RETURN ADDRESS
5040 JMP I KEYGET /TAKE SKIP RETURN
5041\f/ CONSOLE TERMINAL ROUTINES.
5042
5043/ CONSOLE OUTPUT ROUTINE.
5044
5045/ CALLING SEQUENCE:
5046
5047/ TAD CHAR /CHARACTER TO OUTPUT IN AC
5048/ JMS I (CONOUT) /CALL ROUTINE
5049/ RETURN /RETURNS HERE WITH CLEAR AC
5050
5051CONOUT, .-. /CONSOLE OUTPUT ROUTINE
5052 DCA CONTEMP /SAVE PASSED VALUE
5053 TAD CONINSERT /GET INSERTION POINTER
5054 CIA /INVERT FOR TEST
5055 TAD CONREMOVE /COMPARE TO REMOVAL POINTER
5056 TAD CONWAIT /ADD ON WAIT STATUS
5057 SZA CLA /SKIP IF BUFFER EMPTY AND NOT WAITING /047 CJL
5058 JMP CSTUFF /JUMP IF CHARACTER MUST BE BUFFERED
5059 TAD CONTEMP /GET PASSED VALUE /047 CJL
5060 JMS I (CONPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
5061 JMP CSTUFF /COULDN'T OUTPUT IT, SO BUFFER IT /047 CJL
5062 JMP I CONOUT /RETURN
5063
5064CSTUFF, TAD CONTEMP /GET THE CHARACTER
5065 CDF BUFFLD /GOTO BUFFER FIELD
5066 DCA I CONINSERT /STORE THE CHARACTER
5067 CDF PRGFLD /BACK TO OUR FIELD
5068 NL0001 /SET INCREMENT
5069 TAD CONINSERT /UPDATE POINTER
5070 AND [BUFSIZE-1] /JUST BUFFER BITS
5071 TAD [CONBUFFER] /MAKE IT ABSOLUTE
5072 DCA CONINSERT /STORE BACK UPDATED POINTER
5073 JMP I CONOUT /RETURN
5074
5075/ CONSOLE OUTPUT TEST ROUTINE.
5076
5077/ CALLING SEQUENCE:
5078
5079/ JMS I (CONTEST) /CALL ROUTINE
5080/ NOT READY /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER
5081/ READY /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW
5082
5083CONTEST,.-. /CONSOLE OUTPUT TEST ROUTINE
5084 NL0001 /SET BUFFER INCREMENT
5085 TAD CONINSERT /GET UPDATED INSERTION POINTER
5086 CIA /INVERT FOR TEST
5087 TAD CONREMOVE /COMPARE TO REMOVAL POINTER
5088 AND [BUFSIZE-1] /JUST BUFFER BITS
5089 SZA CLA /SKIP IF BUFFER IS FULL
5090 ISZ CONTEST /BUMP RETURN IF NOT
5091 JMP I CONTEST /RETURN EITHER WAY
5092\f/ CONSOLE OUTPUT BUFFER UPDATE ROUTINE.
5093
5094/ CALLING SEQUENCE:
5095
5096/ JMS I (CONUPDATE) /CALL ROUTINE
5097/ RETURN /RETURN WITH CLEAR AC
5098
5099/ THE CONSOLE OUTPUT BUFFERING ROUTINES WILL UPDATE POINTERS, ETC. IF ANY
5100/ STATUS HAS CHANGED SINCE THE LAST CALL.
5101
5102CONUPDA,.-. /CONSOLE OUTPUT UPDATE ROUTINE
5103 TAD CONWAIT /FLOW CONTROL WAIT SET?
5104 SZA CLA /SKIP IF NOT
5105 JMP I CONUPDATE /JUST RETURN IF SO
5106 TAD CONINSERT /GET INSERTION POINTER
5107 CIA /INVERT FOR TEST
5108 TAD CONREMOVE /COMPARE TO REMOVAL POINTER
5109 SNA CLA /SKIP IF BUFFER CONTAINS SOMETHING /047 CJL
5110 JMP I CONUPDATE /RETURN IF BUFFER EMPTY /047 CJL
5111 CDF BUFFLD /GOTO BUFFER FIELD
5112 TAD I CONREMOVE /GET A CHARACTER FROM THE BUFFER
5113 CDF PRGFLD /BACK TO OUR FIELD
5114 JMS I (CONPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
5115 JMP I CONUPDATE /COULDN'T DO IT, SO JUST RETURN /047 CJL
5116 NL0001 /SET BUFFER INCREMENT
5117 TAD CONREMOVE /UPDATE REMOVAL POINTER
5118 AND [BUFSIZE-1] /JUST BUFFER BITS
5119 TAD [CONBUFFER] /MAKE IT ABSOLUTE
5120 DCA CONREMOVE /STORE UPDATED POINTER
5121 JMP I CONUPDATE /RETURN
5122
5123CONINSE,.-. /CONSOLE OUTPUT INSERTION POINTER
5124CONREMO,.-. /CONSOLE OUTPUT REMOVAL POINTER
5125
5126/ CONSOLE FLOW CONTROL WAIT FLAG.
5127
5128CONWAIT,.-. /0=DON'T WAIT, 4000=WAIT FOR <^Q>
5129KEYINSE,.-. /KEYBOARD BUFFER INSERTION POINTER
5130KEYREMO,.-. /KEYBOARD BUFFER REMOVAL POINTER
5131
5132 CONTEMP=CONUPDATE /CONSOLE OUTPUT TEMPORARY
5133
5134 KEYTEMP=CONUPDATE /KEYBOARD INPUT TEMPORARY
5135
5136 PAGE
5137\f/ REMOTE LINE ROUTINES.
5138
5139/ REMOTE LINE INPUT ROUTINE. /026 CJL
5140
5141/ CALLING SEQUENCE:
5142
5143/ JMS I (REMINPUT) /CALL ROUTINE
5144/ NO INPUT /RETURN IF NO INPUT
5145/ INPUT /RETURN IF INPUT AVAILABLE
5146
5147/ THE AC WILL BE CLEAR IF THE IMMEDIATE RETURN IS TAKEN FOR NO INPUT.
5148
5149/ THE AC WILL CONTAIN THE LATEST CHARACTER IF THE SKIP RETURN IS TAKEN.
5150
5151REMINPU,.-. /REMOTE LINE INPUT ROUTINE
5152 TAD RININSERT /GET INSERTION POINTER
5153 CIA /INVERT FOR TEST
5154 TAD RINREMOVE /COMPARE TO REMOVAL POINTER
5155 SNA CLA /SKIP IF BUFFER NOT EMPTY
5156 JMP RINCHECK /JUMP IF BUFFER EMPTY
5157 TAD RINREMOVE /GET REMOVAL POINTER
5158 DCA RINTEMP /SAVE FOR LATER
5159 NL0001 /SET INCREMENT
5160 TAD RINREMOVE /UPDATE REMOVAL POINTER
5161 AND [BUFSIZE-1] /JUST BUFFER BITS
5162 TAD (RINBUFFER) /MAKE IT ABSOLUTE
5163 DCA RINREMOVE /STORE UPDATED POINTER
5164 CDF BUFFLD /GOTO BUFFER FIELD
5165 TAD I RINTEMP /GET THE LATEST CHARACTER
5166 CDF PRGFLD /BACK TO OUR FIELD
5167 DCA RINTEMP /SAVE FOR LATER
5168 TAD FLOWFLAG /GET FLOW CONTROL FLAG
5169 SNA CLA /SKIP IF SET
5170 JMP REMINEXIT /JUMP IF NOT
5171 NL4000 /SET WAITING VALUE
5172 TAD RINWAIT /ARE WE WAITING TO EMPTY?
5173 SZA CLA /SKIP IF SO
5174 JMP REMINEXIT /JUMP IF NOT
5175 TAD RININSERT /GET INSERTION POINTER
5176 CIA /INVERT FOR TEST
5177 TAD RINREMOVE /COMPARE TO REMOVAL POINTER
5178 AND [BUFSIZE^3%4] /JUST 3/4 BITS
5179 SZA CLA /SKIP IF BUFFER NOW 1/4 FULL (OR LESS)
5180 JMP REMINEXIT /JUMP IF NOT
5181 NL7777 /SET BUFFER EMPTYING VALUE
5182 DCA RINWAIT /STORE FOR OUTPUT ROUTINE
5183REMINEX,TAD RINTEMP /GET THE CHARACTER
5184 SKP /DON'T GET ANOTHER ONE /047 CJL
5185
5186/ COMES HERE IF REMOTE LINE INPUT BUFFER IS EMPTY.
5187
5188RINCHEC,JMS RINGET /TRY TO GET A CHARACTER NOW /047 CJL
5189 ISZ REMINPUT /GOT ONE, SO TAKE SKIP RETURN /047 CJL
5190 JMP I REMINPUT /RETURN EITHER WAY
5191\f/ REMOTE LINE INPUT BUFFER UPDATE ROUTINE. /026 CJL
5192
5193/ CALLING SEQUENCE:
5194
5195/ JMS I (RINUPDATE) /CALL ROUTINE
5196
5197/ RETURNS WITH CLEAR AC. ANY REMOTE LINE INPUT WHICH JUST OCCURRED WILL BE
5198/ BUFFERED; CALLS TO REMINPUT WILL RETRIEVE THE CHARACTERS.
5199
5200RINUPDA,.-. /REMOTE LINE INPUT BUFFER UPDATE ROUTINE
5201 JMS RINGET /TRY TO GET A CHARACTER NOW /047 CJL
5202 SKP /GOT ONE, DON'T LEAVE YET /047 CJL
5203 JMP I RINUPDATE /CHARACTER NOT AVAILABLE NOW, RETURN /047 CJL
5204 CDF BUFFLD /GOTO BUFFER FIELD
5205 DCA I RININSERT /STORE IN THE BUFFER
5206 CDF PRGFLD /BACK TO OUR FIELD
5207 NL0001 /SET INCREMENT
5208 TAD RININSERT /UPDATE POINTER
5209 AND [BUFSIZE-1] /JUST BUFFER BITS
5210 TAD (RINBUFFER) /MAKE IT ABSOLUTE
5211 DCA RININSERT /STORE BACK UPDATED POINTER
5212 TAD RININSERT /GET INSERTION POINTER
5213 CIA /INVERT FOR TEST
5214 TAD RINREMOVE /COMPARE TO REMOVAL POINTER
5215 SNA /SKIP IF BUFFER NOT FULL
5216 ISZ RINERROR /INDICATE REMOTE LINE INPUT ERROR
5217 SKP /SKIP IF NO OVERFLOW
5218 JMP .-2 /ENSURE ERROR IS SET
5219 TAD [BUFSIZE^3%4] /SUBTRACT 1/4 BUFFER'S WORTH
5220 AND [BUFSIZE^3%4] /JUST 3/4 BUFFER BITS
5221 SNA CLA /SKIP IF NOT 3/4 FULL
5222 TAD FLOWFLAG /ELSE CHECK IF FLOW CONTROL IS ENABLED
5223 SNA CLA /SKIP IF 3/4 FULL AND FLOW CONTROL IS ENABLED
5224 JMP I RINUPDATE /JUST RETURN
5225 TAD RINWAIT /GET INPUT WAIT FLAG
5226 SNA CLA /SKIP IF ALREADY SET
5227 ISZ RINWAIT /SET TO <^S> STATE
5228 JMP I RINUPDATE /RETURN
5229\f/ REMOTE LINE GET A CHARACTER ROUTINE. /047 CJL
5230
5231/ CALLING SEQUENCE:
5232
5233/ JMS I (RINGET) /CALL ROUTINE
5234/ CHARACTER AVAILABLE /RETURNS HERE WITH LATEST CHARACTER
5235/ NO CHARACTER AVAILABLE /RETURNS HERE IF NO CHARACTER OR HANDLED FLOW-CONTROL
5236
5237/ NORMAL RETURN HAS LATEST CHARACTER IN AC.
5238
5239/ SKIP RETURN HAS CLEAR AC.
5240
5241/ IF FLOWFLAG=0, FLOW CHARACTERS ARE UNPROCESSED AND CAUSE NORMAL RETURN.
5242
5243RINGET, .-. /REMOTE LINE GET A CHARACTER ROUTINE
5244RINTEST,TAD INFLAG /IS INPUT AVAILABLE?
5245RINGT0, SNA CLA /SKIP IF SO
5246RINREAD,JMP RINGNONE /JUMP IF NOT
5247RINGT1, DCA INFLAG /CLEAR AVAILABILITY FLAG
5248RINGT2, IRB /READ IN THE CHARACTER
5249
5250/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
5251/ ARE FOR KL8 INTERFACES.
5252
5253 *RINTEST /OVERLAY DECMATE II CODE
5254
5255RINTEST,RKSFIOT /FLAG UP?
5256RINGT0, JMP RINGNONE /NO, TAKE SKIP RETURN
5257RINREAD,RKRBIOT /YES, READ THE CHARACTER
5258RINGT1, SKP /NO ERRORS ON DECMATE I
5259
5260/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
5261/ FOR KL8 INTERFACES.
5262
5263 *RINGT1 /OVERLAY DECMATE I CODE
5264
5265RINGT1, SPA /SKIP IF NO UART ERRORS
5266RING2, ISZ RINERROR /INDICATE REMOTE LINE INPUT ERROR
5267 SKP /SKIP IF NOT TOO MANY ERRORS
5268 JMP .-2 /ENSURE REMOTE LINE INPUT ERROR IS INDICATED
5269 AND [377] /JUST EIGHT-BIT
5270 DCA RINTEMP /SAVE FOR NOW
5271 TAD FLOWFLAG /GET FLOW CONTROL FLAG
5272 SNA CLA /SKIP IF SET
5273 JMP RINGEXIT /JUMP IF NOT
5274 TAD RINTEMP /GET THE CHARACTER
5275 AND [177] /JUST SEVEN-BIT
5276 TAD [-CNTRLS] /COMPARE TO <^S>
5277 SNA /SKIP IF OTHER
5278 JMP RWATSET /JUMP IF IT MATCHES
5279 TAD [-CNTRLQ+CNTRLS]/COMPARE TO <^S>
5280 SNA CLA /SKIP IF OTHER
5281 JMP RWATCLEAR /JUMP IF IT MATCHES
5282RINGEXI,TAD RINTEMP /GET THE CHARACTER
5283 JMP I RINGET /TAKE IMMEDIATE RETURN
5284\f/ COMES HERE ON <^S> TO SET OUTPUT WAIT.
5285
5286RWATSET,NL4000 /SET WAIT VALUE
5287
5288/ COMES HERE ON <^Q> TO CLEAR OUTPUT WAIT.
5289
5290RWATCLE,DCA REMWAIT /STORE NEW STATE
5291RINGNON,ISZ RINGET /BUMP RETURN ADDRESS
5292 JMP I RINGET /TAKE SKIP RETURN
5293
5294/ REMOTE LINE RESET ROUTINE. /026 CJL
5295
5296/ CALLING SEQUENCE:
5297
5298/ JMS I (REMRESET) /CALL ROUTINE
5299/ RETURN /RETURN WITH CLEAR AC
5300
5301/ RETURNS WITH CLEAR AC AND ALL REMOTE LINE VARIABLES RESET.
5302
5303REMRESE,.-. /REMOTE LINE RESET ROUTINE
5304 TAD [REMBUFFER] /SETUP THE REMOTE LINE
5305 DCA REMINSERT /OUTPUT INSERTION POINTER
5306 TAD [REMBUFFER] /SETUP THE REMOTE LINE
5307 DCA REMREMOVE /OUTPUT REMOVAL POINTER
5308 TAD (RINBUFFER) /SETUP THE REMOTE LINE
5309 DCA RININSERT /INPUT INSERTION POINTER
5310 TAD (RINBUFFER) /SETUP THE REMOTE LINE
5311 DCA RINREMOVE /INPUT REMOVAL POINTER
5312 DCA REMWAIT /CLEAR REMOTE OUTPUT WAIT
5313 DCA RINWAIT /CLEAR REMOTE INPUT WAIT
5314 DCA RINERROR /CLEAR REMOTE INPUT ERROR
5315 JMP I REMRESET /RETURN
5316
5317RININSE,.-. /REMOTE INPUT INSERTION POINTER
5318RINREMO,.-. /REMOTE INPUT REMOVAL POINTER
5319RINTEMP,.-. /REMOTE INPUT TEMPORARY /047 CJL
5320
5321 PAGE
5322\f/ REMOTE LINE OUTPUT ROUTINE.
5323
5324/ CALLING SEQUENCE:
5325
5326/ TAD CHAR /CHARACTER TO OUTPUT IN AC
5327/ JMS I (REMOUT) /CALL ROUTINE
5328/ RETURN /RETURNS HERE WITH CLEAR AC
5329
5330REMOUT, .-. /REMOTE LINE OUTPUT ROUTINE
5331 DCA REMTEMP /SAVE PASSED VALUE
5332 TAD REMINSERT /GET INSERTION POINTER
5333 CIA /INVERT FOR TEST
5334 TAD REMREMOVE /COMPARE TO REMOVAL POINTER
5335 TAD REMWAIT /ADD ON WAIT STATUS
5336 SZA CLA /SKIP IF BUFFER EMPTY AND NOT WAITING /047 CJL
5337 JMP RSTUFF /JUMP IF CHARACTER MUST BE BUFFERED
5338 TAD REMTEMP /GET PASSED VALUE /047 CJL
5339 JMS I (REMPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
5340 JMP RSTUFF /COULDN'T OUTPUT IT, SO BUFFER IT /047 CJL
5341 JMP I REMOUT /RETURN
5342
5343RSTUFF, TAD REMTEMP /GET THE CHARACTER
5344 CDF BUFFLD /GOTO BUFFER FIELD
5345 DCA I REMINSERT /STORE IN BUFFER
5346 CDF PRGFLD /BACK TO OUR FIELD
5347 NL0001 /SET BUFFER INCREMENT
5348 TAD REMINSERT /BUMP INSERTION POINTER
5349 AND [BUFSIZE-1] /JUST BUFFER BITS
5350 TAD [REMBUFFER] /MAKE IT ABSOLUTE
5351 DCA REMINSERT /STORE UPDATED POINTER
5352 JMP I REMOUT /RETURN
5353
5354/ REMOTE LINE OUTPUT TEST ROUTINE.
5355
5356/ CALLING SEQUENCE:
5357
5358/ JMS I (REMTEST) /CALL ROUTINE
5359/ NOT READY /RETURN IF OUTPUT NOT READY FOR NEXT CHARACTER
5360/ READY /OUTPUT CAN ACCEPT ANOTHER CHARACTER NOW
5361
5362/ AC WILL BE CLEARED AFTER THE CALL.
5363
5364REMTEST,.-. /REMOTE LINE OUTPUT TEST ROUTINE
5365 NL0001 /SET BUFFER INCREMENT
5366 TAD REMINSERT /GET INSERTION POINTER
5367 CIA /INVERT FOR TEST
5368 TAD REMREMOVE /COMPARE TO REMOVAL POINTER
5369 AND [BUFSIZE-1] /JUST BUFFER BITS
5370 SZA CLA /SKIP IF BUFFER IS FULL
5371 ISZ REMTEST /BUMP RETURN IF BUFFER IS NOT FULL
5372 JMP I REMTEST /RETURN EITHER WAY
5373\f/ REMOTE LINE OUTPUT BUFFER UPDATE ROUTINE.
5374
5375/ CALLING SEQUENCE:
5376
5377/ JMS I (REMUPDATE) /CALL ROUTINE
5378/ RETURN /RETURN WITH CLEAR AC
5379
5380/ THE REMOTE LINE OUTPUT BUFFERING ROUTINES WILL UPDATE POINTERS, ETC. IF ANY
5381/ STATUS HAS CHANGED SINCE THE LAST CALL.
5382
5383REMUPDA,.-. /REMOTE LINE OUTPUT UPDATE ROUTINE
5384 TAD RINWAIT /GET INPUT WAIT FLAG
5385 CLL RAL /MAIN STATE BIT TO LINK
5386 SNA CLA /SKIP IF OUTPUT FLOW CHARACTER NEEDED /047 CJL
5387 JMP REMCHECK /JUMP IF CHARACTER NOT NEEDED NOW /047 CJL
5388 TAD (CNTRLQ) /ASSUME RELEASE CHARACTER NEEDED /047 CJL
5389 SNL /SKIP IF SO /047 CJL
5390 TAD [CNTRLS-CNTRLQ] /ELSE CHANGE IT TO HOLD CHARACTER /047 CJL
5391 JMS I (REMPUT) /TRY TO OUTPUT IT NOW /047 CJL
5392 JMP REMCHECK /COULDN'T DO IT, FORGET IT FOR NOW /047 CJL
5393 CML RAR /SET NEW STATE VALUE /047 CJL
5394 DCA RINWAIT /STORE IT
5395REMCHEC,TAD REMWAIT /GET OUTPUT WAIT FLAG
5396 SZA CLA /SKIP IF NOT WAITING
5397 JMP I REMUPDATE /JUST RETURN IF WAITING
5398 TAD REMINSERT /GET OUTPUT INSERTION POINTER
5399 CIA /INVERT FOR TEST
5400 TAD REMREMOVE /COMPARE TO OUTPUT REMOVAL POINTER
5401 SNA CLA /SKIP IF BUFFER CONTAINS SOMETHING /047 CJL
5402 JMP I REMUPDATE /RETURN IF BUFFER EMPTY /047 CJL
5403 CDF BUFFLD /GOTO BUFFER FIELD
5404 TAD I REMREMOVE /GET A CHARACTER FROM THE BUFFER
5405 CDF PRGFLD /BACK TO OUR FIELD
5406 JMS I (REMPUT) /TRY TO OUTPUT THE CHARACTER NOW /047 CJL
5407 JMP I REMUPDATE /COULDN'T DO IT, SO JUST RETURN /047 CJL
5408 NL0001 /SET BUFFER INCREMENT
5409 TAD REMREMOVE /BUMP REMOVAL POINTER
5410 AND [BUFSIZE-1] /JUST BUFFER BITS
5411 TAD [REMBUFFER] /MAKE IT ABSOLUTE
5412 DCA REMREMOVE /STORE UPDATED POINTER
5413 JMP I REMUPDATE /RETURN
5414
5415 REMTEMP=REMUPDATE /REMOTE OUTPUT TEMPORARY
5416\f/ LOW-LEVEL CONSOLE OUTPUT ROUTINE. /047 CJL
5417
5418/ CALLING SEQUENCE:
5419
5420/ [CHARACTER TO OUTPUT IN THE AC]
5421
5422/ JMS I (CONPUT) /CALL ROUTINE
5423/ NO OUTPUT /RETURNS HERE IF OUTPUT UNAVAILABLE
5424/ OUTPUT /RETURNS HERE IF CHARACTER WAS OUTPUT
5425
5426CONPUT, .-. /CONSOLE OUTPUT ROUTINE
5427CONTSF, TSFIOT /FLAG UP?
5428 JMP CONCLEAR /NO, FORGET IT
5429CONTLS, TLSIOT /YES, OUTPUT THE CHARACTER NOW
5430 ISZ CONPUT /TAKE SKIP RETURN
5431CONCLEA,CLA /CLEAN UP
5432 JMP I CONPUT /RETURN EITHER WAY
5433
5434/ CONSOLE RESET ROUTINE. /026 CJL
5435
5436/ CALLING SEQUENCE:
5437
5438/ JMS I (CONRESET) /CALL ROUTINE
5439/ RETURN /RETURN WITH CLEAR AC
5440
5441/ RETURNS WITH CLEAR AC AND ALL CONSOLE VARIABLES RESET.
5442
5443CONRESE,.-. /CONSOLE RESET ROUTINE
5444 TAD [CONBUFFER] /SETUP THE
5445 DCA I (CONINSERT) /CONSOLE OUTPUT INSERTION POINTER
5446 TAD [CONBUFFER] /SETUP THE
5447 DCA I (CONREMOVE) /CONSOLE OUTPUT REMOVAL POINTER
5448 TAD [KEYBUFFER] /SETUP THE
5449 DCA I (KEYINSERT) /KEYBOARD INSERTION POINTER
5450 TAD [KEYBUFFER] /SETUP THE
5451 DCA I (KEYREMOVE) /KEYBOARD REMOVAL POINTER
5452 DCA I (CONWAIT) /CLEAR OUTPUT WAIT
5453 DCA KEYERROR /CLEAR KEYBOARD ERROR
5454 JMP I CONRESET /RETURN
5455\f/ LOW-LEVEL REMOTE LINE OUTPUT ROUTINE. /047 CJL
5456
5457/ CALLING SEQUENCE:
5458
5459/ [CHARACTER TO OUTPUT IN THE AC]
5460
5461/ JMS I (REMPUT) /CALL ROUTINE
5462/ NO OUTPUT /RETURNS HERE IF OUTPUT UNAVAILABLE
5463/ OUTPUT /RETURNS HERE IF CHARACTER WAS OUTPUT
5464
5465REMPUT, .-. /REMOTE LINE OUTPUT ROUTINE
5466DM1AN2, AND [377] /ENSURE EIGHT BIT /049 CJL
5467
5468/ THE ABOVE INSTRUCTION IS FOR DECMATE I USE ONLY. THE DEFAULT INSTRUCTION IS
5469/ FOR KL8 INTERFACES.
5470
5471 *DM1AN2 /OVERLAY DECMATE II CODE /049 CJL
5472
5473DM1AN2, SKP /WE'RE NOT A DECMATE I /049 CJL
5474 TAD [400] /SET WRITE BIT /049 CJL
5475REMTSF, DCA RMPTEMP /SAVE PASSED VALUE
5476RMPUT0, TAD OUTFLAG /CHECK IF OUTPUT IS AVAILABLE
5477REMTLS, SNA CLA /SKIP IF SO
5478RMPUT1, JMP I REMPUT /RETURN IF NOT
5479REMCLEA,TAD RMPTEMP /GET THE PASSED VALUE
5480RMPUT2, OLS /OUTPUT THE CHARACTER NOW
5481
5482/ THE ABOVE INSTRUCTIONS ARE FOR DECMATE II USE ONLY. THE DEFAULT INSTRUCTIONS
5483/ ARE FOR KL8 INTERFACES.
5484
5485 *REMTSF /OVERLAY DECMATE II CODE
5486
5487REMTSF, RTSFIOT /FLAG UP?
5488RMPUT0, JMP REMCLEAR /NO, FORGET IT
5489REMTLS, RTLSIOT /YES, OUTPUT THE CHARACTER NOW
5490RMPUT1, ISZ REMPUT /TAKE SKIP RETURN
5491REMCLEA,CLA /CLEAN UP
5492RMPUT2, JMP I REMPUT /RETURN EITHER WAY
5493
5494 CLA /CLEAN UP
5495 DCA OUTFLAG /INDICATE OUTPUT IS UNAVAILABLE
5496 ISZ REMPUT /TAKE SKIP RETURN
5497 JMP I REMPUT /RETURN TO CALLER
5498
5499 RMPTEMP=CONRESET /REMOTE OUTPUT TEMPORARY
5500
5501 PAGE
5502\f/ SEVEN-BIT COMMAND TABLES. /034 CJL
5503
5504 CMDTBL= . /COMMAND TABLE HERE
5505
5506 "C&177; "O&177; "N&177 /\
5507 "N&177; "E&177; "C&177 / >CONNECT COMMAND
5508 "T&177; -1 //
5509 CONSRV /CONNECT ROUTINE ADDRESS
5510
5511 "F&177; "I&177; "N&177 /\
5512 "I&177; "S&177; "H&177 / >FINISH COMMAND
5513 -1 //
5514 FINSRV /FINISH ROUTINE ADDRESS
5515
5516 "E&177; "X&177; "I&177 /EXIT
5517 "T&177; -1 /COMMAND
5518 EXITKERMIT /EXIT ROUTINE ADDRESS
5519
5520 "S&177; "E&177; "N&177 /SEND
5521 "D&177; -1 /COMMAND
5522 SNDSRV /SEND ROUTINE ADDRESS
5523
5524 "G&177; "E&177; "T&177 /GET
5525 -1 /COMMAND
5526 GETSRV /GET ROUTINE ADDRESS
5527
5528 "R&177; "E&177; "C&177 /\
5529 "E&177; "I&177; "V&177 / >RECEIVE COMMAND
5530 "E&177; -1 //
5531 RECSRV /RECEIVE ROUTINE ADDRESS
5532\f "H&177; "E&177; "L&177 /HELP
5533 "P&177; -1 /COMMAND
5534 HELPSRV /HELP ROUTINE ADDRESS
5535
5536 -1 /THIS ENDS THE TABLE /034 CJL
5537
5538/ REMOTE PACKET INPUT BUFFER. /014 CJL
5539
5540RRBUF, 0 /MARK
5541RRLEN, 0 /PACKET LENGTH
5542RRSEQ, 0 /PACKET SEQ
5543RRTYP, 0 /PACKET TYPE
5544
5545 DECIMAL
5546
5547RRDTA, ZBLOCK 91 /DATA GOES HERE
5548
5549 OCTAL
5550
5551RTERMI, 0 /ADD LOCATION WHERE TERMINATOR IS STORED/A004
5552 /ON RECEIVE IF BUFFER IS MAXIMUM LENGTH /A004
5553
5554/ REMOTE PACKET OUTPUT BUFFER
5555
5556RSBUF, CNTRLA /PACKET BUFFER (BEGINS WITH "SOH") /034 CJL
5557RSLEN, 0 /PACKET LENGTH GOES HERE
5558RSSEQ, 0 /PACKET SEQUENCE GOES HERE
5559RSTYP, 0 /PACKET TYPE GOES HERE
5560
5561 DECIMAL
5562
5563RSDTA, ZBLOCK 91 /DATA GOES HERE
5564
5565 0 /CHECKSUM HERE ON MAX PACKET
5566 0 /EOL (IF USED HERE ON MAX PACKET)
5567 0 /INTERNAL TERMINATOR HERE ON MAX PACKET
5568
5569 OCTAL
5570\f/ SEND-INIT PACKET DEFINITION
5571
5572INIDAT, DECIMAL
5573
5574 94+32 /94 CHARS MAX
5575
5576 OCTAL
5577
5578 "/&177 /15 SECOND TIME-OUT /M013/014 CJL
5579 " &177 /NO PADDING
5580 0+100&177 /NO PADDING CHAR
5581 " &177+15 /CR FOR EOL
5582 "#&177 /QUOTE CHAR
5583 "N&137 /NO 8TH BIT QUOTING
5584 "1&177 /CHECK TYPE 1
5585 " &177 /NO REPEAT CHAR
5586 " &177+0 /NO EXTRA CAPABILITY
5587NODATA, -1 /END OF DATA (USE THIS FOR SENDING NO-DATA)
5588\f PAGE /GET TO NEXT PAGE /028 CJL
5589
5590/ NO-INTERRUPT CONSOLE INPUT/OUTPUT SUPPORT ROUTINES. /023 CJL
5591
5592/ MODIFIED FOR FORCED-ECHO AND COLUMN-COUNTING. /043 CJL
5593
5594/ CONSOLE INPUT ROUTINE. RETURNS LATEST CHARACTER WITHOUT ECHOING. MAY BE
5595/ CALLED WITH DIRTY AC. RETURNS LATEST SEVEN-BIT CHARACTER TYPED WHILE FIELDING
5596/ POTENTIAL <^S>/<^Q> PROTOCOL.
5597
5598INPUT, .-. /CONSOLE INPUT ROUTINE
5599INPWAIT,JMS CHKUP /TRY TO GET A CHARACTER
5600 TAD INCHAR /GET THE CHARACTER
5601 SNA /SKIP IF ANYTHING CAME IN
5602 JMP INPWAIT /WAIT FOR ANYTHING
5603 JMP I INPUT /RETURN WITH LATEST CHARACTER
5604
5605/ CONSOLE OUTPUT ROUTINE. OUTPUTS CHARACTER IN AC (INCLUDING <HT> VIA
5606/ SIMULATION). RETURNS WITH CLEAR AC. SUBJECT TO CONSOLE ECHO STATUS (ECHOSW).
5607
5608P7CH, .-. /CONSOLE OUTPUT ROUTINE
5609 TAD (-CNTRLI) /COMPARE TO <HT>
5610 SNA /SKIP IF OTHER
5611 JMP DOTAB /JUMP IF <HT>
5612 TAD L11/(CNTRLI) /RESTORE THE CHARACTER
5613 JMS P7CHAR /PRINT IT (UPDATING COLUMN COUNT)
5614 JMP I P7CH /RETURN
5615
5616DOTAB, TAD [" &177] /GET A <SPACE>
5617 JMS P7CHAR /OUTPUT IT
5618 TAD COLUMN /GET CURRENT COLUMN COUNT
5619 AND [7] /JUST TAB BITS
5620 SZA CLA /SKIP IF NOW AT NEW TAB STOP
5621 JMP DOTAB /ELSE KEEP GOING
5622 JMP I P7CH /RETURN
5623
5624/ FORCED-ECHO CONSOLE OUTPUT ROUTINE. SAME AS P7CH BUT CLEARS ECHOSW BEFORE
5625/ OUTPUT OF THE CHARACTER.
5626
5627P7ECHO, .-. /CONSOLE OUTPUT WITH FORCED-ECHO ROUTINE
5628 DCA P7TEMP /SAVE PASSED VALUE
5629 DCA ECHOSW /CLEAR ECHO STATUS
5630 TAD P7TEMP /RESTORE THE CHARACTER
5631 JMS P7CH /CALL MAIN ROUTINE
5632 JMP I P7ECHO /RETURN
5633\fCHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE
5634 JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE
5635 SNA /SKIP IF ANYTHING CAME BACK
5636 JMP CHKCLR /ELSE FORGET IT
5637 TAD (-CNTRLP) /COMPARE TO <^P>
5638 SNA /SKIP IF OTHER
5639 JMP DOUP /GO HANDLE <^P> THERE
5640 IAC /TAD (-CNTRLO+CNTRLP)/COMPARE TO <^O>
5641 SNA /SKIP IF OTHER
5642 JMP DOUO /GO HANDLER <^O> THERE
5643 TAD (-CNTRLS+CNTRLO) /COMPARE TO <^S>
5644 SZA CLA /SKIP IF IT MATCHES
5645 JMP I CHKUP /RETURN ON UNIMPORTANT CHARACTERS
5646UQWAIT, JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE
5647 TAD (-CNTRLQ) /COMPARE TO <^Q>
5648 SZA CLA /SKIP IF IT MATCHES
5649 JMP UQWAIT /ELSE WAIT FOR <^Q> FOREVER
5650CHKCLR, DCA INCHAR /OBLITERATE INPUT CHARACTER
5651 JMP I CHKUP /RETURN
5652
5653/ COMES HERE TO HANDLE <^P>.
5654
5655DOUP, TAD ("P&177) /GET A "P"
5656 JMS UPRINT /PRINT "^P"
5657 JMP I UPADDRESS /GO WHERE YOU SHOULD
5658
5659/ COMES HERE TO HANDLE <^O>.
5660
5661DOUO, TAD ("O&177) /GET AN "O"
5662 JMS UPRINT /PRINT "^O"
5663 NL4000 /SET REVERSING BIT
5664 TAD ECHOSW /REVERSE THE ECHO STATE
5665 DCA ECHOSW /STORE BACK
5666 JMP CHKCLR /OBLITERATE <^O> AND RETURN
5667
5668CTLCTST,.-. /LOW-LEVEL <^C> TEST ROUTINE
5669 CLA /CLEAN UP
5670KSFLOC, KSFIOT /FLAG UP?
5671 JMP I CTLCTST /NO, JUST RETURN
5672KRSZAP, KRSIOT /**** 6120 **** KRBIOT
5673 AND [177] /JUST SEVEN-BIT
5674 DCA INCHAR /SAVE THE CHARACTER
5675 NL7775 /SET -<^C> VALUE
5676 TAD INCHAR /COMPARE TO CHARACTER
5677 SZA CLA /SKIP IF OTHER THAN <^C>
5678 JMP NOEX /PHPH
5679 CAF
5680 JMP I UCADDRESS /JUMP IF <^C>
5681NOEX,
5682
5683KCCZAP, KCCIOT /**** 6120 **** 0000
5684 TAD INCHAR /GET THE CHARACTER
5685 JMP I CTLCTST /RETURN
5686\fP7CHAR, .-. /LOWER-LEVEL CONSOLE PRINT ROUTINE
5687 DCA P7TEMP /SAVE PASSED VALUE
5688P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC.
5689 TAD ECHOSW /GET CURRENT ECHO STATUS
5690 SPA CLA /SKIP IF ECHO ON
5691 JMP P7OFF /JUMP IF ECHO OFF
5692 TAD P7TEMP /GET THE PASSED VALUE BACK
5693 JMS P7OUT /TRY TO OUTPUT IT
5694 JMP P7AGN /COULDN'T OUTPUT, GO WAIT THERE
5695P7OFF, JMS CHKUP /CHECK FOR <^C>, ETC.
5696 TAD P7TEMP /GET THE CHARACTER BACK
5697 AND [140] /JUST QUADRANT BITS
5698 SZA CLA /SKIP IF CONTROL CHARACTER
5699 ISZ COLUMN /BUMP COLUMN IF PRINTING CHARACTER
5700L11, CNTRLI/NOP /JUST IN CASE
5701 TAD P7TEMP /GET THE CHARACTER AGAIN
5702 TAD (-CNTRLM) /COMPARE TO <CR>
5703 SNA /SKIP IF NOT <CR>
5704 DCA COLUMN /CLEAR COLUMN COUNT ON <CR>
5705 TAD (-CNTRLH+CNTRLM)/COMPARE TO <BS>
5706 SNA CLA /SKIP IF OTHER
5707 NL7777 /SET BACKUP VALUE
5708 TAD COLUMN /UPDATE COLUMN COUNT
5709 DCA COLUMN /STORE BACK
5710 JMP I P7CHAR /RETURN
5711
5712P7OUT, .-. /LOW-LEVEL CONSOLE OUTPUT ROUTINE
5713P7TSF, TSFIOT /FLAG UP?
5714 JMP I P7OUT /NO, TAKE IMMEDIATE RETURN WITH AC INTACT
5715P7TLS, TLSIOT /YES, OUTPUT IT
5716 CLA /CLEAN UP
5717 ISZ P7OUT /BUMP RETURN ADDRESS
5718 JMP I P7OUT /TAKE SKIP RETURN TO CALLER
5719
5720/ COMES HERE TO HANDLE <^C> IF SO ENABLED.
5721
5722UPCPRT, TAD ("C&177) /GET A "C"
5723 JMS UPRINT /PRINT "^C"
5724KCCZP2, KCCIOT /**** 6120 **** 0000
5725 JMP I [CLOOP] /RESTART
5726
5727UPRINT, .-. /"^"<CHARACTER> PRINTING ROUTINE
5728 DCA P7TEMP /SAVE PASSED VALUE
5729 TAD ("^&177) /GET AN "^"
5730 JMS P7OUT /OUTPUT IT
5731 JMP .-1 /WAIT FOR IT
5732 TAD P7TEMP /GET PASSED VALUE
5733 JMS P7OUT /OUTPUT IT
5734 JMP .-1 /WAIT FOR IT
5735 JMP I UPRINT /RETURN
5736
5737P7TEMP, .-. /OUTPUT ROUTINE TEMPORARY
5738\f PAGE
5739
5740/ HANDLER I/O BUFFER DEFINITIONS. /014 CJL
5741
5742 HNDLR= . /BUFFER FOR DISK I/O HANDLER /014 CJL
5743
5744 *PAGCNT^200+HNDLR /RESET ORIGIN PAST HANDLER BUFFER /014 CJL
5745
5746 IFNZRO SBOOT-.&4000 <ERROR .> /028 CJL
5747
5748 *SBOOT-2 /JUST BEFORE EXIT ADDRESS /025 CJL
5749
5750 EXITKER=. /WHERE TO EXIT TO /025 CJL
5751 0
5752 CAF /PHPH
5753\f/ ONCE-ONLY INITIALIZATION CODE. /024 CJL
5754
5755 *HNDLR /OVER AVAILABLE SPACE
5756
5757INITIAL,CLA CLL /CLEAN UP
5758COUTINI,TLSIOT /RAISE CONSOLE OUTPUT FLAG /046 CJL
5759 TAD INITIA/(CLA CLL)/GET REPLACEMENT INSTRUCTION
5760 DCA I [CLOOP] /DON'T COME BACK TO US
5761 JMS I (MACHINE) /IDENTIFY CPU TYPE
5762 DCA CPUTEMP /SAVE IT
5763 TAD CPUTEMP /GET CPU TYPE
5764 TAD (-13) /COMPARE TO DEADLY 6120 VALUE
5765 SNA CLA /SKIP IF OTHER
5766 JMP INI6120 /JUMP IF IT MATCHES
5767ROUTINI,RTLSIOT /INITIALIZE REMOTE OUTPUT /046 CJL
5768RININIT,RKRBIOT /INITIALIZE REMOTE INPUT /046 CJL
5769 CLA /CLEAN UP
5770INITPRT,
5771/PHPHPH
5772/ JMS I [SCRIBE] /GIVE THEM THE
5773/ INITMSG /OPENING MESSAGE
5774/ JMS I [SCRIBE] /GIVE THEM THE
5775/ DAYMSG /DAY MESSAGE
5776/ JMS I [SCRIBE] /GIVE THEM THE
5777/ MONMSG /MONTH MESSAGE
5778/ JMS I [SCRIBE] /GIVE THEM THE
5779/ YEARMSG /YEAR MESSAGE
5780/ JMS I [SCRIBE] /GIVE THEM THE
5781/ CPUTMSG /CPU ID MESSAGE
5782 TAD CPUTEMP /*1
5783 CLL RTL /*4
5784 TAD CPUTEMP /*5
5785 TAD (CPULIST) /POINT TO PROPER MESSAGE
5786 DCA TST6120 /STORE IN-LINE
5787/ JMS I [SCRIBE] /TELL THEM THEIR
5788 SKP /PHPH
5789TST6120,0 /ACTUAL CPU ID
5790/ JMS I [SCRIBE] /GIVE THEM THE
5791/ CLOSMSG /CLOSING MESSAGE
5792DMPRZAP,JMP .+3 /**** DECMATE USAGE DETECTED **** 0000
5793 JMS I [SCRIBE] /GIVE THEM THE
5794SPZAP, DMPOMSG /DECMATE PORT MESSAGE
5795 JMS I [SCRIBE] /GIVE THEM THE
5796 CRLF /END OF LINE
5797 JMS I [SCRIBE] /GIVE THEM THE
5798 LCLMSG /LOCAL PREFERENCE MESSAGE
5799/ JMS I [SCRIBE] /TELL THEM THEY CAN
5800/ THLPMSG /ASK FOR HELP
5801 TAD CPUTEMP /GET CPU TYPE
5802 CLL RTL /*4
5803 TAD (CPUPRMPT-1) /POINT TO PROPER ENTRY
5804 DCA XR0 /STASH THE POINTER
5805 TAD (-4) /GET MOVE COUNT
5806 JMS MESMOVE /MOVE THE PROPER PROMPT TEXT
5807 PROMID-1 /TO THERE
5808\f TAD CPUTEMP /*1
5809 CLL RTL /*4
5810 TAD CPUTEMP /*5
5811 TAD (CPUIDLST-1) /POINT TO PROPER ENTRY
5812 DCA XR0 /STASH THE POINTER
5813 TAD (-5) /GET MOVE COUNT
5814 JMS MESMOVE /MOVE THE PROPER CPU ID TEXT
5815 CPUMSG-1 /TO THERE
5816 CIF USRFLD /GOTO USR FIELD /035 CJL
5817 JMS I (USR) /CALL USER SERVICE ROUTINE /035 CJL
5818 USRIN /LOCK USR IN /035 CJL
5819
5820/ DO FURTHER INITIALIZATION HERE.
5821
5822 JMP I [CLOOP] /GO BACK TO KERMIT PROPER
5823
5824/ COMES HERE TO INITIALIZE 6120-BASED MACHINES. /046 CJL
5825
5826INI6120,DCA I (KCCZAP) /ELIMINATE KCCIOT
5827 DCA I (KCCZP2) /ELIMINATE KCCIOT
5828 ISZ I (KRSZAP) /TURN KRSIOT
5829 ISZ I (KRSZAP) /INTO KRBIOT
5830 TAD ROUTINITIALIZE /GET OUTPUT INITIALIZE INSTRUCTION /046 CJL
5831 TAD (-6336) /COMPARE TO POSSIBLE VALUE /046 CJL
5832 SZA CLA /SKIP IF IT MATCHES SERIAL PRINTER VALUE/046 CJL
5833 JMP TRYDM1 /JUMP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL
5834 TAD RININITIALIZE /GET INPUT INITIALIZE INSTRUCTION /046 CJL
5835 TAD (-6326) /COMPARE TO POSSIBLE VALUE /046 CJL
5836 SNA CLA /SKIP IF NOT CONFIGURED FOR SERIAL PORT /046 CJL
5837 JMP DMSER /JUMP IF SERIAL PORT CONFIGURATION /046 CJL
5838TRYDM1, CLSK /SKIP ON, CLEAR CLOCK FLAG IF DECMATE II/046 CJL
5839 NOP /JUST IN CASE /046 CJL
5840 CLCL /CLEAR VT278 CLOCK FLAG /046 CJL
5841 NOP /JUST IN CASE /046 CJL
5842 ISZ TST6120 /WASTE /046 CJL
5843 JMP .-1 /SOME TIME /046 CJL
5844 CLSK8A /VT278 CLOCK FLAG UP? /046 CJL
5845 JMP TRYDM2 /NO, TRY DECMATE II, ETC. /046 CJL
5846 DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /050 CJL
5847 CIF CDF DMIFLD /GOTO DECMATE ONCE-ONLY CODE FIELD /046 CJL
5848 JMP I (DM1INIT) /CONTINUE THERE /046 CJL
5849
5850TRYDM2, CLSK /CLOCK FLAG UP? /046 CJL
5851 JMP ROUTINITIALIZE /NO, MUST BE SOMEBODY ELSE! /046 CJL
5852 DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /048 CJL
5853 CIF CDF DMIFLD /GOTO DECMATE ONCE-ONLY FIELD /046 CJL
5854 JMP I (DM2INIT) /CONTINUE THERE /046 CJL
5855
5856/ COMES HERE IF SERIAL PORT CONFIGURATION ON DECMATE.
5857
5858DMSER, DCA DMPRZAP /MAKE IT PRINT OUR MESSAGE /048 CJL
5859 TAD (DMPPMSG) /GET OUR MESSAGE ADDRESS /048 CJL
5860 DCA SPZAP /STORE IN-LINE /048 CJL
5861 JMP ROUTINITIALIZE /CONTINUE THERE
5862\fMESMOVE,.-. /MESSAGE MOVE ROUTINE
5863 DCA MMOVCNT /SAVE PASSED COUNT
5864 TAD I MESMOVE /GET THE PASSED ARGUMENT
5865 DCA XR1 /SET IT UP
5866 ISZ MESMOVE /BUMP PAST ARGUMENT
5867 CDF MSGFLD /GOTO BUFFER FIELD
5868MESMVLP,TAD I XR0 /GET A WORD
5869 DCA I XR1 /PUT A WORD
5870 ISZ MMOVCNT /DONE YET?
5871 JMP MESMVLP /NO, GO BACK
5872 CDF PRGFLD /BACK TO OUR FIELD
5873 JMP I MESMOVE /YES, RETURN
5874
5875CPUTEMP,.-. /TEMPORARY FOR MACHINE TYPE
5876MMOVCNT,.-. /TEMPORARY FOR MOVE COUNT
5877
5878 PAGE
5879\f/ CPU IDENTIFYING ROUTINE. /024 CJL
5880
5881/ RETURNS VALUE IN AC ACCORDING TO THE FOLLOWING RULE:
5882
5883/ AC CPU TYPE
5884
5885/ 0 UNKNOWN (DCC112, MP-12?)
5886/ 1 PDP-5 (THE INCOMPATIBLE ONE!)
5887/ 2 PDP-8 (THE REAL ONE!)
5888/ 3 PDP-8/S (THE SLOW ONE!)
5889/ 4 LINC-8 (THE STRANGE ONE!)
5890/ 5 PDP-8/I (THE ORANGE ONE!)
5891/ 6 PDP-8/L (THE STRIPPED-DOWN ONE!)
5892/ 7 PDP-12 (THE GREEN ONE! (BLUE?))
5893/ 10 PDP-8/E (THE FAST ONE!)
5894/ 11 PDP-8/A (THE WIDE ONE!)
5895/ 12 6100 (THE MICRO ONE!)
5896/ 13 6120 (THE HARRIS ONE!)
5897
5898MACHINE,.-. /MACHINE IDENTIFYING ROUTINE
5899 CLA CLL /THIS WORKS ON EVERYBODY!
5900 TAD 0 /GET PDP-5 PC
5901 DCA MACHTEMP /SAVE IT
5902 TAD (IMA5-1) /GET PDP-5 NEW PC
5903 DCA 0 /STORE IT
5904
5905/ IF WE GET HERE, WE'RE NOT A PDP-5.
5906
5907 TAD MACHTEMP /GET OLD LOCATION ZERO
5908 DCA 0 /RESTORE IT
5909 NL3776 /PDP-8/I, L WEIRDNESS
5910 TAD (-3776) /COMPARE TO POSSIBLE VALUE
5911 SNA CLA /SKIP IF NOT THOSE TWO
5912 JMP IMA8IL /JUMP IF ONE OF THEM
5913
5914/ IF WE GET HERE, WE'RE NOT A PDP-8/I OR PDP-8/L.
5915
5916 NL7776 /SETUP -2
5917 TAD (-7776) /COMPARE TO EXPECTED VALUE
5918 SZA CLA /SKIP IF OK
5919 JMP IMA8S /JUMP IF RETARDED BROTHER
5920
5921/ IF WE GET HERE, WE'RE NOT A PDP-8/S.
5922
5923 NL0100 /SETUP 0100
5924 TAD (-100) /COMPARE TO EXPECTED VALUE
5925 SNA CLA /SKIP IF STRAIGHT PDP-8
5926 JMP IMAOMNIBUS /JUMP IF NEWER CPU
5927\f/ IF WE GET HERE, WE ARE A PDP-8, BUT ARE WE A LINC-8?
5928
5929 NL7777 /SETUP LINC TEST VALUE
5930 IACA /LOAD LINC "A" REGISTER
5931 CLA /CLEAN UP
5932 IAAC /GET IT BACK
5933 IAC /ADD ONE
5934 SNA CLA /SKIP IF NO LINC HARDWARE
5935 JMP IMAL8 /JUMP IF LINC-8
5936
5937/ SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE A PDP-8.
5938
5939 JMP IMA8 /GO TELL THEM WE ARE A PDP-8
5940
5941/ COMES HERE IF PDP-8/I OR PDP-8/L.
5942
5943IMA8IL, NL7777 /SETUP TEST VALUE
5944 CLA!401 /DO PDP-8/I GROUP THREE EAE CLA
5945 SZA CLA /SKIP IF PDP-8/I
5946 JMP IMA8L /JUMP IF NOT
5947
5948/ IF WE GET HERE, WE ARE A PDP-8/I, BUT ARE WE A PDP-12?
5949
5950 LINC /GOTO LINC MODE
5951 COM /COMPLEMENT AC IF PDP-12, ELSE A HARMLESS AND
5952 PDP /GOTO PDP8 MODE IF PDP-12, ELSE HARMLESS AND
5953 IAC /ADD ONE FOR TEST
5954 SNA CLA /SKIP IF JUST PDP-8/I
5955 JMP IMA12 /JUMP IF ACTUALLY A LINC-8/I
5956
5957/ SINCE WE DON'T CARE ABOUT PERIPHERALS, WE ARE JUST A PDP-8/I.
5958
5959 JMP IMA8I /TELL THEM WE ARE A PDP-8/I
5960
5961IMAOMNI,RTL RTR /DO STRANGE OMNIBUS INSTRUCTION
5962PC8A, SNA /SKIP IF NOT A MICRO CHIP
5963 JMP IMA61 /JUMP IF ONE OF THOSE THINGS
5964 TAD (.&7600+16^7777) /CHECK FOR PDP-8/E VALUE
5965 SNA /SKIP IF NOT HIM
5966 JMP IMA8E /JUMP IF IT IS A PDP-8/E (/F OR /M OR 8A-6XX)
5967 TAD (.&7600+16-PC8A) /COMPARE TO PDP-8/A VALUE /051 CJL
5968 SNA CLA /SKIP IF SOMEBODY ELSE
5969 JMP IMA8A /JUMP IF IT MATCHES
5970
5971/ IF WE GET HERE, SOME STRANGE PROCESSOR IS RUNNING US.
5972
5973 JMP IMAUNKNOWN /YOU FIGURE IT OUT!
5974\f/ IF WE GET HERE, WE ARE A 6100 OR 6120.
5975
5976IMA61, NL0010 /DO 6120 SPECIAL INSTRUCTION
5977 TAD (-10) /COMPARE TO EXPECTED VALUE
5978 SNA CLA /SKIP IF OTHER
5979 JMP IMA6120 /JUMP IF IT MATCHES
5980
5981/ WE APPARENTLY ARE ON A 6100, SO TELL THEM SO.
5982
5983 JMP IMA6100 /TELL THEM WE ARE A 6100 MACHINE (VT-78, ETC.)
5984
5985/ RETURN GAUNTLET.
5986
5987IMA6120,IAC /SET 6120 VALUE
5988IMA6100,IAC /SET 6100 VALUE
5989IMA8A, IAC /SET PDP-8/A VALUE
5990IMA8E, IAC /SET PDP-8/E VALUE
5991IMA12, IAC /SET PDP-12 VALUE
5992IMA8L, IAC /SET PDP-8/L VALUE
5993IMA8I, IAC /SET PDP-8/I VALUE
5994IMAL8, IAC /SET LINC-8 VALUE
5995IMA8S, IAC /SET PDP-8/S VALUE
5996IMA8, IAC /SET PDP-8 VALUE
5997IMA5, IAC /SET PDP-5 VALUE
5998IMAUNKN,JMP I MACHINE /RETURN
5999
6000MACHTEM,.-. /TEMPORARY FOR LOCATION ZERO
6001
6002 PAGE
6003\f FIELD PRGFLD%10 /DUMP THE LITERALS NOW
6004\f/ LAYOUT OF FIELD ONE (PERMANENT CONTENTS). /046 CJL
6005
6006 NOPUNCH /FOOL THE ASSEMBLER /046 CJL
6007
6008 FIELD USRFLD%10 /USR FIELD /046 CJL
6009
6010 *0 /WHERE IT LOADS /046 CJL
6011
6012USRLOAD,ZBLOCK 200-. /GET TO ENTRY POINT /046 CJL
6013
6014 USRENTR=. /LOCKED-IN USR ENTRY POINT /046 CJL
6015
6016USRENTR,ZBLOCK 2000-. /USR OWNS REST OF THIS AREA /046 CJL
6017
6018 FILBUFF=. /FILE I/O DONE HERE /046 CJL
6019
6020 FIELD BUFFLD%10 /FILE I/O BUFFER FIELD /046 CJL
6021
6022 *FILBUFFER /RESET ORIGIN /046 CJL
6023
6024FILBUFF,ZBLOCK PAGCNT^200 /THIS IS THE FILE I/O BUFFER /046 CJL
6025
6026 DIRBUFF=. /DIRECTORY LOOKUP I/O DONE HERE /028 CJL
6027
6028 FIELD DIRFLD%10 /DIRECTORY LOOKUP BUFFER FIELD /028 CJL
6029
6030 *DIRBUFFER /RESET ORIGIN /028 CJL
6031
6032FILECNT,.-. /-(NUMBER OF ENTRIES IN THIS SEGMENT)
6033FRSTREC,.-. /FIRST RECORD OF FIRST ENTRY IN THIS SEGMENT
6034DIRLINK,.-. /LINK TO NEXT SEGMENT; 0 IF LAST ACTIVE ONE
6035 .-. /TENTATIVE ENTRY POINTER STORED HERE
6036AIWNUMB,.-. /-(NUMBER OF ADDITIONAL INFORMATION WORDS)
6037
6038 ENTSTRT=. /FILE ENTRIES START HERE /046 CJL
6039
6040 ZBLOCK PAGCNT^200+DIRBUFFER-. /DIRECTORY ENTRIES HERE /046 CJL
6041
6042/ CONNECT MODE I/O BUFFERS. /026 CJL
6043
6044KEYBUFF,ZBLOCK BUFSIZE /KEYBOARD BUFFER /026 CJL
6045CONBUFF,ZBLOCK BUFSIZE /CONSOLE OUTPUT BUFFER /026 CJL
6046RINBUFF,ZBLOCK BUFSIZE /REMOTE INPUT BUFFER /026 CJL
6047REMBUFF,ZBLOCK BUFSIZE /REMOTE OUTPUT BUFFER /026 CJL
6048
6049 FLD1ADR=. /SPACE AVAILABLE FOR TEXT, ETC. /046 CJL
6050
6051 ENPUNCH /UN-FOOL THE ASSEMBLER /046 CJL
6052\f/ DECMATE ONCE-ONLY CODE. /046 CJL
6053
6054 FIELD DMIFLD%10 /DECMATE ONCE-ONLY CODE FIELD /046 CJL
6055
6056 *USRLOAD /OVER USR ROUTINE /046 CJL
6057
6058/ PAGE ZERO FOR ONCE-ONLY CODE. /046 CJL
6059
6060 *10 /GET TO AUTO-INDEX AREA /048 CJL
6061
6062XR0, .-. /AUTO-INDEX ZERO /048 CJL
6063
6064 *USRENTRY /OVER USR ENTRY POINT /046 CJL
6065
6066/ DECMATE I ONCE-ONLY CODE. /046 CJL
6067
6068DM1INIT,JMS I (DM1PORT) /INITIALIZE THE REMOTE PORTS /050 CJL
6069 TAD (DM1LIST-1) /POINT TO REPLACEMENT LIST /050 CJL
6070 JMS REPLACE /ZAP IN ALL OF OUR PATCHES /050 CJL
6071 CDF PRGFLD /GOTO MAIN FIELD /050 CJL
6072 TAD I (DIRXR) /GET PORT SELECTION /050 CJL
6073 SNA CLA /SKIP IF PORT 1 REQUIRED /050 CJL
6074 JMP USEP0 /JUMP IF PORT 0 REQUIRED /050 CJL
6075 TAD (DM1SEC-1) /POINT TO REPLACEMENT LIST /050 CJL
6076 JMS REPLACE /ZAP IN SECONDARY PATCHES /050 CJL
6077USEP0, CIF CDF PRGFLD /BACK TO REST OF INITIALIZATION /046 CJL
6078 JMP I (INITPRT) /CONTINUE THERE /046 CJL
6079
6080/ DECMATE II, ETC. ONCE-ONLY CODE. /046 CJL
6081
6082DM2INIT,JMS I (DMIPORT) /INITIALIZE THE REMOTE PORT /048 CJL
6083 TAD (DM2LIST-1) /POINT TO REPLACEMENT LIST /048 CJL
6084 JMS REPLACE /ZAP IN ALL OF OUR PATCHES /048 CJL
6085 CIF CDF PRGFLD /BACK TO REST OF INITIALIZATION /046 CJL
6086 JMP I (INITPRT) /CONTINUE THERE /046 CJL
6087
6088REPLACE,.-. /REPLACEMENT ROUTINE /048 CJL
6089 DCA XR0 /SAVE PASSED LIST POINTER /048 CJL
6090REPLUP, CDF DMIFLD /BACK TO OUR FIELD /048 CJL
6091 TAD I XR0 /GET AN ADDRESS /048 CJL
6092 SNA /SKIP IF NOT AT END OF LIST /048 CJL
6093 JMP I REPLACE /RETURN IF END OF LIST /048 CJL
6094 DCA REPADR /STASH THE ADDRESS /048 CJL
6095 TAD I XR0 /GET THE REPLACEMENT VALUE /048 CJL
6096 CDF PRGFLD /GOTO ZAPPING FIELD /048 CJL
6097 DCA I REPADR /ZAP IT IN /048 CJL
6098 JMP REPLUP /KEEP GOING /048 CJL
6099
6100REPADR, .-. /REPLACEMENT ADDRESS TEMPORARY /048 CJL
6101\f/ DECMATE I PORT INITIALIZE ROUTINE /050 CJL
6102
6103DM1PORT,.-. /DECMATE I PORT INITIALIZE ROUTINE
6104 TAD (234) /GET PORT 0 SCD ENABLE VALUE
6105 WCON0 /WRITE PORT 0 CONTROL REGISTER
6106 NL0000 /INDICATE PORT 0
6107 JMS PRTINIT /INITIALIZE PORT 0
6108
6109/ CHANGE ALL IOTS TO PORT 1 VALUES.
6110
6111IOCLUP, ISZ PSETF1 /BUMP SET FLAG INSTRUCTION
6112 ISZ PDUMRD /BUMP DUMMY READ INSTRUCTION
6113 ISZ PSETF2 /BUMP SET FLAG INSTRUCTION
6114 ISZ PSKIP /BUMP SKIP ON FLAG INSTRUCTION
6115 ISZ PLOAD /BUMP LOAD INSTRUCTION
6116 ISZ IOTCNT /DONE YET?
6117 JMP IOCLUP /NO, KEEP GOING
6118
6119 TAD (234) /GET PORT 1 SCD ENABLE VALUE
6120 WCON1 /WRITE PORT 1 CONTROL REGISTER
6121 NL4000 /INDICATE PORT 1
6122 JMS PRTINIT /INITIALIZE PORT 1
6123 JMP I DM1PORT /RETURN
6124
6125PRTINIT,.-. /LOW-LEVEL PORT INTIALIZE ROUTINE
6126 RACD /RESET DESIRED PORT
6127 ISZ PWASTE /WASTE
6128 JMP .-1 /SOME TIME
6129 CLA /CLEAN UP
6130PSETF1, RTFL0 /SET THE FLAG NOW
6131 TAD (2516) /SETUP FOR 8 BITS, NO PARITY, ETC.
6132 JMS PSEND /SEND TO MODE REGISTER 1
6133 CDF PRGFLD /GOTO MAIN FIELD
6134 TAD I (RATE) /GET BAUD RATE NOW
6135 CDF DMIFLD /BACK TO OUR FIELD
6136 TAD (2460) /ADD ON CLOCK ENABLES, ETC.
6137 JMS PSEND /SEND TO MODE REGISTER 2
6138 TAD (3425) /GET ENABLE AND RESET VALUE
6139 JMS PSEND /SEND TO COMMAND REGISTER
6140PDUMRD, RKRB0 /DO A DUMMY READ NOW
6141PSETF2, RTFL0 /SET THE FLAG NOW
6142 CLA /CLEAN UP
6143 JMP I PRTINIT /RETURN
6144
6145PSEND, .-. /PORT WRITE ROUTINE
6146PSKIP, RTSF0 /FLAG UP?
6147 JMP PSKIP /NO, WAIT FOR IT
6148PLOAD, RTLS0 /YES, LOAD THE VALUE
6149 CLA /CLEAN UP
6150 JMP I PSEND /RETURN
6151
6152IOTCNT, RKFL0-RKFL1 /INTER-DEVICE IOT COUNT
6153PWASTE, 0 /TIMER TEMPORARY
6154\f PAGE
6155\f/ DECMATE II, ETC. PORT INITIALIZE ROUTINE. /048 CJL
6156
6157/ THIS ROUTINE IS MOSTLY "DARK GREY MAGIC" WHICH IS PRIMARILY DERIVED FROM THE
6158/ "OFFICIAL" INFORMATION TAKEN FROM THE ONLY KNOWN DOCUMENTATION, THE DECMATE II
6159/ PROGRAMMER'S REFERENCE MANUAL: EK-DECM2-RM-001. VARIOUS EMPLOYEES OF DIGITAL
6160/ EQUIPMENT CORPORATION (A MULTI-NATIONAL COMPANY) HAVE ADDITIONALLY CONTRIBUTED
6161/ TO THIS EFFORT BY PROVIDING PORTIONS OF THE "SACRED SLUSHWARE NOTES" ON A NOT
6162/ NECESSARILY WILLING BASIS THROUGH THEIR RELEASED WORKS, SUCH AS, BUT NOT
6163/ LIMITED TO, THE SOURCES OF THE PARTICULAR VERSION OF KERMIT-8 KNOWN AS K278.
6164/ IT IS ASSUMED THAT THESE PEOPLE HAVE ACCESS TO BETTER DOCUMENTATION OF THE
6165/ HARDWARE, AND ESPECIALLY DOCUMENTATION OF THE THREE DIFFERENT MODELS OF
6166/ DECMATE (II, III, III+) THAT THESE ISSUES APPLY TO.
6167
6168/ SINCE IT IS NOT KNOWN WHETHER THE K278, ETC. CODE IS SPECIFIC AND PRECISE, OR
6169/ MERELY SLOPPY, VARIOUS "QUIRKY" CODING TECHNIQUES HAVE BEEN LEFT "AS IS", WITH
6170/ COMMENTS REGARDING POTENTIAL VARIANCE WITH DOCUMENTATION NOTED WHERE
6171/ NECESSARY. THE ORDER OF ACCESS TO THE REGISTERS HAS BEEN LEFT INTACT IN CASE
6172/ OF POTENTIAL INTERACTION. SEVERAL CHANGES HAVE BEEN MADE BEYOND THIS WORK AS
6173/ A RESULT OF TRIAL-AND-ERROR, AND ALSO HAND DIS-ASSEMBLY OF SEVERAL DECMATE
6174/ DISKETTES' CONTENTS.
6175
6176/ IT IS HOPED THAT FUTURE "NEGOTIATIONS" WITH DEC ALLOW FOR PROPER DISCLOSURE OF
6177/ THESE ISSUES TO AVOID POTENTIAL SOFTWARE FAILURES EVIDENT IN THESE ROUTINES
6178/ DUE TO LACK OF PROPER DOCUMENTATION.
6179
6180DMIPORT,.-. /COMMUNICATIONS PORT INITIALIZE ROUTINE
6181
6182/ ACCORDING TO THE DECMATE II MANUAL, THE FOLLOWING INSTRUCTION IS UNDEFINED.
6183
6184 MPRESET /RESET MULTIPROTOCOL COMMUNICATIONS CONTROLLER CHIP
6185
6186/ THE DECMATE III HAS AN INTERNAL MODEM OPTION WHICH IS NOT AVAILABLE IN THE
6187/ DECMATE II. THE INTERFACE TO THIS DEVICE IS APPARENTLY SHARED WITH THE MPSCC
6188/ MODEM INTERFACE WE NORMALLY USE, SO THE REGISTER ACCESS MUST BE MORE CAREFULLY
6189/ DEFINED. THE APPARENT DIFFERENTIATION IS THE CURRENT VALUE OF THE DATA FIELD,
6190/ NAMELY EITHER FIELD 0 OR 1. IT IS NOT KNOWN WHETHER THE THREE-BIT VALUE OF
6191/ THE DATA FIELD IS SIGNIFICENT (PRESUMABLY FOR FUTURE EXPANSION), OR MERELY THE
6192/ DATA FIELD'S LOW-ORDER BIT IS USED, AS ALL KNOWN EXAMPLES OF ALLEDGEDLY
6193/ FUNCTIONAL CODE USE APPROPRIATE CDF 00 AND CDF 10 ONLY. APPARENTLY THE MODEM
6194/ INTERFACE IS REFERRED TO AS "A" AND THE MPSCC INTERFACE IS REFERRED TO AS "B".
6195
6196 TAD (030) /GET RESET VALUE
6197 CDF 00 /TALKING TO REGISTER 0A
6198 MPSCC /RESET COMMUNICATIONS CHIP
6199 CDF 10 /TALKING TO REGISTER 0B
6200 MPSCC /RESET COMMUNICATIONS CHIP
6201\f/ ACCORDING TO THE DECMATE II MANUAL, CONTROL REGISTER 2 "HAS NO RELEVANT
6202/ BITS... IF IT IS EVER WRITTEN, IT MUST BE WRITTEN WITH ALL ZEROS." APPARENTLY
6203/ THE MODEM INTERFACE DEMANDS A NON-ZERO VALUE BE WRITTEN TO REGISTER 2
6204/ (PRESUMABLY TO DISABLE IT). TO SATISFY THE ABOVE REQUIREMENT (WHATEVER THIS
6205/ IMPLIES!), REGISTER 2(B) IS WRITTEN WITH ALL ZEROS *LAST* IN CASE THIS IS A
6206/ DECMATE II WHERE THE DATA FIELD CONSIDERATIONS ARE MEANINGLESS.
6207
6208 CDF 00 /TALKING TO REGISTER 0A
6209 NL0002 /WANT REGISTER 2A
6210 MPSCC /SELECT IT
6211 TAD (020-2) /GET RESET VALUE
6212 MPSCC /LOAD IT
6213 CDF 10 /TALKING TO REGISTER 0B
6214 NL0002 /WANT REGISTER 2B
6215 MPSCC /SELECT IT
6216 NL0000 /GET RESET VALUE (000)
6217 MPSCC /LOAD IT
6218
6219/ THE K278 CODE DOES NOT HAVE SETUP CODE FOR REGISTER 4B, PRESUMABLY BECAUSE THE
6220/ CODE PERFORMS A PANEL REQUEST (PRQ3) WHICH SETS UP THE EQUIVALENT VALUES FOR
6221/ ASYNCHRONOUS OPERATION WITH ONE STOP BIT AND NO PARITY. IT IS NOT KNOWN IF
6222/ THE DECMATE III EVEN *HAS* A REGISTER 4B, BUT PRESUMABLY IT IS AVAILABLE FOR
6223/ LOADING THE RIGHT VALUES COMPATIBLE WITH THE DECMATE II, OR ATTEMPTING TO LOAD
6224/ IT IS INNOCUOUS.
6225
6226 CDF 00 /TALKING TO REGISTER 0A
6227 NL0004 /WANT REGISTER 4A
6228 MPSCC /SELECT IT
6229 TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY
6230 MPSCC /LOAD IT
6231 CDF 10 /TALKING TO REGISTER 0B
6232 NL0004 /WANT REGISTER 4B
6233 MPSCC /SELECT IT
6234 TAD (104-4) /SETUP FOR ASYNCHRONOUS, ONE STOP BIT, NO PARITY
6235 MPSCC /LOAD IT
6236\f/ THE DOCUMENTED VALUES (FOR DECMATE II) REGARDING CONTROL REGISTER 1 INDICATE
6237/ THE PROPER VALUE OF 022, WHERE BIT[9] IS DEFINED AS A ZERO. THE VALUE OF 026
6238/ IS TAKEN FROM K278 WHERE PRESUMABLY THE EXTRA BIT IS NECESSARY FOR SOME
6239/ DECMATE III OBSCURITY.
6240
6241/ THE FOLLOWING CODE IS REDUNDANT FOR LOADING REGISTER 0A BEFORE AND AFTER
6242/ LOADING REGISTER 0B. THIS IS EITHER A MISTAKE OR OBSCURELY NECESSARY (TAKEN
6243/ FROM K278).
6244
6245 CDF 00 /TALKING TO REGISTER 0A
6246 NL0001 /WANT REGISTER 1A
6247 MPSCC /SELECT IT
6248 TAD (026-1) /GET SETUP VALUE
6249 MPSCC /LOAD IT
6250 CDF 10 /TALKING TO REGISTER 0B
6251 NL0001 /WANT REGISTER 1B
6252 MPSCC /SELECT IT
6253 TAD (026-1) /GET SETUP VALUE
6254 MPSCC /LOAD IT
6255 CDF 00 /TALKING TO REGISTER 0A
6256 NL0001 /WANT REGISTER 1A
6257 MPSCC /SELECT IT
6258 TAD (026-1) /GET SETUP VALUE
6259 MPSCC /LOAD IT
6260
6261/ THE DECMATE III INTERNAL MODEM IS PROBABLY ASYNCHRONOUS 8 BIT ONLY. ASSUMING
6262/ THE RECEIVE SIDE OF THE INTERNAL MODEM IS ALWAYS "ENABLED", REGISTER 3A WOULD
6263/ BE UNNECESSARY. THE K278 CODE DOES NOT ADDRESS REGISTER 3 AS AN A/B PAIR,
6264/ PRESUMABLY BECAUSE REGISTER 3 IS NOT DECODED AND IS EFFECTIVELY REGISTER 3B
6265/ REGARDLESS OF THE DATA FIELD. THIS IS EITHER TRUE, OR THE K278 CODING FAILS
6266/ TO PROPERLY INITIALIZE THE DECMATE III MPSCC PORT.
6267
6268 NL0003 /WANT REGISTER 3
6269 MPSCC /SELECT IT
6270 TAD (301-3) /SETUP FOR 8 BITS AND ENABLE RECIVER
6271 MPSCC /LOAD IT
6272
6273/ A SIMILAR SITUATION EXISTS FOR THE TRANSMITTER SIDE OF THE DECMATE III
6274/ INTERNAL MODEM. REGISTER 5 IS UTILIZED ACCORDINGLY.
6275
6276 TAD (5-301) /WANT REGISTER 5
6277 MPSCC /SELECT IT
6278 TAD (150-5) /GET TRANSMITTER ENABLE, 8 BITS VALUE
6279 MPSCC /LOAD IT
6280
6281/ THE DECMATE II REFERENCE MANUAL INDICATES THE PROPER SETTING FOR THE MODEM
6282/ CONTROL REGISTER AS EITHER 030 OR 130 DEPENDING ON WHETHER BIT[5] INDICATES
6283/ INTERNAL OR EXTERNAL TIMING (WHERE ONE OF THESE IS ILLEGAL FOR ASYNCHRONOUS
6284/ OPERATION!). THE SETTING OF BITS [10] AND [11] WOULD INDICATE ENABLING OF
6285/ BOTH LOCAL AND REMOTE LOOPBACKS, YET WE SET ONLY THESE BITS (ALA K278)
6286/ ALLEDGEDLY FOR THE PURPOSE OF SETTING RTS AND DTR (WHICH ARE DOCUMENTED AS
6287/ BEING BITS[7] AND [8] RESPECTIVELY).
6288
6289 NL0003 /SET VALUE
6290 MLC /LOAD IT
6291\f CLA /CLEAN UP
6292
6293/ THE BAUD RATE SHOULD BE SET HERE IF DESIRED.
6294
6295/ TAD BAUD /GET BAUD RATE
6296/ MSB /LOAD IT
6297 CLA /CLEAN UP
6298 JMP I DMIPORT /RETURN
6299\f/ DECMATE II, ETC. REPLACEMENT LIST. /048 CJL
6300
6301DM2LIST,CLDMZAP / *CLDMZAP
6302
6303 DMINIT&177+JMSC /CLDMZAP,JMS DMINIT
6304
6305 SETBAUD / *SETBAUD /050 CJL
6306
6307 MSB /SETBAUD,MSB /050 CJL
6308
6309 INLUP / *INLUP
6310
6311 TAD INFLAG /INLUP, TAD INFLAG
6312
6313 INSKIP / *INSKIP
6314
6315 NOTYET&177+JMPC /INSKIP, JMP NOTYET
6316 INLUP1; DCA INFLAG /INLUP1, DCA INFLAG
6317 INREAD; IRB /INREAD, IRB
6318
6319 INSTATUS / *INSTATUS
6320
6321 UPSTATUS&177+JMSC /INSTATU,JMS UPSTATUS
6322
6323 GETFL1 / *GETFL1
6324
6325 UPSTATUS&177+JMSC /GETFL1, JMS UPSTATUS
6326
6327 COMWAIT / *COMWAIT
6328
6329 GETFLOW&177+JMSC /COMWAIT,JMS GETFLOW
6330
6331 NOWAIT / *NOWAIT
6332
6333 TAD OUTFLAG /NOWAIT, TAD OUTFLAG
6334 CMOUT1; SNA CLA /CMOUT1, SNA CLA
6335 CMOUT2; OWAIT&177+JMPC /CMOUT2, JMP OWAIT
6336 DM1AND; DCA OUTFLAG /DM1AND, DCA OUTFLAG
6337 CMOUT3; OUTEMP&177+TADC /CMOUT3, TAD OUTEMP
6338 CMOUT4; OLS /CMOUT4, OLS
6339
6340 BUFCHECK / *BUFCHECK
6341
6342 PUPSTATUS&177+JMSIC /BUFCHEC,JMS I PUPSTATUS
6343
6344 KERRLUP / *KERRLUP
6345
6346 PUPSTATUS&177+JMSIC /KERRLUP,JMS I PUPSTATUS
6347\f RINTEST / *RINTEST
6348
6349 TAD INFLAG /RINTEST,TAD INFLAG
6350 RINGT0; SNA CLA /RINGT0, SNA CLA
6351 RINREAD;RINGNONE&177+JMPC /RINREAD,JMP RINGNONE
6352 RINGT1; DCA INFLAG /RINGT1, DCA INFLAG
6353 RINGT2; IRB /RINGT2, IRB
6354
6355 REMTSF / *REMTSF
6356
6357 RMPTEMP&177+DCAC /REMTSF, DCA RMPTEMP
6358 RMPUT0; TAD OUTFLAG /RMPUT0, TAD OUTFLAG
6359 REMTLS; SNA CLA /REMTLS, SNA CLA
6360 RMPUT1; REMPUT&177+JMPIC /RMPUT1, JMP I REMPUT
6361 REMCLEA;RMPTEMP&177+TADC /REMCLEA,TAD RMPTEMP
6362 RMPUT2; OLS /RMPUT2, OLS
6363
6364 0 /THIS ENDS THE LIST
6365
6366 PAGE
6367\f/ DECMATE I REPLACEMENT LIST. /050 CJL
6368
6369DM1LIST,CLDMZAP / *CLDMZAP
6370
6371 DMINIT&177+JMSC /CLDMZAP,JMS DMINIT
6372
6373 SETBAUD / *SETBAUD
6374
6375 NOP /SETBAUD,NOP
6376
6377 DMI01 / *DMI01
6378
6379 DM234&177+TADC /DMI01, TAD DM234/(234)
6380 DMI02; WCON0 /DMI02, WCON0
6381 DMI03; NL0000 /DMI03, NL0000
6382 DMI04; RACD /DMI04, RACD
6383 DMI05; DMWASTE&177+ISZC /DMI05, ISZ DMWASTE
6384 DMI06; DMI05&177+JMPC /DMI06, JMP DMI05
6385 DMI07; DMWASTE&177+ISZC /DMI07, ISZ DMWASTE
6386 DMI08; DMI07&177+JMPC /DMI08, JMP DMI07
6387 DMI09; RTFL0 /DMI09, RTFL0
6388 DMI10; DM2516&177+TADC /DMI10, TAD DM2516/(2516)
6389 DMI11; DMSEND&177+JMSC /DMI11, JMS DMSEND
6390 DMI12; TAD RATE /DMI12, TAD RATE
6391 DMI13; DM2460&177+TADC /DMI13, TAD DM2460/(2460)
6392 DMI14; DMSEND&177+JMSC /DMI14, JMS DMSEND
6393 DMI15; DM3425&177+TADC /DMI15, TAD DM3425/(3425)
6394 DMI16; DMSEND&177+JMSC /DMI16, JMS DMSEND
6395 DMI17; RKRB0 /DMI17, RKRB0
6396
6397 DMISET / *DMISET
6398
6399 RTFL0 /DMISET, RTFL0
6400
6401 DMISKP / *DMISKP
6402
6403 RTSF0 /DMISKP, RTSF0
6404\f DMIOUT / *DMIOUT
6405
6406 RTLS0 /DMIOUT, RTLS0
6407
6408 INSKIP / *INSKIP
6409
6410 RKSF0 /INSKIP, RKSF0
6411
6412 INREAD / *INREAD
6413
6414 RKRB0 /INREAD, RKRB0
6415
6416 COMWAIT / *COMWAIT
6417
6418 GETFLOW&177+JMSC /COMWAIT,JMS GETFLOW
6419
6420 NOWAIT / *NOWAIT
6421
6422 RTSF0 /NOWAIT, RTSF0
6423 CMOUT1; OWAIT&177+JMPC /CMOUT1, JMP OWAIT
6424
6425 DM1AND / *DM1AND
6426
6427 AND377 /DM1AND, AND [377]
6428
6429 CMOUT4 / *CMOUT4
6430
6431 RTLS0 /CMOUT4, RTLS0
6432
6433 RINTEST / *RINTEST
6434
6435 RKSF0 /RINTEST,RKSF0
6436
6437 RINREAD / *RINREAD
6438
6439 RKRB0 /RINREAD,RKRB0
6440 RINGT1; SKP /RINGT1, SKP
6441
6442 DM1AN2 / *DM1AN2
6443
6444 AND377 /DM1AN2, AND [377]
6445
6446 REMTSF / *REMTSF
6447
6448 RTSF0 /REMTSF, RTSF0
6449
6450 REMTLS / *REMTLS
6451
6452 RTLS0 /REMTLS, RTLS0
6453
6454 0 /THIS ENDS THE LIST
6455\f/ DECMATE I SECONDARY REPLACEMENT LIST /050 CJL
6456
6457DM1SEC, DMI02 / *DMI02
6458
6459 WCON1 /DMI02, WCON1
6460 DMI03; NL4000 /DMI03, NL4000
6461
6462 DMI09 / *DMI09
6463
6464 RTFL1 /DMI09, RTFL1
6465
6466 DMI17 / *DMI17
6467
6468 RKRB1 /DMI17, RKRB1
6469
6470 DMISET / *DMISET
6471
6472 RTFL1 /DMISET, RTFL1
6473
6474 DMISKP / *DMISKP
6475
6476 RTSF1 /DMISKP, RTSF1
6477
6478 DMIOUT / *DMIOUT
6479
6480 RTLS1 /DMIOUT, RTLS1
6481
6482 INSKIP / *INSKIP
6483
6484 RKSF1 /INSKIP, RKSF1
6485
6486 INREAD / *INREAD
6487
6488 RKRB1 /INREAD, RKRB1
6489
6490 NOWAIT / *NOWAIT
6491
6492 RTSF1 /NOWAIT, RTSF1
6493
6494 CMOUT4 / *CMOUT4
6495
6496 RTLS1 /CMOUT4, RTLS1
6497
6498 RINTEST / *RINTEST
6499
6500 RKSF1 /RINTEST,RKSF1
6501
6502 RINREAD / *RINREAD
6503
6504 RKRB1 /RINREAD,RKRB1
6505
6506 REMTSF / *REMTSF
6507
6508 RTSF1 /REMTSF, RTSF1
6509\f REMTLS / *REMTLS
6510
6511 RTLS1 /REMTLS, RTLS1
6512
6513 0 /THIS ENDS THE LIST
6514\f/ ONCE-ONLY TEXT MESSAGES. /024 CJL
6515
6516 FIELD BUFFLD%10 /FILE I/O BUFFER FIELD
6517
6518 *FILBUFFER /OVER FILE I/O BUFFER
6519
6520/ LOCAL PREFERENCE MESSAGE. /024 CJL
6521
6522/ USE SOMETHING APPROPRIATE HERE TO CUSTOMIZE KERMIT-12 TO YOUR MACHINE.
6523
6524/ THIS LOCATION SHOULD BE MAINTAINED SINCE IT IS DOCUMENTED TO BE HERE.
6525
6526 XLIST OFF
6527 IFZERO GENMSG <
6528 XLIST ON
6529LCLMSG, *LCLMSG+40 /EMPTY HOLE FOR USER MESSAGE /039 CJL
6530
6531 XLIST OFF >
6532 IFNZRO GENMSG <
6533 IFNZRO LEDERLE <
6534 XLIST ON
6535LCLMSG, TEXT "%^T^HANKS TO: ^B^ILL ^S^MITH AND ^D^INGER ^M^ILLER%"
6536
6537 XLIST OFF >
6538 IFNZRO UMSG <
6539 XLIST ON
6540LCLMSG, TEXT "%^I^NSERT LOCAL USER MESSAGE HERE!%^"
6541
6542 XLIST OFF >
6543 IFZERO LEDERLE!UMSG <
6544 XLIST ON
6545LCLMSG, TEXT "^^^^^^^^^^^^^^^^^^^^^^"/DEFAULT IS NO MESSAGE
6546
6547 XLIST OFF >
6548 IFNZRO LCLMSG+40-. <
6549 XLIST ON
6550 ZBLOCK LCLMSG+40-. /LEAVE PATCHING SPACE
6551
6552 XLIST OFF >
6553 >
6554 XLIST ON
6555CLOSMSG,TEXT "^]^" /CPU TYPE CLOSING MESSAGE
6556\f/ CPU IDENTIFICATION LIST; ALL MUST BE 5 WORDS LONG (EXCEPT LAST)./024 CJL
6557
6558CPULIST,TEXT "^U^NKNOWN" /00=UNKNOWN
6559 TEXT "^PDP^-5^^" /01=PDP-5
6560 TEXT "^PDP^-8^^" /02=PDP-8
6561 TEXT "^PDP^-8/S" /03=PDP-8/S
6562 TEXT "^LINC^-8^" /04=LINC-8
6563 TEXT "^PDP^-8/I" /05=PDP-8/I
6564 TEXT "^PDP^-8/L" /06=PDP-8/L
6565 TEXT "^PDP^-12^" /07=PDP-12
6566 TEXT "^PDP^-8/E" /10=PDP-8/E
6567 TEXT "^PDP^-8/A" /11=PDP-8/A
6568\f TEXT "6100^^^^^" /12=6100
6569 TEXT "6120^" /13=6120; LAST CAN BE SHORT!
6570CPUTMSG,TEXT "%^[C^PU TYPE IS: " /CPU TYPE MESSAGE
6571DAYMSG, DAY%12^66+DAY+6060 /DAY MESSAGE
6572 TEXT " "
6573DMPOMSG,TEXT " ^[U^SING ^C^OMMUNICATIONS" /DECMATE PORT MESSAGE
6574 TEXT " ^P^ORT^]"
6575DMPPMSG,TEXT " ^[U^SING ^P^RINTER ^P^ORT^]^" /DECMATE SERIAL PORT MESSAGE
6576\fINITMSG,TEXT "%^PS/8 PS/12 OS/8 OS/12 " /INITIAL MESSAGE
6577 TEXT "OS/78 OS/278 K^ERMIT-12 ^V"
6578INMSG2, VERSION%12^66+VERSION+6060 /VERSION DIGITS
6579INMSG3, "^^100+REVISION /REVISION
6580 TEXT " " /END OF MESSAGE
6581 XLIST OFF
6582 IFZERO MONTH-1 <
6583 XLIST ON
6584MONMSG, TEXT "^J^ANUARY ^" /MONTH MESSAGE
6585 XLIST OFF >
6586 IFZERO MONTH-2 <
6587 XLIST ON
6588MONMSG, TEXT "^F^EBRUARY " /MONTH MESSAGE
6589 XLIST OFF >
6590 IFZERO MONTH-3 <
6591 XLIST ON
6592MONMSG, TEXT "^M^ARCH ^" /MONTH MESSAGE
6593 XLIST OFF >
6594 IFZERO MONTH-4 <
6595 XLIST ON
6596MONMSG, TEXT "^A^PRIL ^" /MONTH MESSAGE
6597 XLIST OFF >
6598 IFZERO MONTH-5 <
6599 XLIST ON
6600MONMSG, TEXT "^M^AY ^" /MONTH MESSAGE
6601 XLIST OFF >
6602 IFZERO MONTH-6 <
6603 XLIST ON
6604MONMSG, TEXT "^J^UNE " /MONTH MESSAGE
6605 XLIST OFF >
6606 IFZERO MONTH-7 <
6607 XLIST ON
6608MONMSG, TEXT "^J^ULY " /MONTH MESSAGE
6609 XLIST OFF >
6610 IFZERO MONTH-10 <
6611 XLIST ON
6612MONMSG, TEXT "^A^UGUST " /MONTH MESSAGE
6613 XLIST OFF >
6614 IFZERO MONTH-11 <
6615 XLIST ON
6616MONMSG, TEXT "^S^EPTEMBER ^" /MONTH MESSAGE
6617 XLIST OFF >
6618 IFZERO MONTH-12 <
6619 XLIST ON
6620MONMSG, TEXT "^O^CTOBER ^" /MONTH MESSAGE
6621 XLIST OFF >
6622 IFZERO MONTH-13 <
6623 XLIST ON
6624MONMSG, TEXT "^N^OVEMBER " /MONTH MESSAGE
6625 XLIST OFF >
6626 IFZERO MONTH-14 <
6627 XLIST ON
6628MONMSG, TEXT "^D^ECEMBER " /MONTH MESSAGE
6629 XLIST OFF >
6630 IFNZRO MONMSG+7-. <
6631 XLIST ON
6632
6633 ZBLOCK MONMSG+7-. /EMPTY SPACE FOR ALIGNMENT
6634
6635 XLIST OFF >
6636 XLIST ON
6637\fTHLPMSG,TEXT "%^T^YPE ^HELP<CR>^ FOR HELP%^" /TYPE HELP MESSAGE
6638YEARMSG,TEXT "19" /YEAR MESSAGE
6639 YEAR%12^66+YEAR+6060 /YEAR DIGITS
6640 TEXT "^" /END OF MESSAGE
6641\f/ CPU-SPECIFIC PROMPT LIST. /024 CJL
6642
6643CPUPRMP,TEXT "??^>^^^" /UNKNOWN
6644 TEXT "5^>^^^^" /PDP-5
6645 TEXT "8^>^^^^" /PDP-8
6646 TEXT "8^/S>^^" /PDP-8/S
6647 TEXT "LINC-8>" /LINC-8
6648 TEXT "8^/I>^^" /PDP-8/I
6649 TEXT "8^/L>^^" /PDP-8/L
6650 TEXT "12^>^^^" /PDP-12
6651 TEXT "8^/E>^^" /PDP-8/E
6652 TEXT "8^/A>^^" /PDP-8/A
6653 TEXT "78^>^^^" /6100
6654 TEXT "278^>^^" /6120
6655\f/ CPU-SPECIFIC IDENTIFICATION LIST. /025 CJL
6656
6657CPUIDLS,TEXT "^U^NKNOWN" /UNKNOWN
6658 TEXT "^PDP^-5^^" /PDP-5
6659 TEXT "^PDP^-8^^" /PDP-8
6660 TEXT "^PDP^-8/S" /PDP-8/S
6661 TEXT "^LINC^-8^" /LINC-8
6662 TEXT "^PDP^-8/I" /PDP-8/I
6663 TEXT "^PDP^-8/L" /PDP-8/L
6664 TEXT "^PDP^-12^" /PDP-12
6665 TEXT "^PDP^-8/E" /PDP-8/E
6666 TEXT "^PDP^-8/A" /PDP-8/A
6667\f TEXT "^VT^-78^^" /VT-78
6668 TEXT "^DEC^MATE" /6120
6669\f FIELD MSGFLD%10 /MESSAGE FIELD
6670
6671 *FLD1ADR /PERMANENT LOAD ADDRESS /046 CJL
6672 /TEXT MESSAGES LOAD HERE/046 CJL
6673
6674ABMSG, TEXT "%^F^ILE ^A^BORT%^" /FILE ABORT MESSAGE
6675CMERMSG,TEXT "?^I^NVALID COMMAND^" /COMMAND ERROR MESSAGE
6676CONNMSG,TEXT "%(^C^ONNECTING TO HOST, TYPE " /FIRST CONNECT MESSAGE
6677CONTMSG,TEXT "^C^ONTROL-^" /CONTROL CHARACTER MESSAGE
6678\fCON2MSG,TEXT " ^C^ TO RETURN TO ^" /BRIDGING CONNECT MESSAGE
6679CON3MSG,TEXT ")%^" /FINAL CONNECT MESSAGE
6680CPUMSG, ZBLOCK 5 /CPU ID MESSAGE GOES HERE
6681/CRLF, TEXT "%" /<CR>, <LF> MESSAGE
6682DNERMSG,TEXT "?^E^RROR IN DEVICE NAME" /DEVICE NAME ERROR MESSAGE
6683DSFLMSG,TEXT "?^D^ISK FULL!" /DISK OUT OF ROOM ERROR MESSAGE
6684FCLEMSG,TEXT "?^E^RROR CLOSING FILE" /FILE CLOSE ERROR MESSAGE
6685\fFNERMSG, TEXT "?^E^RROR IN FILE NAME" /FILE NAME ERROR MESSAGE
6686FRECMSG,TEXT "^R^EC: ^" /RECEIVING FILE MESSAGE
6687FSENMSG,TEXT "^S^END: ^" /SENDING FILE MESSAGE
6688FSERMSG,TEXT "?^F^ILE NAME SYNTAX ERROR" /FILE NAME ERROR MESSAGE
6689\fHELPMSG,TEXT "%^S^UPPORTED COMMANDS ARE:%%" /HELP MESSAGE
6690 TEXT "^CONNECT^ (TO REMOTE SYSTEM) %"
6691 TEXT "^SEND DEV:FILNAM.EX^ %"
6692\f TEXT "^RECEIVE DEV:^ (FILENAME AND EXTENSION ^NOT^ ALLOWED)%"
6693 TEXT "^GET DEV:FILNAM.EX^%"
6694 TEXT "^FINISH^ (SERVER)%"
6695\f TEXT "^EXIT^ (TO OPERATING SYSTEM) %"
6696 TEXT "^HELP^ (THIS MESSAGE)%"
6697 TEXT "%^E^SCAPE CHARACTER: "
6698KERRMSG,TEXT "%^K^EYBOARD INPUT ERROR!%" /KEYBOARD ERROR MESSAGE
6699
6700 CRLF= .-1 /<CR>, <LF> MESSAGE
6701\fNOFINIS,TEXT "?^U^NABLE TO TELL HOST THAT " /FINISH ERROR MESSAGE
6702 TEXT "SESSION IS FINISHED"
6703NOTFND, TEXT "?^U^NABLE TO LOCATE FILE^" /FILE NOT FOUND MESSAGE
6704PRMTMSG,TEXT "^K^ERMIT-^" /STATIC PORTION OF PROMPT MESSAGE
6705PROMID, ZBLOCK 23 /MODIFIED PORTION OF PROMPT MESSAGE
6706PRMT2, TEXT "^K12>" /PHPH
6707RERRMSG,TEXT "?^R^ECEIVE FAILURE^" /GENERAL RECEIVE FAILURE MESSAGE
6708\fRFLNMSG,TEXT "?^E^RROR IN RECEIVED FILE NAME"/RECEIVED NAME ERROR MESSAGE
6709 TEXT "^"
6710RHFEMSG,TEXT "^U^NABLE TO RECEIVE - HANDLER" /HANDLER FETCH ERROR MESSAGE
6711 TEXT " ERROR^"
6712\fRIDEMSG,TEXT "?^U^NABLE TO RECEIVE -" /DIRECTORY FULL ERROR MESSAGE
6713 TEXT " INSUFFICIENT DIRECTORY SPACE"
6714RIERMSG,TEXT "%^R^EMOTE LINE INPUT ERROR!%^" /REMOTE LINE ERROR MESSAGE
6715\fRPERMSG,TEXT "?^U^NABLE TO RECEIVE LATEST " /LATEST PACKET ERROR MESSAGE
6716 TEXT "PACKET^"
6717SDERMSG,TEXT "?^U^NABLE TO SEND - DIRECTORY "/DIRECTORY INPUT ERROR MESSAGE
6718 TEXT "ERROR"
6719SHFEMSG,TEXT "?^U^NABLE TO SEND - HANDLER " /HANDLER FETCH ERROR MESSAGE
6720 TEXT "ERROR"
6721\fSNDEMSG,TEXT "?^U^NABLE TO SEND" /GENERAL SEND ERROR MESSAGE
6722UPERMSG,TEXT "?^U^NABLE TO RECEIVE - DATA " /RECEIVED DATA ERROR MESSAGE
6723 TEXT "ERROR"
6724
6725 $ /THAT'S ALL FOLK!