1 \f\fTITLE EDITOR V.003 1 APRIL 1968
\r
2 SUBTTL DECEDIT PARAMETERS
\r
4 DEFINE ERR (A) < JSR A,ERRORX>
\r
5 DEFINE TSTRIN (A) < EXP "A"+"A"+1>
\r
30 OPDEF EXIT [POPJ PDP,]
\r
31 OPDEF CAL [PUSHJ PDP,]
\r
32 OPDEF SAVE [PUSH PDP,]
\r
33 OPDEF UNSAVE [POP PDP,]
\r
35 \fSUBTTL DECTAPE IO - AUGUST 25, 1965
\r
43 FILLB: TLNN FL,1; IS BUFFER LOADED
\r
44 JRST FILLB1; NO, SO LOAD IT
\r
45 MOVE C,WBC; GET BUFFER COUNT
\r
46 CAIG C,177; IS IT GETTIN FULL
\r
48 TRZ FL,S8; SET FIRST BLOCK FLAG TO FALSE
\r
49 TRO FL,S3; AND MODIFIED FLAG TO TRUE
\r
50 MOVEI AC2,WB; GET WORKING BUFFER ADDRESS
\r
51 MOVEI AC3,1; SEQUENCE NUMBER TEST
\r
52 ADDI AC2,125; DUMP ABOUT 2/3 OF BUFFER
\r
53 TDNN AC3,0(AC2); BUT NOT A FRACTIONAL LINE
\r
54 SOJA AC2,.-1; HUNT FOR BEGIN OF LINE
\r
55 HRRZ P,THSBLK; UPDATE PREVIOUS BLOCK NUMBER
\r
56 UGETF DT,IAMTEM; NEXT FREE BLOCK
\r
57 USETO DT,0(P); PREPARE TO DUMP THIS BLOCK
\r
58 MOVE P,IAMTEM; AND PREPARE NEXT BLOCK
\r
59 MOVE AC3,DTOBUF; SET UP BLT
\r
60 HRLZM P,1(AC3); LINK TO NEXT DECTAPE BLOCK
\r
64 SUBI AC1,WB; AND MAKE A COUNT OF IT
\r
65 SUB C,AC1; TOTAL REMAINING WORDS
\r
66 MOVEM C,WBC; SET NEW COUNT
\r
67 ADDI AC1,-1(AC3); SETUP FOR BLT
\r
68 CAL DUMX; TRANSFER AND DUMP BLOCK
\r
69 MOVEI AC3,WB; GET DEST FOR MOVE UP
\r
70 HRL AC3,AC2; AND SOURCE
\r
71 MOVE AC1,AC3; GENERATE LAST ADDRESS
\r
72 ADDI AC1,(C); FROM COUNT
\r
73 BLT AC3,(AC1); ON TOAST
\r
74 EXCH P,THSBLK; SET NEW BLOCK
\r
75 JRST FILLB; GO AGAIN
\r
77 FILLB1: TLNN FL,FOPEN; IS A FILE OPEN
\r
79 TLO FL,1; SET TO FILLED BUFFER
\r
80 JRST GETF; AND GET THE FIRST BLOCK
\r
81 \fGET: TRNE FL,S0; FORWARD OR REVERSE
\r
84 GETN: TRNE FL,S5; IS THERE ANY MORE
\r
87 CAL DUMPB; OUTPUT BLOCK
\r
88 MOVE P,THSBLK; SAVE PREVIOUS FLOCK NUMBER
\r
89 TRZ FL,S8; SET FIRST BLOCK FLAG TO FALSE
\r
90 GET0: HRRZM THSBLK; SAVE CURRENT BLOCK NUMBER
\r
91 USETO DT,@THSBLK; SER OUTPUT FOR PRESENT BLOCK
\r
93 SLURP: INPUT DT,0; INPUT A NEW BLOCK
\r
95 SKIPN; WE DONT LIKE ZERO LINKS
\r
96 TRO FL,S5; SO WE SET A FLAG TO REMIND US
\r
98 MOVEM WBC; AND SAVE IT
\r
99 TRNN FL,S5; WAS IT END OF FILE
\r
101 EXIT; END OF FILE OR NON-EMPTY BLOCK
\r
102 HLRZ WBF; EMPTY BLOCK - GET LINK
\r
103 TRNN FL,S0; DIRECTION CHECK
\r
106 GETL: CAL DUMPB; REVERSE - GET LAST BLOCK-SAVE THIS ONE
\r
107 JUMPN P,GETL1; IS LAST BLOCK AVAILABLE
\r
108 GETF: HRRZ P,FBNUM; NO, SO GET FIRST ONE
\r
109 TRZ FL,S0+S5; SET FORWARD AND END
\r
110 TROA FL,S8; SET FIRST BLOCK AND SKIP
\r
111 GETL1: TRZ FL,S5+S8; SET NON-END AND NON-FIRST
\r
112 USETI DT,(P); ESTABLISH INPUT BLOCK NUMBER
\r
113 USETO DT,(P); AND OUTPUT BLOCK NUMBER
\r
114 MOVEM P,THSBLK; UPDATE CURRENT BLOCK NUMBER
\r
115 SETZM P; AND ZERO PREVIOUS BLOCK NUMBER
\r
116 JRST SLURP; AND INPUT THE BLOCK
\r
117 \fDUMPB: CAL FILLB; SPLIT BLOCKS IF THE OVER-RUN
\r
118 TRZN FL,S3; ANY MODS MADE
\r
120 MOVE AC2,DTOBUF; POINTER TO BUFFERS
\r
121 MOVEI AC3,2(AC2); FIRST WORD ADDRESS
\r
122 HRLI AC3,WB; FIRST DATA WORD
\r
123 HLRZ AC1,WBF; BLOCK NUMBER
\r
124 SKIPN AC1; LAST BLOCK
\r
125 SOS AC1; YES, SO EXTEND
\r
126 HRLM AC1,1(AC2); INTO LINK
\r
127 MOVEI AC1,1(AC2); PREPARE BLT
\r
128 ADD AC1,WBC; SIZE OF BLT
\r
129 DUMX: BLT AC3,(AC1); BLOCK UP SUBROUTINE
\r
130 HRRM AC1,DTOBF1; LAST ADDRESS
\r
131 OUTPUT DT,0; DUMP IT
\r
132 STATO DT,740000; CHECK FOR DEVICE ERROR
\r
134 SETOM FL ; DDE ERROR
\r
137 FINISH: TLNE FL,FOPEN; IF A FILE IS OPEN
\r
139 FINIS2: RELEAS DT,0; RELEASE THE TAPE
\r
140 JRST INITIX; AND GO BACK TO SETUP
\r
142 THSBLK: 0; PRESENT BLOCK NUMBER
\r
143 IAMTEM: 0; TEMPORARY
\r
144 \f\f\fSUBTTL CONTROL - AUGUST 25, 1965
\r
145 ;MAIN LISTEN AND DISPATCH FOR EDITOR CONTROL MODE
\r
146 OUTTER: CAL GETCHR; GET ONE CHARACTER
\r
147 CAIN C,15; INITIAL CARRIAGE RETURNS
\r
148 JRST OUTTER; ARE IGNORED
\r
157 CAIE C,33; ALTERNATE ALTMOD
\r
158 CAIN C,175; THE REGULAR ALTMOD
\r
162 ERR 1; ILLEGAL COMMAND
\r
163 ;OUTPUT A CARRIAGE RETURN
\r
164 CRT: MOVEI INDEX,CRM; PICK UP THE POINTER
\r
165 JRST OTLINE; OUTPUT CRT-LF-*
\r
168 ERRORX: 0; CALLED BY JSR X,ERRORX
\r
169 HRRZ INDEX,ERRORX; WHERE X IS THE ERROR NUMBER
\r
170 LDB INDEX,EPT; EXTRACT THE X
\r
171 MOVEI INDEX,ERT-1(INDEX)
\r
172 ERROX1: MOVEI PDP,PDSTAK; INITIALIZE PUSHDOWN
\r
173 ERROX2: CAL OTLINE; OUTPUT ERROR MESSAGE
\r
174 \f JRST COMLEV; AND A CARRIAGE RETURN - EXIT
\r
175 ;ERROR MESSAGES ET.AL. THESE MUST NOT BE MOVED ABOUT
\r
176 ;SINCE THE PRINT ROUTINE DEPENDS ON THE BIT 35 OF THE
\r
177 ;NEXT MESSAGE TO TERMINATE THE PRESENT ONE
\r
179 CRM: OCT 64245200000; THE CARRIAGE RETURN-LINE FEED-*
\r
180 ERT: TSTRIN <*ILC*>; ILLEGAL COMMAND
\r
181 TSTRIN <*NLN*>; NON-EXISTENT LINE
\r
182 TSTRIN <*ILS*>; ILLEGAL SEQUENCE
\r
183 TSTRIN <*ILR*>; ILLEGAL REFERENCE
\r
184 TSTRIN <*UNA*>; UNIT NOT AVAILABLE
\r
185 TSTRIN <*DCE*>; DIRECTORY CAPACITY EXCEEDED
\r
186 TSTRIN <*NFO*>; NO FILE OPEN
\r
187 TSTRIN <*FAU*>; FILE NAME ALREADY IN USE
\r
188 TSTRIN <*NCF*>; NOT A CURRENT FILE
\r
189 TSTRIN <*DDE*>; DEVICE DATA ERROR
\r
190 EPT: POINT 4,-1(INDEX),12; THE ERROR PRINT DEPENDS
\r
191 ;ON THE 1 IN BIT 35 HERE
\r
193 \f\fSUBTTL EDITOR - AUGUST 25, 1965
\r
196 INSE: CAL GETSEQ; GET THE SEQUENCE NUMBER AND STEP
\r
197 MOVEM CINDEX; THIS INSTR SKIPED IF ONLY ONE ARG
\r
198 JRST INSE3; PROCESS IT
\r
199 INSE2: CAL FIND; TOP OF THE LOOP - SEARCH FOR THE LINE
\r
200 CAMN SINDEX,(INDEX); EXACT MATCH?
\r
202 CAL BACK1; BACKUP TO LAST LINE
\r
203 CAME LAST; IS IT INDEED THE LAST ONE WE PUT IN
\r
205 INSE3: CAL FIND; GET THE LINE
\r
206 CAL OTSEQ; OUTPUT THE SEQUENCE NUMBER
\r
207 CAL GETLIN; GET THE INPUT LINE
\r
208 JRST OUTTER; ALT MODE
\r
209 CAL INSED; INSERT AND DELETE
\r
210 MOVEM SINDEX,LAST; SAVE AWAY THIS LINE NUMBER
\r
212 CAL ASCIA; STEP SEQUENCE
\r
213 JRST INSE2; LOOP BACK FOR NEXT LINE
\r
215 INSED: HRRZ COTP; GET THE SIZE OF THE LINE
\r
216 MOVEI 1,0; SETUP DIRECTION FLAG
\r
217 CAML WC; IF LINE SIZE IS GREATER-EQUAL THAN NEW
\r
218 MOVEI 1,1; SET FLAG TO 1
\r
219 CAME WC; IF OLD LINE IS NON-NULL
\r
220 JRST INSEG; DELETE IT
\r
221 INSE1: JUMPE WC,INSE16; NULL SIZE TO INPUT
\r
222 HLRZ INDEX,COTP; GET LINE ADDRESS
\r
223 ADD INDEX,WC; AND SIZE
\r
224 HLRS COTP; AND COUNT
\r
225 HRLI COTP,TTB; SET SOURCE
\r
226 MOVE 1,COTP; READY FOR BLT
\r
227 BLT COTP,-1(INDEX); MOVE IN THE NEW LINE
\r
228 MOVE COTP,1; RESTORE COTP
\r
229 INSE16: TRO FL,S3+S6; SET MOD FLAGS - GENERAL EXIT
\r
230 CLEARE: MOVEI 1,WB; CLEAR LAST BUFFER WORD
\r
231 ADD 1,WBC; END OF BUFFER
\r
232 SETZM (1); SET TO ZERO
\r
235 ;BACK UP LINE POINTER
\r
236 BACK1: CAIE INDEX,WB; IS THIS THE FIRST LINE IN THE BUFFER
\r
237 JRST BACK; NO, SO NORMAL PROCESS
\r
238 TRO FL,S0; WE MUST GET THE PREVIOUS BLOCK
\r
239 CAL GET; INPUT IT - THIS WILL ALWAYS WORK
\r
240 ADD INDEX,WBC; LAST LINE
\r
241 JRST BACK; NOW WE BACK IT UP
\r
242 MOVE (INDEX); TOP OF LOOP - PICK UP DATA WORD
\r
243 TRNN 1; BIT ONE MAKES IT A SEQUENCE N
\r
244 BACK: SOJA INDEX,.-2; COUNT IT BACK
\r
246 \fINSEG: CAL CSIZE; COMPUTE SIZE OF XFER
\r
247 JUMPE INSEX; ZERO SIZE XFER
\r
248 JUMPN 1,INSER; FORWARD BLT
\r
249 HRLS 0; REVERSE XFER
\r
250 ADD INDEX,0; SET UP POINTER WORD
\r
251 HRRZS 0; READY TO GO
\r
252 INSER: MOVEM INDEX,C; PROTECT XFER WORD
\r
253 BLT C,(INDEX); XFER ONE WORD
\r
254 XCT ITAB(1); STEP UP OR DOWN
\r
255 SOJGE INSER; IF NOT DONE, LOOP BACK
\r
256 INSEX: HRRZ COTP; SETUP SIZE
\r
257 SUB WC; OF NEW BLOCK
\r
259 SUBM WBC; NOW NEW BLOCK SIZE IS IN WBC
\r
260 JRST INSE1; ALL DONE - GO BACK
\r
262 ITAB: SUB INDEX,K5; SHRINK
\r
267 ASCIA: SAVE CINDEX; PROTECT THE STEP
\r
269 AND CINDEX,K2; MASK OUT 60S
\r
273 ADD CINDEX,SINDEX; EXCESS 166 ADDITION
\r
274 AND CINDEX,K3; MASK OUT CARRY BITS
\r
277 ASH SINDEX,-3; GIVES 000 WHERE CARRY HAPPENED, 006
\r
278 SUBM CINDEX,SINDEX; CONVERT TO EXCESS 0 OR 60
\r
279 IOR SINDEX,K4; CONVERT TO EXCESS 60
\r
280 UNSAVE CINDEX; RESTORE THE STEP
\r
281 CAML 7,SINDEX; IF 99999, DON'T GO TO 00009
\r
285 K1: OCT 432150643214; 106
\r
286 K2: OCT 036170743617; 017
\r
287 K3: OCT 375767737576; 077
\r
289 K5: XWD 1,1; +,- ONE TO BOTH HALVES
\r
290 \fFIND: CAL FILLB; FILL THE BUFFER
\r
291 FIND1: TRZ FL,S0+S4; FORWARD SEARCH AND INITIAL SEARCH
\r
292 FIND2: HRRZ WBC; GET THE BUFFER SIZE
\r
293 JUMPE FINDA; EMPTY BLOCK
\r
294 MOVEI INDEX,WB; GET THE DATA ADDRESS
\r
295 MOVE WB; GET THE FIRST DATA WORD
\r
296 CAMLE SINDEX; ARE WE PAST THE LINE
\r
297 JRST FINDA; YES, REVERSE
\r
298 CAMN SINDEX; EXACT MATCH
\r
299 JRST FINDEQ; YES, BE HAPPY
\r
300 ADD INDEX,WBC; FORM ADDRESS OF LAST DATA WORD
\r
301 CAL BACK; FIND ITS SEQUENCE NUMBER
\r
302 CAMLE SINDEX; IT THE LINE IN THIS BLOCK
\r
303 JRST FIND3A; YES, INVESTIGATE FURTHER
\r
304 CAMN SINDEX; EXACT MATCH
\r
306 FINDX: TRNE FL,S5; IS THIS LAST BLOCK
\r
307 JRST FINDC; YES, SO EXIT WITH THIS ADDRESS
\r
308 TRO FL,S4; SCANNING HAS STARTED
\r
309 TRZ FL,S0; AND GO FORWARD
\r
310 JRST FIND4; AWAY WE GO
\r
312 FINDA: MOVEI INDEX,0; SETUP FOR REVERSE
\r
313 TRNN FL,S4; HAVE WE BEEN HERE BEFORE
\r
314 TRNE FL,S8; OR IS IT THE FIRST BLOCK
\r
315 JRST FINDR; YES, SO USE THIS ADDRESS
\r
316 TRO FL,S0; OTHERWISE, GO BACK ONE BLOCK
\r
317 FIND4: CAL GET; GET THE BLOCK
\r
318 JRST FIND2; SEARCH FOR IT
\r
320 FINDC: HRRZ INDEX,WBC; TAIL OF BLOCK IF ENTERED HERE
\r
321 FINDR: ADDI INDEX,WB; HEAD OF BLOCK IF ENTERED HERE
\r
322 JRST FIND3; AND RETURN
\r
324 FIND3A: MOVEI INDEX,WBC; WE WISH TO SCAN THIS BLOCK FOR
\r
325 CAL FINDES; THIS LINE - COMPUTE LINE SIZE
\r
326 CAMN SINDEX; EXACT MATCH
\r
327 JRST FINDEQ; YES, WELL, GOOD
\r
328 CAMG SINDEX; HAVE WE PASSED IT
\r
329 AOJA INDEX,FIND3A+1; NO, SO CONTINUE
\r
330 FIND3: HRLZ COTP,INDEX; RETURN THE ADDRESS OF THE LINE
\r
333 FINDEQ: HRLZ COTP,INDEX; FOUND THE DESIRED LINE
\r
334 CAL FINDES; COMPUTE ITS SIZE
\r
335 HLRZ INDEX,COTP; SET UP INDEX
\r
336 JRST CLEARE; AND EXIT
\r
337 \fFINDES: AOS COTP; FIND SIZE OF LINE
\r
338 MOVE 1(INDEX); FIND NEXT SEQUENCE NUMBER
\r
340 TRNN 1; SEQUENCE NUMBER?
\r
341 JUMPN FINDES; NO, BUT ZERO ALSO DENOTES END
\r
344 CSIZE: HRRZ COTP; COMPUTE SIZE OF TRANSFER
\r
345 HLRZ INDEX,COTP; SIZE OF THIS LINE
\r
346 ADD INDEX; AND THIS LOCATION
\r
347 ADD INDEX,WC; PLUS THE NEW LINE SIZE
\r
348 HRL INDEX,0; IN LEFT HALF IS OLD SIZE
\r
349 SUBI WB; AND TURN IT INTO A COUNT
\r
350 HRRZ C,WBC; FOR A SUBTRACT
\r
351 SUBM C,0; AND NOW ZERO HAS THE XFER SIZE
\r
355 DELETE: CAL GE2SEQ; GET THE RANGE TO BE EXCISED
\r
356 DELOOP: HRRZ INDEX,WBC; GET THE WORD COUNT
\r
357 ADDI INDEX,WB; FORM THE END ADDRESS
\r
358 CAL BACK; GET THE LAST SEQUENCE IN THE BLOCK
\r
359 CAMN LAST; IS THE LAST LINE THE END OF THE RANGE
\r
361 CAML LAST; DO WE WANT TO DELETE THIS ONE TOO
\r
362 JRST DINB; NO,DELETE TERMINATES IN THE BUFFER
\r
363 CAL DREST; ERASE THE REST OF THE BUFFER
\r
364 EMPT: TRNE FL,S5; LAST BLOCK
\r
365 JRST COMLEV; YES, DONE
\r
367 CAL GET; INPUT NEXT BLOCK
\r
368 MOVE SINDEX,WB; GET FIRST LINE
\r
369 TRNN SINDEX,1; IF NOT A ONE, BLOCK IS EMPTY
\r
370 JRST EMPT; SO GET THE NEXT ONE
\r
371 CAL FIND; NEW SINDEX IS THE FIRST LINE - THIS CAL
\r
372 JRST DELOOP; SETS UP THE COUNTS, ETC.
\r
374 DEQ: CAL DREST; DELETE THE REST OF THE BUFFER
\r
375 DEX: JRST COMLEV; EXIT
\r
376 \fDINB: MOVEI INDEX,WBF; GET INITIAL ADDRESS
\r
377 CAL FINDES; SCAN THE LINE
\r
378 JUMPE .+3; END OF BUFFER
\r
379 CAMG LAST; LAST LINE DONE
\r
380 AOJA INDEX,DINB+1; NO, GO AGAIN
\r
381 HLRZS COTP; COMPUTE TOTAL SIZE
\r
382 SUB INDEX,COTP; THIS MUCH SMALLER
\r
383 HRLZS COTP; RESET LEFT HALF
\r
384 HRRM INDEX,COTP; AND RIGHT HALF GET DELTA SIZE
\r
385 CLEARM WC; SET FOR ZERO LENGTH INSERT
\r
386 CAL INSED; INSERT THE NULL LINE
\r
387 JRST COMLEV; AND EXIT
\r
389 DREST: HLRZ INDEX,COTP; DELETE THE REMAINING BUFFER
\r
390 SUBI INDEX,WB; JUST DECREMENT SIZE
\r
391 HRRM INDEX,WBC; OF THE NEW BUFFER
\r
393 \fPRINT: CAL GE2SEQ; GET THE RANGE
\r
394 PRLOOP: MOVE (INDEX); GET A LINE
\r
395 JUMPE GETNEX; ZERO IMPLIES END OF BUFFER - GET NEXT
\r
396 CAMLE LAST; ARE WE STILL IN THE BALLPARK
\r
397 JRST COMLEV; NO, ALL DONE
\r
398 CAL STEP; PREPARE FOR NEXT HUNT
\r
399 CAL OTLINE; PRINT THIS LINE
\r
400 CAL FIND; FIND THE NEXT LINE
\r
401 JRST PRLOOP; LOOK AT IT
\r
403 GE2SEQ: CAL GETSEQ; GET A 2 NUMBER RANGE
\r
404 SKIPA; THERE WERE TWO
\r
407 TROA 1; AND FLAG IT AS A SEQUENCE NUMBER
\r
408 GEX: MOVE SINDEX; DUPLICATE THE INPUT NUMBER IF JUST ONE
\r
409 MOVEM LAST; STORE THE END OF THE RANGE
\r
410 CAL FIND; SEARCH FOR THE FIRST LINE
\r
411 CAMN LAST,FIRST; BOTH THE SAME
\r
412 CAMN SINDEX,(INDEX); BUT NO MATCH FOUNT
\r
413 EXIT; WILL SKIP THIS ONE
\r
416 STEP: SAVE CINDEX ;PROTECT THE STEP
\r
417 MOVEI CINDEX,1; PREPARE TO ADD ONE TO SINDEX
\r
418 MOVEM SINDEX; WHICH WE LOAD FROM ZERO
\r
419 \f\f\f\f\f\f\f JRST ASCIA+1; AWAY
\r
421 PNEXT: MOVE SINDEX,FIRST; PRINT NEXT LINE
\r
422 MOVE SINDEX; UPDATE THE LINE POINTER
\r
423 CAL STEP; NEXT LINE
\r
424 CAL FIND; WHERE IS IT
\r
425 SKIPN SINDEX,(INDEX); ZERO IS END, ALSO LOAD SINDEX
\r
427 MOVEM SINDEX,FIRST; STEP FIRST POINTER
\r
428 CAL OTLINE; PRINT THE LINE
\r
429 JRST OUTTER; BACK TO CONTROL
\r
431 GETNEX: TRNE FL,S5; END OF FILE
\r
432 JRST COMLEV; YES, EXIT
\r
435 MOVEI INDEX,WB; FIRST ADDRESS
\r
436 JRST PRLOOP; RETURN TO PRINT SCAN
\r
437 \f\fSUBTTL TELETYPE IO - AUGUST 25, 1965
\r
439 ;OUTPUT SEQUENCE NUMBER
\r
440 OTSEQ: AOS TYOBF1; STEP THE WORD POINTER
\r\r\r
441 MOVEM SINDEX,@TYOBF1; PUT THE SEQUENCE NO.
\r
442 MOVEI 1,211; AND A TAB
\r
443 IDPB 1,TYOBF1; INTO THE OUTPUT BUFFER
\r
444 OTSEQ4: OUTPUT TYP,0; OUTPUT THE TELETYPE BUFFER
\r
447 ;INPUT ONE LINE FROM TELETYPE AND CONVERT TO SEQUENCED
\r
449 GETLIN: INPUT TYP,0; READ THE LINE
\r
450 MOVEI 1,TTB1; PREEPARE TO BLOCK IT UP
\r
451 HRLI 1,TTB; DESTINATION
\r
453 BLT 1,TTB16; BLOCK IT UP
\r
454 MOVE TPT,KKK1; PREPARE THE CONVERSION POINTER
\r
455 MOVE IPT,TYIBF1; AND READ POINTER
\r
456 MOVE 2,TYIBF2; AND THE COUNT
\r
457 MOVEM SINDEX,(TPT); PUT IN THE SEQUENCE
\r
459 AOJA TPT,EOMLOP+2; START CONVERSION
\r
461 EOMLOP: SOJL 2,EOMOUT; IF ALL OUT OF CHARACTERS
\r
462 ILDB 1,IPT; READ ONE
\r
463 IDPB 1,TPT; WRITE ONE
\r
464 CAIE 1,33; ALTERNATE ALTMOD
\r
465 CAIN 1,175; REGULAR ALTMOD
\r
466 JRST CRT; MAKE EXIT
\r
467 JRST EOMLOP; GET MORE
\r
469 EOMOUT: MOVE WC,TPT; FORM WORD COUNT
\r
470 SUB WC,KKK1; INITIAL VALUE
\r
471 HRRZS WC; CLEAR LEFT
\r
472 CAIN 1,12; LINE FEED
\r
473 ADDI WC,1; MEANS STEP COUNT
\r
474 STEPEX: AOS (PDP); SKIP EXIT
\r
476 KKK1: POINT 7,TTB; INITIAL POINTER
\r
478 ;OUTPUT ONE LINE OF TEXT
\r
480 OTLINE: MOVE (INDEX); FIRST WORD
\r
482 MOVE (INDEX); SUBSEQUENT WORDS
\r
483 JUMPE OTSEQ4; ZERO IMPLIES THE END OF THE WORLD
\r
484 TRNE 1; ONE IMPLIES THE END OF THE LINE
\r
486 OTL1: AOS TYOBF1; PUT IT IN THE OUTPUT BUFFER
\r
488 AOJA INDEX,OTLINE+2; GO FOR MORE
\r
489 \f;GET ONE CHARACTER
\r
491 GETCHR: INPUT TYP,0; GET A LINE
\r
492 MOVE IPT,TYIBF1; PREPARE INPUT POINTER
\r
493 ILDB C,IPT; LOAD THE FIRST CHARACTER
\r
496 ;GET A SEQUENCE PAIR
\r
498 GETSEQ: CLEARB 0,SINDEX; MAKE BOTH ZERO
\r
499 ILDB C,IPT; GET A CHARACTER
\r
500 CAIL C,60; IT MUST BE A NUMBER
\r
502 JRST ETEST; OR A DELIMITER
\r
503 LSH SINDEX,7; NUMBER
\r
504 ADD SINDEX,C; NEW ONE
\r
507 ETEST: CAIN C,56; POINT?
\r
511 SKIPE SINDEX; IF NOTHING INPUT YET
\r
512 CAIE C,15; OR NOT A CARRET
\r
513 COMERR: ERR 1; ILLEGAL COMMAND
\r
514 IOR SINDEX,KK4; MAKE IT AN ASCII THING
\r
515 SKIPE 0; IF TWO ARGS
\r
516 EXCH SINDEX,0; SWAP EM BACK
\r
517 LSH SINDEX,1; LEFT JUSTIFY
\r
518 TRO SINDEX,1; AND FLAG IT
\r
519 MOVEM SINDEX,FIRST; SAVE IT FOR .
\r
520 JUMPE STEPEX; ONLY ONE ARG
\r
523 CMMA: JUMPE SINDEX,COMERR; THREE ARGS?
\r
524 JUMPN COMERR; ONE ARG
\r
525 IOR SINDEX,KK4; ASCII-IZE IT
\r
526 EXCH SINDEX,0; SWAP EM
\r
529 PER: JUMPN SINDEX,COMERR; CANT BE THIRD ARG
\r
530 MOVE SINDEX,FIRST; RETREIVE POINT
\r
531 LSH SINDEX,-1; RIGHT JUSTIFY
\r
534 KK4: OCT 140603014060; 00000
\r
535 \fSUBTTL DECSET - AUGUST 25, 1965
\r
539 ;SET FILE OPEN (*SN,NAME)
\r
541 DECINI: TLNE FL,FOPEN; IF A FILE IS NOT ALREADY OPEN
\r
542 ; THEN GOTO NORMAL PROCESS
\r
543 ERR 1 ; IF FILE OPEN ,MUST CLOSE W. E
\r
544 DECIN1: SETZB FL,WBC; ZERO FLAGS AND WORD COUNT
\r
545 CLEARM DTNAME; FILE NAME
\r
546 CLEARM DTNAME+1; AND EXTENSION
\r
547 CLEARM DTNAME+2; AND DATE
\r
548 CAL GTCHAR; GET UNIT NUMBER
\r
549 CAIL 60; IT MUST BE A NUMBER
\r
551 JRST .-3; IGNORE ANYTHING ELSE
\r
552 DPB [POINT 5,PLUNK,23]; DUMP INTO INIT COMMAND
\r
553 CAL GTCHAR; NEXT CHARACTER
\r
555 JRST .-2; IGNORE ALL ELSE
\r
556 LOOP0: MOVE 1,[POINT 6,DTNAME]; INITIALIZE NAME POINTER
\r
557 MOVEI C,6; MAX NAME LENGTH
\r
558 LOOP: CAL GTCHAR; GET A CHARACTER
\r
559 CAIL "0"; NUMBERS AND LETTERS ONLY COME HERE
\r
560 CAILE "9"; SO HERE FILTER NUMBERS
\r
561 JRST LOOP1; IT IS A LETTER
\r
562 LOOP2: TRC 40; NUMBER - MAKE IT SIXBIT
\r
563 IDPB 1; STORE INTO NAME (OR EXTENSION)
\r
564 SOJG C,LOOP; COUNT DOWN FOR SIZE
\r
565 CAL GTCHAR; NEXT CHARACTER
\r
568 \fGTCHAR: ILDB IPT; LOAD ONE CHARACTER
\r
570 JRST GET1; SNEAK EXIT
\r
571 CAIN "."; AN EXTENSION IS COMMING
\r
572 JRST GET2; FIX IT UP
\r
573 CAIE 33; THE FUNNY ALTMODE
\r
574 CAIN 175; AND THE REAL ONE
\r
575 JRST GET11 ;CAUSE EXIT TO OCCUR
\r
576 CAIN 0,12 ;LF CHAR?
\r
577 JRST GET1 ; YES TREAT AS CR
\r
579 EXIT; NOTA SO EXIT HAPPY
\r
580 TLO FL,100; SET CONTROL A FLAG
\r
581 JRST GTCHAR; GET ANOTHER CHARACTER
\r
582 GET11: TLO FL,2 ;NEW FILE FLAG
\r
584 GET1: UNSAVE; POP OFF EXIT
\r
585 GO: MOVEI DTOBUF; THESE TWO INSTRUCTIONS REQUIRED
\r
586 HRLM PLUNK+1; REQUIRED TO LINK LEFT HALF
\r
587 MOVE SJOBFF; RESET JOB AREA
\r
588 MOVEM JOBFF; TO PREVENT STORAGE EAT-UP
\r
589 INIT DT,0; INITIALIZE DECTAPE
\r
590 PLUNK: SIXBIT /DTA/; RIGHT HALF SET ABOVE
\r
591 XWD 0,DTIBUF; LEFT HALF SET ABOVE
\r
592 ERR 5; UNIT NOT AVAILABLE
\r
593 MOVSI 400000; USE BIT
\r
594 ANDCAM DTB; CLEAR IT
\r
595 HRRI DTB; HEAD OF BUFFER
\r
596 MOVEM DTIBUF; SETUP IN HEADER
\r
597 OUTBUF DT,1; SET UP SINGLE BUFFER
\r
598 TLZE FL,100; NEW DIRECTORY?
\r
599 CALLI DT,13; YES, ZONK IT (UTPCLR)
\r
600 SKIPN DTNAME; NO NAME MEANS JUST CLEAR, PROB
\r
601 JRST FINIS2; SO EXIT AND CLOSE FILE
\r
602 LOOKUP DT,DTNAME; IS THE NAME ALRRADY THERE
\r
603 JRST NEWFIL; NO, SO WE ENTER IT
\r
604 TLNE FL,2; ARE WE ASKING FOR A NEW FILE
\r
607 DOIT: MOVE 2,DTNAME+1; GET LINK
\r
608 USETI DT,(2); SET IT UP
\r
609 OUTPUT DT,; MAKE SYSTEM HAPPY
\r
610 USETO DT,(2); SET UP OUTPUT ALSO
\r
611 TLZN FL,10; NEW FILE?
\r
612 JRST DOIT1; NO, ALMOST DONE
\r
613 SETZM WBF; WE MUST FORCE AN EMPTY BLOCK
\r
614 TLO FL,1; SET BUFFER FULL FLAG
\r
615 SETZM WBC; ZERO LENGTH
\r
616 TRO FL,S3+S5+S6+S8; INITIAL STATE, FIRST BLOCK MODIFIED
\r
617 DOIT1: MOVEM 2,THSBLK; SETUP CURRENT BLOCK NUMBER
\r
618 TLO FL,FOPEN; SET FILE STATUS TO OPEN
\r
619 JRST COMLEV; ALL DONE
\r
620 \fNEWFIL: TLNN FL,2; WAS ALTMOD STRUCK
\r
622 ENTER DT,DTNAME; PUT IN DI
\r
624 TLO FL,10; SET NEW FILE FLAG
\r
627 LOOP1: CAIL "A"; LETTER CHECK
\r
628 CAILE "Z"; IT MUST VERILY BE A LETTER
\r
629 JRST LOOP; WE IGNORE IT
\r
630 JRST LOOP2; WE PROCESS IT
\r
632 GET2: SKIPE DTEXTN; EXTENSION?
\r
633 ERR 1; ALREADY GOT ONE, CANT HAVE TWO
\r
634 TLZ 1,770000; MAGIC TO BYTE POINTER TO POINT TO NEXT
\r
635 MOVEI C,3; ONLY 3 LETTERS IN EXTENSION
\r
636 UNSAVE; POP OF SOME GARBAGE
\r
637 JRST LOOP; RETURN TO LISTEN
\r
639 DTNAME: 0; FILE NAME
\r
640 DTEXTN: 0; FILE EXTENSION
\r
646 \fSUBTTL INITIA - AUGUST 25, 1965
\r
648 INITIA: CALLI 0,0; RESET SYSTEM
\r
649 INIT TYP,AL; RESET CONCOLE
\r
653 INBUF TYP,1; SET UP ONE INPUT BUFFER
\r
654 OUTBUF TYP,2; AND TWO OUTPUT BUFFERS
\r
655 MOVE JOBFF; SAVE FIRST FREE
\r
656 MOVEM SJOBFF; FOR LATER RESTART
\r
657 OUTPUT TYP,0; MAKE SYSTEM HAPPY
\r
658 INITIX: MOVE CINDEX,KK1; INITIALIZE STEP TO 10
\r
659 MOVEI PDP,PDSTAK-1; INITIALIZE PUSHDOWN POINTER
\r
660 CLEARB SINDEX,FL; FLAGS AND SEQUENCE INDEX
\r
661 MOVNI P,1; AND FIRST BLOCK POINTER
\r
662 CLEARM WBC; WORD COUNT
\r
663 COMLEV: CAL CRT; A COMMON RETURN
\r
664 CAIL FL,0 ; DDE ERROR
\r
665 JRST OUTTER ; NO, SO OFF TO LISTEN CONTROL
\r
666 JRST INITIA ; YES GO RESET WORLD
\r
669 KK1: OCT 140603014260; 00010
\r
675 XWD 700,0; SELF ASSIGNED BUFFERS, ETC.
\r
681 WBC: 0; WORKING BUFFER COUNT
\r
683 DTB: XWD 200,DTB; DECTAPE HEADER
\r
685 WB: BLOCK 217; THE WORKING BUFFER
\r
686 RESTT: SIXBIT .RESET.
\r
688 PDSTAK: BLOCK 7; PUSHDOWN STAK
\r
689 TTB: BLOCK 23; TELETYPE BUFFER-BUFFER
\r