/BIT MAPPED GRAPHICS PRINTING SYSTEM / LAST EDIT: 10/12/87 15:09:00 TR /THIS SYSTEM READS BIT MAPPED GRAPHICS POINTS OF A LOGICAL PAGE ON A DISK /AND OUTPUTS THEM ON A DOT MATRIX PRINTER /SYSTEM PARAMETER DEFINITIONS CODFLD= 0^10 /FIELD WHERE CODE IS ABSPNT= 1400 /NUMBER OF ABSCISSANT POINTS ORDPNT= 3000 /NUMBER OF ORDINATE POINTS. ORDWRD= ORDPNT-1%14+1 /NUMBER OF Y AXIS WORDS. ABSOFFS=ABSPNT%2 /X AXIS OFFSET ORDOFFS=ORDPNT%2 /Y AXIS OFFSET FLDBUF= 5^10 /STARTING FIELD FOR PUTTING POINTS SYSIO= 7640 /LOCATION OF I/O ROUTINES SCNNUM= 1 /NUMBER OF SCANS/LINE UNIT= 2 /UNIT WHERE BIT MAP IS FORMFD= 14 /FORM FEED CHARACTER /PRINTER DEFINITIONS XLIST IFNDEF PRNSET XLIST PRNSET= LA34SET /MAKE THE PRINTER THE LA34 PINS= 6 /NUMBER OF PINS ON LA34 RBUFSIZ=40%PINS^PINS /CLOSEST BUFFER SIZE TO A FIELD SWEEPS= 40%PINS /NUMBER OF SWEEPS TO DO ONE BUFFER /PROCESSOR DEFINITIONS NL4000= CLA CLL CML RAR /LOAD A 4000 INTO NL7777=CLA CLL CMA /LOAD A 7777 INTO AC PAGE 0 /START AT THE BEGINNING ZBLOCK 10-. XR1, .-. /1ST AUTO INDEX REG XR2, .-. /2ND AUTO INDEX REG XR3, .-. /AUTO INDEX REG 3 XR4, .-. /AUTO INDEX REG 4 PAGE PLOTDAT,CLA /CLEAN UP TAD (SCNNUM) /GET SCAN NUMBER CIA /NEGATE DCA SCNCNT /STORE AS COUNTER TAD (-RBUFSIZ) /GET BUFFER SIZE DCA RBLKNUM /STORE AS SWEEP COUNTER /SETUP THE PRINTER JMS I (PRNSET) /SET UP THE PRINTER PARAMETERS REDBUF, TAD (RBUFSIZ^100+FLDBUF+UNIT)/READ RBUFSIZ INTO FLDBUF FROM UNIT DCA RIOFUN /STORE AS FUNCTION ARGUMENT TO I/O ROUTINES DCA RIOTRN /ZERO STARTING ADDRESS TAD RBLKNUM /GET LAST BLOCK NUMBER READ TAD (RBUFSIZ) /ADD THE BUFFER SIZE DCA RBLKNUM /STORE AS BLOCK NUMBER TAD RBLKNUM /GET BACK THE BLOCK NUMBER TAD (-ABSPNT) /SUBTRACT # OF ABSCISSANT POINTS SMA CLA /IF MAXIMUM ABSCISSA IS NOT EXCEEDED THEN SKIP JMP PLEXIT /ELSE BOOTSTRAP JMS I (SYSIO) /CALL THE I/O ROUTINES RIOTRN, 0000 /I/O TRANSFER ADDRESS RIOFUN, .-. /I/O FUNCTION WORD RBLKNUM,-RBUFSIZ /BLOCK #, INITIALIZED TO BUFFER SIZE NL7777 /INITIALIZE Y TO -1 DCA Y DCA X /INITIALIZE X TO ZERO /THIS ROUTINE SCANS THE BIT MAP LINE BY LINE AND RETURNS A /Y VALUE WHERE PIN FIRING IS NON ZERO AND A SLEW COUNT OF HOW FAR /TO MOVE THE PRINTER HEAD RNSWP, DCA I (GRSLCNT) /STORE IN GRAPHICS MODE SLEW COUNT PRSCEN, ISZ Y /MOVE UP THE Y TAD Y /GET THE Y(AC WILL BE ZERO IF Y=0) TAD (-ORDPNT) /GET THE END OF LINE VALUE SMA CLA /IF WE HAVE NOT REACHED IT THEN SKIP JMP RNABSC /ELSE GET NEW LINE JMS I (PINFIR) /GET THE PIN FIRING PATTERN SZA /IF ZERO THEN SKIP JMP PRSAHE /ELSE JUMP AHEAD ISZ I (GRSLCN) /AND INCREMENT SLEW COUNTER JMP PRSCEN /AND CONTINUE TO SCAN LINE PRSAHE, DCA BPINFIR /STORE PIN FIRING PATTEN TAD I (GRSLCNT) /GET SLEW COUNT SZA CLA /IF ZERO SKIP AND DON'T SLEW JMS I (GRSLEW) /ELSE SLEW PRINTER HEAD TAD BPINFIR /GET PIN FIRING PATTERN FOR PRESENT Y VALUE JMS I (POUT) /OUTPUT IT JMP RNSWP /CONTINUE SWEEPING RNABSC, ISZ SCNCNT /IF FINISHED SCANNING THEN SKIP JMP REDO /ELSE REDO TAD (PINS) /GET THE NUMBER OF PINS TAD X /ADD THE X VALUE DCA X /STORE BACK IN X NL7777 /RESTORE Y TO BEGINNING OF LINE DCA Y /CLEAN UP Y VALUE TAD (SCNNUM) /GET SCAN COUNT CIA /NEGATE DCA SCNCNT /STORE AS COUNT JMS I (GRCRLF) /DO A GRAPHICS CARRIAGE RETURN LINE FEED RNABEN, TAD X /GET THE X VALUE TAD (-RBUFSIZ) /SUBTRACT BUFFER SIZE SPA CLA /IF POSITIVE THEN SKIP JMP RNSWP /ELSE DO ANOTHER SWEEP JMP REDBUF /GO BACK AND READ BUFFER BPINFIR,.-. /BUFFERED PIN FIRING PATTERN X, .-. /ABSCISSANT VALUE Y, .-. /ORDINATE VALUE SCNCNT, .-. /HOLDS SCAN COUNT REDO, NL7777 /GET -1 DCA Y /STORE INTO Y REGISTER JMS I (GRCRET) /JUST DO A CARRIAGE RETURN JMP RNABEN /GO FINISH THERE PLEXIT, TAD GRCNCL /GET GRAPHICS MODE CANCEL CODE JMS I (POUT) /SEND IT TO PRINTER / TAD (FORMFD) /GET FORM FEED TSF2 /WAIT FOR FLAG JMP .-1 / TLS2 /OUTPUT IT JMP I (7600) /BOOTSTRAP GRCNCL, .-. /CANCEL CODE (PUT HERE BY PRINTER SETUP ROUTINE) PAGE /EAE SIMULATION DEFINITIONS MUY= JMS I (XMUL) DVI= JMS I (XDVI) PINFIR, .-. /SUBROUTINE HEADER TAD (-PINS) /GET THE NEGATIVE OF THE NUMBER OF PINS DCA PINCNT /STORE AS THE COUNT OF THE PINS TAD I (Y) /GET THE ORDINATE VALUE MQL; DVI /STORE IN MQ AND DIVIDE 14 /BY NUMBER OF BITS/WORD DCA PNBIT /STORE AS BIT NUMBER MQA /GET QUOTIENT DCA PNWORD /STORE AS WORD TAD I (X) /GET ABSCISSANT VALUE MQL;MUY /MULTIPLY BY ORDWRD /NUMBER OF WORDS IN ORDINATE LINE SWP /IT MUST BE A TWELVE BIT QUANTITY TAD PNWORD /ADD TO THE ORDINATE WORD DCA PNWORD /STORE BACK AS WORD ADDRESS TAD (BITTAB) /GET THE LOCATION OF THE BIT TABLE TAD PNBIT /ADD THE BIT NUMBER CALCULATED DCA BITMSK /STORE AS THE BIT MASK ADDRESS TAD (PINLST-1) /GET THE LOCATION OF THE PINLIST DCA PPINLST /STORE AS POINTER TO PIN LIST PNBK1, CDF FLDBUF /GET THE FIELD WHERE DATA IS TAD I PNWORD /GET THE WORD ADDRESSED CDF CODFLD /CHANGE BACK TO CODE FIELD AND I BITMSK /AND OFF THE BIT SELECTED PNBK2, SZA /IF ZERO THEN SKIP JMP PNAHED /ELSE PUT PIN IN PROPER PLACE PINENT, ISZ PPINLST /MOVE UP POINTER TO PINLST DCA I PPINLST /PUT PIN POSITION IN LIST TAD (ORDWRD) /GET THE NUMBER OF WORDS IN ORDINATE TAD PNWORD /ADD THE WORD WE HAVE CALCULATED DCA PNWORD /POINT TO WORD ONE COLUMNN MORE ISZ PINCNT /IF WE HAVE DONE ALL PINS THEN SKIP JMP PNBK1 /ELSE GO BACK FOR MOR PINS JMP PINSET /SET UP THE PINS IN PROPER ORDER PNAHED, SPA /IS PIN IN BIT POSITION 0 JMP PINENT /YES, GO BACK FOR MORE PINS RAL /NO, MOVE OVER ONE BIT POSITION JMP PNAHED /ELSE KEEP MOVING PINSET, TAD (PINLST) /GET LOCATION OF PIN LIST DCA PPINLST /STORE AS POINTER NL4000 /TURN ON BIT 0 AS MARKER BIT DCA PNWORD /STORE INTO PNWORD TAD (-PINS) /GET NUMBER OF PINS DCA PINCNT /STORE AS PINCNT PINLP, TAD PNWORD /ADD BACK THE PIN WORD CLL RAR /MOVE OVER TAD I PPINLST /GET THE PIN VALUE DCA PNWORD /STORE BACK ISZ PPINLST /MOVE UP POINTER ISZ PINCNT /ARE WE DONE JMP PINLP /NO, KEEP GOING TAD PNWORD /YES, GET BACK PIN WORD CLL RAR /MOVE OVER TO RIGHT SNL /IF MARKER HAS REACHED LINK THEN SKIP JMP .-2 /ELSE KEEP MOVING JMP I PINFIR /RETURN BITMSK, .-. /HOLDS BIT MASK PPINLST,.-. /POINTER TO PIN LIST PINCNT, .-. /HOLDS THE PIN COUNT PNBIT, .-. /BIT NUMBER IN WORD PNWORD, .-. /WORD NUMBER PINLST, ZBLOCK 6 /HOLDS BIT VALUES FOR PINS BITTAB, 4000 /CONVERTS BIT NUMBER TO BIT LOCATION 2000 1000 0400 0200 0100 0040 0020 0010 0004 0002 0001 PAGE /SUBROUTINE TO OUTPUT TO PRINTER THE BIT MAPPED GRAPHICS /PRINTER PORT I/O DEFINITIONS (SPECIFIC TO DECMATE I) PRICOD= 0040 /PRINTER INPUT CODE PROCOD= 0041 /PRINTER OUTPUT CODE KCF2= PRICOD^10+6000 /SET PRINTER INPUT FLAG KSF2= PRICOD^10+6001 /SKIP ON PRINTER INPUT FLAG KIE2= PRICOD^10+6005 /PRINTER INPUT INTERRUPT ENABLE KRB2= PRICOD^10+6006 /TRANSFER PRINTER INPUT DATA SPF2= PROCOD^10+6000 /SET PRINTER INPUT FLAG TSF2= PROCOD^10+6001 /SKIP ON PRINTER OUTPUT FLAG TCF2= PROCOD^10+6002 /CLEAR AC TSB2= PROCOD^10+6003 /SET BAUD RATE TIE2= PROCOD^10+6005 /PRINTER OUTPUT INTERRUPT ENABLE TLS2= PROCOD^10+6006 /TRANSFER AC<4:11> TO PRINTER POUT, .-. /SUBROUTINE HEADER DCA POUTTM /STORE TEMPORARILY JMS PINP /CHECK INPUT FOR ^S TAD (-23) /SUBTRACT ^S SNA CLA /IF NON ZERO THEN SKIP JMP CTRLQW /ELSE WAIT FOR ^Q POUTBK, TAD POUTTM /GET THE TEMPORARILY STORED OUTPUT TAD POFFSET /ADD THE OFFSET IN GRAPHICS MODE JMS PPRNT /SEND IT TO PRINTER JMP I POUT /RETURN TO CALLER CTRLQW, JMS PINP /GET INPUT FROM PRINTER TAD (-21) /SUBTRACT ^Q SZA CLA /IF ZERO THEN CONTINUE PROCESSING JMP CTRLQW /ELSE KEEP WAITING FOR ^Q JMP POUTBK /GO BACK AND OUTPUT TO PRINTER POFFSET,.-. /HOLD OFFSET FOR PRINTER WHEN OPERATING IN GRAPHICS MODE POUTTM, .-. /TEMPORARY /READ CHARACTERS SENT FROM PRINTER ROUTINE PINP, .-. /SUBROUTINE HEADER CLA /CLEAN UP KSF2 /IF FLAG IS UP THEN SKIP JMP I PINP /NO FLAG,RETURN AND CONTINUE PROCESSING KRB2 /READ THE CHARACTER AND (177) /MASK OFF PARITY BIT JMP I PINP /RETURN TO CALLER /ROUTINE TO PRINT CHARACTERS ON PRINTER PPRNT, .-. /SUBROUTINE HEADER TSF2 /IF FLAG IS UP THEN SKIP JMP .-1 /ELSE WAIT TLS2 /SEND CHARACTER CLA /CLEAN UP JMP I PPRNT /RETURN /ROUTINE TO DO A CARRIAGE RETURN ONLY GRCRET, .-. /SUBROUTINE HEADER TAD GRCR /GET THE GRAPHICS CARRIAGE RETURN JMS POUT /OUTPUT IT JMP I GRCRET /RETURN TO CALLER /ROUTINE TO DO A GRAPHICS CARRIAGE RETURN LINE FEED GRCRLF, .-. /SUBROUTINE HEADER TAD GRCR /GET GRAPHICS CARRIAGE RETURN JMS POUT /SEND IT TO PRINTER TAD GRLF /GET GRAPHICS LINE FEED JMS POUT /SEND IT TO PRINTER JMP I GRCRLF /RETURN TO CALLER GRCR, .-. /GRAPHICS CARRIAGE RETURN CODE GRLF, .-. /GRAPHICS LINE FEED CODE /THIS SUBROUTINE SLEWS THE PRINT HEAD ACCORDING TO GRSLCNT MUY= JMS I (XMUL) DVI= JMS I (XDVI) GRSLEW, .-. /SUBROUTINE HEADER CLA /CLEAN UP TAD GRRPT /GET REPEAT INTRODUCER JMS POUT /OUTPUT IT TAD GRSLCNT /GET THE SLEW COUNT MQL /LOAD INTO MQ DVI; 1750 /DIVIDE BY 1000(DEC) SWP /GET THE QUOTIENT INTO TAD (60-77) /TURN IT INTO CHARACTER JMS POUT /OUTPUT IT DVI; 144 /DIVIDE REMAINDER BY 100(DEC) SWP /GET QUOTIENT INTO AC TAD (60-77) /TURN INTO CHARACTER JMS POUT /OUTPUT IT DVI; 12 /DIVIDE BY 10(DEC) SWP /GET QUOTIENT INTO TAD (60-77) /TURN INTO CHARACTER JMS POUT /OUTPUT IT SWP /GET REMAINDER TAD (60-77) /TURN INTO CHARACTER JMS POUT /OUTPUT IT TAD GRBLNK /GET GRAPHICS BLANK JMS POUT /OUTPUT IT JMP I GRSLEW /RETURN GRSLCNT,.-. /SLEW COUNTER GRBLNK, 77-77 /GIVES 0 PIN FIRINGS GRRPT, 41-77 /REPEAT INTRODUCER PAGE /SUBROUTINE TO SETUP THE LA34 BAUD RATE AS WELL AS ITS GRAPHICS MODE PARAMETERS /SUBROUTINE DEFINITIONS BAUDRAT=16 /9600 BAUD CR= 15 /CARRIAGE RETURN CODE LF= 12 /LINE FEED CODE LA34SET,.-. /SUBROUTINE HEADER / KCF2 /SET PRINTER INPUT FLAG SPF2 /SET PRINTER FLAG FOR READY / TAD (BAUDRAT) /GET BAUD RATE FOR PRINTER / TSB2 /OUTPUT IT CLA /CLEAN UP TAD (77) /GET OFFSET FOR GRAPHICS MODE DCA I (POFFSET) /STORE IT TAD (44-77) /GET GRAPHICS CARRIAGE RETURN DCA I (GRCR) /STORE IT TAD (55-77) /GET GRAPHICS LINE FEED CODE DCA I (GRLF) /STORE IT TAD (30-77) /GET CANCEL CODE DCA I (GRCNCL) /STORE IT TAD (CR) /GET CARRIAGE RETURN JMS I (PPRNT) /SEND IT TAD (LF) /GET LINE FEED JMS I (PPRNT) /SEND IT TAD (33) /GET CHARACTER JMS I (PPRNT) /SEND IT TAD (120) /GET 120 JMS I (PPRNT) /SEND <120> TAD (60) /GET <60> OR <61> JMS I (PPRNT) /SEND IT TAD (161) /GET SMALL Q JMS I (PPRNT) /SEND THAT JMP I LA34SET /RETURN PAGE 36 /EAE SIMULATION FOR THE PDP 8/E /MODE A OPERATION ONLY /THE FOLLOWING FUNCTIONS ARE IMPLEMENTED /MUY,DVI,DAD,DCM,SHL,SHR,ROTL,ROTR XMUL, .-. /MULTIPLY SUBROUTINE CLA CLL /CLEAN UP TAD (-15) /SET UP DCA ROTL /USE ROTL AS STEP COUNT XMROT, JMS ROTR /ROTATE RIGHT ISZ ROTL /COUNT STEPS(INIT STPCNT=-13 SKP JMP XMULFIN /FINISH THERE SNL /LOW ORDER BIT=1? JMP XMROT /NO,ROTATE AGAIN CLL /YES,GET RID OF LOW BIT TAD I XMUL /AND ADD MULTIPLIER JMP XMROT /GET NEXT BIT OF MULTIPLICAND XMULFIN,ISZ XMUL /GET TO NEXT WORD JMP I XMUL /GET BACK TO CALLER ROTR, .-. /ROTATION SUBROUTINE RAR /ROT AC SWP /GET MQ RAR /ROTATE IT SWP /FINISH ROT RIGHT JMP I ROTR /WITH LOW BIT IN LINK ROTL, .-. /ROT LEFT SUBROUTINE SWP /GET MQ RAL /ROTATE LEFT SWP /GET BACK AC RAL /ROTATE AGAIN JMP I ROTL /GET BACK TO CALLER XDVI, .-. /EAE SIMULATED DIVIDE DCA AC /STORE HIGH DIVIDEND IN AC MQA /GET MQ DCA MQ /STORE IN MQ TAD I XDVI /GET THE DIVISOR CIA /NEGATE IT DCA MDVSOR /STORE IT /NOW CHECK FOR OVERFLOW TAD AC /GET BACK AC STL CMA /SET LINK AND COMPLEMENT AC TAD I XDVI /ADD THE DIVISOR SNL CLA /IF NO OVERFLOW THEN SKIP SKP /ELSE SKIP AGAIN JMP XDVOUT /LEAVE ROUTINE WITH LINK SET IF OVERFLOW /IF THERE IS NO OVERFLOW START DIVISION ALGORITHM TAD (-14) /GET -12 DCA SFTCNTR /STORE AS SHIFT COUNTER XDIVLP, TAD MQ /GET THE MQ CLL RAL /SHIFT 25 PLACES DCA MQ /TO THE TAD AC /LEFT RAL DCA AC TAD AC /GET BACK HIGH PART OF DIVIDEND TAD MDVSOR /ADD -THE DIVISOR SZL /IF LINK IS ZERO, RESTORE BY LEAVING IT ALONE DCA AC /ELSE UPDATE THE DIVIDEND SZL CLA /IF LINK WAS ZERO DON'T SET BIT IN LOW MQ ISZ MQ /ELSE DO SET THE BIT ISZ SFTCNTR /SKIP IF DONE TWELVE TIMES JMP XDIVLP /ELSE GO BACK AND DO MORE TAD MQ MQL /PUT QUOTIENT IN REAL MQ TAD AC /GET BACK REAL AC XDVOUT, ISZ XDVI /TAKE SKIP RETURN JMP I XDVI /AND RETURN AC, .-. /HOLDS AC VALUE MQ, .-. /HOLDS MQ VALUE MDVSOR, .-. /HOLDS MINUS THE DIVISOR SFTCNTR,.-. /HOLDS STEP COUNTER VALUE XDCM, .-. /DOUBLE PREC. COMPL. SWP CIA SWP DCA XSHR RAL TAD XSHR JMP I XDCM XDAD, .-. /DOUBLE PRECISION ADD ROUTINE SWP /GET LOW ORDER BITS INTO AC TAD I XDAD /ADD LOW BITS ISZ XDAD /ADVANCE HIGHER ORDER BITS DCA XSHL /STORE SUM RAL /GET CARRY DCA XSHR /AND STORE IT AWAY MQA /GET HIGH BITS TAD XSHR /ADD CARRY TAD I XDAD /ADD HIGH ADDER ISZ XDAD /ADVANCE TO NEXT INSTR MQL /GET HIGH ADD INTO MQ TAD XSHL /GET LOW ORDER SUM SWP /PUT LOW IN MQ AND HIGH INTO AC JMP I XDAD /RETURN XSHL, .-. /SHIFT LEFT ROUTINE DCA XDCM /TEMP FOR HIGH BITS TAD (NOP) /GET NOP DCA XSHRE3 /STORE OVER (JMS ROTR) INSTRUCTION XSHRE1, TAD I XSHL CMA DCA XDAD TAD XDCM XSHRE3, JMS ROTR CLL XSHRE2, JMS ROTL ISZ XDAD JMP XSHRE3 ISZ XSHL JMP I XSHL XSHR, .-. /SHIFT RIGHT ROUTINE DCA XDCM TAD XSHR DCA XSHL TAD (NOP) DCA XSHRE2 TAD (JMS ROTR) /RESTORE THE ROTATE RIGHT INSTRUCTION DCA XSHRE3 /FOR USE BY THIS SUBROUTINE JMP XSHRE1 /ENTER THE LEFT SUBROUTINE AND CONTINUE