Initial commit
[retro-software/dec/tops10/v1.19.git] / src / rim10b.mac
1 \f       TITLE   RIMIO\r
2 \r
3 ;CONVERTS RIM10B PAPER TAPES TO DMP FILES AND VICE-VERSA\r
4 \r
5 EXTERN JOBSA,JOBREL,JOBSYM,JOBS41\r
6 \r
7 A=1\r
8 B=2\r
9 C=3\r
10 D=4\r
11 CHK=13\r
12 BLK=14\r
13 LNG=15\r
14 R=16\r
15 P=17\r
16 \r
17 PDLEN==40\r
18 \r
19 PDLIST: BLOCK   PDLEN\r
20 \r
21 OFILE:  BLOCK   5                       ;OFILE+4 IS THE DEVICE.\r
22 IFILE:  BLOCK   5                       ;IFILE+4 IS THE DEVICE\r
23 OBUF:   BLOCK   3\r
24 IBUF:   BLOCK   3\r
25 \r
26 DMPBUF: BLOCK   200                     ;RANDOM ACCESS DUMP IO BUFFER.\r
27 HILOC:  0\r
28 \f;ERRORS:\r
29 \r
30 NOENT:  OUTSTR  [ASCIZ/Enter to create output file failed.\r
31 /]\r
32         JRST    BEGIN\r
33 \r
34 NOLALT: OUTSTR  [ASCIZ/Lookup to read-alter the output file failed.\r
35 /]\r
36         JRST    BEGIN\r
37 \r
38 NOALT:  OUTSTR  [ASCIZ/Enter to read-alter the output file failed.\r
39 /]\r
40         JRST    BEGIN\r
41 \r
42 NOPTR:  OUTSTR  [ASCIZ/OPEN of device PTR: failed.\r
43 /]\r
44         JRST    BEGIN\r
45 \r
46 NOOPEN: OUTSTR  [ASCIZ/OPEN failed\r
47 /]\r
48         JRST    BEGIN\r
49 \r
50 \f;INITIALIZATION, DISPATCH\r
51 \r
52 BEGIN:  RESET\r
53         MOVE    P,[IOWD PDLEN,PDLIST]\r
54 RORP:   OUTSTR  [ASCIZ/Read tape or Punch tape?  (Type R or P)  /]\r
55         INCHWL  A\r
56         PUSHJ   P,CLRIN\r
57         TRZ     A,40                    ;MAKE SURE IT'S UPPERCASE\r
58         CAIN    A,"R"\r
59         JRST    RTAPE\r
60         CAIN    A,"P"\r
61         JRST    PTAPE\r
62         OUTSTR  [ASCIZ/?\r
63 /]\r
64         JRST    RORP\r
65 \r
66 CLRIN:  PUSH    P,A\r
67 CLRIN1: CAIE    A,175\r
68         CAIN    A,12\r
69         JRST    APOPJ\r
70         INCHWL  A\r
71         JRST    CLRIN1\r
72 \r
73 ;HERE'S HOW THE RIM10B LOADER LOOKS ON THE TAPE:\r
74 PTR??104\r
75 ;AC 10 CONTAINS (WHEN 5 IS EXECUTED):\r
76 ;       SOJA    10,4 - INITIAL POINTER OR JRST WORD\r
77 ;       SOJA    10,3 - MIDDLE OF DATA BLOCK\r
78 ;       SOJA    10,2 - WHEN READING THE CHECKSUM WORD\r
79 ;\r
80 RIM10B: -16,,0                          ; 0  INITIAL BLKI WORD\r
81         CONO    PTR,60                  ; 1  START PTR IN BINARY MODE\r
82         HRRI    10,4                    ; 2  INITIALIZE 10 (FOR INDEX AND JUMP ADDR)\r
83         CONSO   PTR,10                  ; 3  SKIP IF DONE\r
84         JRST    3                       ; 4  WAIT FOR DONE\r
85         DATAI   PTR,@7(10)              ; 5  STORE DATA INDIRECT (13 OR 12 OR 11)\r
86         XCT     7(10)                   ; 6  EXECUTES 13 OR 12 OR 11\r
87         XCT     12(10)                  ; 7  EXECUTES 16 OR 15 OR 14\r
88         SOJA    10,0                    ;10  RH IS CLOBBERED TO 4 OR 3 OR 1\r
89         CAME    17,16                   ;11  XCTED TO CHECK CHECKSUM\r
90         ADD     17,1(16)                ;12  XCTED TO COMPUTE CHECKSUM\r
91         SKIPL   17,16                   ;13  XCT TO INITIALIZE CHECKSUM AND\r
92                                         ;    SKIP IF THIS IS AN AOBJN WORD\r
93         JRST    4,1                     ;14  XCT TO HALT IF CHECKSUM FAILS\r
94         AOBJN   16,3                    ;15  XCT WHILE READING MIDDLE OF DATA BLOCK\r
95         JRST    2                       ;16  XCTED BY READIN MODE. XCT TO START PRGM\r
96                                         ;17  CHECKSUM IS STORED HERE.\r
97 \r
98 RIMPTR: RIM10B-.,,RIM10B-1              ;IOWD POINTER TO THE RIM10B LOADER\r
99 \f;RTAPE\r
100 \r
101 RTAPE:  OUTSTR  [ASCIZ/Output file name: /]\r
102         MOVEI   R,OFILE\r
103         MOVE    A,[OFILE,,OFILE+1]\r
104         SETZM   OFILE\r
105         BLT     A,OFILE+4\r
106         MOVSI   A,'DMP'\r
107         MOVEM   A,OFILE+1\r
108         PUSHJ   P,GETFIL                        ;READ FILE NAME FROM USER.\r
109 \r
110         MOVEI   A,17                            ;OPEN CHANNEL\r
111         SKIPN   B,OFILE+4\r
112         MOVSI   B,'DSK'\r
113         MOVEI   C,0\r
114         OPEN    1,A\r
115         JRST    NOOPEN\r
116         MOVE    D,[OFILE,,A]\r
117         BLT     D,D\r
118         ENTER   1,A                             ;SELECT OUTPUT FILE.\r
119         JRST    NOENT   \r
120         CLOSE   1,                              ;WRITE 0 LENGTH FILE.\r
121         RELEAS  1,\r
122         MOVEI   A,17                            ;RE-OPEN CHANNEL\r
123         SKIPN   B,OFILE+4\r
124         MOVSI   B,'DSK'\r
125         MOVEI   C,0\r
126         OPEN    1,A\r
127         JRST    NOOPEN\r
128         MOVE    D,[OFILE,,A]\r
129         BLT     D,D\r
130         LOOKUP  1,A                             ;SEEK FILE WE JUST WROTE\r
131         JRST    NOLALT                          ;I JUST WROTE ONE. WHERE IS IT?\r
132         MOVE    D,[OFILE,,A]\r
133         BLT     D,D\r
134         ENTER   1,A                             ;ENTER READ-ALTER MODE\r
135         JRST    NOALT   \r
136 \r
137         INIT    0,13                            ;PTR IN BINARY MODE.\r
138         'PTR   '\r
139         IBUF\r
140         JRST    NOPTR\r
141 \r
142         OUTSTR  [ASCIZ/Mount paper tape and type return when ready:\r
143 /]\r
144         MOVEI   A,0\r
145         PUSHJ   P,CLRIN\r
146 \r
147         MOVE    B,RIMPTR\r
148         PUSHJ   P,TREAD                         ;READ IOWD FOR TAPE'S LOADER\r
149         CAMLE   A,1(B)                          ;OK IF TAPE'S LOADER IS LONGER\r
150         JRST    BADRIM                          ;BUT NOT IF SHORTER.\r
151         MOVE    C,A                             ;IOWD FOR TAPE'S LOADER\r
152         ADD     B,[1,,1]\r
153 RIMCHK: PUSHJ   P,TREAD                         ;\r
154         CAME    A,1(B)\r
155         JRST    BADRIM                          ;TAPE ISN'T IN RIM FORMAT.\r
156         ADD     C,[1,,1]\r
157         AOBJN   B,RIMCHK                        ;LOOP, GOBBLING THE RIM10B LOADER.\r
158         JUMPG   C,RIMOK                         ;JUMP IF TAPE'S IOWD IS COUNTED OUT\r
159         PUSHJ   P,TREAD                         ;READ AND THROW OUT EXTRA WORDS\r
160         AOBJN   C,.-1                           ;FROM THE TAPE'S LOADER.\r
161 RIMOK:  PUSHJ   P,FILINI\r
162 GETBLK: PUSHJ   P,TREAD\r
163         SKIPL   B,A                             ;SKIP IF THIS IS A POINTER WORD\r
164         JRST    SSTART                          ;SET STARTING ADDRESS\r
165         MOVE    CHK,B                           ;INITIALIZE CHECKSUM\r
166 RIMLP:  PUSHJ   P,TREAD\r
167         ADD     CHK,A\r
168         PUSHJ   P,FILSTR                        ;STORE IN FILE. DATA A IN LOC 1(B)\r
169         AOBJN   B,RIMLP                         ;LOOP\r
170         PUSHJ   P,TREAD                         ;READ CHECKSUM WORD\r
171         CAMN    A,CHK\r
172         JRST    GETBLK                          ;GET ANOTHER IOWD.\r
173         OUTSTR  [ASCIZ/Checksum failure.\r
174 /]\r
175         HALT    GETBLK\r
176 \r
177 UNEOF:  OUTSTR  [ASCIZ/Unexpected End of File from PTR:\r
178 /]\r
179         MOVEI   A,0                             ;STORE ZERO FOR THE STARTING ADDRE.\r
180 SSTART: MOVE    B,HILOC                         ;GET HIGHEST LOC LOADED.\r
181         HRLI    A,1(B)                          ;ONE BEYOND IS INITIAL JOBFF\r
182         MOVEI   B,JOBSA-1\r
183         PUSHJ   P,FILSTR\r
184         PUSHJ   P,FILFRC\r
185         CLOSE   1,\r
186         RELEAS  1,\r
187         RELEAS  0,\r
188         JRST    BEGIN\r
189 \r
190 BADRIM: OUTSTR  [ASCIZ/Bad format RIM10B loader at the front of the tape?\r
191 /]\r
192         JRST    BEGIN\r
193 \r
194 PTRERR: OUTSTR  [ASCIZ/PTR input error\r
195 /]\r
196         GETSTS  0,A\r
197         HALT    .+1\r
198         SETSTS  0,10\r
199 TREAD:  SOSLE   IBUF+2\r
200         JRST    TRED1\r
201         INPUT   0,\r
202         STATZ   0,20000\r
203         JRST    [POP P,(P)\r
204                 JRST UNEOF]\r
205         STATZ   0,740000\r
206         JRST    PTRERR\r
207 TRED1:  ILDB    A,IBUF+1\r
208         POPJ    P,\r
209 \r
210 FILSTR: MOVEI   C,1(B)                  ;C?ABSOLUTE ADDRESS.\r
211         CAIN    C,36                    ;EXEC MODE JOBSYM?\r
212         MOVEI   C,JOBSYM\r
213         CAIN    C,41                    ;UUO TRAP?\r
214         MOVEI   C,JOBS41                ;YES.  HERE'S WHERE IT BELONGS IN DMP FORMAT\r
215         CAMLE   C,HILOC                 ;IS THIS HIGHEST LOC LOADED THUS FAR?\r
216         MOVEM   C,HILOC                 ;YES.  SAVE HIGHEST LOC LOADED.\r
217         SUBI    C,74                    ;OFFSET TO DMP FILE ORIGIN=WORD # IN FILE.\r
218         JUMPL   C,CPOPJ                 ;RETURN IF OFF THE FRONT.\r
219         IDIVI   C,200                   ;BLOCK NUMBER-1 IN C, WORD NUMBER IN D.\r
220         ADDI    C,1                     ;THIS IS THE USET POINTER\r
221         CAIN    C,(BLK)                 ;SAME AS WHAT'S IN CORE?\r
222         JRST    FILST2                  ;YES. - THIS IS THE EASY CASE.\r
223 FILST0: PUSHJ   P,FILFRC                ;FORCE CURRENT RECORD OUT.  ADVANCE TO NEXT\r
224         CAIG    C,(LNG)                 ;IS DESIRED RECORD WITHIN EXISTING FILE?\r
225         JRST    FILST1                  ;YES.  READ IT (UNLESS THE LAST RECORD)\r
226         MOVEI   BLK,(LNG)               ;SET TO APPEND A ZERO RECORD TO THE FILE.\r
227         JRST    FILST0\r
228 \r
229 FILST1: MOVEI   BLK,(C)                 ;MAKE DESIRED RECORD THE CURRENT RECORD\r
230         CAIL    BLK,(LNG)               ;IS THIS THE NON-EX RECORD AT END OF FILE?\r
231         JRST    FILST2                  ;YES.  WE CAN'T (AND DON'T NEED TO) READ IT.\r
232         USETI   1,(BLK)\r
233         INPUT   1,[-200,,DMPBUF-1\r
234                 0]\r
235 FILST2: MOVEM   A,DMPBUF(D)             ;STORE DATA\r
236         POPJ    P,\r
237 \r
238 FILINI: MOVEI   BLK,1                           ;REC # THAT IS "IN CORE".\r
239         MOVEI   LNG,1                           ;RECORD NUMBER OF EOF\r
240         SETZM   HILOC                           ;HIGHEST LOCATION LOADED\r
241 FILCLR: SETZM   DMPBUF\r
242         PUSH    P,A\r
243         MOVE    A,[DMPBUF,,DMPBUF+1]\r
244         BLT     A,DMPBUF+177\r
245 APOPJ:  POP     P,A\r
246 CPOPJ:  POPJ    P,\r
247 \r
248 FILFRC: USETO   1,(BLK)                         ;SELECT OUTPUT RECORD ALWAYS\r
249         OUTPUT  1,[-200,,DMPBUF-1               ;WRITE CURRENT RECORD.\r
250                         0]\r
251         ADDI    BLK,1\r
252         CAMGE   LNG,BLK \r
253         MOVE    LNG,BLK                         ;INCREASE LNG IF INCREASING FILE.\r
254         JRST    FILCLR                          ;NEXT RECORD NUMBER\r
255 \f;THINGS TO WRITE LATER:\r
256 \r
257 GETFIL: MOVE    A,['RIMOUT']\r
258         MOVEM   A,(R)\r
259         OUTSTR  [ASCIZ/RIMOUT.DMP\r
260 /]\r
261         POPJ    P,\r
262 \r
263 PTAPE:  OUTSTR  [ASCIZ/Not ready.\r
264 /]\r
265         jrst    begin\r
266 \r
267 END BEGIN\r