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