File K12ENB.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/	OS/8 BOO ENCODING PROGRAM

/	LAST EDIT:	01-OCT-1991	15:00:00	CJL

/	MAY BE ASSEMBLED WITH '/F' SWITCH SET.

/	PROGRAM TO ENCODE ANY  TYPE  OF  OS/8  FILE  INTO  "PRINTABLE"  ASCII (".BOO")
/	FORMAT.  THIS IS A  COMMON  DISTRIBUTION FORMAT FOR MANY COLUMBIA KERMIT FILES
/	AND IS AN ALTERNATIVE TO ENCODE FORMAT FOR PDP-8 AND DECMATE USERS.

/	DISTRIBUTED BY CUCCA AS "K12ENB.PAL" AS PART OF THE CUCCA KERMIT-12 PACKAGE.

/	WRITTEN BY:

/	CHARLES LASNER (CJL)
/	CLA SYSTEMS
/	72-55 METROPOLITAN AVENUE
/	MIDDLE VILLAGE, NEW YORK 11379-2107
/	(718) 894-6499

/	USAGE:

/	.RUN DEV ENBOO		INVOKE PROGRAM
/	*OUTPUT<INPUT		PASS ONE INPUT AND ONE OUTPUT FILE ONLY (WITH <CR>)
/	*OUTPUT<INPUT$		PASS ONE INPUT AND ONE OUTPUT FILE ONLY (WITH <ESC>)
/	.			PROGRAM EXITS NORMALLY

/	INPUT FILE ASSUMES .SV EXTENSION; THERE IS NO ASSUMED OUTPUT EXTENSION.

/	PROGRAM EXIT  IS THE NORMAL OS/8 METHOD OF EITHER PRESSING <^C> ON THE CONSOLE
/	KEYBOARD DURING THE  COMMAND,  OR  ENDING THE COMMAND INPUT LINE WITH AN <ESC>
/	CHARACTER.

/	THIS PROGRAM SUPPORTS THE .BOO FORMAT  FOR  FILE  ENCODING WHICH IS POPULAR IN
/	OTHER  SYSTEMS.  THIS VERSION IMPLEMENTS THE  FILE  LENGTH  PROTECTION  SCHEME
/	DEVELOPED BY CHARLES LASNER TO ENSURE PRECISE FILE LENGTH.

/	MANY .BOO PROGRAMS HAVE PROBLEMS MAINTAINING PRECISE FILE  LENGTH.  THE ACTUAL
/	LENGTH  MAY  BE IMPRECISELY STATED BY ONE OR TWO  BYTES  DUE  TO  AN  INHERENT
/	WEAKNESS  IN  THE  ORIGINAL .BOO ENCODING FORMAT DESIGN.  THIS  IMPLEMENTATION
/	APPENDS CORRECTION BYTES AS NECESSARY TO THE BASIC .BOO FILE TO  ENSURE PROPER
/	DECODING BY PROGRAMS COMPATIBLE WITH THIS EXTENSION.  

/	FILES CREATED BY THIS PROGRAM MAY BE  USED  WITH  EARLIER  .BOO DECODERS;  THE
/	RESULTANT FILES MAY INACCURATELY RECREATE THE ORIGINAL FILES BY AS MUCH AS TWO
/	EXTRANEOUS  TRAILING  BYTES.   THERE WILL BE NO PROBLEMS  (BEYOND  THE  LENGTH
/	ANOMALY)  AS LONG AS THE DECODERS IMPLEMENT ZERO-LENGTH COMPRESSION FIELDS  AS
/	NO  OPERATION.  IT IS POSSIBLE THAT CERTAIN DECODERS COULD ERRONEOUSLY  APPEND
/	MASSIVE  QUANTITIES  OF  ZEROES  ONTO  THE END OF THE DECODED FILES, BUT  THIS
/	ACTION WOULD CERTAINLY BE CAUSED BY DEFECTIVE PROGRAM CODE WITHIN THE DECODER.
/	(ALTHOUGH NOT  LIKELY  SEEN  BEFORE  ENCOUNTERING FILES WITH LENGTH CORRECTION
/	BYTES, THIS WOULD  BE  A  LATENT  BUG  IN  THESE  DECODING  PROGRAMS.  UPDATED
/	VERSIONS SHOULD BE SOUGHT IF THIS PROBLEM SURFACES.)

