Commit | Line | Data |
---|---|---|
81e70d48 PH |
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! |