File VCPY.PA (PAL assembler source file)

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

/27 OS/8 VERSAPLOT
/
/
/	VCPY
/
/	M.R.MURPHY
/	LAC/USC MEDICAL CENTER, 5K-40
/	1200 NORTH STATE STREET
/	LOS ANGELES, CALIFORNIA
/	90033
/
/
/	VCPY IS THE SECOND PASS OF A TWO-PASS VERSATEC MATRIX PLOTTER
/	SOFTWARE PACKAGE.  VCPY EXPECTS AN OS/8 FILE CREATED BY
/	THE FORTRAN IV PASS I ROUTINES. THIS INTERMEDIATE
/	FILE HAS THE FOLLOWING FORMAT:
/
/	EACH OS/8 BLOCK (256 WORDS) CONTAINS 85 PLOT RECORDS
/	OF 3 WORDS EACH.  THE LAST WORD OF THE BLOCK IS WASTED.
/	PLOT RECORD FORMAT
/
/
/	WORD	CONTENTS
/	1	CODE
/	2	X COORDINATE (0-4095)
/	3	Y COORDINATE (0-4095)
/
/	CODE	MEANING
/	0	PLOT PEN UP   (DOT OFF)
/	1	PLOT PEN DOWN (DOT ON)
/	2	END BUFFER
/	3	END PLOTS
/
/
/	THIS INTERMEDIATE FILE IS READ INTO THE INTERMEDIATE
/	DATA BUFFER "MID" UNTIL A CODE OF 2 OR 3 IS ENCOUNTERED.
/	THE INTERMEDIATE DATA BUFFER IS SCANNED TO PRODUCE
/	A SCAN DATA BUFFER "MSD".  THIS BUFFER IS 16 RASTER
/	SCAN LINES IN LENGTH.  THE SCAN DATA BUFFER IS PLOTTED
/	WHEN THE INTERMEDIATE DATA BUFFER HAS BEEN SCANNED.
/	THE INTERMEDIATE BUFFER IS RESCANNED UNTIL NO MORE
/	POINTS ARE IN POSSIBLE PLOTTING RANGE.
/
/
/

