Convert BINCOM.MAC to DOS format file.
[retro-software/dec/tops10/v4.5.git] / src / bincom.mac
1 TITLE   BINCOM   V.003\r
2         XALL\r
3         LIST\r
4 \r
5 JOBVER=137\r
6 LOC     JOBVER\r
7 3\r
8 RELOC\r
9 \r
10 CTL==0\r
11 IN1==1\r
12 IN2==2\r
13 \r
14 ACDEV=1\r
15 ACFILE=2\r
16 ACEXT=3\r
17 ACDEL=4\r
18 ACPNTR=5\r
19 C=7     ;CHARACTER FOR PROCESSING\r
20 PP=17   ;PUSH DOWN POINTER\r
21 LPDL=20\r
22 \r
23 COMP:   CLOSE   CTL,\r
24         RELEAS  CTL,\r
25         RELEAS  IN1,\r
26         RELEAS  IN2,\r
27 COMPGO: RESET\r
28         SETZM   PPSET           ;THIS IS THE ZERO WHICH WILL\r
29                                 ;BE "BLT"ED TO CLEAR STORAGE\r
30         MOVE    [XWD PPSET,PPSET+1]     ;ZERO STORAGE AREA\r
31         BLT     ENDP-1\r
32         MOVE    PP,[IOWD LPDL,PPSET+1]  ;SET UP PUSH DOWN LIST\r
33         MOVSI   (SIXBIT /REL/)\r
34         MOVEM   INDIR1+1\r
35         MOVEM   INDIR2+1\r
36         MOVSI   (SIXBIT /TTY/)\r
37         MOVEM   OUTDEV\r
38         SETZM   AZD\r
39         PUSHJ   PP,INITTY\r
40         PUSHJ   PP,CRFL\r
41         MOVEI   10,"*"          ;TELL USER WE ARE READY FOR COMMAND\r
42         IDPB    10,CTOBUF+1\r
43         OUTPUT  CTL,            ;OUT GOES THE "*"\r
44         INPUT   CTL,            ;HERE COMES THE COMMAND STRING\r
45         PUSHJ   PP,NAME1        ;ANALYIZE OUTPUT DEVICE AND NAME\r
46         CAIE    C,137\r
47         JRST    INDEV+1\r
48         JUMPE   ACDEV,INDEV\r
49         MOVE    13,AZDEV        ;GET ASCII NAME OF OUTPUT DEVICE\r
50         MOVEM   13,AZD          ;SAVE IT SO IT WON'T BE\r
51         MOVE    13,AZDEV+1      ;DESTROYED BY INPUT NAMES\r
52         MOVEM   13,AZD+1\r
53         MOVEM   ACDEV,OUTDEV\r
54         MOVEM   ACFILE,OUTDIR   ;PUT SIXBIT FILE NAME IN\r
55         MOVEM   ACEXT,OUTDIR+1  ;AND EXTENSION\r
56 INDEV:  PUSHJ   PP,NAME1        ;GET INPUT FROM COMMAND\r
57         JUMPN   ACDEV,.+4\r
58         HRLI    ACDEV,(SIXBIT/DSK/)\r
59         MOVE    13,[ASCIZ/DSK/]\r
60         MOVEM   13,AZDEV\r
61         MOVEM   ACDEV,INDEV1\r
62         MOVEM   ACDEV,INDEV2\r
63         MOVEM   ACFILE,INDIR1\r
64         SKIPE   ACEXT\r
65         MOVEM   ACEXT,INDIR1+1\r
66         INIT    IN1,14\r
67 INDEV1: SIXBIT  /DSK/\r
68         XWD     INBUF1\r
69         JRST    ERRI\r
70         INBUF   IN1,2           ;DO LOOKUP ON FIRST FILE NAME\r
71         LOOKUP  IN1,INDIR1\r
72         JRST    ERRIA           ;ERROR RETURN\r
73         PUSHJ   PP,NAME1\r
74         SKIPN   ACDEV\r
75         MOVE    ACDEV,INDEV1\r
76         MOVEM   ACDEV,INDEV2\r
77         MOVEM   ACFILE,INDIR2\r
78         SKIPE   ACEXT\r
79         MOVEM   ACEXT,INDIR2+1\r
80         INIT    IN2,14\r
81 INDEV2: SIXBIT  /DSK/\r
82         XWD     INBUF2\r
83         JRST    ERRI\r
84         INBUF   IN2,2           ;LOOKUP ON SECOND FILE NAME\r
85         LOOKUP  IN2,INDIR2\r
86         JRST    ERRIA\r
87         MOVE    13,INDEV1       ;GET INPUT DEV\r
88         CAME    13,INDEV2       ;SAME FOR BOTH?\r
89         JRST    .+6\r
90         CALLI   13,4\r
91         AND     13,[200000000000]\r
92         HLRZ    13,13\r
93         CAIE    13,200000\r
94         JRST    ERRS\r
95         INIT    CTL,0\r
96 OUTDEV: 0\r
97         XWD     CTOBUF,0\r
98         JRST    ERRA\r
99         MOVE    13,OUTDEV\r
100         CALLI   13,4\r
101         TLNN    13,1\r
102         JRST    ERRO\r
103         ENTER   OUTDIR\r
104         JRST    ERRO\r
105         OUTPUT  CTL,\r
106         MOVEI   16,0\r
107 MAIN:   PUSHJ   PP,GCHAR1       ;GET NEXT CHARACTER\r
108         JRST    MAIN1           ;ERROR FINISH\r
109         PUSHJ   PP,GCHAR2       ;GET SECOND FILE.\r
110         JRST    MAIN2\r
111         CAME    1,2             ;CHECK IF SAME.\r
112         PUSHJ   PP,DIFF\r
113         AOJA    16,MAIN         ;COUNT RECORDS.\r
114 \r
115 ; PRINT OUT DIFFERENCE REPORT.\r
116 DIFF:   AOS     0,ERRCNT        ;CHARACTERS DIFFER, INCREASE COUNT\r
117         HRLZ    11,16           ;PRINT OUT LOCATION.\r
118         PUSHJ   PP,OCTOUT\r
119         MOVE    11,1            ;PRINT FIRST ONE\r
120         PUSHJ   PP,SPTOCT\r
121         MOVE    11,2            ;PRINT SECOND ONE\r
122         PUSHJ   PP,SPTOCT\r
123         MOVE    11,1            ;PRINT OUT DIFFERENCE\r
124         XOR     11,2\r
125         PUSHJ   PP,SPTOCT\r
126         JRST    CRFL\r
127 \r
128 ; HANDLE END OF FILES.\r
129 MAIN1:  PUSHJ   PP,GCHAR2       ;END OF FILE 1.\r
130         JRST    MAIN3\r
131         SETZM   1               ;COMPARE TO ZERO\r
132         CAME    1,2\r
133         PUSHJ   PP,DIFF\r
134         AOJA    16,MAIN1\r
135 \r
136 MAIN2:  SETZM   2               ;END OF FILE 2.\r
137         CAME    1,2             ;COMPARE TO ZERO\r
138         PUSHJ   PP,DIFF\r
139         PUSHJ   PP,GCHAR1\r
140         JRST    MAIN3\r
141         AOJA    16,MAIN2\r
142 MAIN3:  SKIPE   0,ERRCNT\r
143         JRST    COMP\r
144         MOVEI   11,[ASCIZ /NO ERRORS ENCOUNTERED/]\r
145         JRST    ERROUT\r
146 \r
147 \fCRFL:  MOVEI   10,15           ;OUTPUT A CARRIAGE RETURN-LINE FEED\r
148         PUSHJ   PP,TYO\r
149         MOVEI   10,12\r
150 \r
151 TYO:    SOSG    CTOBUF+2        ;DECREMENT BUFFER COUNT\r
152         OUTPUT  CTL,            ;BUFFER WAS EMPTY\r
153 DEP:    IDPB    10,CTOBUF+1     ;DEPOSIT CHAR\r
154         CAIN    10,12           ;CHECK IF LINE FEED.\r
155         OUTPUT  CTL,\r
156         POPJ    PP,\r
157 \r
158 OCTOUT: MOVEI   12,6            ;NUMBER OF CHARACTERS TO CONVERT\r
159         MOVEI   10,0            ;RESULTS\r
160         LSHC    10,3            ;DOUBLE SHIFT LEFT, 11.\r
161         ADDI    10,"0"\r
162         PUSHJ   PP,TYO\r
163         SOJG    12,.-4          ; UNTIL COUNT REACHED.\r
164         POPJ    PP,\r
165 \r
166 SPCOUT: MOVEI   10," "          ;TYPE OUT A SPACE\r
167         JRST    TYO\r
168 \r
169 TABOUT: MOVEI   10,11           ;TYPE OUT A TAB\r
170         JRST    TYO\r
171 \r
172 SPTOCT: PUSHJ   PP,TABOUT       ;PRINT OUT NUMBER IN SPLIT OCTAL\r
173         PUSHJ   PP,OCTOUT\r
174         PUSHJ   PP,SPCOUT\r
175         JRST    OCTOUT\r
176 \r
177 \f;ROUTINES FOR OUTPUTING ERROR MESSAGES\r
178 ERRO:   SKIPA   11,[[ASCIZ /?OUTPUT INITIALIZATION ERROR/]]\r
179 ERRS:   MOVEI   11,[ASCIZ /?FILE BEING COMPARED ON SAME INPUT DEVICE/]\r
180 ERROUT: PUSHJ   17,TYPMSG\r
181         JRST    CARR\r
182 \r
183 TYPMSG: PUSHJ   PP,INITTY       ;INITIALIZE TTY\r
184         PUSHJ   PP,CRFL         ;OUTPUT A CARRIAGE RETURN\r
185         TLOA    11,(POINT 7,,)  ;THIS IS POINTER FOR ERROR MESSAGE\r
186 TYPMS1: PUSHJ   PP,TYO          ;OUTPUT CHAR.\r
187         ILDB    10,11           ;LOAD A CHAR. FROM ERROR MESSAGE\r
188         JUMPN   10,TYPMS1       ;ALL ERROR MESSAGES END WITH A ZERO\r
189         POPJ    PP,             ;THROUGH WITH ERROR MESSAGE\r
190 \r
191 CARR:   PUSHJ   PP,CRFL         ;COMMON EXIT FOR ERROR MESSAGES\r
192         PUSHJ   PP,CRFL\r
193         JRST    COMP\r
194 \r
195 ;INITIALIZE TTY FOR ERROR MESSAGES\r
196 INITTY: CLOSE   CTL\r
197         RELEAS  CTL\r
198         INIT    CTL,1\r
199         SIXBIT  /TTY/\r
200         XWD     CTOBUF,CTIBUF\r
201         HALT\r
202         INBUF   CTL,1\r
203         OUTBUF  CTL,1\r
204         OUTPUT  CTL,\r
205         POPJ    PP,\r
206 \r
207 \f;ROUTINE TO GET NEXT CHARACTER\r
208 GCHAR1: SOSG    0,INBUF1+2\r
209         JRST    GCH1FL          ;FILL BUFFER IF EMPTY\r
210         SKIPN   0,INBUF1+2\r
211         JRST    .-2             ; TRY AGAIN\r
212         ILDB    1,INBUF1+1\r
213         JRST    GCH1OK\r
214 GCH1FL: INPUT   IN1,            ;INPUT FOR FILE 1\r
215         STATO   IN1,762000      ;ERRORS OR END OF FILE?\r
216         JRST    GCHAR1+2                ;NO\r
217         STATO   IN1,742000      ;YES, EOF?\r
218         POPJ    PP,     \r
219         MOVEI   11,[ASCIZ /?FILE 1 READ ERROR/]\r
220         JRST    ERROUT\r
221 GCH1OK: AOS     0,(PP)\r
222         POPJ    PP,\r
223 \r
224 GCHAR2: SOSG    0,INBUF2+2\r
225         JRST    GCH2FL          ;FILL BUFFER IF EMPTY\r
226         SKIPN   0,INBUF2+2\r
227         JRST    .-2             ; TRY AGAIN\r
228         ILDB    2,INBUF2+1\r
229         JRST    GCH2OK\r
230 GCH2FL: INPUT   IN2,\r
231         STATO   IN2,762000\r
232         JRST    GCHAR2+2\r
233         STATO   IN2,742000\r
234         POPJ    PP,\r
235         MOVEI   11,[ASCIZ /?FILE 2 READ ERROR/]\r
236         JRST    ERROUT\r
237 GCH2OK: AOS     0,(PP)\r
238         POPJ    PP,\r
239 \r
240 \f;THE CODE ON THIS PAGE IS FOR HANDLING INPUT ERRORS \r
241 ;THERE ARE TWU TYPES OF ERRORS--EITHER THE FILE IS NOT FOUND\r
242 ;OR THE DEVICE IS NOT AVAILABLE--THE FORMAT FOR THESE MESSAGES\r
243 ;IS THE SAEM FORMAT USED FOR THE "TECO" MESSAGES.\r
244 \r
245 ERRA:   MOVE    13,AZD\r
246         MOVEM   13,AZDEV\r
247         MOVE    13,AZD+1\r
248         MOVEM   13,AZDEV+1\r
249         JRST    ERRI\r
250 \r
251 ERRIA:  MOVEI   11,[ASCIZ /?INPUT ERROR.../]\r
252         PUSHJ   PP,TYPMSG       ;TYPE FIRST PART OF MESSAGE\r
253         MOVEI   11,AZFIL        ;ADR. OF ASCII FILE NAME\r
254         PUSHJ   PP,TYPMS1-1     ;TYPE FILE NAME\r
255         SKIPN   0,AZEXT         ;IS THERE AN EXTENSION\r
256         JRST    NOEXT           ;NO EXTENSION\r
257         MOVEI   10,"."          ;FOR EXTENSION\r
258         XCT     DEP             ;THIS PUTS IT IN\r
259         MOVEI   11,AZEXT        ;GET ADR OF ASCII EXTENSION\r
260         PUSHJ   PP,TYPMS1-1\r
261 NOEXT:  MOVEI   11,[ASCIZ / FILE NOT FOUND/]    ;FINISH MESSAGE\r
262         PUSHJ   PP,TYPMS1-1\r
263         JRST    CARR            ;THIS WILL OUTPUT TWO C.R. AND EXIT\r
264 \r
265 ERRI:   MOVEI   11,[ASCIZ /?DEVICE /]\r
266         PUSHJ   PP,TYPMSG       ;TYPE BEGINNING OF MESSAGE\r
267         MOVEI   11,AZDEV        ;ADR OF DEVICE NAME\r
268         PUSHJ   PP,TYPMS1-1     ;OUTPUT DEVICE NAME\r
269         MOVEI   11,[ASCII / NOT AVAILABLE/]\r
270         PUSHJ   PP,TYPMS1-1     ;TYPE REST OF MESSAGE\r
271         JRST    CARR            ;INSERT CARRIAGE RETURNS AND EXIT\r
272 \r
273 \fNAME1: SETZB   ACDEV,AZDEV     ;ZERO THE REGISTERS WHICH WILL RETURN THE NAMES\r
274         SETZB   ACDEL,AZFIL\r
275         SETZM   AZTEM\r
276         SETZB   ACFILE,AZEXT\r
277         SETZB   ACEXT,AZTEM+1\r
278 \r
279 NAME3:  MOVE    16,[POINT 7,AZTEM]      ;THIS IS A POINTER FOR DEPOSITING THE\r
280                                 ;ASCII CHARACTERS IN CASE AN INPUT\r
281                                 ;ERROR IS DECTECTED--FOR THEN WE WILL\r
282                                 ;HAVE TO PRINT THESE NAMES OUT\r
283         MOVSI   ACPNTR,(POINT 6,0)      ;SET POINTER\r
284         SETZ    13,\r
285         MOVEI   0,0             ;THE SIXBIT NAME WILL BE STORED IN THE AC0\r
286 \r
287 GETIOC: PUSHJ   PP,TTYIN        ;GET INPUT CHARACTER\r
288         CAIN    C,":"           ;HAVE WE BEEN GETTING A DEVICE NAME\r
289         JRST    DEVICE          ;YES\r
290         CAIN    C,"."           ;OR A FILE NAME\r
291         JRST    NAME            ;YES\r
292         CAIN    C,","           ;THIS IS ANOTHER WAY TO GET A FILE NAME\r
293         JRST    TERM\r
294         CAIE    C,137           ;ONE KIND OF SEPERATOR\r
295         CAIG    C,15            ;THIS ALSO MEANS WE HAVE FINISHED A TERM\r
296         JRST    TERM            ;TERM HAAS BEEN READ\r
297         SUBI    C,40            ;CONVERT TO 6-BIT\r
298         TLNE    ACPNTR,770000   ;HAVE WE STORED SIX BYTES?\r
299         IDPB    C,ACPNTR        ;NO, STORE  IT\r
300         ADDI    C,40            ;CONVERT BACK TO ASCII FOR ERROR MESSAGES.\r
301         IDPB    C,16            ;STORE IN AC13\r
302         JRST    GETIOC          ;GET ANOTHER CHAR.\r
303 \r
304 \fDEVICE:        MOVE    13,AZTEM\r
305         MOVEM   13,AZDEV        ;STORE ASCII DEVICE NAME\r
306         MOVE    13,AZTEM+1\r
307         MOVEM   13,AZDEV+1\r
308         MOVE    ACDEV,0\r
309         JRST    .+6\r
310 NAME:   MOVE    ACFILE,0        ;FILE NAME\r
311         MOVE    13,AZTEM\r
312         MOVEM   13,AZFIL        ;STORE ASCII NAME\r
313         MOVE    13,AZTEM+1\r
314         MOVEM   13,AZFIL+1\r
315         SETZM   AZTEM\r
316         SETZM   AZTEM+1\r
317         MOVE    ACDEL,C         ;SET DELIMITER\r
318         JRST    NAME3           ;GET NEXT SYMBOL\r
319 \r
320 TERM:   CAIN    ACDEL,0         ;IF NO PREVIOUS DELIMITOR, OR\r
321         JRST    .+3\r
322         CAIE    ACDEL,":"       ;IF PREVIOUS DELIMITER\r
323         JRST    TERM1\r
324         MOVE    13,AZTEM\r
325         MOVEM   13,AZFIL\r
326         MOVE    13,AZTEM+1\r
327         MOVEM   13,AZFIL+1\r
328         SETZM   AZTEM\r
329         SETZM   AZTEM+1\r
330         MOVE    ACFILE,0        ;SET FILE\r
331 TERM1:  CAIE    ACDEL,"."       ;IF PERIOD,\r
332         POPJ    PP,\r
333         MOVE    13,AZTEM\r
334         MOVEM   13,AZEXT        ;STORE ASCII EXTENSION\r
335         HLLZ    ACEXT,0         ;SET EXTENSION\r
336         POPJ    PP,             ;EXIT\r
337 \r
338 TTYIN:  ILDB    C,CTIBUF+1      ;GET CHARACTER\r
339         CAIE    C,40            ;SKIP BLANKS\r
340         CAIN    C,11            ;AND TABS\r
341         JRST    TTYIN\r
342         POPJ    PP,             ;NO, EXIT\r
343 \f\r
344 PPSET:  BLOCK   20\r
345 INDIR1: BLOCK   4\r
346 INDIR2: BLOCK   4\r
347 AZD:    BLOCK   2       ;OUTPUT FILE NAME\r
348 AZTEM:  BLOCK   2\r
349 AZFIL:  BLOCK   2       ;FOR ASCII FILE NAME\r
350 AZDEV:  BLOCK   2       ;FOR ASCII DEVICE NAME\r
351 AZEXT:  BLOCK   1       ;FOR ASCII EXTENSION\r
352 CTIBUF: BLOCK   3\r
353 CTOBUF: BLOCK   3\r
354 INBUF1: BLOCK   3\r
355 INBUF2: BLOCK   3\r
356 ERRCNT: BLOCK   1\r
357 OUTDIR: BLOCK   4\r
358         ENDP:\r
359         END     COMPGO\r