/ FONT CONVERSION UTILITY / FANCY-FONT => P?S/8 FONT CONVERSION PROGRAM. / LAST EDIT: 29-JUL-1988 20:00:00 CJL / MUST BE ASSEMBLED WITH '/J' SWITCH SET. / PRODUCES A FONT FILE IN A FORMAT THAT PARTIALLY MIMICS A P?S/8 SIX-BIT FILE: / RELATIVE ADDRESS USAGE / 0000-0003 FONT NAME IN P?S/8 SIX-BIT. / 0004-0007 LENGTH BLURB. / 0010-0011 LENGTH IN BLOCKS (OCTAL). / 0012-0015 BLOCKS BLURB AND . / 0016 0000 TO TERMINATE FILE. / 0017 FONT HEIGHT IN SIXELS (DOES NOT INCLUDE VERTICAL / SPACING). / 0020 INTRA-CHARACTER SPACING IN PIXELS (ASSUMES VARIABLE / SPACING PER CHARACTER). / 0021 VERTICAL SPACING IN PIXELS. / 0022-0023 POINTER TO FREE SPACE AFTER LAST CHARACTER DESCRIPTOR. / 0024-0177 RESERVED FOR OTHER ATTRIBUTES. / 0200-0577 POINTERS TO IMPLEMENTED CHARACTERS (0 IF CHARACTER / NOT IMPLEMENTED IN THIS SET). / 0600- CHARACTER DESCRIPTOR STORAGE. / IF SCANNED FROM THE BEGINNING, THE FILE WILL APPEAR TO BE A VALID P?S/8 / ASCII FILE WITH ONE LINE PROCLAIMING THE FONT NAME AND LENGTH. THIS FILE / MUST NOT BE MODIFIED BY THE P?S/8 EDITOR, BUT MAY BE INSPECTED BY ANY / NORMAL P?S/8 SIX-BIT ASCII-ORIENTED UTILITY, SUCH AS "PRINT." THE ACTUAL / FONT INFORMATION IS HIDDEN, AVAILABLE ONLY BY DIRECT ACCESS. / CHARACTER DESCRIPTOR LAYOUT (RELATIVE ADDRESSING): / 0000 CHARACTER WIDTH IN PIXELS. / 0001 HOW MANY SIXELS ARE DESCRIBED IN LATEST FIELD. / (0000 IS ALLOWED). / 0002- SIXEL DESCRIPTIONS PACKED TWO PER WORD. / THE SIXEL COUNT AND PACKED SIXELS FOR ANY ADDITIONAL FIELDS FOLLOW. IF / THE SIXEL COUNT IS ODD, THE LAST HALF-WORD IS IGNORED. SIXEL BINARY PATTERN / CONFORMS TO DEC STANDARD WHERE BITS SCANNED LEFT TO RIGHT FIRE PINS FROM / BOTTOM TO TOP. / INPUT FILE DESCRIPTION. / CHARACTER ENCODING. / THE INPUT FILE IS AN ENCODED VERSION OF A SEVEN-BIT ASCII FILE CONVERTED / TO P?S/8 SIX-BIT FOR PROCESSING BY THIS PROGRAM. / THE CHARACTER ENCODING IS AS FOLLOWS: / OCTAL ASCII P?S/8 INTERNAL CODE / 000-014 - IGNORED / 015 00 / 016-037 - IGNORED / 040-077 -? 40-77 (TRANSLATED DIRECTLY TO SIX-BIT) / 100 36,46 ^& / 101-135 A-] 01-35 (TRANSLATED DIRECTLY TO SIX-BIT) / 136 ^ 36,36 ^^ / 137 36,45 ^% / 140 36,47 ^' / 141-175 - 01-35 (TRANSLATED DIRECTLY TO SIX-BIT) / 176 36,44 ^$ / 177 IGNORED / UPPER-CASE/LOWER-CASE RESOLUTION FOR 101-135 VERSUS 141-175 IS ACCOMPLISHED / VIA CASE SHIFT. CASE SHIFT CHANGE IS ACHIEVED BY INSERTING ^ (CODE 36) / IN FRONT OF THE CASE-CHANGING CHARACTER. THE DEFAULT STATE IS UPPER-CASE. / PROGRAM USAGE. / THE PROGRAM IS MEANT TO BE INVOKED AS A SYSTEM PROGRAM: / .GET BFNCON GET THE BINARY OF THIS PROGRAM / .R %,OUTFIL / THE FONT NAME WILL BE USED TO IDENTIFY THE CREATED FONT OUTPUT FILE. EXACTLY / 8 CHARACTERS MUST BE PRESENT. / P?S/8 DEFINITIONS. EXTCAT= 0067 /EXTENDED CATALOG BLOCK SBOOT= 7600 /SYSTEM EXIT ADDRESS SFILES= 7757 /FILE ARGUMENTS PASSED TO SYSTEMS STARTING HERE SOUTFLS=7607 /OUTPUT FILE COUNT SYSIO= 7640 /SYSTEM I/O ENTRY POINT WRITE= 4000 /SYSIO WRITE BIT / OTHER DEFINITIONS. NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7777= CLA CMA /LOAD AC WITH 7777 PAGE 0 /START AT THE BEGINNING *10 /GET TO AUTO-INDEX AREA XR1, .-. /AUTO-INDEX NUMBER 1 *20 /GET PAST AUTO-INDEX AREA CNT, .-. /COUNTER TEMPORARY CURBLK, .-. /CURRENT VIRTUAL BLOCK CURPTHI,.-. /CURRENT OUTPUT POINTER - HIGH-ORDER CURPTLO,.-. /CURRENT OUTPUT POINTER - LOW-ORDER FCNTR, .-. /FIELD COUNTER FPTR, .-. /FIELD BUFFER POINTER FSBLK, .-. /FREE-SPACE CURRENT BLOCK FWIDTH, .-. /WIDTH OF LATEST FIELD GCASE, .-. /ALPHABETIC CASE GFLPTR, .-. /FILE LIST POINTER GFPTR, .-. /FIELD BUFFER POINTER GPTR, .-. /BUFFER POINTER LIMBLK, .-. /UPPER LIMIT BLOCK LSTCHAR,.-. /LAST CHARACTER SCANNED MW, .-. /MAXIMUM FIELD WIDTH TEMPORARY NUMBER, .-. /NUMBER TEMPORARY NUMBSW, .-. /NO-DIGIT SWITCH PUTBASE,.-. /PUT HALF-WORD BASE PUTNDX, .-. /PUT HALF-WORD INDEX PUTPTR, .-. /PUT HALF-WORD STORING POINTER PUTEMP, .-. /PUT HALF TEMPORARY SCNTR, .-. /SIXEL COUNTER STRVALU,.-. /TEMPORARY FOR STORE ROUTINE TEMP, .-. /TEMPORARY DUMPIT, .-. /VIRTUAL WRITE ROUTINE JMS I [SYSIO] /CALL I/O ROUTINES VIRBUFFER /VIRTUAL BUFFER DMPFUN, 1^100+WRITE+.-. /UNIT BITS WILL BE FILLED IN DMPBLK, .-. /CURRENT VIRTUAL BLOCK JMP I DUMPIT /RETURN PAGE /START AT THE USUAL PLACE FONCON, JMS I (INITIALIZE) /SETUP EVERYTHING TAD [CPTRS] /SETUP THE DCA TEMP /CLEARING POINTER TAD [-200^2] /SETUP THE DCA CNT /CLEARING COUNT CLRCLUP,DCA I TEMP /CLEAR A CHARACTER POINTER ISZ TEMP /BUMP TO NEXT ISZ CNT /DONE YET? JMP CLRCLUP /NO, KEEP GOING TAD [FILBUFFER] /POINT TO DCA PUTBASE /FONT NAME DCA PUTNDX /CLEAR OUTPUT INDEX TAD [-10] /SETUP THE DCA CNT /NAME COUNT NAMLUP, JMS I [GETCHR] /GET A NAME CHARACTER HLT / SNA /? HLT /BARF! JMS I [PUTHALF] /OUTPUT TO FILE ISZ PUTNDX /BUMP TO NEXT ISZ CNT /DONE YET? JMP NAMLUP /NO, KEEP GOING JMS I [GETCHR] /GET THE TERMINATOR HLT / SZA /? HLT /BARF IF NOT JMS I [WASTLINE] /WASTE THE FIRST LINE (A COMMENT) JMS I [GETNUMBER] /GET THE HEIGHT IN SIXELS DCA I [FH] /STASH IT JMS I [WASTLINE] /WASTE THE NEXT LINE JMS I [GETNUMBER] /GET THE HORIZONTAL SPACING DCA I [HSPACE] /STASH IT JMS I [WASTLINE] /WASTE THE NEXT LINE JMS I [GETNUMBER] /GET VERTICAL SPACING CLL RAL /DOUBLE IT DCA I [VSPACE] /STASH IT LOOP, JMS I [GETCHAR] /GET CHARACTER WHICH IS BEING DESCRIBED JMP ENDIT / CLL RAL /DOUBLE IT TAD (CPTRS-1) /POINT TO PROPER HOLDER DCA XR1 /STASH THE POINTER TAD I [FSPTRHI] /GET CURRENT FREE SPACE POINTER - HIGH-ORDER DCA I XR1 /STORE AS LATEST DESCRIPTOR POINTER - HIGH-ORDER TAD I [FSPTRLO] /GET CURRENT FREE SPACE POINTER - LOW-ORDER DCA I XR1 /STORE AS LATEST DESCRIPTOR POINTER - HIGH-ORDER JMS I [GETCHAR] /GET THE DELIMITER HLT /BARF TAD (-",!200) /COMPARE TO "," SZA /BETTER BE A "," HLT /BARF JMS I [GETNUMBER] /GET CHARACTER WIDTH JMS I [STORE] /STORE IN DESCRIPTOR TAD STRVALUE /GET IT BACK CIA /WANT NEGATIVE FORM DCA MW /SAVE AS MAXIMUM FIELD WIDTH FOR WIDE FIELDS JMS I [BUMPTR] /BUMP TO NEXT JMS I [GETFLD] /THROW AWAY MYSTERY FIELD TAD I [FH] /GET SIXEL COUNT CIA /WANT NEGATIVE FORM DCA FCNTR /SAVE AS FIELD COUNTER / NOW PROCESS EACH FIELD. FLDLUP, JMS I [GETFLD] /GET LATEST FIELD TAD FWIDTH /GET ITS WIDTH JMS I [STORE] /STORE IN DESCRIPTOR JMS I [BUMPTR] /BUMP TO NEXT TAD FWIDTH /GET FIELD WIDTH SNA /SKIP IF SOMETHING THERE JMP FLDZERO /JUMP IF NULL FIELD TAD MW /COMPARE TO MAXIMUM WIDTH SZA /BETTER MATCH HLT /BARF TAD MW /SETUP THE DCA SCNTR /SIXEL COUNTER TAD (SBUFFER) /POINT AT DCA PUTBASE /SIXEL BUFFER DCA PUTNDX /CLEAR OUTPUT INDEX TAD (FLDBUFFER) /POINT TO DCA FPTR /FIELD BUFFER GSXLOOP,TAD I FPTR /GET A SIXEL TAD [-"?!200] /MAKE IT SIX-BIT JMS I [PUTHALF] /STASH IT ISZ FPTR /BUMP TO NEXT ISZ PUTNDX /BUMP OUTPUT INDEX ISZ SCNTR /DONE WITH THE SIXELS? JMP GSXLOOP /NO, KEEP GOING TAD (SBUFFER-1) /POINT TO DCA XR1 /SIXELS PSXLOOP,TAD I XR1 /GET A PAIR JMS I [STORE] /STORE IT JMS I [BUMPTR] /BUMP TO NEXT TAD PUTPTR /GET LAST WORD POINTER CIA /INVERT FOR TEST TAD XR1 /COMPARE TO WHAT WE JUST DID SZA CLA /SKIP IF DONE JMP PSXLOOP /KEEP GOING FLDZERO,ISZ FCNTR /DONE ALL FIELDS? JMP FLDLUP /NO, GO BACK FOR ANOTHER ONE TAD LSTCHAR /GET THE LAST CHARACTER OF THE LAST FIELD TAD [-15] /COMPARE TO SNA /SKIP IF NOT JMP LOOP /DONE WITH THIS CHARACTER TAD [-",+215] /COMPARE TO "," SZA /BETTER MATCH HLT /BARF JMS I [GETCHAR] /GET ANOTHER CHARACTER HLT /BARF TAD [-15] /COMPARE TO SZA /BETTER MATCH HLT /BARF JMP LOOP /GO GET ANOTHER CHARACTER ENDIT, TAD [-200] /SETUP THE DCA CNT /ZEROING COUNT JMS I [STORE] /SEND A ZERO JMS I [BUMPTR] /BUMP TO NEXT ISZ CNT /DONE YET? JMP .-3 /NO, KEEP GOING / JMS DUMPIT /DUMP LAST VIRTUAL BLOCK JMS I (OUTLENGTH) /SET PRINTABLE LENGTH JMS I [SYSIO] /CALL I/O ROUTINES FILBUFFER /WRITE MEMORY-RESIDENT BLOCKS WMFUN, VIRBUFF-FILBUFF%2+WRITE+.-. /UNIT BITS WILL BE FILLED IN BASBLK, .-. /BASE BLOCK OF FILE JMP I [SBOOT] /GOODBYE! PAGE GETFLD, .-. /GET A FIELD ROUTINE DCA FWIDTH /CLEAR FIELD WIDTH TAD [FLDBUFFER] /POINTER TO DCA GFPTR /OUR BUFFER / SCAN OFF ANY LOOSE AND CHARACTERS. FRSTLP, JMS I [GETCHAR] /GET A CHARACTER HLT /BARF DCA LSTCHAR /SAVE IT TAD LSTCHAR /GET IT BACK TAD [-15] /COMPARE TO SZA /SKIP IF IT ALREADY MATCHES TAD (-40+15) /ELSE COMPARE TO SNA CLA /SKIP IF NEITHER JMP FRSTLP /TOSS IT AND TRY AGAIN / NOW JUMP INTO IT WITH A NEW FIELD CHARACTER. JMP GETIN /CONTINUE THERE GFLOOP, JMS I [GETCHAR] /GET A CHARACTER HLT /BARF DCA LSTCHAR /SAVE AS LAST IN CASE IT IS LAST GETIN, TAD LSTCHAR /GET IT BACK TAD [-15] /COMPARE TO SZA /SKIP IF IT MATCHES ALREADY TAD [-",+215] /ELSE COMPARE TO "," SNA CLA /SKIP IF NOT DELIMITER JMP I GETFLD /RETURN ON DELIMITER TAD LSTCHAR /GET THE CHARACTER DCA I GFPTR /STORE IN BUFFER ISZ GFPTR /BUMP TO NEXT ISZ FWIDTH /ACCOUNT FOR THIS CHARACTER JMP GFLOOP /KEEP GOING GETNUMB,.-. /GET A NUMBER ROUTINE DCA NUMBER /CLEAR ACCUMULATION NL7777 /SETUP THE DCA NUMBSW /NO-DIGIT SWITCH GNLOOP, JMS I [GETCHAR] /GET A CHARACTER HLT /BARF TAD [-15] /COMPARE TO SZA /SKIP IF IT MATCHES ALREADY TAD [-",+215] /ELSE COMPARE TO "," SNA /SKIP IF NEITHER DELIMITER JMP GNEND /JUMP IF EITHER TAD [-":+",] /ADD ON UPPER LIMIT CLL /CLEAR LINK FOR RANGE TEST TAD [":-"0] /ADD ON VALID RANGE SNL /SKIP IF IN RANGE HLT /ELSE BARF DCA NUMBSW /SAVE FOR NOW (ALSO CLEARING NO-DIGIT SWITCH TAD NUMBER /GET THE NUMBER CLL RTL /*4 TAD NUMBER /*5 RAL /*10 TAD NUMBSW /ADD LATEST DIGIT DCA NUMBER /STASH THE LATEST VALUE JMP GNLOOP /KEEP GOING GNEND, TAD NUMBER /GET THE VALUE ISZ NUMBSW /DID WE FIND ANY DIGITS? JMP I GETNUMBER /YES, RETURN HLT /NO, BARF PUTHALF,.-. /PUT A HALF-WORD ROUTINE DCA PUTEMP /SAVE THE PASSED VALUE TAD PUTNDX /GET HALF-WORD INDEX CLL RAR /SHIFT WHICH HALF BIT INTO LINK TAD PUTBASE /ADD BASE TO INDEX/2 DCA PUTPTR /SAVE POINTER TAD I PUTPTR /GET BOTH CURRENT HALF-WORDS AND [7700] /RETAIN EVEN HALF IN CASE WE NEED IT TAD PUTEMP /PUT LATEST INTO LOW-ORDER HALF SZL /SKIP IF EVEN HALF BEING STORED JMP PUTIT /ELSE LEAVE IT ALONE AND [77] /JUST OUR HALF RTL;RTL;RTL /SHIFT LEFT PUTIT, DCA I PUTPTR /STORE BACK JMP I PUTHALF /RETURN WASTLIN,.-. /WASTE A LINE ROUTINE WASTLUP,JMS I [GETCHAR] /GET A CHARACTER HLT /BARF TAD [-15] /COMPARE TO SZA CLA /SKIP IF IT MATCHES JMP WASTLUP /ELSE KEEP GOING JMP I WASTLINE /RETURN OUTLENG,.-. /SET PRINTABLE OUTPUT LENGTH TAD I [BASBLK] /GET BASE BLOCK OF FILE CIA /-BASE TAD DMPBLK /NOW HAVE RELATIVE LENGTH DCA LSTCHAR /SAVE IT TAD (LENFLD) /POINT TO DCA PUTBASE /OUTPUT LENGTH FIELD DCA PUTNDX /CLEAR OUTPUT INDEX TAD LSTCHAR /GET THE VALUE RTL;RTL /MOVE UP JMS OUT1 /SEND IT TAD LSTCHAR /GET IT AGAIN RTR;RTR;RTR /MOVE DOWN JMS OUT1 /SEND IT TAD LSTCHAR /GET IT AGAIN RTR;RAR /MOVE DOWN JMS OUT1 /SEND IT TAD LSTCHAR /GET IT AGAIN JMS OUT1 /SEND IT JMP I OUTLENGTH /RETURN OUT1, .-. /OUTPUT A DIGIT ROUTINE AND [7] /JUST ONE DIGIT TAD ("0&77) /MAKE IT ASCII JMS I [PUTHALF] /SEND IT ISZ PUTNDX /BUMP TO NEXT JMP I OUT1 /RETURN PAGE / SIX-BIT CHARACTER INPUT ROUTINE. / CALLING SEQUENCE: / JMS I (GETCHR) /GET A SIX-BIT CHARACTER / END-OF-FILE /RETURNS HERE WITH CLEAR AC ON / NORMAL-RETURN /RETURNS HERE WITH P?S/8 SIX-BIT CHARACTER IN AC GETCHR, .-. /GET A SIX-BIT CHARACTER ROUTINE JMP I GETRIM /GO WHERE YOU SHOULD GO GETRIM, .-. /TRIM AND EXIT ROUTINE ISZ GETCHR /TAKE NORMAL RETURN EVENTUALLY AND [77] /JUST SIX-BIT SZA /SKIP IF JMP I GETCHR /ELSE JUST RETURN TAD (GRESET) /RESET FOR DCA GETRIM /NEXT TIME JMP I GETCHR /RETURN / COMES HERE TO OBTAIN NEXT FILE. GNXFILE,ISZ GFLPTR /BUMP TO NEXT SLOT TAD I GFLPTR /GET NEXT FILE ARGUMENT SNA /? JMP I GETCHR /YES, TAKE IMMEDIATE RETURN AND [7770] /NO, ISOLATE BLOCK BITS DCA GBLOCK /STORE IN-LINE TAD I GFLPTR /GET IT AGAIN AND [7] /JUST UNIT BITS TAD [1^100] /ADD ON READ BITS DCA GFUNCT /STORE IN-LINE GNXTBLK,JMS I [SYSIO] /CALL I/O ROUTINES GBUFFER /TRANSFER ADDRESS GFUNCT, 1^100+.-. /UNIT BITS WILL BE FILLED IN GBLOCK, .-. /BLOCK NUMBER WILL BE FILLED IN TAD (GBUFFER) /RESET THE DCA GPTR /BUFFER POINTER GLOOP, TAD I GPTR /GET A PAIR SNA /SKIP IF NOT END OF THIS FILE JMP GNXFILE /JUMP IF AT END OF THIS FILE RTR;RTR;RTR /MOVE DOWN JMS GETRIM /TRIM AND EXIT TAD I GPTR /GET IT AGAIN JMS GETRIM /TRIM AND EXIT GRESET, ISZ GPTR /BUMP TO NEXT TAD GPTR /GET THE POINTER TAD [-GBUFFER-200] /COMPARE TO LIMIT SZA CLA /SKIP IF AT THE END JMP GLOOP /ELSE KEEP GOING ISZ GBLOCK /BUMP TO NEXT BLOCK JMP GNXTBLK /GO DO ANOTHER BLOCK / SEVEN-BIT CHARACTER INPUT ROUTINE. / CALLING SEQUENCE: / JMS I (GETCHAR) /GET A SEVEN-BIT CHARACTER / END-OF-FILE /RETURNS HERE WITH CLEAR AC ON / NORMAL-RETURN /RETURNS HERE WITH SEVEN-BIT CHARACTER IN AC GETCHAR,.-. /GET A SEVEN-BIT CHARACTER JMS GETCHR /GET A SIX-BIT CHARACTER JMP I GETCHAR / GAGAIN, SNA /SKIP IF NOT JMP GOTEOL /JUMP IF TAD [-37] /COMPARE TO VALUE SPA /SKIP IF GREATER JMP CHKTAB /JUMP IF NOT TAD (37-15) /RESTORE THE CHARACTER GOTEOL, TAD [15] /GET A GETCXIT,ISZ GETCHAR /TAKE SKIP RETURN JMP I GETCHAR /RETURN TO CALLER / COMES HERE IF CHARACTER IS VALUE OR LESS. CHKTAB, SNA /IS IT ? JMP GOTTAB /YES IAC /TAD (-36+37)/COMPARE TO "^" SNA /SKIP IF OTHER JMP GOTUPPAROW /JUMP IF IT MATCHES TAD GCASE /ADD ON CURRENT CASE FOR ALPHABETIC GIVUPAR,TAD [136] /RESTORE AND MAKE SEVEN-BIT JMP GETCXIT /FINISH IT THERE / GOT "^", SO GET NEXT CHARACTER TO FIND OUT WHAT TO DO. GOTUPPA,JMS GETCHR /GET NEXT SIX-BIT CHARACTER JMP I GETCHAR / TAD (-36) /IS IT "^"? SNA /SKIP IF OTHER JMP GIVUPARROW /GIVE THEM "^" TAD (-47+36) /COMPARE TO INDICATOR SNA /SKIP IF OTHER JMP GIVACCENT /GIVE THEM IAC /TAD (-46+47)/COMPARE TO INDICATOR SNA /SKIP IF OTHER JMP GIVATSIGN /GIVE THEM IAC /TAD (-45+46)/COMPARE TO INDICATOR SNA /SKIP IF OTHER JMP GIVUNDERSCORE /GIVE THEM IAC /TAD (-44+45)/COMPARE TO INDICATOR SNA /SKIP IF OTHER JMP GIVTILDE /GIVE THEM DCA GETCHR /SAVE FOR NOW / WE MUST FLIP THE PREVAILING CASE AND REPROCESS THE CHARACTER. TAD GCASE /GET CURRENT CASE CIA /INVERT IT TAD [0+40] /ADD ON SUM OF POSSIBLE VALUES DCA GCASE /STORE FLIPPED VALUE TAD GETCHR /GET THE CHARACTER TAD (44) /RESTORE TO PASSED VALUE JMP GAGAIN /PROCESS NOW IN LATEST CASE GIVTILD,TAD [176-140] /GET VALUE GIVACCE,IAC/TAD (140-137) /GET VALUE GIVUNDE,TAD [137-100] /GET VALUE GIVATSI,TAD (100-11) /GET VALUE GOTTAB, TAD [11] /GET VALUE JMP GETCXIT /CONTINUE THERE PAGE STORE, .-. /STORE ROUTINE DCA STRVALUE /SAVE PASSED VALUE TAD I [FSPTRLO] /GET LOW-ORDER POINTER AND [7600] /JUST PAGE BITS CLL RTL;RTL;RTL /MOVE DOWN DCA FSBLK /SAVE FOR NOW TAD I [FSPTRHI] /GET HIGH-ORDER POINTER AND [177] /JUST PAGE BITS CLL RTL;RTL;RAL /MOVE UP TAD FSBLK /ADD ON LOW-ORDER TAD (FILBUFFER-VIRBUFFER%200!7740) /COMPARE TO IN-MEMORY LIMIT SPA /SKIP IF NOT RESIDENT JMP INMEMORY /JUMP IF IN MEMORY TAD (VIRBUFFER-FILBUFFER%200) /RESTORE IT CIA /INVERT FOR TESTING TAD CURBLK /COMPARE TO LATEST BLOCK SNA /SKIP IF IT DOESN'T MATCH JMP STORIT /JUMP IF IN CURRENT BUFFER CIA /INVERT AGAIN TAD CURBLK /NOW HAVE OUR BLOCK DCA CURBLK /UPDATE TO OURS JMS DUMPIT /WRITE LATEST BLOCK TAD CURBLK /GET OUR BLOCK TAD I [BASBLK] /ADD ON FILE BASE BLOCK DCA DMPBLK /MAKE IT THE BLOCK TO DUMP LATER TAD DMPBLK /GET OUR BLOCK CLL CIA /INVERT FOR TESTING TAD LIMBLK /COMPARE TO UPPER LIMIT OF DEVICE SNL CLA /SKIP IF OK HLT /ELSE BARF TAD I [FSPTRHI] /GET OUR HIGH-ORDER VALUE AND [177] /JUST BLOCK BITS DCA CURPTHI /STORE AS HIGH-ORDER TAD I [FSPTRLO] /GET OUR LOW-ORDER AND [7600] /JUST BLOCK BITS DCA CURPTLO /STORE AS LOW-ORDER STORIT, TAD I [FSPTRLO] /GET LOW-ORDER AND [177] /JUST ON-PAGE BITS TAD [VIRBUFFER] /POINT TO BUFFER INMEMIN,DCA TEMP /STASH THE POINTER TAD STRVALUE /GET THE VALUE DCA I TEMP /STORE IT JMP I STORE /RETURN INMEMOR,TAD I [FSPTRLO] /GET LOW-ORDER TAD [FILBUFFER] /POINT TO MEMORY BUFFER JMP INMEMIN /CONTINUE THERE BUMPTR, .-. /POINTER BUMP ROUTINE ISZ I [FSPTRLO] /BUMP LOW-ORDER SKP /DON'T ISZ I [FSPTRHI] /BUMP HIGH-ORDER JMP I BUMPTR /RETURN HLT /BARF! / INITIALIZE ROUTINE. INITIAL,.-. /INITIALIZE ROUTINE CLA /CLEAN UP TAD [VIRBUFFER-FILBUFFER] /SETUP THE DCA CURPTLO /VIRTUAL BUFFER POINTER DCA CURPTHI /CLEAR HIGH-ORDER POINTER TAD [VIRBUFFER-FILBUFFER] /SETUP THE DCA I [FSPTRLO] /FREE SPACE POINTER DCA I [FSPTRHI] /CLEAR HIGH-ORDER POINTER DCA GCASE /FORCE UPPER-CASE TAD (GNXFILE) /SETUP THE DCA I (GETRIM) /CO-ROUTINE TAD I (SOUTFLS) /GET OUTPUT FILE COUNT SNA /BETTER BE ONE HLT /ELSE BARF TAD [SFILES-1] /SETUP THE DCA GFLPTR /FILE LIST POINTER TAD I [SFILES] /GET FIRST OUTPUT FILE AND [7770] /JUST BLOCK BITS DCA I [BASBLK] /SAVE AS BASE BLOCK OF FILE TAD [VIRBUFFER-FILBUFFER%200] /SETUP THE DCA CURBLK /LATEST RELATIVE BLOCK TAD CURBLK /GET IT BACK TAD I [BASBLK] /MAKE IT ABSOLUTE DCA DMPBLK /SETUP DUMPING ROUTINE TAD I [SFILES] /GET OUTPUT FILE AGAIN AND [7] /JUST UNIT BITS TAD [1^100] /ADD ON READ BITS DCA EXCFUN /STORE IN-LINE JMS I [SYSIO] /CALL I/O ROUTINES FLDBUFFER /READ BUFFER EXCFUN, 1^100+.-. /UNIT BITS WILL BE FILLED IN EXTCAT+2 /WHERE LIMIT WORD IS TAD I (FLDBUFFER+176) /GET PHYSICAL DEVICE LIMIT DCA LIMBLK /STASH IT NL4000 /TAD (WRITE) /GET WRITE BIT TAD EXCFUN /NOW HAVE WRITE FUNCTION DCA DMPFUN /STORE IN VIRTUAL DUMP ROUTINE TAD DMPFUN /GET IT BACK TAD [VIRBUFFER-FILBUFFER%200-1^100] /ADD ON DIFFERENCE DCA I (WMFUN) /STORE IN MEMORY DUMP ROUTINE JMP I INITIALIZE /RETURN PAGE FLDBUFF,ZBLOCK 200 /FIELD BUFFER / IMAGE OF FILE. FIRST 3 PAGES ARE MEMORY-RESIDENT. FILBUFF,TEXT "XXXXXXXX LENGTH:" /FONT NAME AND LENGTH BLURB LENFLD, TEXT "0000 BLOCKS" /LENGTH AND BLOCK BLURB AND 0000 /END OF FILE FOR P?S/8 FH, ZBLOCK 1 /FONT HEIGHT IN SIXELS HSPACE, ZBLOCK 1 /CHARACTER SPACING IN PIXELS VSPACE, ZBLOCK 1 /VERTICAL SPACING IN PIXELS (*2) FSPTRHI,.-. /FREE SPACE POINTER - HIGH-ORDER FSPTRLO,.-. /FREE SPACE POINTER - LOW-ORDER ZBLOCK FILBUFFER+200-. /RESERVED EMPTY SPACE CPTRS, ZBLOCK 400 /CHARACTER INFORMATION POINTERS VIRBUFF,ZBLOCK 200 /VIRTUAL FILE BUFFER GBUFFER,ZBLOCK 200 /INPUT BUFFER SBUFFER,ZBLOCK 400 /SIXELS BUFFER $ /THAT'S ALL FOLK!