home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / apilot.lha / APilot / APilot_Ser / hline.asm < prev    next >
Encoding:
Assembly Source File  |  1994-12-03  |  3.5 KB  |  167 lines

  1. **************************************************************
  2. *
  3. * hline.asm -- Draws horizontal lines
  4. *
  5. *----------------------------------------------------- -------
  6. * Authors:  Casper Gripenberg  (casper@alpha.hut.fi)
  7. *           Kjetil Jacobsen  (kjetilja@stud.cs.uit.no)  
  8. *
  9. * void HorizontalLine (register __a0 PLANEPTR bpl,
  10. *               register __d2 int x,
  11. *               register __d1 int y,
  12. *               register __d3 int length,
  13. *               register __d4 int onoff)
  14. *
  15. *
  16.  
  17.     XDEF    _HorizontalLine
  18.     XREF    _pixelbyterow        ; row-offsets, given in LONG
  19.     
  20.  
  21.     SECTION    TEXT,CODE
  22.  
  23. _HorizontalLine
  24.  
  25.     movem.l    d1-d4/a1,-(sp)
  26.  
  27.     tst.l    d1            ; For some odd reason, negative numbers appears
  28.     blt    .word_end        ; in d1 while initing...This should fix this.    
  29.  
  30.     lea    _pixelbyterow(a4),a1    ; Much faster than mulu
  31.     add.l    (a1,d1.w*4),a0
  32.  
  33.     cmp.w    #15,d3            ; Size < 16, do special case
  34.     ble    Less
  35.  
  36.     move.l    d2,d0
  37.     lsr.w    #4,d0
  38.     lsl.w    #1,d0
  39.     add.l    d0,a0                  ; Number of bytes to the right
  40.  
  41.     lsl.w    #3,d0
  42.     sub.w    d0,d2            ; Number of bits to the right
  43.  
  44.     tst.w    d4
  45.     beq    .word_clear        ; Check if we want to clear
  46.  
  47.     * Set bits
  48.  
  49.     lea    Firstword(a4),a1    ; Set first bits (initial word)
  50.     moveq    #16,d4
  51.     sub.w    d2,d4
  52.     move.w    (a1,d2.w*2),d0
  53.     sub.w    d4,d3            ; Decrease number of bits
  54.     or.w    d0,(a0)+
  55.  
  56. .word_setloop
  57.     cmp.w    #16,d3
  58.     blt    .word_setlast
  59.     move.w    #$ffff,(a0)+        ; Don't really need or, just bang 'em in.
  60.     sub    #16,d3
  61.     bra    .word_setloop
  62.  
  63. .word_setlast
  64.     lea    Lastword(a4),a1        ; Set last bits
  65.     move.w    (a1,d3.w*2),d0
  66.     or.w    d0,(a0)
  67. .word_end
  68.     movem.l    (sp)+,a1/d1-d4
  69.     rts
  70.  
  71.     * Do (basically) the same procedure as setting when clearing bits
  72.  
  73. .word_clear
  74.     lea    Lastword(a4),a1        ; Clear first bits (initial word)
  75.     moveq    #16,d4
  76.     sub.w    d2,d4
  77.     move.w    (a1,d2.w*2),d0
  78.     sub.w    d4,d3            ; Decrease number of bits
  79.     and.w    d0,(a0)+
  80.  
  81. .word_clrloop
  82.     cmp.w    #16,d3
  83.     blt    .word_clrlast
  84.     clr.w    (a0)+
  85.     sub    #16,d3
  86.     bra    .word_clrloop
  87.  
  88. .word_clrlast
  89.     lea    Firstword(a4),a1    ; Clear last bits
  90.     move.w    (a1,d3.w*2),d0
  91.     and.w    d0,(a0)
  92.     movem.l    (sp)+,a1/d1-d4
  93.     rts
  94.  
  95. *
  96. *    Do the same with length less than 16
  97. *
  98.  
  99. Less    move.l    d2,d0
  100.     lsr.w    #4,d0
  101.     lsl.w    #1,d0
  102.     add.l    d0,a0                  ; Number of bytes to the right
  103.  
  104.     lsl.w    #3,d0
  105.     moveq    #32,d1    
  106.     sub.w    d0,d2            ; Number of bits to the right
  107.     move.w    #$ffff,d0
  108.     sub.w    d3,d1
  109.     lsl.l    d1,d0            ; Shift size
  110.     lsr.l    d2,d0            ; Shift offset
  111.  
  112.     tst.b    d4
  113.     beq    .less_clear        ; Check for clear
  114.  
  115.     or.l    d0,(a0)
  116.     movem.l    (sp)+,a1/d1-d4
  117.     rts
  118.  
  119. .less_clear
  120.     eor.l    d0,(a0)
  121.     movem.l    (sp)+,a1/d1-d4
  122.     rts    
  123.  
  124. *
  125. *    Local variables, used to lookup some bits
  126. *
  127.  
  128.     SECTION __MERGED,DATA
  129.  
  130. Firstword
  131.     dc.w    $ffff    ; %1111111111111111
  132.     dc.w    $7fff    ; %0111111111111111
  133.     dc.w    $3fff    ; %0011111111111111
  134.     dc.w    $1fff    ; %0001111111111111
  135.     dc.w    $0fff    ; %0000111111111111
  136.     dc.w    $07ff    ; %0000011111111111
  137.     dc.w    $03ff    ; %0000001111111111
  138.     dc.w    $01ff    ; %0000000111111111
  139.     dc.w    $00ff    ; %0000000011111111
  140.     dc.w    $007f    ; %0000000001111111
  141.     dc.w    $003f    ; %0000000000111111
  142.     dc.w    $001f    ; %0000000000011111
  143.     dc.w    $000f    ; %0000000000001111
  144.     dc.w    $0007    ; %0000000000000111
  145.     dc.w    $0003    ; %0000000000000011
  146.     dc.w    $0001    ; %0000000000000001
  147.  
  148. Lastword
  149.     dc.w    $0000    ; %0000000000000000
  150.     dc.w    $8000    ; %1000000000000000
  151.     dc.w    $c000    ; %1100000000000000
  152.     dc.w    $e000    ; %1110000000000000
  153.     dc.w    $f000    ; %1111000000000000
  154.     dc.w    $f800    ; %1111100000000000
  155.     dc.w    $fc00    ; %1111110000000000
  156.     dc.w    $fe00    ; %1111111000000000
  157.     dc.w    $ff00    ; %1111111100000000
  158.     dc.w    $ff80    ; %1111111110000000
  159.     dc.w    $ffc0    ; %1111111111000000
  160.     dc.w    $ffe0    ; %1111111111100000
  161.     dc.w    $fff0    ; %1111111111110000
  162.     dc.w    $fff8    ; %1111111111111000
  163.     dc.w    $fffc    ; %1111111111111100
  164.     dc.w    $fffe    ; %1111111111111110
  165.  
  166.     END
  167.