Cleanup of typos.
[retro-software/dec/tops10/v1.19.git] / src / editor.mac
1 \f\fTITLE EDITOR   V.003  1 APRIL 1968\r
2 SUBTTL DECEDIT PARAMETERS\r
3 \r
4 DEFINE ERR (A) <        JSR A,ERRORX>\r
5 DEFINE TSTRIN (A) <     EXP "A"+"A"+1>\r
6 \r
7 S0=1\r
8 S1=2\r
9 S2=4\r
10 S3=10\r
11 S4=40\r
12 S5=20\r
13 S6=100\r
14 S7=200\r
15 S8=400\r
16 PDP=3\r
17 FL=4\r
18 INDEX=11\r
19 WC=12\r
20 C=13\r
21 COTP=14\r
22 IPT=5\r
23 TPT=6\r
24 P=10\r
25 SINDEX=15\r
26 CINDEX=16\r
27 LAST=17\r
28 TYP=2\r
29 DT=3\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
34 EXTERNAL JOBFF\r
35 \fSUBTTL DECTAPE IO - AUGUST 25, 1965\r
36 \r
37 FOPEN=1000\r
38 AC1=1\r
39 AC2=2\r
40 AC3=5\r
41 AC4=6\r
42 \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
47 ATSALL: EXIT;   NO\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
61         HRLI AC3,WB;    SOURCE\r
62         ADDI AC3,2;     +2\r
63         MOVE AC1,AC2;   LAST\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
76 \r
77 FILLB1: TLNN FL,FOPEN;  IS A FILE OPEN\r
78         ERR 7;          NO, SO *NFO*\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
82         JRST GETL;      REVERSE\r
83 \r
84 GETN:   TRNE FL,S5;     IS THERE ANY MORE\r
85         EXIT;           NO\r
86         HLRZ WBF;       GET LINK\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
92 \r
93 SLURP:  INPUT DT,0;     INPUT A NEW BLOCK\r
94         HLRZ WBF;       GET LINK\r
95         SKIPN;          WE DONT LIKE ZERO LINKS\r
96         TRO FL,S5;      SO WE SET A FLAG TO REMIND US\r
97         HRRZ WBF;       GET COUNT\r
98         MOVEM WBC;      AND SAVE IT\r
99         TRNN FL,S5;     WAS IT END OF FILE\r
100         SKIPE;          EMPTY BLOCK\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
104         JRST GET0;      FORWARD\r
105 \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
119         EXIT;           NO\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
133         EXIT;           ALL IS GOOD\r
134         SETOM FL     ; DDE ERROR\r
135         ERR 12;         *DDE*\r
136 \r
137 FINISH: TLNE FL,FOPEN;  IF A FILE IS OPEN\r
138         CAL DUMPB;      DUMP IT\r
139 FINIS2: RELEAS DT,0;    RELEASE THE TAPE\r
140         JRST INITIX;    AND GO BACK TO SETUP\r
141 \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
149         CAIN C,"I"\r
150         JRST INSE\r
151         CAIN C,"D"\r
152         JRST DELETE\r
153         CAIN C,"P"\r
154         JRST PRINT\r
155         CAIN C,"E"\r
156         JRST FINISH\r
157         CAIE C,33;      ALTERNATE ALTMOD\r
158         CAIN C,175;     THE REGULAR ALTMOD\r
159         JRST PNEXT\r
160         CAIN C,"S"\r
161         JRST DECINI\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
166 \r
167 ;ERROR PRINT\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
178 \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
192 ;COMMUNICATIONS\r
193 \f\fSUBTTL EDITOR - AUGUST 25, 1965\r
194 \r
195 ;INSERT LINE(S)\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
201         ERR 4;          YES, *ILR*\r
202         CAL BACK1;      BACKUP TO LAST LINE\r
203         CAME LAST;      IS IT INDEED THE LAST ONE WE PUT IN\r
204         ERR 3;          NO, *ILS*\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
211         MOVEM SINDEX,FIRST\r
212         CAL ASCIA;      STEP SEQUENCE\r
213         JRST INSE2;     LOOP BACK FOR NEXT LINE\r
214 \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
233         EXIT;           GO AWAY\r
234 \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
245         EXIT\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
258         EXCH WBC;\r
259         SUBM WBC;       NOW NEW BLOCK SIZE IS IN WBC\r
260         JRST INSE1;     ALL DONE - GO BACK\r
261 \r
262 ITAB:   SUB INDEX,K5;   SHRINK\r
263         ADD INDEX,K5;   GROW\r
264 \r
265 ;THE ASCII ADDER\r
266 \r
267 ASCIA:  SAVE CINDEX;    PROTECT THE STEP\r
268         MOVE 7,SINDEX\r
269         AND CINDEX,K2;  MASK OUT 60S\r
270         LSH CINDEX,1;\r
271         IOR SINDEX,K4;\r
272         ADD SINDEX,K1;\r
273         ADD CINDEX,SINDEX;      EXCESS 166 ADDITION\r
274         AND CINDEX,K3;  MASK OUT CARRY BITS\r
275         MOVE SINDEX,K4;\r
276         AND SINDEX,CINDEX;\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
282         ERR 3\r
283         EXIT;           LEAVE\r
284 \r
285 K1:     OCT 432150643214;       106\r
286 K2:     OCT 036170743617;       017\r
287 K3:     OCT 375767737576;       077\r
288 K4:     TSTRIN <00000>\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
305         JRST FINDEQ;    YES\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
311 \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
319 \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
323 \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
331         JRST CLEARE;    EXIT\r
332 \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
339         AOS INDEX;\r
340         TRNN 1;         SEQUENCE NUMBER?\r
341         JUMPN FINDES;   NO, BUT ZERO ALSO DENOTES END\r
342         EXIT;           DONE\r
343 \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
352         EXIT;\r
353 \r
354 \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
360         JRST DEQ;       YES\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
366         TRZ FL,S0;      FORWARD\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
373 \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
388 \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
392         JRST INSE16;    DONE\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
402 \r
403 GE2SEQ: CAL GETSEQ;     GET A 2 NUMBER RANGE\r
404         SKIPA;          THERE WERE TWO\r
405         JRST GEX;       ONLY ONE\r
406         LSH 1;          JUSTIFY IT\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
414         ERR 2;          AND *NLN*\r
415 \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
420 \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
426         ERR 2;          *NLN*\r
427         MOVEM SINDEX,FIRST;     STEP FIRST POINTER\r
428         CAL OTLINE;     PRINT THE LINE\r
429         JRST OUTTER;    BACK TO CONTROL\r
430 \r
431 GETNEX: TRNE FL,S5;     END OF FILE\r
432         JRST COMLEV;    YES, EXIT\r
433         TRZ FL,S0;      FORWARD\r
434         CAL GET;        INPUT IT\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
438 \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
445         EXIT\r
446 \r
447 ;INPUT ONE LINE FROM TELETYPE AND CONVERT TO SEQUENCED\r
448 \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
452         CLEARM TTB\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
458         MOVEI 1,211;    TAB\r
459         AOJA TPT,EOMLOP+2;      START CONVERSION\r
460 \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
468 \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
475         EXIT\r
476 KKK1:   POINT 7,TTB;    INITIAL POINTER\r
477 \r
478 ;OUTPUT ONE LINE OF TEXT\r
479 \r
480 OTLINE: MOVE (INDEX);   FIRST WORD\r
481         JRST OTL1\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
485         JRST OTSEQ4\r
486 OTL1:   AOS TYOBF1;     PUT IT IN THE OUTPUT BUFFER\r
487         MOVEM @TYOBF1\r
488         AOJA INDEX,OTLINE+2;    GO FOR MORE\r
489 \f;GET ONE CHARACTER\r
490 \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
494         EXIT\r
495 \r
496 ;GET A SEQUENCE PAIR\r
497 \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
501         CAILE C,71\r
502         JRST ETEST;     OR A DELIMITER\r
503         LSH SINDEX,7;   NUMBER\r
504         ADD SINDEX,C;   NEW ONE\r
505         JRST GETSEQ+1\r
506 \r
507 ETEST:  CAIN C,56;      POINT?\r
508         JRST PER\r
509         CAIN C,54;      COMMA?\r
510         JRST CMMA\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
521         EXIT;           TWO ARGS\r
522 \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
527         JRST GETSEQ+1\r
528 \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
532         JRST GETSEQ+1\r
533 \r
534 KK4:    OCT 140603014060;       00000\r
535 \fSUBTTL DECSET - AUGUST 25, 1965\r
536 \r
537 FOPEN=1000\r
538 \r
539 ;SET FILE OPEN (*SN,NAME)\r
540 \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
550         CAILE 70;\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
554         CAIE 54;                COMMA?\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
566         JRST .-1;\r
567 \r
568 \fGTCHAR:        ILDB IPT;               LOAD ONE CHARACTER\r
569         CAIN 15;                CRT\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
578         CAIE 1;         CONTROL A\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
583 \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
605         ERR 10;         YES, FAU\r
606 \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
621         ERR 11;         NO, NCF\r
622         ENTER DT,DTNAME;        PUT IN DI\r
623         ERR 6;          DCE\r
624         TLO FL,10;      SET NEW FILE FLAG\r
625         JRST DOIT;\r
626 \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
631 \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
638 \r
639 DTNAME: 0;      FILE NAME\r
640 DTEXTN: 0;      FILE EXTENSION\r
641 DTDATE: 0;      DATE\r
642         0;              DUMMY\r
643 \r
644 FBNUM=DTEXTN\r
645 \r
646 \fSUBTTL INITIA - AUGUST 25, 1965\r
647 AL=1\r
648 INITIA: CALLI 0,0;      RESET SYSTEM\r
649         INIT TYP,AL;    RESET CONCOLE\r
650         SIXBIT /TTY/\r
651         XWD TYOBUF,TYIBUF\r
652         HALT\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
667 \r
668 ;BUFFERS, ET. AL.\r
669 KK1:    OCT 140603014260;       00010\r
670 TYOBUF: BLOCK 3\r
671 TYIBUF: BLOCK 3\r
672 \r
673 DTOBUF: BLOCK 3\r
674 DTIBUF: 0\r
675         XWD 700,0;      SELF ASSIGNED BUFFERS, ETC.\r
676         0\r
677 \r
678 FIRST:  0\r
679 SJOBFF: 0\r
680 \r
681 WBC:    0;              WORKING BUFFER COUNT\r
682         0\r
683 DTB:    XWD 200,DTB;    DECTAPE HEADER\r
684 WBF:    0\r
685 WB:     BLOCK 217;      THE WORKING BUFFER\r
686 RESTT:  SIXBIT .RESET.\r
687 \r
688 PDSTAK: BLOCK 7;        PUSHDOWN STAK\r
689 TTB:    BLOCK 23;       TELETYPE BUFFER-BUFFER\r
690 TTB16:  0\r
691 \r
692 TTB1=TTB+1\r
693 TYIBF1=TYIBUF+1\r
694 TYIBF2=TYIBUF+2\r
695 TYOBF1=TYOBUF+1\r
696 DTOBF1=DTOBUF+1\r
697 \r
698 EXTERNAL JOBFF\r
699 EDEND:\r
700 \r
701 END INITIA\r
702 \f\r