/ ERROR MESSAGES. / ERROR MESSAGES ARE ONE OF TWO VARIETIES: COMMAND DECODER MESSAGES AND USER / (PROGRAM-SIGNALLED) MESSAGES. / COMMAND DECODER MESSAGES ARE NON-FATAL AND MERELY REQUIRE RETYPING THE / COMMAND. ATTEMPTING TO USE MORE THAN ONE OUTPUT FILE WILL YIELD THE COMMAND / DECODER MESSAGE "TOO MANY FILES" AND CAUSE A REPEAT OF THE COMMAND DECODER / PROMPT REQUIRING USER INPUT. THE USER IS DIRECTED TO OTHER DOCUMENTATION OF / THE "SPECIAL" MODE OF THE COMMAND DECODER, AS THAT IS THE ONLY MODE USED BY / THIS UTILITY PROGRAM. / ANY USER MESSAGE PRINTED IS A FATAL ERROR MESSAGE CAUSED BY A PROBLEM BEYOND / THE SCOPE OF THE COMMAND DECODER. ALL USER MESSAGES ARE THE STANDARD OS/8 / "USER" ERROR MESSAGES OF THE FORM: "USER ERROR X AT AAAAA", WHERE X IS THE / ERROR NUMBER AND AAAAA IS THE PROGRAM ADDRESS WHERE THE ERROR WAS DETECTED. / THE FOLLOWING USER ERRORS ARE DEFINED: / ERROR NUMBER PROBABLE CAUSE / 0 NO OUTPUT FILE. / 1 INPUT FILE ERROR (CAN'T FIND INPUT FILE) OR NO INPUT / FILE SPECIFIED OR TOO MANY INPUT FILES SPECIFIED. / 2 ILLEGAL OUTPUT FILE NAME (WILD CARDS NOT ALLOWED). / 3 NO OUTPUT FILE NAME (DEVICE ONLY IS NOT ALLOWED). / 4 ERROR WHILE FETCHING FILE HANDLER. / 5 ERROR WHILE ATTEMPTING TO ENTER OUTPUT FILE. / 6 OUTPUT FILE LARGER THAN AVAILABLE FILE SPACE. / 7 ERROR WHILE CLOSING THE OUTPUT FILE. / 8 I/O ERROR WHILE ENCODING FILE DATA. / 9 OUTPUT ERROR WHILE ENCODING FILE DATA. / ASSEMBLY INSTRUCTIONS. / IT IS ASSUMED THE SOURCE FILE K12ENB.PAL HAS BEEN MOVED AND RENAMED TO / DSK:ENBOO.PA. / .PAL ENBOO<ENBOO/E/F ASSEMBLE SOURCE PROGRAM / .LOAD ENBOO LOAD THE BINARY FILE / .SAVE DEV ENBOO=2001 SAVE THE CORE-IMAGE FILE
/ DEFINITIONS. CLOSE= 4 /CLOSE OUTPUT FILE DECODE= 5 /CALL COMMAND DECODER ENTER= 3 /ENTER TENTATIVE FILE FETCH= 1 /FETCH HANDLER IHNDBUF=7200 /INPUT HANDLER BUFFER INBUFFE=6200 /INPUT BUFFER INFILE= 7605 /INPUT FILE INFORMATION HERE LOOKUP= 2 /LOOKUP INPUT FILE NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 OHNDBUF=6600 /OUTPUT HANDLER BUFFER OUTBUFF=5600 /OUTPUT BUFFER OUTFILE=7600 /OUTPUT FILE INFORMATION HERE PRGFLD= 00 /PROGRAM FIELD RESET= 13 /RESET SYSTEM TABLES SBOOT= 7600 /MONITOR EXIT TBLFLD= 10 /COMMAND DECODER TABLE FIELD TERMWRD=7642 /TERMINATOR WORD USERROR=7 /USER SIGNALLED ERROR USR= 0200 /USR ENTRY POINT USRENT= 7700 /USR ENTRY POINT WHEN NON-RESIDENT USRFLD= 10 /USR FIELD USRIN= 10 /LOCK USR IN CORE WIDTH= 114 /LINES MUST BE 76 WIDE OR LESS WRITE= 4000 /I/O WRITE BIT
*0 /START AT THE BEGINNING *20 /GET PAST AUTO-INDEX AREA BUFPTR, .-. /OUTPUT BUFFER POINTER CHAR, .-. /LATEST INPUT BYTE CHARPTR,.-. /OUTPUT BYTE POINTER CHARS, ZBLOCK 3 /OUTPUT BYTES HERE CMPCNT, .-. /MATCH COUNT FOR COMPRESSION COLUMN, .-. /LATEST COLUMN DANGCNT,.-. /DANGER COUNT IDNUMBE,.-. /INPUT DEVICE NUMBER IFNAME, ZBLOCK 4 /INPUT FILENAME INLEN, .-. /INPUT FILE LENGTH INPTR, .-. /INPUT BUFFER POINTER INPUT, .-. /INPUT HANDLER POINTER INRECOR,.-. /INPUT RECORD FNAME, ZBLOCK 4 /OUTPUT FILENAME LATEST, .-. /LATEST OUTPUT CHARACTER ODNUMBE,.-. /OUTPUT DEVICE NUMBER OUTPUT, .-. /OUTPUT HANDLER POINTER OUTRECO,.-. /OUTPUT RECORD PIFTEMP,.-. /PRINT INPUT FILENAME TEMPORARY TEMPTR, .-. /TEMPORARY POINTER THIRD, .-. /THIRD INPUT BYTE UNPACKING TEMPORARY
PAGE /START AT THE USUAL PLACE BEGIN, NOP /IN CASE WE'RE CHAINED TO CLA /CLEAN UP START, CIF USRFLD /GOTO USR FIELD JMS I (USRENT) /CALL USR ROUTINE USRIN /GET IT LOCKED IN CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE DECODE /WANT COMMAND DECODER "*^100 /USING SPECIAL MODE CDF TBLFLD /GOTO TABLE FIELD TAD I (TERMWRD) /GET TERMINATOR WORD SPA CLA /SKIP IF <CR> TERMINATED THE LINE DCA EXITZAP /ELSE CAUSE EXIT LATER TAD I (OUTFILE) /GET OUTPUT FILE DEVICE WORD SNA /SKIP IF FIRST OUTPUT FILE PRESENT JMP TSTMORE /JUMP IF NOT THERE AND [17] /JUST DEVICE BITS DCA ODNUMBER /SAVE OUTPUT DEVICE NUMBER TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SNA /SKIP IF PRESENT JMP INERR /JUMP IF NOT AND [17] /JUST DEVICE BITS DCA IDNUMBER /SAVE INPUT DEVICE NUMBER TAD I (INFILE+5) /GET SECOND INPUT FILE DEVICE WORD SZA CLA /SKIP IF ONLY ONE INPUT FILE JMP INERR /ELSE COMPLAIN JMS I (MIFNAME) /MOVE INPUT FILENAME WITH ADJUSTED EXTENSION TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD SNA CLA /SKIP IF NAME PRESENT JMP NONAME /JUMP IF DEVICE ONLY JMS I (MOFNAME) /MOVE OUTPUT FILENAME CDF PRGFLD /BACK TO OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE RESET /RESET SYSTEM TABLES TAD (OHNDBUFFER+1) /GET BUFFER POINTER+TWO-PAGE BIT DCA OHPTR /STORE IN-LINE TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER OHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD OHPTR /GET RETURNED ADDRESS DCA OUTPUT /STORE AS OUTPUT HANDLER ADDRESS TAD (IHNDBUFFER+1) /GET INPUT BUFFER POINTER+TWO-PAGE BIT DCA IHPTR /STORE IN-LINE
TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE FETCH /FETCH HANDLER IHPTR, .-. /WILL BE BUFFER POINTER+TWO-PAGE BIT JMP FERROR /FETCH ERROR TAD IHPTR /GET RETURNED ADDRESS DCA INPUT /STORE AS INPUT HANDLER ADDRESS JMS I (GEIFILE) /GO LOOKUP INPUT FILE TAD (FNAME) /POINT TO DCA ENTAR1 /STORED FILENAME DCA ENTAR2 /CLEAR SECOND ARGUMENT TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE ENTER /ENTER TENTATIVE FILENAME ENTAR1, .-. /WILL POINT TO FILENAME ENTAR2, .-. /WILL BE ZERO JMP ENTERR /ENTER ERROR TAD ENTAR1 /GET RETURNED FIRST RECORD DCA OUTRECORD /STORE IT TAD ENTAR2 /GET RETURNED EMPTY LENGTH IAC /ADD 2-1 FOR OS/278 CRAZINESS DCA DANGCNT /STORE AS DANGER COUNT JMS I (ENCODIT) /GO DO THE ACTUAL ENCODING JMP PROCERR /ERROR WHILE ENCODING TAD ODNUMBER /GET OUTPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE CLOSE /CLOSE OUTPUT FILE FNAME /POINTER TO FILENAME OUTCNT, .-. /WILL BE ACTUAL COUNT JMP CLSERR /CLOSE ERROR EXITZAP,JMP START /**** <ESC> TERMINATION **** 0000 JMP I (SBOOT) /EXIT TO MONITOR
/ OUTPUT FILE ERROR WHILE PROCESSING. ENCERRO,TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE PROCESSING INPUT FILE. PROCERR,NL0002 /SET INCREMENT SKP /DON'T USE NEXT / ERROR WHILE CLOSING THE OUTPUT FILE. CLSERR, NL0001 /SET INCREMENT SKP /DON'T CLEAR IT / OUTPUT FILE TOO LARGE ERROR. SIZERR, CLA /CLEAN UP TAD [3] /SET INCREMENT SKP /DON'T USE NEXT / ENTER ERROR. ENTERR, NL0002 /SET INCREMENT SKP /DON'T USE NEXT / HANDLER FETCH ERROR. FERROR, NL0001 /SET INCREMENT / NO OUTPUT FILENAME ERROR. NONAME, IAC /SET INCREMENT / ILLEGAL OUTPUT FILE NAME ERROR. BADNAME,IAC /SET INCREMENT / INPUT FILESPEC ERROR. INERR, IAC /SET INCREMENT / OUTPUT FILESPEC ERROR. OUTERR, DCA ERRNUMBER /STORE ERROR NUMBER CDF PRGFLD /ENSURE OUR FIELD CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE USERROR /USER ERROR ERRNUMB,.-. /WILL BE PASSED ERROR NUMBER
/ COMES HERE TO TEST FOR NULL LINE. TSTMORE,TAD I (INFILE) /GET FIRST INPUT FILE DEVICE WORD SZA CLA /SKIP NO INPUT OR OUTPUT GIVEN JMP OUTERR /ELSE COMPLAIN CDF PRGFLD /BACK TO OUR FIELD JMP EXITZAP /MIGHT BE LAST TIME, SO GO THERE FIRST PAGE
ENCODIT,.-. /ENCODING ROUTINE NL7777 /SETUP INITIALIZE VALUE JMS I [DOBYTE] /INITIALIZE OUTPUT ROUTINE JMS I (PIFNAME) /OUTPUT THE INPUT FILENAME JMS I (PCRLF) /OUTPUT <CR>/<LF> AND CLEAR COLUMN COUNTER DCA CMPCNT /CLEAR COMPRESSION TAD [CHARS] /SETUP THE DCA CHARPTR /OUTPUT POINTER NL7777 /MAKE IT INITIALIZE LOOP, JMS I (GETBYTE) /GET LATEST BYTE JMP ENDCHECK /AREN'T ANY MORE, FINISH THE FILE / TEST IF ALREADY WITHIN A DEVELOPING COMPRESSION FIELD. TAD CMPCNT /GET COMPRESSION COUNT SNA CLA /SKIP IF COMPRESSION IN PROGRESS JMP NOCOMP /JUMP IF NOT / CHECK IF LATEST INPUT BYTE IS ZERO. TAD CHAR /GET LATEST SZA CLA /SKIP IF SO JMP ENDCOMPRESS /JUMP IF NOT SETCOMP,ISZ CMPCNT /BUMP COMPRESSION COUNT TAD CMPCNT /GET LATEST COUNT TAD (-116) /COMPARE TO MAXIMUM ALLOWED SNA CLA /SKIP IF NOT JMS I (COMPRESSOUT) /OUTPUT MAXIMUM COMPRESSION AND CANCEL COMPRESSION JMP LOOP /GO GET ANOTHER ONE / IF LATEST IS NON-ZERO, THEN COMPLETE EXISTING COMPRESSION FIELD. ENDCOMP,NL7777 /-1 TAD CMPCNT /COMPARE TO COMPRESSION COUNT SZA CLA /SKIP IF TRIVIAL CASE JMP OUTCOMPRESS /JUMP IF NOT / CANCEL TRIVIAL CASE OF ONE BYTE COMPRESSION. DCA CMPCNT /CLEAR COMPRESSION MODE DCA CHARS /FIRST BYTE WAS ZERO TAD (CHARS+1) /SETUP OUTPUT POINTER TO DCA CHARPTR /STORE INTO SECOND BYTE JMP BYTEINSERT /CONTINUE THERE
/ OUTPUT LATEST COMPRESSION AND PROCESS NEW NON-ZERO BYTE. OUTCOMP,JMS I (COMPRESSOUT) /OUTPUT COMPRESSION FIELD AND CANCEL COMPRESSION / COMES HERE IF NOT WITHIN A COMPRESSION REGION. NOCOMP, TAD CHARPTR /GET POINTER TAD (-CHARS) /CHECK IF AT BEGINNING SZA CLA /SKIP IF BUFFER EMPTY JMP BYTEINSERT /JUMP IF NOT / IF AT BEGINNING OF THREE BYTES, TEST IF LATEST STARTS A COMPRESSION FIELD. TAD CHAR /GET LATEST BYTE SNA CLA /SKIP IF NOT ZERO JMP SETCOMPRESSION /JUMP IF SO BYTEINS,TAD CHAR /GET LATEST BYTE DCA I CHARPTR /STORE IT ISZ CHARPTR /BUMP TO NEXT TAD CHARPTR /GET THE UPDATED POINTER TAD (-CHARS-2-1) /COMPARE TO UPPER LIMIT SNA CLA /SKIP IF LESS THAN THREE PRESENT JMS I (OUT3) /ELSE OUTPUT THE THREE BYTES AND RESET THE BUFFER JMP LOOP /GO GET ANOTHER ONE / COMES HERE AT END OF INPUT. ENDCHEC,NL7776 /-2 TAD CMPCNT /COMPARE TO COMPRESSION COUNT SMA /SKIP IF AT TRIVIAL CASE OR NO COMPRESSION CURRENTLY JMP ENDFCOMPRESS /FINISH WITH A COMPRESSION FIELD IAC /CHECK FURTHER SZA CLA /SKIP IF TRIVIAL COMPRESSION AT END JMP NORMEND /JUMP IF NOT WITHIN COMPRESSION / THE TRIVIAL CASE CONVERTS TO AN INCOMPLETE OUTPUT, COMPLETE WITH CORRECTION / BYTES TO INDICATE THE SHORT FIELD. DCA CHARS /MOVE ZERO BYTE TO FIRST POSITION NORM1, DCA CHARS+1 /CLEAR SECOND POSITION DCA CHARS+2 /CLEAR THIRD POSITION JMS I (OUT3) /OUTPUT THE THREE BYTES DCA CMPCNT /CLEAR COMPRESSION COUNT JMS I (COMPRESSOUT) /OUTPUT NULL COMPRESSION FIELD TO CANCEL THIRD BYTE /NEXT WILL CANCEL SECOND BYTE / COMES HERE IF FILE ENDS ON A COMPRESSION FIELD. ENDFCOM,JMS I (COMPRESSOUT) /OUTPUT COMPRESSION FIELD AND CANCEL COMPRESSION JMP CLOSFILE /FINISH IT THERE
/ COMES HERE IF FILE ENDS IN SOME FORM OF DATA FIELD. NORMEND,TAD CHARPTR /GET CHARACTER POINTER TAD (-CHARS-2) /COMPARE TO TWO PRESENT VALUE SNA /SKIP IF NOT THE CASE JMP NORM2 /JUMP IF SO IAC /BUMP TO ONE PRESENT VALUE SNA CLA /SKIP IF NOT THE CASE JMP NORM1 /JUMP IF SO CLOSFIL,TAD COLUMN /GET CURRENT COLUMN COUNTER SZA CLA /SKIP IF AT BEGINNING ALREADY JMS I (PCRLF) /ELSE OUTPUT <CR>/<LF> NOW TAD ("Z&37) /GET <^Z> CLOSLUP,JMS I [DOBYTE] /OUTPUT A BYTE (^Z OR NULL) TAD BUFPTR /GET THE OUTPUT BUFFER POINTER TAD (-OUTBUFFER) /COMPARE TO RESET VALUE SZA CLA /SKIP IF IT MATCHES JMP CLOSLUP /ELSE KEEP GOING ISZ ENCODIT /NO ERRORS JMP I ENCODIT /RETURN / COMES HERE IF FILE ENDS WITH ONLY TWO DATA CHARACTERS. NORM2, DCA CHARS+2 /CLEAR THIRD CHARACTER JMS I (OUT3) /OUTPUT THE THREE BYTES JMP ENDFCOMPRESS /FINISH IT THERE PAGE
/ GET AN INPUT BYTE ROUTINE. GETBYTE,.-. /GET A BYTE ROUTINE SNA CLA /INITIALIZING? JMP I PUTC /NO, GO GET NEXT BYTE TAD INRECORD /GET INPUT FILE STARTING RECORD DCA GETRECORD /STORE IN-LINE GETNEWR,JMS I INPUT /CALL INPUT HANDLER 2^100 /READ TWO PAGES PINBUFF,INBUFFER /INTO INPUT BUFFER GETRECO,.-. /WILL BE LATEST INPUT FILE RECORD JMP I (PROCERR) /INPUT READ ERROR, GO COMPLAIN TAD PINBUFFER/(INBUFFER) /SETUP THE DCA INPTR /BUFFER POINTER GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE TAD THIRD /GET THIRD BYTE JMS PUTC /SEND IT BACK TAD INPTR /GET THE POINTER TAD (-2^200-INBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP GETLOOP /KEEP GOING ISZ GETRECORD /BUMP TO NEXT RECORD NOP /JUST IN CASE ISZ INLEN /DONE ALL INPUT RECORDS? JMP GETNEWRECORD /NO, KEEP GOING / AT END-OF-FILE, SO JUST TAKE IMMEDIATE RETURN. JMP I GETBYTE /RETURN TO CALLER PUTONE, .-. /SEND BACK A BYTE ROUTINE TAD I INPTR /GET LATEST WORD AND [7400] /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD THIRD /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA THIRD /SAVE FOR NEXT TIME TAD I INPTR /GET LATEST WORD AGAIN JMS PUTC /SEND BACK CURRENT BYTE ISZ INPTR /BUMP TO NEXT WORD JMP I PUTONE /RETURN PUTC, .-. /SEND BACK LATEST BYTE ROUTINE AND (377) /KEEP ONLY GOOD BITS DCA CHAR /SAVE AS LATEST BYTE ISZ GETBYTE /BUMP PAST <EOF> RETURN JMP I GETBYTE /RETURN TO MAIN CALLER
/ COMPRESSION FIELD OUTPUT ROUTINE. COMPRES,.-. /COMPRESSION OUTPUT ROUTINE CLA /CLEAN UP TAD COLUMN /GET CURRENT COLUMN COUNTER TAD (-WIDTH+2) /COMPARE TO UPPER LIMIT SMA SZA CLA /SKIP IF NOT ABOVE LIMIT JMS PCRLF /ELSE DO <CR>/<LF> FIRST TAD (176) /GET TILDE VALUE JMS I [DOBYTE] /OUTPUT IT TAD CMPCNT /GET COMPRESSION COUNT JMS PDIGIT /OUTPUT IT DCA CMPCNT /CLEAR COMPRESSION JMP I COMPRESSOUT /RETURN / DATA FIELD OUTPUT ROUTINE. OUT3, .-. /OUTPUT THREE BYTES ROUTINE TAD COLUMN /GET CURRENT COLUMN COUNTER TAD (-WIDTH+4) /COMPARE TO UPPER LIMIT SMA SZA CLA /SKIP IF NOT ABOVE LIMIT JMS PCRLF /ELSE DO <CR>/<LF> FIRST TAD CHARS /GET FIRST BYTE RTR /WANT HIGH SIX BITS FIRST JMS PDIGIT /OUTPUT THEM TAD CHARS /GET IT AGAIN AND [3] /JUST TWO LOWEST BITS CLL RTR;RTR;RAR /MOVE UP TAD CHARS+1 /GET SECOND BYTE RTR;RTR /MOVE DOWN JMS PDIGIT /OUTPUT THEM TAD CHARS+2 /GET THIRD BYTE AND (300) /JUST TWO HIGHEST BITS NEEDED CLL RTL;RTL;RAL /MOVE INTO POSITION TAD CHARS+1 /GET SECOND BYTE RTL /MOVE UP AND [77] /JUST DESIRED BITS JMS PDIGIT /OUTPUT THEM TAD CHARS+2 /GET THIRD BYTE AND [77] /JUST SIX BITS JMS PDIGIT /OUTPUT THEM TAD [CHARS] /RESET THE DCA CHARPTR /OUTPUT POINTER JMP I OUT3 /RETURN PDIGIT, .-. /PRINT AS A DIGIT INTO FILE ROUTINE AND [177] /REMOVE JUNK BITS TAD ("0&177) /TURN PASSED VALUE INTO A DIGIT JMS I [DOBYTE] /OUTPUT IT JMP I PDIGIT /RETURN
PCRLF, .-. /PRINT <CR>/<LF> INTO FILE ROUTINE TAD ("M&37) /GET A <CR> JMS I [DOBYTE] /OUTPUT IT TAD ("J&37) /GET A <LF> JMS I [DOBYTE] /OUTPUT IT DCA COLUMN /CLEAR COLUMN COUNTER JMP I PCRLF /RETURN PAGE
PUTBYTE,.-. /OUTPUT A BYTE ROUTINE SPA /ARE WE INITIALIZING? JMP PUTINITIALIZE /YES AND [177] /JUST IN CASE DCA LATEST /SAVE LATEST CHARACTER TAD LATEST /GET LATEST CHARACTER JMP I PUTNEXT /GO WHERE YOU SHOULD GO PUTNEXT,.-. /EXIT ROUTINE ISZ PUTBYTE /BUMP TO GOOD RETURN PUTERRO,CLA CLL /CLEAN UP JMP I PUTBYTE /RETURN TO MAIN CALLER PUTINIT,CLA /CLEAN UP TAD OUTRECORD /GET STARTING RECORD OF TENTATIVE FILE DCA PUTRECORD /STORE IN-LINE DCA I (OUTCNT) /CLEAR ACTUAL FILE LENGTH PUTNEWR,TAD (OUTBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER PUTLOOP,JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT TAD BUFPTR /GET POINTER VALUE DCA TEMPTR /SAVE FOR LATER ISZ BUFPTR /BUMP TO NEXT JMS PUTNEXT /GET A CHARACTER DCA I BUFPTR /STORE IT JMS PUTNEXT /GET A CHARACTER RTL;RTL /MOVE UP AND [7400] /ISOLATE HIGH NYBBLE TAD I TEMPTR /ADD ON FIRST BYTE DCA I TEMPTR /STORE COMPOSITE TAD LATEST /GET LATEST CHARACTER RTR;RTR;RAR /MOVE UP AND AND [7400] /ISOLATE LOW NYBBLE TAD I BUFPTR /ADD ON SECOND BYTE DCA I BUFPTR /STORE COMPOSITE ISZ BUFPTR /BUMP TO NEXT TAD BUFPTR /GET LATEST POINTER VALUE TAD (-2^200-OUTBUFF)/COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP PUTLOOP /KEEP GOING ISZ DANGCNT /TOO MANY RECORDS? SKP /SKIP IF NOT JMP I (SIZERR) /JUMP IF SO JMS I OUTPUT /CALL I/O HANDLER 2^100+WRITE /WRITE SOME PAGES FROM OUTPUT BUFFER OUTBUFFER /BUFFER ADDRESS PUTRECO,.-. /WILL BE LATEST RECORD NUMBER JMP PUTERROR /OUTPUT ERROR! ISZ I (OUTCNT) /BUMP ACTUAL LENGTH ISZ PUTRECORD /BUMP TO NEXT RECORD JMP PUTNEWRECORD /KEEP GOING
/ INPUT FILENAME MOVE ROUTINE; USES DEFAULT EXTENSION IF NONE PROVIDED BY USER. MIFNAME,.-. /MOVE INPUT FILENAME ROUTINE TAD I (INFILE+1) /GET FIRST INPUT FILENAME WORD DCA IFNAME /STASH IT TAD I (INFILE+2) /GET SECOND INPUT FILENAME WORD DCA IFNAME+1 /STASH IT TAD I (INFILE+3) /GET THIRD INPUT FILENAME WORD DCA IFNAME+2 /STASH IT TAD I [INFILE+4] /GET FOURTH INPUT FILENAME WORD SNA /SKIP IF SOMETHING THERE TAD ("S^100+"V-300) /ELSE USE DEFAULT EXTENSION VALUE DCA IFNAME+3 /STASH IT EITHER WAY JMP I MIFNAME /RETURN DOBYTE, .-. /OUTPUT A BYTE ROUTINE JMS PUTBYTE /OUTPUT PASSED VALUE JMP I (ENCERROR) /COULDN'T DO IT ISZ COLUMN /BUMP COLUMN COUNTER JMP I DOBYTE /RETURN PAGE
/ INPUT FILE ROUTINE. GEIFILE,.-. /GET INPUT FILE ROUTINE JMS LUKUP /TRY TO LOOKUP THE FILE SKP /SKIP IF IT WORKED JMP TRYNULL /TRY NULL EXTENSION VERSION NULLOK, TAD LARG1 /GET FIRST INPUT RECORD DCA INRECORD /STASH IT TAD LARG2 /GET NEGATED LENGTH DCA INLEN /STASH IT JMP I GEIFILE /RETURN / COMES HERE IF LOOKUP FAILED. TRYNULL,CDF TBLFLD /GOTO TABLE FIELD TAD I [INFILE+4] /GET ORIGINAL FILENAME'S EXTENSION CDF PRGFLD /BACK TO OUR FIELD SZA CLA /SKIP IF IT WAS NULL ORIGINALLY JMP I (INERR) /ELSE COMPLAIN OF EXPLICIT LOOKUP FAILURE DCA IFNAME+3 /NOW TRY NULL VERSION INSTEAD OF DEFAULT VERSION JMS LUKUP /TRY TO LOOK IT UP AGAIN JMP NULLOK /THAT WORKED! JMP I (INERR) /COMPLAIN OF LOOKUP FAILURE LUKUP, .-. /LOW-LEVEL LOOKUP ROUTINE TAD (IFNAME) /GET OUR FILENAME POINTER DCA LARG1 /STORE IN-LINE DCA LARG2 /CLEAR SECOND ARGUMENT TAD IDNUMBER /GET INPUT DEVICE NUMBER CIF USRFLD /GOTO USR FIELD JMS I [USR] /CALL USR ROUTINE LOOKUP /WANT LOOKUP FUNCTION LARG1, .-. /WILL BE POINTER TO OUR FILENAME LARG2, .-. /WILL RETURN FILE LENGTH (HOPEFULLY) ISZ LUKUP /LOOKUP FAILED, SO BUMP RETURN ADDRESS JMP I LUKUP /RETURN EITHER WAY
/ INPUT FILENAME PRINT ROUTINE. PIFNAME,.-. /PRINT INPUT FILENAME ROUTINE TAD IFNAME /GET FIRST PAIR JMS PIF2 /PRINT IT TAD IFNAME+1 /GET SECOND PAIR JMS PIF2 /PRINT IT TAD IFNAME+2 /GET THIRD PAIR JMS PIF2 /PRINT IT TAD (".&177) /GET SEPARATOR JMS PIFOUT /PRINT IT TAD IFNAME+3 /GET FOURTH PAIR JMS PIF2 /PRINT IT JMP I PIFNAME /RETURN PIF2, .-. /PRINT A PAIR ROUTINE DCA PIFTEMP /SAVE PASSED PAIR TAD PIFTEMP /GET IT BACK RTR;RTR;RTR /MOVE DOWN JMS PIFOUT /PRINT HIGH-ORDER FIRST TAD PIFTEMP /GET IT AGAIN JMS PIFOUT /PRINT LOW-ORDER JMP I PIF2 /RETURN PIFOUT, .-. /FILENAME CHARACTER OUTPUT ROUTINE AND [77] /JUST SIXBIT SNA /SKIP IF SOMETHING THERE JMP I PIFOUT /ELSE IGNORE IT TAD [40] /INVERT IT AND [77] /REMOVE EXCESS TAD [40] /INVERT IT AGAIN JMS I [DOBYTE] /OUTPUT IT JMP I PIFOUT /RETURN MOFNAME,.-. /MOVE OUTPUT FILENAME ROUTINE TAD I [OUTFILE+1] /GET FIRST OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME /STASH IT TAD I (OUTFILE+2) /GET SECOND OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+1 /STASH IT TAD I (OUTFILE+3) /GET THIRD OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+2 /STASH IT TAD I (OUTFILE+4) /GET FOURTH OUTPUT FILENAME WORD JMS CHKNAME /CHECK IF LEGAL DCA FNAME+3 /STASH IT JMP I MOFNAME /RETURN
/ OUTPUT NAME CHECK ROUTINE. CHKNAME,.-. /OUTPUT NAME CHECK ROUTINE DCA LUKUP /SAVE PASSED VALUE TAD LUKUP /GET IT BACK RTR;RTR;RTR /MOVE DOWN JMS CHKIT /CHECK HIGH-ORDER AND GET IT BACK JMS CHKIT /CHECK LOW-ORDER AND GET IT BACK JMP I CHKNAME /RETURN CHKIT, .-. /ONE CHARACTER CHECK ROUTINE AND [77] /JUST SIX BITS TAD (-"?!200) /COMPARE TO "?" SZA /SKIP IF ALREADY BAD TAD (-"*+"?) /ELSE COMPARE TO "*" SNA CLA /SKIP IF NEITHER BAD CASE JMP I (BADNAME) /COMPLAIN OF WILD CHARACTER TAD LUKUP /GET THE PAIR BACK FOR NEXT TIME JMP I CHKIT /RETURN PAGE
$ /THAT'S ALL FOLK!



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search