A large commit.
[pdp8.git] / sw / kermit / k12 / k12ipg.pal
1 / IPL GENERATING PROGRAM
2
3 / LAST EDIT: 08-OCT-1991 12:00:00 CJL
4
5 / MUST BE ASSEMBLED WITH '/F' SWITCH SET.
6
7 / THIS IS A UTILITY NAMED IPLGEN (AKA K12IPG) TO CREATE FIELD0.IPL (AKA
8 / K12FL0.IPL) AND FIELD1.IPL (AKA K12FL1.IPL). THESE FILES ARE IN TURN MEANT
9 / FOR USE WITH THE DIRECT LOADING PROGRAM IPLOAD (AKA K12IPL). FUTURE VERSIONS
10 / OF K12MIT.SV MAY "GROW" TO USE FIELD TWO, IN WHICH CASE THIS PROGRAM WILL HAVE
11 / TO BE CHANGED.
12
13 / THIS PROGRAM ALWAYS RESIDES IN THE NEXT FIELD BEYOND K12MIT.SV, AND CREATES
14 / FILES FOR ALL FIELDS LOWER THAN ITS LOADING FIELD. THIS CURRENTLY REQUIRES A
15 / 12K MACHINE TO ENCODE ALL LOCATIONS 00000-07577 AND 10000-17577.
16
17 / USAGE:
18
19 / SINCE K12MIT.SV IS A COMPLETE IMAGE FILE, IT MUST BE LOADED FIRST IN IMAGE
20 / MODE, AND THEN OVERLAYED WITH THE BINARY OF THIS ASSEMBLY:
21
22 / .PAL IPLGEN<IPLGEN/E/F ASSEMBLE IPLGEN PROGRAM.
23
24 / .LOAD K12MIT.SV/I$*IPLGEN/G=20200 LOAD K12MIT.SV IN IMAGE MODE; THE $
25 / INDICATES USING <ESC> TO TERMINATE
26 / THE LINE; THEN LOAD IPLGEN AND START.
27
28 / THE FILES SYS:FIELD0.IP AND SYS:FIELD1.IP WILL BE CREATED AND THE PROGRAM
29 / EXITS TO THE KEYBOARD MONITOR. THE RESULTANT FILES MAY BE EDITED AS LONG AS
30 / THE RULES OF .IPL FORMAT ENCODING ARE OBEYED (ADDITIONAL LOWER-CASE LEADER
31 / COMMENTS SHOULD BE ADDED AT THE BEGINNING, AND UNRESTRICTED COMMENTS AT THE
32 / END).
33
34 / ERROR MESSAGES:
35
36 / ERROR NUMBER PROBABLE CAUSE
37
38 / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE.
39
40 / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE.
41
42 / 7 ERROR WHILE CLOSING THE OUTPUT FILE.
43
44 / 8 I/O ERROR WHILE ENCODING FILE DATA.
45 \f/ EQUATED SYMBOLS.
46
47 CLOSE= 4 /CLOSE OUTPUT FILE
48 DFIELD= 2 /PROGRAM LOADS INTO FIELD TWO (ALSO OUTPUT COUNT)
49 DFLD= DFIELD^10 /PROGRAM FIELD FOR CDF INSTRUCTIONS
50 ENTER= 3 /ENTER TENTATIVE FILE
51 NL0001= CLA IAC /LOAD AC WITH 0001
52 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002
53 NL7777= CLA CMA /LOAD AC WITH 7777
54 SBOOT= 7600 /MONITOR EXIT
55 SYSENTR=7607 /CALL SYS: HANDLER HERE
56 USERROR=7 /USER SIGNALLED ERROR
57 USRENT= 7700 /USR ENTRY POINT WHEN NON-RESIDENT
58 USRFLD= 10 /USR FIELD
59 WRITE= 4000 /I/O WRITE BIT
60 \f FIELD DFIELD /WHERE WE LOAD
61
62 *20 /GET PAST AUTO-INDEX AREA
63
64 BUFPTR, .-. /OUTPUT BUFFER POINTER
65 DANGCNT,.-. /DANGER COUNT FOR OUTPUT FILE
66 FCNT, -DFIELD /FIELD, FILE COUNTER
67 FNAME, FILENAM FIELD0.IP /OUTPUT FILE NAME FIELD
68 LATEST, .-. /LATEST OUTPUT CHARACTER
69 OUTRECO,.-. /OUTPUT RECORD
70 SCRCASE,.-. /CURRENT MESSAGE CASE
71 SCRCHAR,.-. /LATEST MESSAGE CHARACTER
72 SCRPTR, .-. /MESSAGE POINTER
73 TEMPTR, .-. /TEMPORARY OUTPUT POINTER
74 WRDADR, .-. /WORD ADDRESS
75 WRDCNT, .-. /WORD COUNTER
76
77 DSETUP, .-. /DATA FIELD SETUP
78 DATFLD, CDF 00+.-. /WILL BE LATEST DATA FIELD
79 JMP I DSETUP /RETURN TO CALLER
80 \f PAGE /START AT THE BEGINNING
81
82 BEGIN, NOP /IN CASE WE'RE CHAINED TO
83 LOOP, TAD (FNAME) /POINT TO
84 DCA ENTAR1 /STORED FILENAME
85 DCA ENTAR2 /CLEAR SECOND ARGUMENT
86 NL0001 /SYS: IS ALWAYS DEVICE ONE
87 CDF DFLD /INDICATE OUR CALLING FIELD
88 CIF USRFLD /GOTO USR FIELD
89 JMS I (USRENTRY) /CALL USR ROUTINE
90 ENTER /ENTER TENTATIVE FILENAME
91 ENTAR1, .-. /WILL POINT TO FILENAME
92 ENTAR2, .-. /WILL BE ZERO
93 JMP ENTERR /ENTER ERROR
94 TAD ENTAR1 /GET RETURNED FIRST RECORD
95 DCA OUTRECORD /STORE IT
96 TAD ENTAR2 /GET RETURNED EMPTY LENGTH
97 IAC /ADD 2-1 FOR OS/278 CRAZINESS
98 DCA DANGCNT /STORE AS DANGER COUNT
99 NL7777 /INDICATE INITIALIZATION
100 JMS I [PUTBYTE] /INITIALIZE OUTPUT FILE
101 JMS LEADER /OUTPUT LEADER
102 JMS I (DOFLD) /OUTPUT LATEST FIELD'S DATA
103 JMS TRAILER /OUTPUT TRAILER
104 TAD ("Z&37) /GET <^Z>
105 CLOSLUP,JMS I [PUTBYTE] /OUTPUT A BYTE (^Z OR NULL)
106 TAD BUFPTR /GET THE OUTPUT BUFFER POINTER
107 TAD (-OUTBUFFER) /COMPARE TO RESET VALUE
108 SZA CLA /SKIP IF IT MATCHES
109 JMP CLOSLUP /ELSE KEEP GOING
110 NL0001 /GET SYS:'S DEVICE NUMBER
111 CDF DFLD /INDICATE OUR CALLING FIELD
112 CIF USRFLD /GOTO USR FIELD
113 JMS I (USRENTRY) /CALL USR ROUTINE
114 CLOSE /CLOSE OUTPUT FILE
115 FNAME /POINTER TO FILENAME
116 OUTCNT, .-. /WILL BE ACTUAL COUNT
117 JMP CLSERR /CLOSE ERROR
118 ISZ FNAME+2 /BUMP THE FILENAME
119 TAD DATFLD /GET CURRENT DATA FIELD
120 TAD (10) /BUMP TO NEXT FIELD
121 DCA DATFLD /STORE BACK
122 ISZ FCNT /DONE ALL FIELDS YET?
123 JMP LOOP /NO, GO DO IT AGAIN
124 CIF CDF 00 /YES, GOTO MONITOR FIELD
125 JMP I [SBOOT] /EXIT TO MONITOR
126 \f/ ERROR WHILE OUTPUTTING THE FILE.
127
128 PROCERR,NL0002 /SET INCREMENT
129 SKP /DON'T USE NEXT
130
131 / ERROR WHILE CLOSING THE OUTPUT FILE.
132
133 CLSERR, NL0001 /SET INCREMENT
134 SKP /DON'T CLEAR IT
135
136 / OUTPUT FILE TOO LARGE ERROR.
137
138 SIZERR, CLA /CLEAN UP
139 TAD (3) /SET INCREMENT
140 SKP /DON'T USE NEXT
141
142 / ENTER ERROR.
143
144 ENTERR, NL0002 /SET INCREMENT
145 TAD (3) /ADD ON OFFSET
146 DCA ERRNUMBER /STORE ERROR NUMBER
147 CDF DFLD /ENSURE OUR FIELD
148 CIF USRFLD /GOTO USR FIELD
149 JMS I (USRENTRY) /CALL USR ROUTINE
150 USERROR /USER ERROR
151 ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER
152 \f/ LEADER ROUTINE.
153
154 LEADER, .-. /LEADER ROUTINE
155 JMS I (SCRIBE) /CALL SCRIBE ROUTINE
156 LEADMSG /FOR LEADER MESSAGE
157 TAD DATFLD /GET CURRENT FIELD
158 RTR;RAR /MOVE DOWN
159 AND (7) /JUST FIELD NUMBER
160 TAD (NTABLE) /POINT TO TABLE ELEMENT
161 DCA MSGPTR /STASH THE POINTER
162 TAD I MSGPTR /GET THE MESSAGE ADDRESS
163 DCA MSGPTR /STORE IN-LINE
164 JMS I (SCRIBE) /CALL SCRIBE ROUTINE
165 MSGPTR, .-. /WILL POINT TO CORRECT MESSAGE
166 JMP I LEADER /RETURN
167
168 / TRAILER ROUTINE.
169
170 TRAILER,.-. /TRAILER ROUTINE
171 JMS I (SCRIBE) /CALL SCRIBE ROUTINE
172 SAVEMSG /END OF FILE MESSAGE
173 JMS OUTFLD /OUTPUT FIELD DIGIT
174 JMS I (SCRIBE) /CALL SCRIBE ROUTINE
175 SVMSG /.SV BRIDIGING MESSAGE
176 JMS OUTFLD /OUTPUT FIELD DIGIT
177 JMS I (SCRIBE) /CALL SCRIBE ROUTINE
178 SV0MSG /0000 BRIDGING MESSAGE
179 JMS OUTFLD /OUTPUT FIELD DIGIT
180 JMS I (SCRIBE) /CALL SCRIBE ROUTINE
181 SVEMSG /FINISHING MESSAGE
182 JMP I TRAILER /RETURN
183
184 OUTFLD, .-. /OUTPUT FIELD DIGIT ROUTINE
185 TAD DATFLD /GET OUTPUT FIELD
186 RTR;RAR /MOVE OVER
187 AND (7) /JUST FIELD DIGIT
188 TAD ("0&177) /MAKE IT ASCII
189 JMS I [PUTBYTE] /OUTPUT IT
190 JMP I OUTFLD /RETURN
191
192 PAGE
193 \fDOFLD, .-. /DO LATEST FIELD ROUTINE
194 DCA WRDADR /CLEAR WORD ADDRESS
195 TAD (-7600) /SETUP THE
196 DCA WRDCNT /WORD COUNT
197 WRDLUP, JMS DSETUP /GOTO DATA FIELD
198 TAD I WRDADR /GET A WORD
199 DCA DSETUP /SAVE IT
200 CDF DFLD /BACK TO OUR FIELD
201 TAD DSETUP /GET THE WORD AGAIN
202 RTR;RTR;RTR /WANT HIGH-ORDER HALF FIRST
203 JMS DOBYTE /OUTPUT HIGH-ORDER BYTE
204 TAD DSETUP /GET THE WORD AGAIN
205 JMS DOBYTE /OUTPUT LOW-ORDER BYTE
206 ISZ WRDADR /BUMP TO NEXT ADDRESS
207 TAD WRDADR /GET LATEST ADDRESS
208 AND (37) /JUST LOW-ORDER BITS
209 SNA CLA /SKIP IF NOT AT GOOD BOUNDARY
210 JMS PUTCRLF /ELSE OUTPUT LINE BREAK
211 ISZ WRDCNT /DONE ALL WORD YET?
212 JMP WRDLUP /NO, KEEP GOING
213 JMP I DOFLD /YES, RETURN TO CALLER
214
215 DOBYTE, .-. /OUTPUT A SIX-BIT BYTE ROUTINE
216 AND (77) /JUST SIX BITS
217 TAD (41) /ADD ON OFFSET TO MAKE IT PRINTABLE
218 JMS I [PUTBYTE] /OUTPUT IT
219 JMP I DOBYTE /RETURN
220 \f/ <CR>/<LF> ROUTINE.
221
222 PUTCRLF,.-. /OUTPUT <CR>/<LF> ROUTINE
223 TAD ("M&37) /GET A <CR>
224 JMS I [PUTBYTE] /OUTPUT IT
225 TAD ("J&37) /GET A <LF>
226 JMS I [PUTBYTE] /OUTPUT IT
227 JMP I PUTCRLF /RETURN
228
229 / MESSAGE PRINT ROUTINE.
230
231 SCRIBE, .-. /MESSAGE PRINT ROUTINE
232 TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT
233 DCA SCRPTR /STASH THE POINTER
234 ISZ SCRIBE /BUMP PAST ARGUMENT
235 TAD (140) /INITIALIZE TO
236 DCA SCRCASE /LOWER-CASE
237 SCRLUP, TAD I SCRPTR /GET LEFT HALF-WORD
238 RTR;RTR;RTR /MOVE OVER
239 JMS SCRPRNT /PRINT IT
240 TAD I SCRPTR /GET RIGHT HALF-WORD
241 JMS SCRPRNT /PRINT IT
242 ISZ SCRPTR /BUMP TO NEXT PAIR
243 JMP SCRLUP /KEEP GOING
244
245 SCRPRNT,.-. /CHARACTER PRINT ROUTINE
246 AND (77) /JUST SIX BITS
247 SNA /END OF MESSAGE?
248 JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER
249 DCA SCRCHAR /NO, SAVE FOR NOW
250 TAD SCRCHAR /GET IT BACK
251 TAD (-"%!200) /IS IT "%"?
252 SNA /SKIP IF NOT
253 JMP SCRCRLF /JUMP IF IT MATCHES
254 TAD (-"^+100+"%) /IS IT "^"
255 SNA CLA /SKIP IF NOT
256 JMP SCRFLIP /JUMP IF IT MATCHES
257 TAD SCRCHAR /GET THE CHARACTER
258 AND (40) /DOES CASE MATTER?
259 SNA CLA /SKIP IF NOT
260 TAD SCRCASE /ELSE GET PREVAILING CASE
261 TAD SCRCHAR /GET THE CHARACTER
262 JMS I [PUTBYTE] /OUTPUT THE CHARACTER
263 JMP I SCRPRNT /RETURN
264
265 SCRCRLF,JMS PUTCRLF /OUTPUT <CR>/<LF>
266 JMP I SCRPRNT /RETURN
267
268 SCRFLIP,TAD SCRCASE /GET CURRENT CASE
269 CIA /INVERT IT
270 TAD (140+100) /ADD SUM OF POSSIBLE VALUES
271 DCA SCRCASE /STORE NEW INVERTED CASE
272 JMP I SCRPRNT /RETURN
273 \f PAGE
274 \fPUTBYTE,.-. /OUTPUT A BYTE ROUTINE
275 SPA /ARE WE INITIALIZING?
276 JMP PUTINITIALIZE /YES
277 AND (177) /JUST IN CASE
278 DCA LATEST /SAVE LATEST CHARACTER
279 TAD LATEST /GET LATEST CHARACTER
280 JMP I PUTNEXT /GO WHERE YOU SHOULD GO
281
282 PUTNEXT,.-. /EXIT ROUTINE
283 JMP I PUTBYTE /RETURN TO MAIN CALLER
284
285 PUTINIT,CLA /CLEAN UP
286 TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE
287 DCA PUTRECORD /STORE IN-LINE
288 DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH
289 PUTNEWR,TAD (OUTBUFFER) /SETUP THE
290 DCA BUFPTR /BUFFER POINTER
291 PUTLOOP,JMS PUTNEXT /GET A CHARACTER
292 DCA I BUFPTR /STORE IT
293 TAD BUFPTR /GET POINTER VALUE
294 DCA TEMPTR /SAVE FOR LATER
295 ISZ BUFPTR /BUMP TO NEXT
296 JMS PUTNEXT /GET A CHARACTER
297 DCA I BUFPTR /STORE IT
298 JMS PUTNEXT /GET A CHARACTER
299 RTL;RTL /MOVE UP
300 AND (7400) /ISOLATE HIGH NYBBLE
301 TAD I TEMPTR /ADD ON FIRST BYTE
302 DCA I TEMPTR /STORE COMPOSITE
303 TAD LATEST /GET LATEST CHARACTER
304 RTR;RTR;RAR /MOVE UP AND
305 AND (7400) /ISOLATE LOW NYBBLE
306 TAD I BUFPTR /ADD ON SECOND BYTE
307 DCA I BUFPTR /STORE COMPOSITE
308 ISZ BUFPTR /BUMP TO NEXT
309 TAD BUFPTR /GET LATEST POINTER VALUE
310 TAD (-2^200-OUTBUFFER) /COMPARE TO LIMIT
311 SZA CLA /SKIP IF AT END
312 JMP PUTLOOP /KEEP GOING
313 ISZ DANGCNT /TOO MANY RECORDS?
314 SKP /SKIP IF NOT
315 JMP I (SIZERR) /JUMP IF SO
316 CDF DFLD /SET OUR FIELD
317 CIF 00 /GOING TO SYSTEM FIELD
318 JMS I (SYSENTRY) /CALL I/O HANDLER
319 2^100+DFLD+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER
320 OUTBUFFER /BUFFER ADDRESS
321 PUTRECO,.-. /WILL BE LATEST RECORD NUMBER
322 JMP I (PROCERR) /OUTPUT ERROR!
323 ISZ I (OUTCNT) /BUMP ACTUAL LENGTH
324 ISZ PUTRECORD /BUMP TO NEXT RECORD
325 JMP PUTNEWRECORD /KEEP GOING
326 \f PAGE
327 \f/ TEXT MESSAGES.
328
329 LEADMSG,TEXT "LEADER FOR DIRECT LOAD FILE WHICH MUST BE IN LOWER CASE%"
330 TEXT "%FILE CONTAINS KERMIT DATA IN IPL ENCODED FORMAT%%"
331 \f TEXT "THIS FILE CONTAINS DATA FOR FIELD"
332 ONEMSG, TEXT " ONE%%^"
333 SAVEMSG,TEXT "END OF DATA%%^A^FTER THE PROGRAM EXITS BACK TO THE MONITOR, "
334 \f TEXT "YOU SHOULD SAVE THE DATA WITH:%%.^SAVE SYS FIELD^"
335 SVMSG, TEXT ".^SV "
336 SV0MSG, TEXT "0000-"
337 SVEMSG, TEXT "7577=0%"
338 ZEROMSG,TEXT " ZERO%%"
339 \f/ DIGIT MESSAGE POINTER TABLE.
340
341 NTABLE, ZEROMSG /POINTER TO ZERO MESSAGE
342 ONEMSG /POINTER TO ONE MESSAGE
343
344 PAGE /GET TO A GOOD BOUNDARY
345
346 OUTBUFF=. /OUTPUT BUFFER HERE
347
348 $ /THAT'S ALL FOLK!