home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C128Graphics / CANNON+.SDA / CAN-MOD.SRC next >
Encoding:
Text File  |  2019-04-13  |  8.0 KB  |  241 lines

  1. ;CANNON PJ-1080A PRINT DRIVER FOR BASIC 8 SOURCE CODE
  2. ;ORIGINAL SOURCE CODE WAS FROM BASIC 8 MANUAL
  3. ;MODIFIED TO GIVE PSEUDO 16 COLOR OUTPUT
  4. ;
  5. ;
  6. ;SRC NAME     CAN-MOD.SRC
  7. ;OBJECT NAME  P.HC-CANNON16
  8. ;ORG CREATED  12/09/86
  9. ;ORG AUTHOR   DAVID DARUS
  10. ;MODIFIED     02/28/91
  11. ;MODIFIED BY  GARY VANGELDER
  12. ;ASSEMBLER    CBM C64 ADS
  13. ;COMPUTER     ASSEMBLED ON A C64 FOR USE ON A C128
  14. ;
  15. ;REMARKS      BASIC 8 HARD COPY DRIVER FOR CANNON PJ-1080A
  16. ;                     640 * Y UNROTATED COLOR INK JET
  17. ;                     WITH PSEUDO 16 COLOR RESOLUTION
  18. ;
  19. ;             SOURCE CODE MODIFIED FOR CBM C64 ASSEMBLER
  20. ;             AND 16 PSEUDO COLOR RESOLUTION
  21. ;             02/28/91   BY GARY VANGELDER
  22. ;
  23. ;DEFINE OUT OF PROGRAM EQUATES
  24. ;
  25. MMU    = $FF00  ;MMU CONTROL REGISTER
  26. ;
  27. CHROUT = $FFD2  ;KERNAL ROUTINES
  28. CLRCHN = $FFCC
  29. CLOSE  = $FFC3
  30. SETLFS = $FFBA
  31. OPEN   = $FFC0
  32. CHKOUT = $FFC9
  33. ;
  34. CLCADR = $26A8  ;B8 ROUTINE - SET REGISTERS TO CURRENT PIXEL INFO
  35. SWAPBL = $25DB  ;B8 ROUTINE - SWAP FC & BC NIBBLES
  36. GPIXST = $2652  ;B8 ROUTINE - GET PIXEL STATUS ( ON / OFF )
  37. GCOLST = $266E  ;B8 ROUTINE - CET COLOR STATUS ( FC & BC NIBBLES )
  38. ;
  39. CCOLOR = $1318  ;B8 REGISTER - CURRENT COLOR NIBBLES ( USED IF MONO )
  40. SCRCSZ = $131A  ;B8 REGISTER - CURRENT SCREEN COLOR CELL SIZE
  41. SCRSZY = $131C  ;B8 REGISTER - CURRENT SCREEN SCANLINE SIZE ( LB )
  42. SCRSZX = $1324  ;B8 REGISTER - CURRENT SCREEN COLUMN SIZE ( LB )
  43. XX     = $136B  ;B8 REGISTER - CURRENT PIXEL COLUMN ( LB )
  44. YY     = $136D  ;B8 REGISTER - CURRENT PIXEL SCANLINE ( LB )
  45. MASK   = $137B  ;B8 REGISTER - PIXEL ON/OFF MASK FOR A COLOR CELL
  46. PARM1  = $13EF  ;B8 REGISTER - PRINTER'S SECONDARY ADDRESS
  47. PARM2  = $13F0  ;B8 REGISTER - PRINTOUTS HEIGHT
  48. PARM3  = $13F1  ;B8 REGISTER - PRINTOUT DENSITY ( NOT USED )
  49. PARM4  = $13F2  ;B8 REGISTER - ROTATED PRINTOUT FLAG ( NOT USED )
  50. ;
  51. COLCNT = $0280  ;NUMBER OF COLUMNS TO SCAN VALUE
  52. ;
  53. ;START OF ROUTINE @ $65D0  ( 26064 IN BANK 0 )
  54. ;
  55. * = $65D0
  56. ;
  57. MLHCPY LDA PARM1
  58.        STA SECADR   ;PRINTER SECONDARY ADDRESS
  59.        LDA PARM2
  60.        STA ESCDAT+2 ;NUMBER OF TIMES FOR PRINTER TO REPEAT A LINE
  61.        LDA MMU
  62.        AND #$FE     ;CLEAR BIT 0
  63.        STA MMU      ;MAKE SURE THAT THE I/O BLOCK IS SWITCHED IN
  64.        JSR OPNCHN   ;OPEN THE PRINTER SUB
  65.        LDA #7
  66.        STA BN       ;INITIALIZE BITS PER BYTE PROCESSED COUNTER TO 7
  67.        LDA #0
  68.        STA BV       ;BYTE VALUE TO CHROUT = 0
  69.        STA YY       ;ZERO YY SCANLINE INDEXES
  70.        STA YY+1
  71. NXTY   LDA #0
  72.        STA RGBMOD   ;SET FOR FIRST COLOR SCAN
  73.        JSR PRTESC   ;DO FOR EACH ROW = 8 * HEIGHT
  74. X6     LDA #0
  75.        STA XX       ;ZERO XX COLUMN INDEXES
  76.        STA XX+1
  77. X2     JSR GETPIX   ;GET PIXEL VALUE AT XX , YY  FOR THIS COLOR
  78.                     ;IF PIXEL DOES NOT NEED THIS COLOR THEN CLC ON RETURN
  79.        ROL BV       ;ROTATE CARRY FLAG INTO THE LOW BIT OF OUT BYTE
  80.        DEC BN       ;DEC BIT COUNTER
  81.        BPL X1       ;BRANCH IF ALL PIXELS NOT PROCEESED THIS BYTE
  82.        LDA BV       ;IF BN < 0 THEN PRINT BV / BN = 0
  83.        JSR CHROUT   ;OUTPUT THE ASSEMBLED BYTE
  84.        LDA #7
  85.        STA BN       ;RESET BIT COUNT TO 7
  86.        LDA #0
  87.        STA BV       ;CLEAR OUT BYTE
  88. X1     INC XX       ;INC THE COLUMN COUNTER(S)
  89.        BNE X50
  90.        INC XX+1
  91. X50    LDA XX
  92.        CMP #<COLCNT
  93.        BNE X2       ;IF XX < 640 THEN GO BACK TO PROCESS AND OUTPUT
  94.                     ;THE NEXT BYTE FOR THIS COLOR PER SCANLINE
  95.        LDA XX+1
  96.        CMP #>COLCNT
  97.        BNE X2
  98.        INC RGBMOD   ;INC FLAG FOR NEXT COLOR
  99.        LDA RGBMOD
  100.        CMP #3
  101.        BNE X6       ;REPEAT SCAN LINE TO GET 3 (RGB) COLOR ELEMENTS
  102.        INC YY       ;INC SCANLINE INDEX(S)
  103.        BNE X51
  104.        INC YY+1
  105. X51    LDA YY
  106.        CMP SCRSZY
  107.        BNE NXTY     ;IF XX < SCRSZY THEN DO THE NEXT SCANLINE
  108.        LDA YY+1
  109.        CMP SCRSZY+1
  110.        BNE NXTY
  111. HCERR  JSR CLRCHN   ;RESET I/O
  112.        LDA #4
  113.        JMP CLOSE    ;CLOSE THE PRINTER AND RETURN FROM HARD COPY
  114. ;
  115. ;SUBROUTINES
  116. ;
  117. ;OPEN THE OUTPUT TO THE PRINTER
  118. ;
  119. OPNCHN LDA #0
  120.        STA $B7
  121.        LDX #4
  122.        TXA
  123.        LDY SECADR
  124.        JSR SETLFS
  125.        JSR OPEN     ;OPEN 4,4,SECADR
  126.        LDX #4
  127.        JMP CHKOUT   ;SET OUT CHAN TO #4 AND RTS
  128. ;
  129. ;OUTPUT THE ESCAPE SEQUENCE TO THE PRINTER
  130. ;
  131. PRTESC LDX #0
  132. P1     LDA ESCDAT,X
  133.        JSR CHROUT   ;SEND THE STRING 'ESC,R,PARM2,80' TO THE PRINTER
  134.                     ;FOR COLOR GRAPHICS REPEAT LINE MODE WITH PARM2
  135.                     ;BEING THE NUMBER OF REPEATS PER ROW AND
  136.                     ;80 BYTES PER COLOR PER ROW
  137.        INX
  138.        CPX #4
  139.        BNE P1
  140.        RTS
  141. ;
  142. ;GET COLOR DATA FOR A PIXEL SUBROUTINE
  143. ;
  144. GETPIX JSR CLCADR   ;SET B8 PIXEL POINTER TO CURRENT XX,YY LOCATION
  145.        LDA SCRCSZ   ;GET COLOR SCREEN SIZE FLAG
  146.        BEQ G1       ;BRANCH IF MONO
  147.        JSR GCOLST   ;GET BC / FC NIBBLES
  148.        JSR SWAPBL   ;SWAP TO FC / BC
  149.        JMP G2
  150. G1     LDA CCOLOR   ;GET CURRENT FC / BC  NIBBLES IF MONO
  151. G2     STA HCOLOR   ;SAVE COLOR NIBBLES TO TEMP
  152.        JSR GPIXST   ;GET PIXEL ON / OFF STATUS
  153.        AND MASK     ;CHECK AGAINST THE MASK
  154.        BEQ G3       ;BRANCH IF OFF ( BACKGROUND )
  155.        LDA HCOLOR   ;USE FC BECAUSE PIXEL IS ON
  156.        LSR A        ;CONVERT TO 0 - 15 SCALE TO BE USED AS AN INDEX
  157.        LSR A
  158.        LSR A
  159.        LSR A
  160.        JMP G20
  161. G3     LDA HCOLOR   ;GET THE CURRENT CELL COLOR NIBBLES FROM TEMP
  162.        AND #15      ;MASK OUT HIGH NIBBLE FOR 0 - 15 INDEX (BC)
  163. ;
  164. ;MODIFIED VERSION ROUTINES TO ADJUST FOR LIGHT / DARK COLORS
  165. ;
  166. G20    STA TCOL     ;SAVE COLOR INDEX TO TEMP IF ADJ IS NOT NEEDED
  167.        CMP #12      ;ODD COLORS BELOW 12 ARE TO BE ADJUSTED WITH
  168.                     ;INTERSPACED WHITE DOTS AND EVEN COLORS ABOVE 11
  169.                     ;WITH BLACK DOTS
  170.        BCS G23
  171.        AND #1       ;CHECK FOR ODD
  172.        BEQ G4       ;SKIP ADJUST CHECK IF EVEN AND < 12
  173.        LDA #15
  174.        STA CAD      ;SET ADJUST BIT COLOR FOR WHITE
  175. G24    LDX BN       ;USE BIT POSITION FOR ADJ LOOKUP INDEX
  176.        LDA YY       ;GET LB SCAN LINE VALUE
  177.        AND #1       ;CHECK IF VALUE IS ODD
  178.        BEQ G21      ;SKIP INX IF EVEN
  179.        INX          ;ADD 2 TO THE INDEX FOR ODD SCANLINES
  180.        INX
  181. G21    LDA ADJMSK,X ;LOOKUP IF PIXEL IS ONE THAT NEEDS CHANGED
  182.        BEQ G22      ;NO ADJUSTMENT REQUIRED - LEAVE TCOL ALONE
  183.        LDA CAD      ;CHANGE TCOL TO WHITE OR BLACK AS NEEDED
  184.        STA TCOL
  185. G22    JMP G4       ;CONTINUE WITH ORIGINAL ROUTINE
  186. G23    AND #1       ;CHECK FOR ODD
  187.        BNE G4       ;SKIP ADJUST CHECK IF ODD AND >= 12
  188.        LDA #0
  189.        STA CAD      ;SET ADJUST BIT COLOR FOR BLACK
  190.        JMP G24      ;JUMP BACK TO COMMON ADJUST CHECK ROUTINE
  191. ;
  192. ;END OF MODIFICATION ROUTINE - CONTINUE WITH ORIGINAL
  193. ;
  194. G4     LDX TCOL     ;GET THE OFFSET FOR THE COLOR LOOKUP MASKS
  195.        LDA RGBMOD   ;GET WHICH MASK TO USE ( 0=RED, 1=GREEN, 2=BLUE)
  196.                     ;FOR BRANCH TO CORRECT COLOR MASK LOOKUP
  197.        BEQ G5       ;BRANCH IF 0 ( RED )
  198.        CMP #1
  199.        BEQ G6       ;BRANCH IF 1 ( GREEN )
  200. ;                   ;OTHERWISE IT IS 2 ( BLUE )
  201.        LDA BLUTAB,X ;CHECK CURRENT COLOR TO SEE IF A BLUE DOT IS NEEDED
  202.        BEQ G10      ;IF = 0 THEN IT IS NOT NEEDED / BRANCH TO CLC
  203.        BNE G11      ;IF = 1 THEN IT IS NEEDED / BRANCH TO SEC
  204. G6     LDA GRETAB,X ;GREEN CHECK
  205.        BEQ G10
  206.        BNE G11
  207. G5     LDA REDTAB,X ;BLUE CHECK
  208.        BEQ G10
  209. G11    SEC          ;SET THE CARRY FLAG - THE PRINTER REQUIRES THIS DOT
  210.                     ;ON AS PART OF THE COMPOSITE FOR THIS PIXEL'S COLOR
  211.        RTS
  212. G10    CLC          ;CLEAR THE CARRY FLAG - THIS COLOR DOT IS NOT NEEDED
  213.                     ;AS PART OF THE COMPOSITE FOR THIS PIXEL'S COLOR
  214.        RTS          ;RETURN FROM SUB
  215. ;
  216. ;END OF ROUTINES
  217. ;
  218. ;IN PROGRAM VARIABLES, BUFFERS, AND MASKS
  219. ;
  220. REDTAB .BYTE 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1
  221. ;
  222. GRETAB .BYTE 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1
  223. ;
  224. BLUTAB .BYTE 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1
  225. ;
  226. ADJMSK .BYTE 1,0,0,0,1,0,0,0,1,0
  227. ;
  228. ESCDAT .BYTE 27,114,0,80
  229. ;
  230. SECADR .BYTE 0  ;SECONDARY ADDRESS FOR PRINTER
  231. BN     .BYTE 0  ;BIT BUMBER PER BYTE PROCESSED COUNTER
  232. BV     .BYTE 0  ;OUTPUT BYTE BUFFER
  233. TCOL   .BYTE 0  ;TEMP STORAGE OF COLOR INDEX VALUE
  234. CAD    .BYTE 0  ;CURRENT ADJUSTMENT COLOR INDEX
  235. RGBMOD .BYTE 0  ;RGB COUNTER
  236. HCOLOR .BYTE 0  ;CURRENT FC / BC NIBBLES
  237. ;
  238. ;END OF SOURCE CODE FILE
  239. ;
  240.        .END
  241.