home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / dev / rkrm.lha / RKRM / Printer / hp / transfer.asm < prev    next >
Assembly Source File  |  1992-09-03  |  6KB  |  173 lines

  1. *
  2. * Copyright (c) 1992 Commodore-Amiga, Inc.
  3. * This example is provided in electronic form by Commodore-Amiga, Inc. for 
  4. * use with the "Amiga ROM Kernel Reference Manual: Devices", 3rd Edition, 
  5. * published by Addison-Wesley (ISBN 0-201-56775-X).
  6. * The "Amiga ROM Kernel Reference Manual: Devices" contains additional 
  7. * information on the correct usage of the techniques and operating system 
  8. * functions presented in these examples.  The source and executable code 
  9. * of these examples may only be distributed in free electronic form, via 
  10. * bulletin board or as part of a fully non-commercial and freely 
  11. * redistributable diskette.  Both the source and executable code (including 
  12. * comments) must be included, without modification, in any copy.  This 
  13. * example may not be published in printed form or distributed with any
  14. * commercial product.  However, the programming techniques and support
  15. * routines set forth in these examples may be used in the development
  16. * of original executable software products for Commodore Amiga computers.
  17. * All other rights reserved.
  18. * This example is provided "as-is" and is subject to change; no
  19. * warranties are made.  All use is at your own risk. No liability or
  20. * responsibility is assumed.
  21. *
  22. **********************************************************************
  23. *
  24. * Transfer routine for HP_LaserJet
  25. *
  26. **********************************************************************
  27.  
  28.         INCLUDE "exec/types.i"
  29.  
  30.         INCLUDE "intuition/intuition.i"
  31.         INCLUDE "devices/printer.i"
  32.         INCLUDE "devices/prtbase.i"
  33.         INCLUDE "devices/prtgfx.i"
  34.  
  35.         XREF    _PD
  36.  
  37.         XDEF    _Transfer
  38.  
  39.         SECTION         printer,CODE
  40. _Transfer:
  41. ; Transfer(PInfo, y, ptr)
  42. ; struct PrtInfo *PInfo         4-7
  43. ; UWORD y;                      8-11
  44. ; UBYTE *ptr;                   12-15
  45. ;
  46.  
  47.         movem.l d2-d6/a2-a3,-(sp)       ;save regs used
  48.  
  49.         movea.l 32(sp),a0               ;a0 = PInfo
  50.         move.l  36(sp),d0               ;d0 = y
  51.         movea.l 40(sp),a1               ;a1 = ptr
  52.  
  53.         move.w  pi_width(a0),d1         ;d1 = width
  54.         subq.w  #1,d1                   ;adjust for dbra
  55.  
  56.         move.w  pi_threshold(a0),d3     ;d3 = threshold, thresholding?
  57.         beq.s   grey_scale              ;no, grey-scale
  58.  
  59. threshold:
  60. ; a0 - PInfo
  61. ; a1 - ptr
  62. ; d0 - y
  63. ; d1 - width
  64. ; d3 - threshold
  65.  
  66.         eori.b  #15,d3                  ;d3 = dvalue
  67.         movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  68.         move.w  pi_xpos(a0),d2          ;d2 = x
  69.         movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  70.  
  71. ; a0 - sxptr
  72. ; a1 - ptr
  73. ; a2 - ColorInt ptr
  74. ; a3 - dmatrix ptr (NOT USED)
  75. ; d0 - byte to set (x >> 3)
  76. ; d1 - width
  77. ; d2 - x
  78. ; d3 - dvalue
  79. ; d4 - Black
  80. ; d5 - sx
  81. ; d6 - bit to set
  82.  
  83. twidth_loop:
  84.         move.b  PCMBLACK(a2),d4         ;d4 = Black
  85.         addq.l  #ce_SIZEOF,a2           ;advance to next entry
  86.  
  87.         move.w  (a0)+,d5                ;d5 = # of times to use this pixel (sx)
  88.  
  89.         cmp.b   d3,d4                   ;render this pixel?
  90.         ble.s   tsx_end                 ;no, skip to next pixel.
  91.         subq.w  #1,d5                   ;adjust for dbra
  92.  
  93. tsx_render:                             ;yes, render this pixel sx times
  94.         move.w  d2,d0
  95.         lsr.w   #3,d0                   ;compute byte to set
  96.         move.w  d2,d6
  97.         not.w   d6                      ;compute bit to set
  98.         bset.b  d6,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  99.  
  100.         addq.w  #1,d2                   ;x++
  101.         dbra    d5,tsx_render           ;sx--
  102.         dbra    d1,twidth_loop          ;width--
  103.         bra.s   exit                    ;all done
  104.  
  105. tsx_end:
  106.         add.w   d5,d2                   ;x += sx
  107.         dbra    d1,twidth_loop          ;width--
  108.         bra.s   exit
  109.  
  110. grey_scale:
  111. ; a0 - PInfo
  112. ; a1 - ptr
  113. ; d0 - y
  114. ; d1 - width
  115.  
  116.         movea.l pi_ColorInt(a0),a2      ;a2 = ColorInt ptr
  117.         moveq.l #3,d2
  118.         and.w   d0,d2                   ;d2 = y & 3
  119.         lsl.w   #2,d2                   ;d2 = (y & 3) << 2
  120.         movea.l pi_dmatrix(a0),a3       ;a3 = dmatrix
  121.         adda.l  d2,a3                   ;a3 = dmatrix + ((y & 3) << 2)
  122.         move.w  pi_xpos(a0),d2          ;d2 = x
  123.         movea.l pi_ScaleX(a0),a0        ;a0 = ScaleX (sxptr)
  124.  
  125. ; a0 - sxptr
  126. ; a1 - ptr
  127. ; a2 - ColorInt ptr
  128. ; a3 - dmatrix ptr
  129. ; d0 - byte to set (x >> 3)
  130. ; d1 - width
  131. ; d2 - x
  132. ; d3 - dvalue (dmatrix[x & 3])
  133. ; d4 - Black
  134. ; d5 - sx
  135. ; d6 - bit to set
  136.  
  137. gwidth_loop:
  138.         move.b  PCMBLACK(a2),d4         ;d4 = Black
  139.         addq.l  #ce_SIZEOF,a2           ;advance to next entry
  140.  
  141.         move.w  (a0)+,d5                ;d5 = # of times to use this pixel (sx)
  142.         subq.w  #1,d5                   ;adjust for dbra
  143.  
  144. gsx_loop:
  145.         moveq.l #3,d3
  146.         and.w   d2,d3                   ;d3 = x & 3
  147.         move.b  0(a3,d3.w),d3           ;d3 = dmatrix[x & 3]
  148.  
  149.         cmp.b   d3,d4                   ;render this pixel?
  150.         ble.s   gsx_end                 ;no, skip to next pixel.
  151.  
  152.         move.w  d2,d0
  153.         lsr.w   #3,d0                   ;compute byte to set
  154.         move.w  d2,d6
  155.         not.w   d6                      ;compute bit to set
  156.         bset.b  d6,0(a1,d0.w)           ;*(ptr + x >> 3) |= 2 ^ x
  157.  
  158. gsx_end
  159.         addq.w  #1,d2                   ;x++
  160.         dbra    d5,gsx_loop             ;sx--
  161.         dbra    d1,gwidth_loop          ;width--
  162.  
  163. exit:
  164.         movem.l (sp)+,d2-d6/a2-a3       ;restore regs used
  165.         moveq.l #0,d0                   ;flag all ok
  166.         rts                             ;goodbye
  167.  
  168.         END
  169.