home *** CD-ROM | disk | FTP | other *** search
- ;CANNON PJ-1080A PRINT DRIVER FOR BASIC 8 SOURCE CODE
- ;ORIGINAL SOURCE CODE WAS FROM BASIC 8 MANUAL
- ;MODIFIED TO GIVE PSEUDO 16 COLOR OUTPUT
- ;
- ;
- ;SRC NAME CAN-MOD.SRC
- ;OBJECT NAME P.HC-CANNON16
- ;ORG CREATED 12/09/86
- ;ORG AUTHOR DAVID DARUS
- ;MODIFIED 02/28/91
- ;MODIFIED BY GARY VANGELDER
- ;ASSEMBLER CBM C64 ADS
- ;COMPUTER ASSEMBLED ON A C64 FOR USE ON A C128
- ;
- ;REMARKS BASIC 8 HARD COPY DRIVER FOR CANNON PJ-1080A
- ; 640 * Y UNROTATED COLOR INK JET
- ; WITH PSEUDO 16 COLOR RESOLUTION
- ;
- ; SOURCE CODE MODIFIED FOR CBM C64 ASSEMBLER
- ; AND 16 PSEUDO COLOR RESOLUTION
- ; 02/28/91 BY GARY VANGELDER
- ;
- ;DEFINE OUT OF PROGRAM EQUATES
- ;
- MMU = $FF00 ;MMU CONTROL REGISTER
- ;
- CHROUT = $FFD2 ;KERNAL ROUTINES
- CLRCHN = $FFCC
- CLOSE = $FFC3
- SETLFS = $FFBA
- OPEN = $FFC0
- CHKOUT = $FFC9
- ;
- CLCADR = $26A8 ;B8 ROUTINE - SET REGISTERS TO CURRENT PIXEL INFO
- SWAPBL = $25DB ;B8 ROUTINE - SWAP FC & BC NIBBLES
- GPIXST = $2652 ;B8 ROUTINE - GET PIXEL STATUS ( ON / OFF )
- GCOLST = $266E ;B8 ROUTINE - CET COLOR STATUS ( FC & BC NIBBLES )
- ;
- CCOLOR = $1318 ;B8 REGISTER - CURRENT COLOR NIBBLES ( USED IF MONO )
- SCRCSZ = $131A ;B8 REGISTER - CURRENT SCREEN COLOR CELL SIZE
- SCRSZY = $131C ;B8 REGISTER - CURRENT SCREEN SCANLINE SIZE ( LB )
- SCRSZX = $1324 ;B8 REGISTER - CURRENT SCREEN COLUMN SIZE ( LB )
- XX = $136B ;B8 REGISTER - CURRENT PIXEL COLUMN ( LB )
- YY = $136D ;B8 REGISTER - CURRENT PIXEL SCANLINE ( LB )
- MASK = $137B ;B8 REGISTER - PIXEL ON/OFF MASK FOR A COLOR CELL
- PARM1 = $13EF ;B8 REGISTER - PRINTER'S SECONDARY ADDRESS
- PARM2 = $13F0 ;B8 REGISTER - PRINTOUTS HEIGHT
- PARM3 = $13F1 ;B8 REGISTER - PRINTOUT DENSITY ( NOT USED )
- PARM4 = $13F2 ;B8 REGISTER - ROTATED PRINTOUT FLAG ( NOT USED )
- ;
- COLCNT = $0280 ;NUMBER OF COLUMNS TO SCAN VALUE
- ;
- ;START OF ROUTINE @ $65D0 ( 26064 IN BANK 0 )
- ;
- * = $65D0
- ;
- MLHCPY LDA PARM1
- STA SECADR ;PRINTER SECONDARY ADDRESS
- LDA PARM2
- STA ESCDAT+2 ;NUMBER OF TIMES FOR PRINTER TO REPEAT A LINE
- LDA MMU
- AND #$FE ;CLEAR BIT 0
- STA MMU ;MAKE SURE THAT THE I/O BLOCK IS SWITCHED IN
- JSR OPNCHN ;OPEN THE PRINTER SUB
- LDA #7
- STA BN ;INITIALIZE BITS PER BYTE PROCESSED COUNTER TO 7
- LDA #0
- STA BV ;BYTE VALUE TO CHROUT = 0
- STA YY ;ZERO YY SCANLINE INDEXES
- STA YY+1
- NXTY LDA #0
- STA RGBMOD ;SET FOR FIRST COLOR SCAN
- JSR PRTESC ;DO FOR EACH ROW = 8 * HEIGHT
- X6 LDA #0
- STA XX ;ZERO XX COLUMN INDEXES
- STA XX+1
- X2 JSR GETPIX ;GET PIXEL VALUE AT XX , YY FOR THIS COLOR
- ;IF PIXEL DOES NOT NEED THIS COLOR THEN CLC ON RETURN
- ROL BV ;ROTATE CARRY FLAG INTO THE LOW BIT OF OUT BYTE
- DEC BN ;DEC BIT COUNTER
- BPL X1 ;BRANCH IF ALL PIXELS NOT PROCEESED THIS BYTE
- LDA BV ;IF BN < 0 THEN PRINT BV / BN = 0
- JSR CHROUT ;OUTPUT THE ASSEMBLED BYTE
- LDA #7
- STA BN ;RESET BIT COUNT TO 7
- LDA #0
- STA BV ;CLEAR OUT BYTE
- X1 INC XX ;INC THE COLUMN COUNTER(S)
- BNE X50
- INC XX+1
- X50 LDA XX
- CMP #<COLCNT
- BNE X2 ;IF XX < 640 THEN GO BACK TO PROCESS AND OUTPUT
- ;THE NEXT BYTE FOR THIS COLOR PER SCANLINE
- LDA XX+1
- CMP #>COLCNT
- BNE X2
- INC RGBMOD ;INC FLAG FOR NEXT COLOR
- LDA RGBMOD
- CMP #3
- BNE X6 ;REPEAT SCAN LINE TO GET 3 (RGB) COLOR ELEMENTS
- INC YY ;INC SCANLINE INDEX(S)
- BNE X51
- INC YY+1
- X51 LDA YY
- CMP SCRSZY
- BNE NXTY ;IF XX < SCRSZY THEN DO THE NEXT SCANLINE
- LDA YY+1
- CMP SCRSZY+1
- BNE NXTY
- HCERR JSR CLRCHN ;RESET I/O
- LDA #4
- JMP CLOSE ;CLOSE THE PRINTER AND RETURN FROM HARD COPY
- ;
- ;SUBROUTINES
- ;
- ;OPEN THE OUTPUT TO THE PRINTER
- ;
- OPNCHN LDA #0
- STA $B7
- LDX #4
- TXA
- LDY SECADR
- JSR SETLFS
- JSR OPEN ;OPEN 4,4,SECADR
- LDX #4
- JMP CHKOUT ;SET OUT CHAN TO #4 AND RTS
- ;
- ;OUTPUT THE ESCAPE SEQUENCE TO THE PRINTER
- ;
- PRTESC LDX #0
- P1 LDA ESCDAT,X
- JSR CHROUT ;SEND THE STRING 'ESC,R,PARM2,80' TO THE PRINTER
- ;FOR COLOR GRAPHICS REPEAT LINE MODE WITH PARM2
- ;BEING THE NUMBER OF REPEATS PER ROW AND
- ;80 BYTES PER COLOR PER ROW
- INX
- CPX #4
- BNE P1
- RTS
- ;
- ;GET COLOR DATA FOR A PIXEL SUBROUTINE
- ;
- GETPIX JSR CLCADR ;SET B8 PIXEL POINTER TO CURRENT XX,YY LOCATION
- LDA SCRCSZ ;GET COLOR SCREEN SIZE FLAG
- BEQ G1 ;BRANCH IF MONO
- JSR GCOLST ;GET BC / FC NIBBLES
- JSR SWAPBL ;SWAP TO FC / BC
- JMP G2
- G1 LDA CCOLOR ;GET CURRENT FC / BC NIBBLES IF MONO
- G2 STA HCOLOR ;SAVE COLOR NIBBLES TO TEMP
- JSR GPIXST ;GET PIXEL ON / OFF STATUS
- AND MASK ;CHECK AGAINST THE MASK
- BEQ G3 ;BRANCH IF OFF ( BACKGROUND )
- LDA HCOLOR ;USE FC BECAUSE PIXEL IS ON
- LSR A ;CONVERT TO 0 - 15 SCALE TO BE USED AS AN INDEX
- LSR A
- LSR A
- LSR A
- JMP G20
- G3 LDA HCOLOR ;GET THE CURRENT CELL COLOR NIBBLES FROM TEMP
- AND #15 ;MASK OUT HIGH NIBBLE FOR 0 - 15 INDEX (BC)
- ;
- ;MODIFIED VERSION ROUTINES TO ADJUST FOR LIGHT / DARK COLORS
- ;
- G20 STA TCOL ;SAVE COLOR INDEX TO TEMP IF ADJ IS NOT NEEDED
- CMP #12 ;ODD COLORS BELOW 12 ARE TO BE ADJUSTED WITH
- ;INTERSPACED WHITE DOTS AND EVEN COLORS ABOVE 11
- ;WITH BLACK DOTS
- BCS G23
- AND #1 ;CHECK FOR ODD
- BEQ G4 ;SKIP ADJUST CHECK IF EVEN AND < 12
- LDA #15
- STA CAD ;SET ADJUST BIT COLOR FOR WHITE
- G24 LDX BN ;USE BIT POSITION FOR ADJ LOOKUP INDEX
- LDA YY ;GET LB SCAN LINE VALUE
- AND #1 ;CHECK IF VALUE IS ODD
- BEQ G21 ;SKIP INX IF EVEN
- INX ;ADD 2 TO THE INDEX FOR ODD SCANLINES
- INX
- G21 LDA ADJMSK,X ;LOOKUP IF PIXEL IS ONE THAT NEEDS CHANGED
- BEQ G22 ;NO ADJUSTMENT REQUIRED - LEAVE TCOL ALONE
- LDA CAD ;CHANGE TCOL TO WHITE OR BLACK AS NEEDED
- STA TCOL
- G22 JMP G4 ;CONTINUE WITH ORIGINAL ROUTINE
- G23 AND #1 ;CHECK FOR ODD
- BNE G4 ;SKIP ADJUST CHECK IF ODD AND >= 12
- LDA #0
- STA CAD ;SET ADJUST BIT COLOR FOR BLACK
- JMP G24 ;JUMP BACK TO COMMON ADJUST CHECK ROUTINE
- ;
- ;END OF MODIFICATION ROUTINE - CONTINUE WITH ORIGINAL
- ;
- G4 LDX TCOL ;GET THE OFFSET FOR THE COLOR LOOKUP MASKS
- LDA RGBMOD ;GET WHICH MASK TO USE ( 0=RED, 1=GREEN, 2=BLUE)
- ;FOR BRANCH TO CORRECT COLOR MASK LOOKUP
- BEQ G5 ;BRANCH IF 0 ( RED )
- CMP #1
- BEQ G6 ;BRANCH IF 1 ( GREEN )
- ; ;OTHERWISE IT IS 2 ( BLUE )
- LDA BLUTAB,X ;CHECK CURRENT COLOR TO SEE IF A BLUE DOT IS NEEDED
- BEQ G10 ;IF = 0 THEN IT IS NOT NEEDED / BRANCH TO CLC
- BNE G11 ;IF = 1 THEN IT IS NEEDED / BRANCH TO SEC
- G6 LDA GRETAB,X ;GREEN CHECK
- BEQ G10
- BNE G11
- G5 LDA REDTAB,X ;BLUE CHECK
- BEQ G10
- G11 SEC ;SET THE CARRY FLAG - THE PRINTER REQUIRES THIS DOT
- ;ON AS PART OF THE COMPOSITE FOR THIS PIXEL'S COLOR
- RTS
- G10 CLC ;CLEAR THE CARRY FLAG - THIS COLOR DOT IS NOT NEEDED
- ;AS PART OF THE COMPOSITE FOR THIS PIXEL'S COLOR
- RTS ;RETURN FROM SUB
- ;
- ;END OF ROUTINES
- ;
- ;IN PROGRAM VARIABLES, BUFFERS, AND MASKS
- ;
- REDTAB .BYTE 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
- ;
- GRETAB .BYTE 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1
- ;
- BLUTAB .BYTE 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1
- ;
- ADJMSK .BYTE 1,0,0,0,1,0,0,0,1,0
- ;
- ESCDAT .BYTE 27,114,0,80
- ;
- SECADR .BYTE 0 ;SECONDARY ADDRESS FOR PRINTER
- BN .BYTE 0 ;BIT BUMBER PER BYTE PROCESSED COUNTER
- BV .BYTE 0 ;OUTPUT BYTE BUFFER
- TCOL .BYTE 0 ;TEMP STORAGE OF COLOR INDEX VALUE
- CAD .BYTE 0 ;CURRENT ADJUSTMENT COLOR INDEX
- RGBMOD .BYTE 0 ;RGB COUNTER
- HCOLOR .BYTE 0 ;CURRENT FC / BC NIBBLES
- ;
- ;END OF SOURCE CODE FILE
- ;
- .END
-