1 / OS/8 BOO ENCODING PROGRAM
2
3 / LAST EDIT: 01-OCT-1991 15:00:00 CJL
4
5 / MAY BE ASSEMBLED WITH '/F' SWITCH SET.
6
7 / PROGRAM TO ENCODE ANY TYPE OF OS/8 FILE INTO "PRINTABLE" ASCII (".BOO")
8 / FORMAT. THIS IS A COMMON DISTRIBUTION FORMAT FOR MANY COLUMBIA KERMIT FILES
9 / AND IS AN ALTERNATIVE TO ENCODE FORMAT FOR PDP-8 AND DECMATE USERS.
10
11 / DISTRIBUTED BY CUCCA AS "K12ENB.PAL" AS PART OF THE CUCCA KERMIT-12 PACKAGE.
12
13 / WRITTEN BY:
14
15 / CHARLES LASNER (CJL)
16 / CLA SYSTEMS
17 / 72-55 METROPOLITAN AVENUE
18 / MIDDLE VILLAGE, NEW YORK 11379-2107
19 / (718) 894-6499
20
21 / USAGE:
22
23 / .RUN DEV ENBOO INVOKE PROGRAM
24 / *OUTPUT)
25 / *OUTPUT)
26 / . PROGRAM EXITS NORMALLY
27
28 / INPUT FILE ASSUMES .SV EXTENSION; THERE IS NO ASSUMED OUTPUT EXTENSION.
29
30 / PROGRAM EXIT IS THE NORMAL OS/8 METHOD OF EITHER PRESSING <^C> ON THE CONSOLE
31 / KEYBOARD DURING THE COMMAND, OR ENDING THE COMMAND INPUT LINE WITH AN
32 / CHARACTER.
33
34 / THIS PROGRAM SUPPORTS THE .BOO FORMAT FOR FILE ENCODING WHICH IS POPULAR IN
35 / OTHER SYSTEMS. THIS VERSION IMPLEMENTS THE FILE LENGTH PROTECTION SCHEME
36 / DEVELOPED BY CHARLES LASNER TO ENSURE PRECISE FILE LENGTH.
37
38 / MANY .BOO PROGRAMS HAVE PROBLEMS MAINTAINING PRECISE FILE LENGTH. THE ACTUAL
39 / LENGTH MAY BE IMPRECISELY STATED BY ONE OR TWO BYTES DUE TO AN INHERENT
40 / WEAKNESS IN THE ORIGINAL .BOO ENCODING FORMAT DESIGN. THIS IMPLEMENTATION
41 / APPENDS CORRECTION BYTES AS NECESSARY TO THE BASIC .BOO FILE TO ENSURE PROPER
42 / DECODING BY PROGRAMS COMPATIBLE WITH THIS EXTENSION.
43
44 / FILES CREATED BY THIS PROGRAM MAY BE USED WITH EARLIER .BOO DECODERS; THE
45 / RESULTANT FILES MAY INACCURATELY RECREATE THE ORIGINAL FILES BY AS MUCH AS TWO
46 / EXTRANEOUS TRAILING BYTES. THERE WILL BE NO PROBLEMS (BEYOND THE LENGTH
47 / ANOMALY) AS LONG AS THE DECODERS IMPLEMENT ZERO-LENGTH COMPRESSION FIELDS AS
48 / NO OPERATION. IT IS POSSIBLE THAT CERTAIN DECODERS COULD ERRONEOUSLY APPEND
49 / MASSIVE QUANTITIES OF ZEROES ONTO THE END OF THE DECODED FILES, BUT THIS
50 / ACTION WOULD CERTAINLY BE CAUSED BY DEFECTIVE PROGRAM CODE WITHIN THE DECODER.
51 / (ALTHOUGH NOT LIKELY SEEN BEFORE ENCOUNTERING FILES WITH LENGTH CORRECTION
52 / BYTES, THIS WOULD BE A LATENT BUG IN THESE DECODING PROGRAMS. UPDATED
53 / VERSIONS SHOULD BE SOUGHT IF THIS PROBLEM SURFACES.)
54 / ERROR MESSAGES.
55
56 / ERROR MESSAGES ARE ONE OF TWO VARIETIES: COMMAND DECODER MESSAGES AND USER
57 / (PROGRAM-SIGNALLED) MESSAGES.
58
59 / COMMAND DECODER MESSAGES ARE NON-FATAL AND MERELY REQUIRE RETYPING THE
60 / COMMAND. ATTEMPTING TO USE MORE THAN ONE OUTPUT FILE WILL YIELD THE COMMAND
61 / DECODER MESSAGE "TOO MANY FILES" AND CAUSE A REPEAT OF THE COMMAND DECODER
62 / PROMPT REQUIRING USER INPUT. THE USER IS DIRECTED TO OTHER DOCUMENTATION OF
63 / THE "SPECIAL" MODE OF THE COMMAND DECODER, AS THAT IS THE ONLY MODE USED BY
64 / THIS UTILITY PROGRAM.
65
66 / ANY USER MESSAGE PRINTED IS A FATAL ERROR MESSAGE CAUSED BY A PROBLEM BEYOND
67 / THE SCOPE OF THE COMMAND DECODER. ALL USER MESSAGES ARE THE STANDARD OS/8
68 / "USER" ERROR MESSAGES OF THE FORM: "USER ERROR X AT AAAAA", WHERE X IS THE
69 / ERROR NUMBER AND AAAAA IS THE PROGRAM ADDRESS WHERE THE ERROR WAS DETECTED.
70 / THE FOLLOWING USER ERRORS ARE DEFINED:
71
72 / ERROR NUMBER PROBABLE CAUSE
73
74 / 0 NO OUTPUT FILE.
75
76 / 1 INPUT FILE ERROR (CAN'T FIND INPUT FILE) OR NO INPUT
77 / FILE SPECIFIED OR TOO MANY INPUT FILES SPECIFIED.
78 / 2 ILLEGAL OUTPUT FILE NAME (WILD CARDS NOT ALLOWED).
79
80 / 3 NO OUTPUT FILE NAME (DEVICE ONLY IS NOT ALLOWED).
81
82 / 4 ERROR WHILE FETCHING FILE HANDLER.
83
84 / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE.
85
86 / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE.
87
88 / 7 ERROR WHILE CLOSING THE OUTPUT FILE.
89
90 / 8 I/O ERROR WHILE ENCODING FILE DATA.
91
92 / 9 OUTPUT ERROR WHILE ENCODING FILE DATA.
93
94 / ASSEMBLY INSTRUCTIONS.
95
96 / IT IS ASSUMED THE SOURCE FILE K12ENB.PAL HAS BEEN MOVED AND RENAMED TO
97 / DSK:ENBOO.PA.
98
99 / .PAL ENBOO TERMINATED THE LINE
170 000214 3320 DCA EXITZAP /ELSE CAUSE EXIT LATER
171 000215 1775 TAD I (OUTFILE) /GET OUTPUT FILE DEVICE WORD
172 000216 7450 SNA /SKIP IF FIRST OUTPUT FILE PRESENT
173 000217 5347 JMP TSTMORE /JUMP IF NOT THERE
174 000220 0176 AND [17] /JUST DEVICE BITS
175 000221 3047 DCA ODNUMBER /SAVE OUTPUT DEVICE NUMBER
176 000222 1774 TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD
177 000223 7450 SNA /SKIP IF PRESENT
178 000224 5340 JMP INERR /JUMP IF NOT
179 000225 0176 AND [17] /JUST DEVICE BITS
180 000226 3031 DCA IDNUMBER /SAVE INPUT DEVICE NUMBER
181 000227 1773 TAD I (INFILE+5) /GET SECOND INPUT FILE DEVICE WORD
182 000230 7640 SZA CLA /SKIP IF ONLY ONE INPUT FILE
183 000231 5340 JMP INERR /ELSE COMPLAIN
184 000232 4772 JMS I (MIFNAME) /MOVE INPUT FILENAME WITH ADJUSTED EXTENSION
185 000233 1575 TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD
186 000234 7650 SNA CLA /SKIP IF NAME PRESENT
187 000235 5336 JMP NONAME /JUMP IF DEVICE ONLY
188 000236 4771 JMS I (MOFNAME) /MOVE OUTPUT FILENAME
189 000237 6201 CDF PRGFLD /BACK TO OUR FIELD
190 000240 6212 CIF USRFLD /GOTO USR FIELD
191 000241 4577 JMS I [USR] /CALL USR ROUTINE
192 000242 0013 RESET /RESET SYSTEM TABLES
193 000243 1370 TAD (OHNDBUFFER+1) /GET BUFFER POINTER+TWO-PAGE BIT
194 000244 3251 DCA OHPTR /STORE IN-LINE
195 000245 1047 TAD ODNUMBER /GET OUTPUT DEVICE NUMBER
196 000246 6212 CIF USRFLD /GOTO USR FIELD
197 000247 4577 JMS I [USR] /CALL USR ROUTINE
198 000250 0001 FETCH /FETCH HANDLER
199 000251 0000 OHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT
200 000252 5335 JMP FERROR /FETCH ERROR
201 000253 1251 TAD OHPTR /GET RETURNED ADDRESS
202 000254 3050 DCA OUTPUT /STORE AS OUTPUT HANDLER ADDRESS
203 000255 1367 TAD (IHNDBUFFER+1) /GET INPUT BUFFER POINTER+TWO-PAGE BIT
204 000256 3263 DCA IHPTR /STORE IN-LINE
205 000257 1031 TAD IDNUMBER /GET INPUT DEVICE NUMBER
206 000260 6212 CIF USRFLD /GOTO USR FIELD
207 000261 4577 JMS I [USR] /CALL USR ROUTINE
208 000262 0001 FETCH /FETCH HANDLER
209 000263 0000 IHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT
210 000264 5335 JMP FERROR /FETCH ERROR
211 000265 1263 TAD IHPTR /GET RETURNED ADDRESS
212 000266 3040 DCA INPUT /STORE AS INPUT HANDLER ADDRESS
213 000267 4766 JMS I (GEIFILE) /GO LOOKUP INPUT FILE
214 000270 1365 TAD (FNAME) /POINT TO
215 000271 3277 DCA ENTAR1 /STORED FILENAME
216 000272 3300 DCA ENTAR2 /CLEAR SECOND ARGUMENT
217 000273 1047 TAD ODNUMBER /GET OUTPUT DEVICE NUMBER
218 000274 6212 CIF USRFLD /GOTO USR FIELD
219 000275 4577 JMS I [USR] /CALL USR ROUTINE
220 000276 0003 ENTER /ENTER TENTATIVE FILENAME
221 000277 0000 ENTAR1, .-. /WILL POINT TO FILENAME
222 000300 0000 ENTAR2, .-. /WILL BE ZERO
223 000301 5333 JMP ENTERR /ENTER ERROR
224 000302 1277 TAD ENTAR1 /GET RETURNED FIRST RECORD
225 000303 3051 DCA OUTRECORD /STORE IT
226 000304 1300 TAD ENTAR2 /GET RETURNED EMPTY LENGTH
227 000305 7001 IAC /ADD 2-1 FOR OS/278 CRAZINESS
228 000306 3030 DCA DANGCNT /STORE AS DANGER COUNT
229 000307 4764 JMS I (ENCODIT) /GO DO THE ACTUAL ENCODING
230 000310 5324 JMP PROCERR /ERROR WHILE ENCODING
231 000311 1047 TAD ODNUMBER /GET OUTPUT DEVICE NUMBER
232 000312 6212 CIF USRFLD /GOTO USR FIELD
233 000313 4577 JMS I [USR] /CALL USR ROUTINE
234 000314 0004 CLOSE /CLOSE OUTPUT FILE
235 000315 0042 FNAME /POINTER TO FILENAME
236 000316 0000 OUTCNT, .-. /WILL BE ACTUAL COUNT
237 000317 5326 JMP CLSERR /CLOSE ERROR
238 000320 5202 EXITZAP,JMP START /**** TERMINATION **** 0000
239 000321 5775 JMP I (SBOOT) /EXIT TO MONITOR
240 / OUTPUT FILE ERROR WHILE PROCESSING.
241
242 000322 1174 ENCERRO,TAD [3] /SET INCREMENT
243 000323 7410 SKP /DON'T USE NEXT
244
245 / ERROR WHILE PROCESSING INPUT FILE.
246
247 000324 7326 PROCERR,NL0002 /SET INCREMENT
248 000325 7410 SKP /DON'T USE NEXT
249
250 / ERROR WHILE CLOSING THE OUTPUT FILE.
251
252 000326 7201 CLSERR, NL0001 /SET INCREMENT
253 000327 7410 SKP /DON'T CLEAR IT
254
255 / OUTPUT FILE TOO LARGE ERROR.
256
257 000330 7200 SIZERR, CLA /CLEAN UP
258 000331 1174 TAD [3] /SET INCREMENT
259 000332 7410 SKP /DON'T USE NEXT
260
261 / ENTER ERROR.
262
263 000333 7326 ENTERR, NL0002 /SET INCREMENT
264 000334 7410 SKP /DON'T USE NEXT
265
266 / HANDLER FETCH ERROR.
267
268 000335 7201 FERROR, NL0001 /SET INCREMENT
269
270 / NO OUTPUT FILENAME ERROR.
271
272 000336 7001 NONAME, IAC /SET INCREMENT
273
274 / ILLEGAL OUTPUT FILE NAME ERROR.
275
276 000337 7001 BADNAME,IAC /SET INCREMENT
277
278 / INPUT FILESPEC ERROR.
279
280 000340 7001 INERR, IAC /SET INCREMENT
281
282 / OUTPUT FILESPEC ERROR.
283
284 000341 3346 OUTERR, DCA ERRNUMBER /STORE ERROR NUMBER
285 000342 6201 CDF PRGFLD /ENSURE OUR FIELD
286 000343 6212 CIF USRFLD /GOTO USR FIELD
287 000344 4577 JMS I [USR] /CALL USR ROUTINE
288 000345 0007 USERROR /USER ERROR
289 000346 0000 ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER
290 / COMES HERE TO TEST FOR NULL LINE.
291
292 000347 1774 TSTMORE,TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD
293 000350 7640 SZA CLA /SKIP NO INPUT OR OUTPUT GIVEN
294 000351 5341 JMP OUTERR /ELSE COMPLAIN
295 000352 6201 CDF PRGFLD /BACK TO OUR FIELD
296 000353 5320 JMP EXITZAP /MIGHT BE LAST TIME, SO GO THERE FIRST
297
298 000364 0400 PAGE
000365 0042
000366 1200
000367 7201
000370 6601
000371 1275
000372 1065
000373 7612
000374 7605
000375 7600
000376 7642
000377 7700
299 000400 0000 ENCODIT,.-. /ENCODING ROUTINE
300 000401 7240 NL7777 /SETUP INITIALIZE VALUE
301 000402 4573 JMS I [DOBYTE] /INITIALIZE OUTPUT ROUTINE
302 000403 4777 JMS I (PIFNAME) /OUTPUT THE INPUT FILENAME
303 000404 4776 JMS I (PCRLF) /OUTPUT / AND CLEAR COLUMN COUNTER
304 000405 3026 DCA CMPCNT /CLEAR COMPRESSION
305 000406 1172 TAD [CHARS] /SETUP THE
306 000407 3022 DCA CHARPTR /OUTPUT POINTER
307 000410 7240 NL7777 /MAKE IT INITIALIZE
308 000411 4775 LOOP, JMS I (GETBYTE) /GET LATEST BYTE
309 000412 5260 JMP ENDCHECK /AREN'T ANY MORE, FINISH THE FILE
310
311 / TEST IF ALREADY WITHIN A DEVELOPING COMPRESSION FIELD.
312
313 000413 1026 TAD CMPCNT /GET COMPRESSION COUNT
314 000414 7650 SNA CLA /SKIP IF COMPRESSION IN PROGRESS
315 000415 5241 JMP NOCOMP /JUMP IF NOT
316
317 / CHECK IF LATEST INPUT BYTE IS ZERO.
318
319 000416 1021 TAD CHAR /GET LATEST
320 000417 7640 SZA CLA /SKIP IF SO
321 000420 5227 JMP ENDCOMPRESS /JUMP IF NOT
322 000421 2026 SETCOMP,ISZ CMPCNT /BUMP COMPRESSION COUNT
323 000422 1026 TAD CMPCNT /GET LATEST COUNT
324 000423 1374 TAD (-116) /COMPARE TO MAXIMUM ALLOWED
325 000424 7650 SNA CLA /SKIP IF NOT
326 000425 4773 JMS I (COMPRESSOUT) /OUTPUT MAXIMUM COMPRESSION AND CANCEL COMPRESSION
327 000426 5211 JMP LOOP /GO GET ANOTHER ONE
328
329 / IF LATEST IS NON-ZERO, THEN COMPLETE EXISTING COMPRESSION FIELD.
330
331 000427 7240 ENDCOMP,NL7777 /-1
332 000430 1026 TAD CMPCNT /COMPARE TO COMPRESSION COUNT
333 000431 7640 SZA CLA /SKIP IF TRIVIAL CASE
334 000432 5240 JMP OUTCOMPRESS /JUMP IF NOT
335
336 / CANCEL TRIVIAL CASE OF ONE BYTE COMPRESSION.
337
338 000433 3026 DCA CMPCNT /CLEAR COMPRESSION MODE
339 000434 3023 DCA CHARS /FIRST BYTE WAS ZERO
340 000435 1372 TAD (CHARS+1) /SETUP OUTPUT POINTER TO
341 000436 3022 DCA CHARPTR /STORE INTO SECOND BYTE
342 000437 5250 JMP BYTEINSERT /CONTINUE THERE
343 / OUTPUT LATEST COMPRESSION AND PROCESS NEW NON-ZERO BYTE.
344
345 000440 4773 OUTCOMP,JMS I (COMPRESSOUT) /OUTPUT COMPRESSION FIELD AND CANCEL COMPRESSION
346
347 / COMES HERE IF NOT WITHIN A COMPRESSION REGION.
348
349 000441 1022 NOCOMP, TAD CHARPTR /GET POINTER
350 000442 1371 TAD (-CHARS) /CHECK IF AT BEGINNING
351 000443 7640 SZA CLA /SKIP IF BUFFER EMPTY
352 000444 5250 JMP BYTEINSERT /JUMP IF NOT
353
354 / IF AT BEGINNING OF THREE BYTES, TEST IF LATEST STARTS A COMPRESSION FIELD.
355
356 000445 1021 TAD CHAR /GET LATEST BYTE
357 000446 7650 SNA CLA /SKIP IF NOT ZERO
358 000447 5221 JMP SETCOMPRESSION /JUMP IF SO
359 000450 1021 BYTEINS,TAD CHAR /GET LATEST BYTE
360 000451 3422 DCA I CHARPTR /STORE IT
361 000452 2022 ISZ CHARPTR /BUMP TO NEXT
362 000453 1022 TAD CHARPTR /GET THE UPDATED POINTER
363 000454 1370 TAD (-CHARS-2-1) /COMPARE TO UPPER LIMIT
364 000455 7650 SNA CLA /SKIP IF LESS THAN THREE PRESENT
365 000456 4767 JMS I (OUT3) /ELSE OUTPUT THE THREE BYTES AND RESET THE BUFFER
366 000457 5211 JMP LOOP /GO GET ANOTHER ONE
367
368 / COMES HERE AT END OF INPUT.
369
370 000460 7344 ENDCHEC,NL7776 /-2
371 000461 1026 TAD CMPCNT /COMPARE TO COMPRESSION COUNT
372 000462 7500 SMA /SKIP IF AT TRIVIAL CASE OR NO COMPRESSION CURRENTLY
373 000463 5275 JMP ENDFCOMPRESS /FINISH WITH A COMPRESSION FIELD
374 000464 7001 IAC /CHECK FURTHER
375 000465 7640 SZA CLA /SKIP IF TRIVIAL COMPRESSION AT END
376 000466 5277 JMP NORMEND /JUMP IF NOT WITHIN COMPRESSION
377
378 / THE TRIVIAL CASE CONVERTS TO AN INCOMPLETE OUTPUT, COMPLETE WITH CORRECTION
379 / BYTES TO INDICATE THE SHORT FIELD.
380
381 000467 3023 DCA CHARS /MOVE ZERO BYTE TO FIRST POSITION
382 000470 3024 NORM1, DCA CHARS+1 /CLEAR SECOND POSITION
383 000471 3025 DCA CHARS+2 /CLEAR THIRD POSITION
384 000472 4767 JMS I (OUT3) /OUTPUT THE THREE BYTES
385 000473 3026 DCA CMPCNT /CLEAR COMPRESSION COUNT
386 000474 4773 JMS I (COMPRESSOUT) /OUTPUT NULL COMPRESSION FIELD TO CANCEL THIRD BYTE
387 /NEXT WILL CANCEL SECOND BYTE
388
389 / COMES HERE IF FILE ENDS ON A COMPRESSION FIELD.
390
391 000475 4773 ENDFCOM,JMS I (COMPRESSOUT) /OUTPUT COMPRESSION FIELD AND CANCEL COMPRESSION
392 000476 5306 JMP CLOSFILE /FINISH IT THERE
393 / COMES HERE IF FILE ENDS IN SOME FORM OF DATA FIELD.
394
395 000477 1022 NORMEND,TAD CHARPTR /GET CHARACTER POINTER
396 000500 1366 TAD (-CHARS-2) /COMPARE TO TWO PRESENT VALUE
397 000501 7450 SNA /SKIP IF NOT THE CASE
398 000502 5321 JMP NORM2 /JUMP IF SO
399 000503 7001 IAC /BUMP TO ONE PRESENT VALUE
400 000504 7650 SNA CLA /SKIP IF NOT THE CASE
401 000505 5270 JMP NORM1 /JUMP IF SO
402 000506 1027 CLOSFIL,TAD COLUMN /GET CURRENT COLUMN COUNTER
403 000507 7640 SZA CLA /SKIP IF AT BEGINNING ALREADY
404 000510 4776 JMS I (PCRLF) /ELSE OUTPUT / NOW
405 000511 1365 TAD ("Z&37) /GET <^Z>
406 000512 4573 CLOSLUP,JMS I [DOBYTE] /OUTPUT A BYTE (^Z OR NULL)
407 000513 1020 TAD BUFPTR /GET THE OUTPUT BUFFER POINTER
408 000514 1364 TAD (-OUTBUFFER) /COMPARE TO RESET VALUE
409 000515 7640 SZA CLA /SKIP IF IT MATCHES
410 000516 5312 JMP CLOSLUP /ELSE KEEP GOING
411 000517 2200 ISZ ENCODIT /NO ERRORS
412 000520 5600 JMP I ENCODIT /RETURN
413
414 / COMES HERE IF FILE ENDS WITH ONLY TWO DATA CHARACTERS.
415
416 000521 3025 NORM2, DCA CHARS+2 /CLEAR THIRD CHARACTER
417 000522 4767 JMS I (OUT3) /OUTPUT THE THREE BYTES
418 000523 5275 JMP ENDFCOMPRESS /FINISH IT THERE
419
420 000564 2200 PAGE
000565 0032
000566 7753
000567 0667
000570 7752
000571 7755
000572 0024
000573 0653
000574 7662
000575 0600
000576 0734
000577 1236
421 / GET AN INPUT BYTE ROUTINE.
422
423 000600 0000 GETBYTE,.-. /GET A BYTE ROUTINE
424 000601 7650 SNA CLA /INITIALIZING?
425 000602 5646 JMP I PUTC /NO, GO GET NEXT BYTE
426 000603 1041 TAD INRECORD /GET INPUT FILE STARTING RECORD
427 000604 3210 DCA GETRECORD /STORE IN-LINE
428 000605 4440 GETNEWR,JMS I INPUT /CALL INPUT HANDLER
429 000606 0200 2^100 /READ TWO PAGES
430 000607 6200 PINBUFF,INBUFFER /INTO INPUT BUFFER
431 000610 0000 GETRECO,.-. /WILL BE LATEST INPUT FILE RECORD
432 000611 5777 JMP I (PROCERR) /INPUT READ ERROR, GO COMPLAIN
433 000612 1207 TAD PINBUFFER/(INBUFFER) /SETUP THE
434 000613 3037 DCA INPTR /BUFFER POINTER
435 000614 3054 GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW
436 000615 4232 JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE
437 000616 4232 JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE
438 000617 1054 TAD THIRD /GET THIRD BYTE
439 000620 4246 JMS PUTC /SEND IT BACK
440 000621 1037 TAD INPTR /GET THE POINTER
441 000622 1376 TAD (-2^200-INBUFFER) /COMPARE TO LIMIT
442 000623 7640 SZA CLA /SKIP IF AT END
443 000624 5214 JMP GETLOOP /KEEP GOING
444 000625 2210 ISZ GETRECORD /BUMP TO NEXT RECORD
445 000626 7000 NOP /JUST IN CASE
446 000627 2036 ISZ INLEN /DONE ALL INPUT RECORDS?
447 000630 5205 JMP GETNEWRECORD /NO, KEEP GOING
448
449 / AT END-OF-FILE, SO JUST TAKE IMMEDIATE RETURN.
450
451 000631 5600 JMP I GETBYTE /RETURN TO CALLER
452
453 000632 0000 PUTONE, .-. /SEND BACK A BYTE ROUTINE
454 000633 1437 TAD I INPTR /GET LATEST WORD
455 000634 0171 AND [7400] /JUST THIRD-BYTE NYBBLE
456 000635 7104 CLL RAL /MOVE UP
457 000636 1054 TAD THIRD /GET OLD NYBBLE (IF ANY)
458 000637 7006 RTL;RTL /MOVE UP NYBBLE BITS
000640 7006
459 000641 3054 DCA THIRD /SAVE FOR NEXT TIME
460 000642 1437 TAD I INPTR /GET LATEST WORD AGAIN
461 000643 4246 JMS PUTC /SEND BACK CURRENT BYTE
462 000644 2037 ISZ INPTR /BUMP TO NEXT WORD
463 000645 5632 JMP I PUTONE /RETURN
464
465 000646 0000 PUTC, .-. /SEND BACK LATEST BYTE ROUTINE
466 000647 0375 AND (377) /KEEP ONLY GOOD BITS
467 000650 3021 DCA CHAR /SAVE AS LATEST BYTE
468 000651 2200 ISZ GETBYTE /BUMP PAST RETURN
469 000652 5600 JMP I GETBYTE /RETURN TO MAIN CALLER
470 / COMPRESSION FIELD OUTPUT ROUTINE.
471
472 000653 0000 COMPRES,.-. /COMPRESSION OUTPUT ROUTINE
473 000654 7200 CLA /CLEAN UP
474 000655 1027 TAD COLUMN /GET CURRENT COLUMN COUNTER
475 000656 1374 TAD (-WIDTH+2) /COMPARE TO UPPER LIMIT
476 000657 7740 SMA SZA CLA /SKIP IF NOT ABOVE LIMIT
477 000660 4334 JMS PCRLF /ELSE DO / FIRST
478 000661 1373 TAD (176) /GET TILDE VALUE
479 000662 4573 JMS I [DOBYTE] /OUTPUT IT
480 000663 1026 TAD CMPCNT /GET COMPRESSION COUNT
481 000664 4327 JMS PDIGIT /OUTPUT IT
482 000665 3026 DCA CMPCNT /CLEAR COMPRESSION
483 000666 5653 JMP I COMPRESSOUT /RETURN
484
485 / DATA FIELD OUTPUT ROUTINE.
486
487 000667 0000 OUT3, .-. /OUTPUT THREE BYTES ROUTINE
488 000670 1027 TAD COLUMN /GET CURRENT COLUMN COUNTER
489 000671 1372 TAD (-WIDTH+4) /COMPARE TO UPPER LIMIT
490 000672 7740 SMA SZA CLA /SKIP IF NOT ABOVE LIMIT
491 000673 4334 JMS PCRLF /ELSE DO / FIRST
492 000674 1023 TAD CHARS /GET FIRST BYTE
493 000675 7012 RTR /WANT HIGH SIX BITS FIRST
494 000676 4327 JMS PDIGIT /OUTPUT THEM
495 000677 1023 TAD CHARS /GET IT AGAIN
496 000700 0174 AND [3] /JUST TWO LOWEST BITS
497 000701 7112 CLL RTR;RTR;RAR /MOVE UP
000702 7012
000703 7010
498 000704 1024 TAD CHARS+1 /GET SECOND BYTE
499 000705 7012 RTR;RTR /MOVE DOWN
000706 7012
500 000707 4327 JMS PDIGIT /OUTPUT THEM
501 000710 1025 TAD CHARS+2 /GET THIRD BYTE
502 000711 0371 AND (300) /JUST TWO HIGHEST BITS NEEDED
503 000712 7106 CLL RTL;RTL;RAL /MOVE INTO POSITION
000713 7006
000714 7004
504 000715 1024 TAD CHARS+1 /GET SECOND BYTE
505 000716 7006 RTL /MOVE UP
506 000717 0170 AND [77] /JUST DESIRED BITS
507 000720 4327 JMS PDIGIT /OUTPUT THEM
508 000721 1025 TAD CHARS+2 /GET THIRD BYTE
509 000722 0170 AND [77] /JUST SIX BITS
510 000723 4327 JMS PDIGIT /OUTPUT THEM
511 000724 1172 TAD [CHARS] /RESET THE
512 000725 3022 DCA CHARPTR /OUTPUT POINTER
513 000726 5667 JMP I OUT3 /RETURN
514
515 000727 0000 PDIGIT, .-. /PRINT AS A DIGIT INTO FILE ROUTINE
516 000730 0167 AND [177] /REMOVE JUNK BITS
517 000731 1370 TAD ("0&177) /TURN PASSED VALUE INTO A DIGIT
518 000732 4573 JMS I [DOBYTE] /OUTPUT IT
519 000733 5727 JMP I PDIGIT /RETURN
520 000734 0000 PCRLF, .-. /PRINT / INTO FILE ROUTINE
521 000735 1367 TAD ("M&37) /GET A
522 000736 4573 JMS I [DOBYTE] /OUTPUT IT
523 000737 1366 TAD ("J&37) /GET A
524 000740 4573 JMS I [DOBYTE] /OUTPUT IT
525 000741 3027 DCA COLUMN /CLEAR COLUMN COUNTER
526 000742 5734 JMP I PCRLF /RETURN
527
528 000766 0012 PAGE
000767 0015
000770 0060
000771 0300
000772 7670
000773 0176
000774 7666
000775 0377
000776 1200
000777 0324
529 001000 0000 PUTBYTE,.-. /OUTPUT A BYTE ROUTINE
530 001001 7510 SPA /ARE WE INITIALIZING?
531 001002 5213 JMP PUTINITIALIZE /YES
532 001003 0167 AND [177] /JUST IN CASE
533 001004 3046 DCA LATEST /SAVE LATEST CHARACTER
534 001005 1046 TAD LATEST /GET LATEST CHARACTER
535 001006 5607 JMP I PUTNEXT /GO WHERE YOU SHOULD GO
536
537 001007 0000 PUTNEXT,.-. /EXIT ROUTINE
538 001010 2200 ISZ PUTBYTE /BUMP TO GOOD RETURN
539 001011 7300 PUTERRO,CLA CLL /CLEAN UP
540 001012 5600 JMP I PUTBYTE /RETURN TO MAIN CALLER
541
542 001013 7200 PUTINIT,CLA /CLEAN UP
543 001014 1051 TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE
544 001015 3260 DCA PUTRECORD /STORE IN-LINE
545 001016 3777 DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH
546 001017 1376 PUTNEWR,TAD (OUTBUFFER) /SETUP THE
547 001020 3020 DCA BUFPTR /BUFFER POINTER
548 001021 4207 PUTLOOP,JMS PUTNEXT /GET A CHARACTER
549 001022 3420 DCA I BUFPTR /STORE IT
550 001023 1020 TAD BUFPTR /GET POINTER VALUE
551 001024 3053 DCA TEMPTR /SAVE FOR LATER
552 001025 2020 ISZ BUFPTR /BUMP TO NEXT
553 001026 4207 JMS PUTNEXT /GET A CHARACTER
554 001027 3420 DCA I BUFPTR /STORE IT
555 001030 4207 JMS PUTNEXT /GET A CHARACTER
556 001031 7006 RTL;RTL /MOVE UP
001032 7006
557 001033 0171 AND [7400] /ISOLATE HIGH NYBBLE
558 001034 1453 TAD I TEMPTR /ADD ON FIRST BYTE
559 001035 3453 DCA I TEMPTR /STORE COMPOSITE
560 001036 1046 TAD LATEST /GET LATEST CHARACTER
561 001037 7012 RTR;RTR;RAR /MOVE UP AND
001040 7012
001041 7010
562 001042 0171 AND [7400] /ISOLATE LOW NYBBLE
563 001043 1420 TAD I BUFPTR /ADD ON SECOND BYTE
564 001044 3420 DCA I BUFPTR /STORE COMPOSITE
565 001045 2020 ISZ BUFPTR /BUMP TO NEXT
566 001046 1020 TAD BUFPTR /GET LATEST POINTER VALUE
567 001047 1375 TAD (-2^200-OUTBUFF)/COMPARE TO LIMIT
568 001050 7640 SZA CLA /SKIP IF AT END
569 001051 5221 JMP PUTLOOP /KEEP GOING
570 001052 2030 ISZ DANGCNT /TOO MANY RECORDS?
571 001053 7410 SKP /SKIP IF NOT
572 001054 5774 JMP I (SIZERR) /JUMP IF SO
573 001055 4450 JMS I OUTPUT /CALL I/O HANDLER
574 001056 4200 2^100+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER
575 001057 5600 OUTBUFFER /BUFFER ADDRESS
576 001060 0000 PUTRECO,.-. /WILL BE LATEST RECORD NUMBER
577 001061 5211 JMP PUTERROR /OUTPUT ERROR!
578 001062 2777 ISZ I (OUTCNT) /BUMP ACTUAL LENGTH
579 001063 2260 ISZ PUTRECORD /BUMP TO NEXT RECORD
580 001064 5217 JMP PUTNEWRECORD /KEEP GOING
581 / INPUT FILENAME MOVE ROUTINE; USES DEFAULT EXTENSION IF NONE PROVIDED BY USER.
582
583 001065 0000 MIFNAME,.-. /MOVE INPUT FILENAME ROUTINE
584 001066 1773 TAD I (INFILE+1) /GET FIRST INPUT FILENAME WORD
585 001067 3032 DCA IFNAME /STASH IT
586 001070 1772 TAD I (INFILE+2) /GET SECOND INPUT FILENAME WORD
587 001071 3033 DCA IFNAME+1 /STASH IT
588 001072 1771 TAD I (INFILE+3) /GET THIRD INPUT FILENAME WORD
589 001073 3034 DCA IFNAME+2 /STASH IT
590 001074 1566 TAD I [INFILE+4] /GET FOURTH INPUT FILENAME WORD
591 001075 7450 SNA /SKIP IF SOMETHING THERE
592 001076 1370 TAD ("S^100+"V-300) /ELSE USE DEFAULT EXTENSION VALUE
593 001077 3035 DCA IFNAME+3 /STASH IT EITHER WAY
594 001100 5665 JMP I MIFNAME /RETURN
595
596 001101 0000 DOBYTE, .-. /OUTPUT A BYTE ROUTINE
597 001102 4200 JMS PUTBYTE /OUTPUT PASSED VALUE
598 001103 5767 JMP I (ENCERROR) /COULDN'T DO IT
599 001104 2027 ISZ COLUMN /BUMP COLUMN COUNTER
600 001105 5701 JMP I DOBYTE /RETURN
601
602 001167 0322 PAGE
001170 2326
001171 7610
001172 7607
001173 7606
001174 0330
001175 1600
001176 5600
001177 0316
603 / INPUT FILE ROUTINE.
604
605 001200 0000 GEIFILE,.-. /GET INPUT FILE ROUTINE
606 001201 4222 JMS LUKUP /TRY TO LOOKUP THE FILE
607 001202 7410 SKP /SKIP IF IT WORKED
608 001203 5211 JMP TRYNULL /TRY NULL EXTENSION VERSION
609 001204 1232 NULLOK, TAD LARG1 /GET FIRST INPUT RECORD
610 001205 3041 DCA INRECORD /STASH IT
611 001206 1233 TAD LARG2 /GET NEGATED LENGTH
612 001207 3036 DCA INLEN /STASH IT
613 001210 5600 JMP I GEIFILE /RETURN
614
615 / COMES HERE IF LOOKUP FAILED.
616
617 001211 6211 TRYNULL,CDF TBLFLD /GOTO TABLE FIELD
618 001212 1566 TAD I [INFILE+4] /GET ORIGINAL FILENAME'S EXTENSION
619 001213 6201 CDF PRGFLD /BACK TO OUR FIELD
620 001214 7640 SZA CLA /SKIP IF IT WAS NULL ORIGINALLY
621 001215 5777 JMP I (INERR) /ELSE COMPLAIN OF EXPLICIT LOOKUP FAILURE
622 001216 3035 DCA IFNAME+3 /NOW TRY NULL VERSION INSTEAD OF DEFAULT VERSION
623 001217 4222 JMS LUKUP /TRY TO LOOK IT UP AGAIN
624 001220 5204 JMP NULLOK /THAT WORKED!
625 001221 5777 JMP I (INERR) /COMPLAIN OF LOOKUP FAILURE
626
627 001222 0000 LUKUP, .-. /LOW-LEVEL LOOKUP ROUTINE
628 001223 1376 TAD (IFNAME) /GET OUR FILENAME POINTER
629 001224 3232 DCA LARG1 /STORE IN-LINE
630 001225 3233 DCA LARG2 /CLEAR SECOND ARGUMENT
631 001226 1031 TAD IDNUMBER /GET INPUT DEVICE NUMBER
632 001227 6212 CIF USRFLD /GOTO USR FIELD
633 001230 4577 JMS I [USR] /CALL USR ROUTINE
634 001231 0002 LOOKUP /WANT LOOKUP FUNCTION
635 001232 0000 LARG1, .-. /WILL BE POINTER TO OUR FILENAME
636 001233 0000 LARG2, .-. /WILL RETURN FILE LENGTH (HOPEFULLY)
637 001234 2222 ISZ LUKUP /LOOKUP FAILED, SO BUMP RETURN ADDRESS
638 001235 5622 JMP I LUKUP /RETURN EITHER WAY
639 / INPUT FILENAME PRINT ROUTINE.
640
641 001236 0000 PIFNAME,.-. /PRINT INPUT FILENAME ROUTINE
642 001237 1032 TAD IFNAME /GET FIRST PAIR
643 001240 4252 JMS PIF2 /PRINT IT
644 001241 1033 TAD IFNAME+1 /GET SECOND PAIR
645 001242 4252 JMS PIF2 /PRINT IT
646 001243 1034 TAD IFNAME+2 /GET THIRD PAIR
647 001244 4252 JMS PIF2 /PRINT IT
648 001245 1375 TAD (".&177) /GET SEPARATOR
649 001246 4264 JMS PIFOUT /PRINT IT
650 001247 1035 TAD IFNAME+3 /GET FOURTH PAIR
651 001250 4252 JMS PIF2 /PRINT IT
652 001251 5636 JMP I PIFNAME /RETURN
653
654 001252 0000 PIF2, .-. /PRINT A PAIR ROUTINE
655 001253 3052 DCA PIFTEMP /SAVE PASSED PAIR
656 001254 1052 TAD PIFTEMP /GET IT BACK
657 001255 7012 RTR;RTR;RTR /MOVE DOWN
001256 7012
001257 7012
658 001260 4264 JMS PIFOUT /PRINT HIGH-ORDER FIRST
659 001261 1052 TAD PIFTEMP /GET IT AGAIN
660 001262 4264 JMS PIFOUT /PRINT LOW-ORDER
661 001263 5652 JMP I PIF2 /RETURN
662
663 001264 0000 PIFOUT, .-. /FILENAME CHARACTER OUTPUT ROUTINE
664 001265 0170 AND [77] /JUST SIXBIT
665 001266 7450 SNA /SKIP IF SOMETHING THERE
666 001267 5664 JMP I PIFOUT /ELSE IGNORE IT
667 001270 1165 TAD [40] /INVERT IT
668 001271 0170 AND [77] /REMOVE EXCESS
669 001272 1165 TAD [40] /INVERT IT AGAIN
670 001273 4573 JMS I [DOBYTE] /OUTPUT IT
671 001274 5664 JMP I PIFOUT /RETURN
672
673 001275 0000 MOFNAME,.-. /MOVE OUTPUT FILENAME ROUTINE
674 001276 1575 TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD
675 001277 4313 JMS CHKNAME /CHECK IF LEGAL
676 001300 3042 DCA FNAME /STASH IT
677 001301 1774 TAD I (OUTFILE+2) /GET SECOND OUTPUT FILENAME WORD
678 001302 4313 JMS CHKNAME /CHECK IF LEGAL
679 001303 3043 DCA FNAME+1 /STASH IT
680 001304 1773 TAD I (OUTFILE+3) /GET THIRD OUTPUT FILENAME WORD
681 001305 4313 JMS CHKNAME /CHECK IF LEGAL
682 001306 3044 DCA FNAME+2 /STASH IT
683 001307 1772 TAD I (OUTFILE+4) /GET FOURTH OUTPUT FILENAME WORD
684 001310 4313 JMS CHKNAME /CHECK IF LEGAL
685 001311 3045 DCA FNAME+3 /STASH IT
686 001312 5675 JMP I MOFNAME /RETURN
687 / OUTPUT NAME CHECK ROUTINE.
688
689 001313 0000 CHKNAME,.-. /OUTPUT NAME CHECK ROUTINE
690 001314 3222 DCA LUKUP /SAVE PASSED VALUE
691 001315 1222 TAD LUKUP /GET IT BACK
692 001316 7012 RTR;RTR;RTR /MOVE DOWN
001317 7012
001320 7012
693 001321 4324 JMS CHKIT /CHECK HIGH-ORDER AND GET IT BACK
694 001322 4324 JMS CHKIT /CHECK LOW-ORDER AND GET IT BACK
695 001323 5713 JMP I CHKNAME /RETURN
696
697 001324 0000 CHKIT, .-. /ONE CHARACTER CHECK ROUTINE
698 001325 0170 AND [77] /JUST SIX BITS
699 001326 1371 TAD (-"?!200) /COMPARE TO "?"
700 001327 7440 SZA /SKIP IF ALREADY BAD
701 001330 1370 TAD (-"*+"?) /ELSE COMPARE TO "*"
702 001331 7650 SNA CLA /SKIP IF NEITHER BAD CASE
703 001332 5767 JMP I (BADNAME) /COMPLAIN OF WILD CHARACTER
704 001333 1222 TAD LUKUP /GET THE PAIR BACK FOR NEXT TIME
705 001334 5724 JMP I CHKIT /RETURN
706
707 001367 0337 PAGE
001370 0025
001371 7701
001372 7604
001373 7603
001374 7602
001375 0056
001376 0032
001377 0340
708 000165 0040 $ /THAT'S ALL FOLK!
000166 7611
000167 0177
000170 0077
000171 7400
000172 0023
000173 1101
000174 0003
000175 7601
000176 0017
000177 0200
BADNAM 0337
BEGIN 0200 unreferenced
BUFPTR 0020
BYTEIN 0450
CHAR 0021
CHARPT 0022
CHARS 0023
CHKIT 1324
CHKNAM 1313
CLOSE 0004
CLOSFI 0506
CLOSLU 0512
CLSERR 0326
CMPCNT 0026
COLUMN 0027
COMPRE 0653
DANGCN 0030
DECODE 0005
DOBYTE 1101
ENCERR 0322
ENCODI 0400
ENDCHE 0460
ENDCOM 0427
ENDFCO 0475
ENTAR1 0277
ENTAR2 0300
ENTER 0003
ENTERR 0333
ERRNUM 0346
EXITZA 0320
FERROR 0335
FETCH 0001
FNAME 0042
GEIFIL 1200
GETBYT 0600
GETLOO 0614
GETNEW 0605
GETREC 0610
IDNUMB 0031
IFNAME 0032
IHNDBU 7200
IHPTR 0263
INBUFF 6200
INERR 0340
INFILE 7605
INLEN 0036
INPTR 0037
INPUT 0040
INRECO 0041
LARG1 1232
LARG2 1233
LATEST 0046
LOOKUP 0002
LOOP 0411
LUKUP 1222
MIFNAM 1065
MOFNAM 1275
NL0001 7201
NL0002 7326
NL7776 7344
NL7777 7240
NOCOMP 0441
NONAME 0336
NORM1 0470
NORM2 0521
NORMEN 0477
NULLOK 1204
ODNUMB 0047
OHNDBU 6600
OHPTR 0251
OUT3 0667
OUTBUF 5600
OUTCNT 0316
OUTCOM 0440
OUTERR 0341
OUTFIL 7600
OUTPUT 0050
OUTREC 0051
PCRLF 0734
PDIGIT 0727
PIF2 1252
PIFNAM 1236
PIFOUT 1264
PIFTEM 0052
PINBUF 0607
PRGFLD 0000
PROCER 0324
PUTBYT 1000
PUTC 0646
PUTERR 1011
PUTINI 1013
PUTLOO 1021
PUTNEW 1017
PUTNEX 1007
PUTONE 0632
PUTREC 1060
RESET 0013
SBOOT 7600
SETCOM 0421
SIZERR 0330
START 0202
TBLFLD 0010
TEMPTR 0053
TERMWR 7642
THIRD 0054
TRYNUL 1211
TSTMOR 0347
USERRO 0007
USR 0200
USRENT 7700
USRFLD 0010
USRIN 0010
WIDTH 0114
WRITE 4000