/ PARAMETERS L645=1;MTR1=1 XLIST /TURN OFF THE PRINT IFNDEF LP08 <LP08=0> IFNDEF L645 <L645=0> IFNDEF MTR1 <MTR1=0> IFNDEF MTR2 <MTR2=0> IFNDEF MTR8 <MTR8=0> IFZERO LP08+L645 <L645=1> IFZERO MTR1+MTR2+MTR8 <MTR1=1> IFNZRO LP08+L645-1 <XLIST /BAD CONTROLLER DEFINITION XLIST> IFNZRO MTR1+MTR2+MTR8-1 <XLIST /BAD MATRIX DEFINITION XLIST> IFNZRO LP08 <XLIST /CONTROLLER: LP08 XLIST> IFNZRO L645 <XLIST /CONTROLLER: L645 XLIST> IFNZRO MTR8 <XLIST /MATRIX: 200A 8.5 INCH XLIST> IFNZRO MTR1 <XLIST /MATRIX: 1100A 11 INCH XLIST> IFNZRO MTR2 <XLIST /MATRIX: 1200A 11 INCH (200 DOTS/INCH) XLIST> XLIST /TURN BACK ON PRINT
/ *10 /AUTO-INDEX REGISTERS AX=. /AX+0 /POINTER TO INTERMEDIATE LANGUAGE BUFFER /AX+1 /POINTER TO SCAN BUFFER /AX+2 /POINTER TO TEMPORARY FOR GINP *20 /BASE PAGE CONSTANTS TM, ZBLOCK 10 WD1, 3 /TEMPORARY LOCATION FOR CALCUL. WD2, 0-0 /TEMPORARY LOCATION FOR CALCULATIONS. ADMSD, 0-0 /ADDRESS CALCULATION LOC. DOTW, 0-0 /SPLS LOCAL VALUE WILL CONTAIN ONE BIT (DOT). IVM, 7777 /MASK MASK, 0-0 /SPLS TEMPORARY FOR MASK. MTY, 0-0 /TEMPORARY FOR MASK LLMT, 0-0 /UPPER BAND LIMIT NEGATED. DOT, 0-0 /DOT ON OR OFF INDICATION. XC, 0-0 /CURRENT X COORDINATE. YC, 0-0 /CURRENT Y COORDINATE. XP, 0-0 /PREVIOUS X COORDINATE. YP, 0-0 /PREVIOUS Y COORDINATE. SCND, 0-0 /ADDRESS OF SECOND OR MINOR DIRECTION MOVE. FIRST, 0-0 /ADDRESS OF FIRST OR MAJOR DIRECTION MOVE. TEMP, 0-0 /TEMPORARY LOCATION USED FOR COMMUNICATION. IACC, 0-0 /ACCUMULATION VALUE FOR BOTH LINE GENERATIONS. NQ, 0-0 /VARIABLE USED IN LINE GENERATION. NA, 0-0 /VARIABLE USED IN LINE GENERATION. NR, 0-0 /VARIABLE USED IN LINE GENERATION. NC, 0-0 /VARIABLE USED IN LINE GENERATION. N, 0-0 /VARIABLE USED IN LINE GENERATION. NLST, 0-0 /UPPER LINE LIMIT FOR SCAN BAND. INEOF, 0-0 INFPTR, 0-0 INPTR, 0-0 DECIMAL MAXX, 850 /MAXIMUM X COORDINATE ENCOUNTERED DURING PLOT OCTAL T1, 0-0 /TEMPORARY LOCATION USED FOR ADDRESS CALC. T2, 0-0 /TEMPORARY LOCATION USED FOR ADDRESS CALC. NDT, 4000 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NDU, 2000 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NDV, 1000 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NDW, 0400 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NDX, 0200 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NDY, 0100 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NDZ, 0040 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NEA, 0020 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NEB, 0010 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NEC, 0004 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NED, 0002 /TABLE WITH ALL POSSIBLE BIT POSTIONS. NEE, 0001 /TABLE WITH ALL POSSIBLE BIT POSTIONS.
XLIST /TURN OFF PRINT IFNZRO MTR1 < XLIST DECIMAL;BSL=128;OCTAL /NUMBER OF BYTES IN SCAN LINE DECIMAL;SLB=16;OCTAL /SCAN LINES IN BAND DECIMAL;NUM=86;OCTAL /NUMBER OF WORDS IN SCAN LINE XLIST> IFNZRO MTR2 < XLIST DECIMAL;BSL=264;OCTAL /NUMBER OF BYTES IN SCAN LINE DECIMAL;SLB=16;OCTAL /SCAN LINES IN BAND DECIMAL;NUM=176;OCTAL /NUMBER OF WORDS IN SCAN LINE XLIST> IFNZRO MTR8 < XLIST DECIMAL;BSL=70;OCTAL /NUMBER OF BYTES IN SCAN LINE DECIMAL;SLB=16;OCTAL /SCAN LINES IN BAND DECIMAL;NUM=47;OCTAL /NUMBER OF WORDS IN SCAN LINE XLIST> IFNZRO LP08 < XLIST LLB=6666 /IOT FOR LP08 CONTROLLER XLIST> IFNZRO L645 < XLIST LLB=6654 /IOT FOR 645 CONTROLLER XLIST> XLIST /TURN ON PRINT LSK=6661 /MATRIX IOT MPDC=6644 /MATRIX IOT
*200 BEGIN, CIF 10 JMS I [7700 /CALL COMMAND DECODER 5 2014 /".PL" IS DEFAULT EXTENSION JMS I [IOPEN /OPEN THE INPUT FILES JMP I [COPY /START UP CXCY, JMS I [SPLS /PLOT THE LINE(MAYBE) DCDE, CLA CLL /SOMEBODY CHEATS TAD XC /LOAD CURRENT X COORDINATE. DCA XP /MAKE CURRENT COORDINATE PREVIOUS COOORDINATE. TAD YC /BRING IN CURRENT Y COORDINATE. DCA YP /MAKE CURRENT COORDINATE PREVIOUS COOORDINATE. DCA DOT /CLEAR DOT INDICATOR CDF 10 /POINT TO INTERMEDIATE BUFFER DATA FIELD TAD I AX+0 /GET X COORDINATE SPA /CHECK IF DOT SHOULD BE BUMPED ISZ DOT /MAKE DOT= 1 OR 3 AND [3777 /FORCE X TO BE POSITIVE DCA XC /AND STORE X COORDINATE TAD I AX+0 /GET Y COORDINATE SMA /CHECK IF DOT SHOULD BE BUMPED AGAIN JMP .+3 ISZ DOT /DOT= 2 OR 3 ISZ DOT AND [3777 /FORCE Y TO BE POSITIVE DCA YC /AND STORE CDF 00 /POINT BACK TO THIS FIELD TAD DOT /CHECK FOR DOT ON OR OFF OR WHAT TAD [DCDET /BUILD TABLE ADDRESS DCA 0 /STORE IN JUMP LOCATION TAD I 0 DCA 0 /DOUBLE INDIRECT JMP I 0 /AND GO TO IT DCDET, DCDE /DOT=0 DOT OFF, JUST CHANGE COORDINATES CXCY /DOT=1 X-COORDINATE,Y-COORDINATE DATA ENDP /DOT=2 END OF THIS PLOT FINI /DOT=3 ALL DONE FINI, TAD [6 /SET PRINT MODE JMS I [MATSET TAD [5 /EXTERNAL RESET JMS I [MATSET JMP I [7600 ENDP, JMS I [RENN /SHOVE THE BAND TAD LLMT /GET SCAN BAND LOWER LIMIT TAD MAXX /AND COMPARE WITH MAXIMUM X IN PLOT SPA CLA /SEE IF DONE WITH X RASTER SCAN JMP I [COPY /YES, DO NEXT PLOT TAD LLMT /RESET LOWER LIMIT TAD [-SLB /TO NEW VALUE DCA LLMT JMP I [COPY30 /AND DO THE REST OF THIS PLOT
PLUSX, .-. /** ENTRY TO PLUS X MOVEMENT. ** ISZ N /BUMP WORD POINTER FOR X VALUE. JMP OVER /JUMP WHEN N IS NON ZERO. TAD MTY /BRING IN NON ZERO MASK. DCA MASK /RESET ZERO MASK, DATA IS NOW IN RANGE. JMP I PLUSX /** RETURN AFTER INITIALIZING MASK, IN RANGE ** OVER, TAD N /BRING IN X VALUE WORD POINTER. SPA CLA /TEST FOR DATA IN RANGE. JMP OVE10 /RETURN WITH AC AND LINK CLEAR TAD N /BRING IN X VALUE. TAD [-SLB /ADD NEGATIVE NUMBER OF SCAN LINES. SMA CLA /TEST FOR DATA BEYOND UPPER LIMIT. JMP OVE20 /CLEAR AC AND LINK TAD ADMSD /BRING IN ADDRESS OF SCAN LINE WORD IN MATRIX. TAD [NUM /UPDATE ADDRESS BY NUMBER OF WORDS TO SCAN LINE DCA ADMSD /SAVE UPDATED ADDRESS. OVE10, CLA CLL JMP I PLUSX /RETURN WITH AC AND LINK CLEAR OVE20, CLA CLL JMP I [SPR /AC AND LINK CLEAR PLUSY, .-. /** ENTRY TO PLUS Y MOVEMENT ** TAD DOTW /BRING IN WORD WITH DOT IN IT. CLL RAR /CLEAR LINK AND ROTATE DOT RIGHT ONE PLACE. SZL /TEST FOR DOT IN LINK. RAR /MOVE DOT BACK INTO WORD. SPA /TEST FOR DOT IN HIGH ORDER BIT POSITION. ISZ ADMSD /BUMP WORD SCAN LINE MATRIX ADDRESS. DCA DOTW /SAVE UPDATED DOT WORD. JMP I PLUSY /** RETURN TO CALLING SEQUENCE. ** MNSY, .-. /** ENTRY TO MINUS Y MOVEMENT ** TAD DOTW /BRING IN WORD WITH DOT IN IT. CLL RAL /CLEAR LINK AND MOVE DOT LEFT ONE POSITION. DCA DOTW /SAVE UPDATED DOT WORD. SNL CLA /TEST FOR DOT IN LINK. JMP I MNSY /** RETURN, DOT WORDS SI UPDATED. ** RAL /MOVE DOT BACK INTO WORD FROM LINK. DCA DOTW /SAVE UPDATED DOT WORD. CLA CMA /SET ACCUM TO MINUS -1. TAD ADMSD /BRING IN SCAN LINE MATRIX ADDRESS. DCA ADMSD /SAVE UPDATED ADDRESS. JMP I MNSY /** RETURN, DOT WORD AND ADDRESS IS UPDATED ** MNSX, .-. /** ENTRY TO MINUS X MOVEMENT ** CLA CMA /SET ACCUM TO MINUS -1. TAD N /BRING IN WORD POINTER. SPA /TEST FOR COORDINATE BELOW LOWER LIMIT. JMP I [SPR /RETURN, X COORDINATE IS NOW BELOW LOWER LIMIT DCA N /SAVE UPDATED X COORDINATE. TAD N /BRING BACK X COORDINATE FOR OTHER LIMIT TEST. TAD [-17 /TEST AGAINST UPPER LIMIT. SNA /TEST FOR COORDINATE BELOW UPPER LIMIT. JMP ZERO /** RETURN, DOT IS OUT OF RANGE **. SMA CLA /TEST FOR DATA STILL OUT OF RANGE. JMP ZO /RETURN DATA STILL OUT OF RANGE. TAD ADMSD /BRING IN ADDRESS OF SCAN BAND MATRIX. TAD [-NUM /SUBTRACT NUMBER OF WORDS TO A SCAN LINE. DCA ADMSD /SAVE UPDATED WORD. ZO, JMP I MNSX /:: RETURN TO CALLING SEQUENCE. ZERO, TAD MTY /BRING IN NON ZERO MASK TO DCA MASK /RESET MASK, DOT IS NOW IN RANGE. JMP I MNSX /** RETURN AFTER INITIALIZING. **
MATSET, .-. /ISSUE MATRIX COMMAND LSK /MATRIX READY? JMP .-1 /NO MPDC /TRANSFER CLA JMP I MATSET IOPEN, .-. /INITIALIZE INPUT STA DCA I [INCHCT /SET TO READ FROM NEW DEVICE ISZ INEOF /FORCE NEW INPUT FILE TAD [7617 DCA INFPTR JMP I IOPEN
PAGE RENN, .-. /ENTRY TO OUTPUT DOT MATRIX TO VERSATEC PLOTTER TAD [MSD /BRING IN ADDRESS OF FIRST WORD IN BUFER DCA ADMSD /INITIALIZE OUTPUT ADDRESS WORD POINTER TAD [-SLB /PICK UP BLOCK SIZE COUNT FOR OUTPUT DCA T1 /INITIALIZE LOOP COUNTER AGN2, TAD [-BSL /INITIALIZE LOOP COUNTER WITH WORDS TO SCAN LIN DCA T2 /INITIALIZE LOOP COUNTER AGAIN, TAD I ADMSD /BRING IN PLOTTER WORD RTR /MOVE UPPER EIGHT BITS TO RIGHT RTR /MOVE UPPER EIGHT BITS TO RIGHT JMS OUT /OUTPUT EIGHT BITS TO MATRIX PLOTTER RTL /MOVE LOWER FOUR BITS TO LEFT FOUR RTL /MOVE LOWER FOUR BITS TO LEFT FOUR PLACES AND [360 /MASK OFF ALL EXCEPT CENTER FOUR BITS DCA TEMP /SAVE THESE FOUR BITS FOR LATER ISZ ADMSD /BUMP ADDRESS TO PICK UP NEXT PLOTTER WORD TAD I ADMSD /BRING IN NEXT MATRIX PLOTTER WORD RTL /MOVE HIGH ORDER FOUR BITS TO LOW ORDER RTL /MOVE HIGH ORDER FOUR BITS TO LOW ORDER RAL /MOVE HIGH ORDER FOUR BITS TO LOW ORDER AND [17 /EXTRACT LOW ORDER FOUR BITS TAD TEMP /CONSTRUCT SECOND WORD OF OUTPUT TO MATRIX JMS OUT /OUTPUT PLOTTER DATA TO MATRIX PLOTTER JMS OUT /OUTPUT LAST 8 BITS OF SECOND WORD. CLA /CLEAR ACCUM ISZ ADMSD /BUMP ADDRESS FOR NEXT MATRIX PLOTTER DATA WORD JMP AGAIN /GO BACK FOR REST OF THIS SCAN LINE. RCNT, CLA /MAKE SURE ACCUM IS CLEAR ISZ T1 /BUMP SCAN LINES TO BAND COUNTER. JMP AGN2 /GO BACK TO REFRESH SCAN WORD COUNTER. JMP I RENN /RETURN WHEN ALL DATA IS OUTPUTED OUT, .-. /ENTRY TO OUTPUT PROCEDURE FOR MATRIX PLOTTER AND [377 /MASK OFF ALL BUT LOWER 8 BITS. LSK /IS MATRIX READY JMP .-1 /NO LLB /TRANSFER A PLOT BYTE CLA /CLEAR ACCUM JUST IN CASE. TAD I ADMSD /BRING IN NEXT PLOTTER WORD ISZ T2 /IF ZERO FINISHED WITH ONE SCAN LINE JMP I OUT /NOT FINISHED GO FOR MORE ISZ ADMSD /BUMP POINTER FOR NEXT SCAN LINE JMP RCNT /GO CHECK IF ANY MORE SCAN LINES TO OUTPUT
DVRM, .-. /** ENTRY TO DIVIDE AND REMAINDER SUBROUTINE ** DCA R /SAVE DIVIDEND IN REMAINDER LOCATION. DCA K /SET QUOTIENT TO ZERO. TAD R /BRING IN DIVIDEND FOR SUCCESSIVE SUBTRACTIONS. TAD I DVRM /SUBTRACT DIVISOR FROM DIVIDEND. SPA /TEST FOR DIVIDEND GREATER THEN DIVISOR JMP .+4 /DIVIDEND(NOW REMAINDER) LESS THAN DIVISOR. DCA R /SAVE DIVIDEND THAT HAS BEEN REDUCED BY DIVISOR ISZ K /BUMP QUOTIENT FOR LAST SUBTRACTION. JMP .-6 /GO BACK TO TRY ANOTHER SUBTRACTION. ISZ DVRM /CALCULATE RETURN ADDRESS CLA /CLEAR ACCUMULATOR TO TAD R /SET ACCUMULATOR TO REMAINDER. JMP I DVRM /RETURN TO CALLING PROGRAM ADM1, MP1 /ADDRESS OF MULTIPLICATION RESULT K, 0 /QUOTIENT OF DIVISION R, 0 /REMAINDER USED IN DIVISION PROCEDURE.
GINP, .-. CLA CLL CMA RTL /AC=-3 DCA TM+00 /SAVE RECORD COUNTER TAD [TM+00 /GET POINTER DCA AX+2 /AND SAVE IT GINP10, JMS I [ICHAR /GET A WORD JMP GINP30 /EOF ERROR AND [3777 /FORCE LEGALITY DCA I AX+2 /STORE THE WORD ISZ TM+00 /BUMP THE COUNTER JMP GINP10 TAD AX+00 /CHECK FOR OVERFLOW TAD [205 /NOW WOULD STORE IN 17600 SNA CLA JMP GINP40 TAD TM+01 /GET CODE WORD AND [3 /MAKE IT LEGAL GINP20, DCA TM+01 CDF 10 /POINT TO INTERMEDIATE DATA FIELD TAD TM+01 /GET CODE WORD CLL RTR /LOW ORDER IS IN AC0,HIGH ORDER IN LINK TAD TM+02 /BUILD PACKED X WORD DCA I AX+00 /STORE THE STUFF RAR /GET HIGH ORDER BIT OF CODE WORD TAD TM+03 /AND Y COORDINATE DCA I AX+00 /STORE THE STUFF CDF 00 /POINT BACK TO THIS FIELD TAD TM+01 /GET THE CODE CLL RAR /CHECK FOR 2,3 CODES SNA CLA /SKIP IF CODE 2 OR 3 ISZ GINP /BUMP RETURN IF CODE 0,1 JMP I GINP GINP30, CLA CLL CML IAC RAL /AC=3 JMP GINP20 /FORCE END OF PLOTS CODE GINP40, CLA CLL CML RTL /AC=2 JMP GINP20 /FORCE END OF PAGE CODE
/ /DO ANOTHER PLOT / COPY, 6654 /CLEAR AC ALSO DCA LLMT /SET LOWER SCAN BAND LIMIT DCA XC /RETURN THE PEN DCA YC TAD [6 /SET PRINT MODE JMS I [MATSET TAD [MID-1 /SET UP WORK BUFFER FOR INTERMEDIATE DCA AX+0 /LANGUAGE INPUT JMS GINP /GET INPUT JMP COPY20 /END OF BUFFER OR END OF PLOTS JMP .-2 /MORE TO GO COPY20, CLA CLL IAC /CLEAR PRINT/PLOT BUFFER JMS I [MATSET CLA CLL CML IAC RAL /REMOTE FORM FEED JMS I [MATSET TAD [7 /SET PLOT MODE JMS I [MATSET COPY30, TAD [MSD-1 /ADDRESS OF SCAN WORK DATA DCA AX+1 /CLEAN OUT WORK AREA TAD [MSDL /CLEAN COUNT DCA WD2 DCA I AX+1 ISZ WD2 JMP .-2 TAD [MID-1 /PICK UP INTERMEDIATE LANGUAGE DCA AX+0 JMP I [DCDE
PAGE SPLS, .-. /** ENTRY TO SPLS SUBROUTINE ** TAD XP /BRING IN PREVIOUS X COORDINATE. CIA /SET PREVIOUS X COORDINATE NEGATIVE. TAD XC /ADD CURRENT X COORDINATE. (DX=XC-XP) DCA NA /SAVE DISTANCE IN DOTS BETWEEN X COORDINATES. TAD YP /BRING IN PREVIOUS Y COORDINATE. CIA /SET PREVIOUS Y COORDINATE NEGATIVE. TAD YC /ADD CURRENT Y COORDINATE. (DY=YC-YP) DCA NR /SAVE DISTANCE IN DOTS BETWEEN Y COORDINATES. TAD NA /BRING IN DELTA X VALUE TO DETERMINE DIRECTION. SPA CLA /IS THIS X MOVE IN POSITIVE OR NEGATIVE DIRECTN JMP .+3 /JUMP TO NEGATIVE X MOVE PROCEDURE. TAD [PLUSX /BRING IN ADDRESS OF PLUS X SUBROUTINE. JMP .+5 /GO TO STORE INSTRUCTION PRIOR TO NEXT TEST. TAD NA /BRING IN DELTA X VALUE TO MAKE POSITIVE. CIA /SET NEGATIVE DELTA X POSITIVE. DCA NA /SAVE DELTA X TO USE IN LINE GENERATION. TAD [MNSX /BRING IN MINUS X SUBROUTINE ADDRESS. DCA FIRST /SAVE AS FIRST OR MAJOR MOVE. TAD NR /BRING IN DELTA Y VALUE TO DETERMINE DIRECTION. SPA /TEST DELTA Y VALUE FOR POSITIVE OR NEGATIVE. JMP .+4 /JUMP WHEN DELTA Y IS NEGATIVE. CLA /CLEAR ACCUM TO TAD [PLUSY /BRING IN ADDRESS OF PLUS Y SUBROUTINE. JMP .+4 /JUMP TO STORE INSTRUCTION PRIOR TO NEXT TEST. CIA /SET NEGATIVE DELTA Y POSITIVE. DCA NR /SAVE POSITIVE DELTA Y COUNT. TAD [MNSY /BRING IN ADDRESS OF MINUS Y SUBROUTINE. DCA SCND /SAVE ADDRESS OF Y SUBR SECOND OR MINOR MOVE T3A, TAD NR /BRING IN DELTA Y VALUE TO COMPARE WITH DELTA X CIA /SET DELTA Y NEGATIVE FOR COMPARISON TO DELTA X TAD NA /ADD DELTA X TO NEGATIVE DELTA Y. SMA CLA /TEST TO SEE IF X OR Y IS FIRST MOVE. JMP T6A /JUMP WHEN X IS FIRST(MAJOR) MOVE. TAD FIRST /BRING IN X MOVE (PLUS OR MINUS) TO INTERCHANGE DCA TEMP /SAVE X MOVE TEMPORARILY. TAD SCND /BRING IN Y MOVE SUBROUTINE ADDRESS. DCA FIRST /SAVE Y MOVE SUBROUTINE ADDRESS AS FIRST(MAJOR) TAD TEMP /BRING BACK X MOVE SUBROUTINE ADDRESS. DCA SCND /SAVE X MOVE SUBROUTINE ADDRESS AS SECOND(MINOR TAD NA /BRING IN DELTA X MOVE COUNT TO INTERCHANGE. DCA TEMP /SAVE DELTA X MOVE COUNT TEMPORARILY. TAD NR /BRING IN DELTA Y MOVE COUNT FOR INTERCHANGE. DCA NA /SAVE DELTA Y COUNT AS MAJOR MOVE COUNT (FIRST) TAD TEMP /BRING DELTA X COUNT BACK TO STORE AS MINOR CNT DCA NR /SAVE DELTA X COUNT AS MINOR MOVE COUNT.
T6A, TAD XP /PICK UP FIRST X COORDINATE. TAD LLMT /SUBTRACT LOWER BAND X COORDINATE. DCA N /INITIALIZE MATRIX BAND WORD POINTER. TAD XC /PICK UP LAST X COORDINATE. TAD LLMT /SUBTRACT LOWER BAND X COORDINATE. DCA NLST /INITIALIZE MATRIX BAND WORD POINTER. TAD NA /STRAIGHT LINE SET UP ALGORITHM CONSTANTS. TAD NA /DOUBLE MAJOR MOVE COUNT. CIA /SET MAJOR MOVE DOUBLE COUNT NEGATIVE. DCA NQ /SAVE FOR TEST AND UPDATE OF SLOPE CALCULATION. TAD NR /BRING IN MINOR MOVE COUNT. TAD NR /DOUBLE MINOR MOVE COUNT. DCA NR /SAVE DOUBLE MINOR MOVE COUNT FOR LINE PROC. TAD NA /BRING IN MAJOR MOVE COUNT. CMA /CALCULATE MAJOR MOVE COUNT + 1 AND NEGATE. DCA NC /SAVE STRAIGHT LINE LOOP COUNT. (-NA-1) TAD IVM /PICK UP SOLID OR DOTTED LINE MASK. DCA I [MTY /INITIALIZE MASK SAVE LOCATION. TAD I [MTY /BRING IN VALUE IN MASK SAVE LOCATION. DCA MASK /INITIAILIZE MASK IN CASE DATA IS IN RANGE. TAD N /BRING IN X COORDINATE OF FIRST POINT FOR SMA CLA /TEST OF X1 BELOW FIRST SCAN LINE OF BAND. JMP T2A /X1 IS ABOVE FIRST SCAN LINE JUMP TO TEST 2. TAD [MSD /X1 WAS BELOW BRING FIRST SCAN LINE ADDRESS TO DCA ADMSD /SET ADDRESS TO FIRST SCAN BAND TAD NLST /BRING IN X2 COORD FOR BELOW RANGE TEST. SPA CLA /TEST X2 FOR BELOW BAND. SPR, JMP I SPLS /** RETURN, BOTH COORDS. ARE BELOW BAND. JMP S3 /JUMP TO SET MASK TO ZERO SINCE FIRST X IS BELO T2A, TAD N /BRING IN X COORDINATE OF FIRST POINT TAD [-SLB /X1 COORD. IS IN ACCUM., CALCULATE UPPER SCAN SPA CLA /TEST FOR X1 ABOVE UPPER SCAN LINE. JMP S4 /JUMP WHEN X1 IS IN RANGE. TAD [SLB-1^NUM+MSD /BRING IN UPPER SCAN LINE ADDRESS FOR DOT STORE DCA ADMSD /WHEN DATA COMES IN RANGE. TAD NLST /BRING IN X2 COORD. FOR UPPER SCAN LINE TEST. TAD [-SLB /COMPARE TO UPPERMOST SCAN LINE. SMA CLA /TEST FOR X2 ABOVE LAST UPPER SCAN LINE. JMP I [SPR /** RETURN BOTH COORDS. ARE BELOW BAND. S3, DCA MASK /X COORD IS OUT OF RANGE. MASK WILL BE RESET. JMP Q4 /SKIP ADDRESS CALCULATION. S4, TAD XP /BRING IN X COORDINATE TO CALC. DOT MATRIX ADDR AND [SLB-1 /MASK ASSUMES NUMBER OF SCAN LINES IS POWER OF 2 JMS I [MLT /JUMP TO MULTIPLY 86 OR 47 TIMES X NUM /86 DECIMAL OR 47 DECIMAL TAD I [MP1 /BRING IN LEAST SIGNIFICANT INTEGER. TAD [MSD /CALCULATE WORD ADDRESS IN DOT MATRIX. DCA ADMSD /INITIALIZE DOT STORE ADDRESS. Q4, TAD YP /BRING IN Y1 TO DIVIDE BY. JMS I [DVRM /GO TO DIVIDE AND REMAINDER ROUTINE. 7764 /MINUS 12 COUNT FOR DIVIDE. TAD [NDT /CALCULATE POSITION IN ARRAY OF DOTS.(NDT) DCA TEMP /SAVE ADDRESS TEMPORARILY TO GET DOT. TAD I TEMP /BRING IN DOT CORRESPONDING TO Y COORD. DCA DOTW /SAVE WORD WITH ONE DOT (BIT) IN IT. TAD ADMSD /BRING IN ADDRESS OF X COORDINATE TAD K /UPDATE ADDRESS TO INCLUDE Y COORDINATE DCA ADMSD /SAVE UPDATED ADDRESS FOR DOT STORE TAD NA /LOAD ACCUM WITH HALF STEP VALUE. TAD NQ /SUBTRACT 2*NA FOR COMBINED MOVE TEST. DCA IACC /SAVE INITIAL VALUE FOR LOOP. JMP I [SS2 /AND DO SOME MORE
PAGE SS2, TAD DOTW /BRING IN WORD WITH DOT FOR LINE. AND MASK /USE DOTTED LINE MASK. DCA TEMP /SAVE MASKED DOT VLUE FOR INCLUSIVE OR CALCUL. TAD TEMP /BRING BACK MASKED DOT WORD FOR INCLUSIVE OR CMA /COMPLEMENT WORD TO PERFORM INCLUSIVE OR. AND I ADMSD /MASK OFF COMMON BITS TO BOTH WORDS. TAD TEMP /ADD ANY NEW BITS TO FORM INCLUSIVE OR. DCA I ADMSD /SAVE UPDATED SCAN WORD IN MATRIX. TAD IACC /BRING IN LINE RUNNING TOTAL. TAD NR /UPDATE BY DY/DX DCA IACC /SAVE UPDATED VALUE. TAD IACC /BRING IT BACK FOR TEST. SPA /TEST FOR COMBINED MOVE. JMP SS6 /JUMP TO MAJOR MOVE ONLY. TAD NQ /BRING LINE SOLUTION BACK TO BASE. DCA IACC /SAVE UPDATED RUNNING TOTAL. JMS I SCND /JUMP TO MINOR MOVE SUBROUTINE. SS6, CLA /CLEAR ACCUM FOR THE X OR Y MOVE SUBROUTINES. JMS I FIRST /JUMP TO MAJOR MOVE SUBROUTINE. ISZ NC /BUMP DOT COUNTER. JMP SS2 /JUMP BACK FOR REST OF LINE. JMP I [SPR /DONE, GO BACK TO DECODE
MLT, .-. /** ENTRY TO MULTIPLY SUBROUTINE. ** CLL /CLEAR LINK FOR SIGN TEST OF CROSS PRODUCT. SPA /TEST FOR NEGATIVE MULTIPLIER CMA CML IAC /SET NUMBER POSITIVE AND SET SIGN INDICATOR(L) DCA MP1 /STORE POSITIVE MULTIPLIER. DCA MP5 /CLEAR QUOTIENT TAD I MLT /BRING IN MULTIPLICAND SNA /TEST FOR ZERO MULTIPLICAND JMP MPSN+2 /JUMP IF MULTIPLICAND IS ZERO SPA /TEST FOR NEGATIVE MULTIPLICAND CMA CML IAC /MAKE NUMBER POSITIVE AND SET SIGN INDICATOR(L) DCA MP2 /STORE POSITIVE MULTIPLICAND TAD THIR /BRING IN SHIFT AND ADD COUNTER DCA MP3 /SAVE SHIFT AND ADD COUNTER. MP4, TAD MP1 /MULTIPLY LOOP PROPER RAR /ROTATE MULTIPLIER AND SAVE LINK BIT. DCA MP1 /SAVE ROTATED NUMBER FOR NEXT ADD/ROTATE. TAD MP5 /BRING IN QUOTIENT. SZL /TEST IF MULTIPLIER SHOULD BE ADDED TAD MP2 /ADD WHEN MULTIPLICAND BHT IS NONZERO. CLL RAR /CLEAR LINK AND MULTIPLY BY 2 DCA MP5 /SAVE PARTIAL QUOTIENT. ISZ MP3 /TEST FOR END OF LOOP JMP MP4 /GO BACK UNTIL WHOLE NUMBER IS MULTIPLIED BY RO TAD MP1 / RAR / MPSN, SZL / JMP COMP / DCA MP1 / TAD MP5 /SET ACCUM TO MOST SIGNIFICANT MPZ, ISZ MLT /BUMP ADDRESS FOR CORRECT RETURN JMP I MLT /** RETURN TO CALLING SEQUENCE ** COMP, CMA CLL IAC /COMPLEMENT PRODUCT DCA MP1 / TAD MP5 / CMA / SZL / IAC / JMP MPZ / THIR, 7764 /ELEVEN DECIMAL. MP1, 0 / MP2, 0 / MP3, 0 / MP5, 0 /
ICHAR, .-. /INPUT A CHARACTER. CLA CLL INCHAR, ISZ INCHCT /INPUT BUFFER EXHAUSTED? JMP INGWRD /NO..UNPACK THE NEXT CHAR TAD INEOF /DID LAST READ GIVE EOF ON THIS DEVICE? SNA CLA JMP INGBUF /NO. CONTINUE READING. INGFIL, JMS INNEWF /YES..GET NEXT INPUT IF IT EXISTS. JMP I ICHAR /EOF INGBUF, ISZ INCTR SKP ISZ INEOF /AND SIGNAL EOF FOR NEXT READ. JMS I INHNDL 201 /INPUT CONTROL WORD INBUFP, INBUF /INPUT BUFFER ADDRESS INREC, 0-0 /POINTER TO INPUT RECORD JMP INERRX ISZ INREC TAD [-377 /NEW NUMBER OF WORDS. DCA INCHCT TAD INBUFP DCA INPTR /AND BUFFER POINTER JMP INGWRD /NOW READ THE BUFFER INERRX, ISZ INEOF /SET EOF JUST IN CASE SMA CLA /IF <0, A PHYSICAL ERROR JMP INGFIL /EOF ON INPUT CLA CLL CML RAR /FATAL JMP I ICHAR /GET OUT INGWRD, TAD I INPTR ISZ INPTR ISZ ICHAR /TAKE NORMAL RETURN JMP I ICHAR
INNEWF, -1 INCHCT=INNEWF TAD [INDEVH+1 /INITIALIZE IN CASE WE NEED A NEW DCA INHNDL /MORE INPUT? CDF 10 TAD I INFPTR CDF 00 SNA JMP I INNEWF /NOPE CIF 10 JMS I [7700 /CALL MONITOR TO GET HANDLER 1 INHNDL, 0-0 HLT /VERY BAD! CDF 10 TAD I INFPTR AND [7760 /GET INPUT FILE LENGTH SZA TAD [17 CLL CML RTR RTR /NEGATIVE OF FILE LENGTH DCA INCTR ISZ INFPTR /POINT TO STARTING BLOCK TAD I INFPTR CDF 00 DCA INREC /STORE IN HANDLER CALL ISZ INFPTR /NEXT INPUT. DCA INEOF /CLEAR EOF FLAG. ISZ INNEWF JMP I INNEWF INCTR=IOPEN
PAGE INDEVH=.; *.+400 /INPUT DEVICE HANDLER (2 PAGE) INBUF=.; *.+400 /INPUT BUFFER (2 PAGES) MSD=. /SCAN DOT BUFFER MSDL=MSD-7577 /DOT BUFFER MAXIMUM LENGTH MID=0000 /INTERMEDIATE LANGUAGE BUFFER $END$



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