home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD v1.2 / amidev_cd_12.iso / reference_library / hardware / hard_examples / simpleline.asm < prev    next >
Assembly Source File  |  1992-08-20  |  4KB  |  107 lines

  1. ;
  2. ; simpleline.asm
  3. ;
  4. ;   This example uses the line draw mode of the blitter
  5. ;   to draw a line.  The line is drawn with no pattern
  6. ;   and a simple `or' blit into a single bitplane.
  7. ;   (Link with amiga.lib)
  8. ;
  9. ;   Input:  d0=x1 d1=y1 d2=x2 d3=y2 d4=width a0=aptr
  10. ;
  11.         include 'exec/types.i'
  12.         include 'hardware/custom.i'
  13.         include 'hardware/blit.i'
  14.         include 'hardware/dmabits.i'
  15.  
  16.         include 'hardware/hw_examples.i'
  17. ;
  18.         xref    _custom
  19. ;
  20.         xdef    simpleline
  21. ;
  22. ;   Our entry point.
  23. ;
  24. simpleline:
  25.         lea     _custom,a1      ; snarf up the custom address register
  26.         sub.w   d0,d2           ; calculate dx
  27.         bmi     xneg            ; if negative, octant is one of [3,4,5,6]
  28.         sub.w   d1,d3           ; calculate dy   ''   is one of [1,2,7,8]
  29.         bmi     yneg            ; if negative, octant is one of [7,8]
  30.         cmp.w   d3,d2           ; cmp |dx|,|dy|  ''   is one of [1,2]
  31.         bmi     ygtx            ; if y>x, octant is 2
  32.         moveq.l #OCTANT1+LINEMODE,d5    ; otherwise octant is 1
  33.         bra     lineagain       ; go to the common section
  34. ygtx:
  35.         exg     d2,d3           ; X must be greater than Y
  36.         moveq.l #OCTANT2+LINEMODE,d5    ; we are in octant 2
  37.         bra     lineagain       ; and common again.
  38. yneg:
  39.         neg.w   d3              ; calculate abs(dy)
  40.         cmp.w   d3,d2           ; cmp |dx|,|dy|, octant is [7,8]
  41.         bmi     ynygtx          ; if y>x, octant is 7
  42.         moveq.l #OCTANT8+LINEMODE,d5    ; otherwise octant is 8
  43.         bra     lineagain
  44. ynygtx:
  45.         exg     d2,d3           ; X must be greater than Y
  46.         moveq.l #OCTANT7+LINEMODE,d5    ; we are in octant 7
  47.         bra     lineagain
  48. xneg:
  49.         neg.w   d2              ; dx was negative! octant is [3,4,5,6]
  50.         sub.w   d1,d3           ; we calculate dy
  51.         bmi     xyneg           ; if negative, octant is one of [5,6]
  52.         cmp.w   d3,d2           ; otherwise it's one of [3,4]
  53.         bmi     xnygtx          ; if y>x, octant is 3
  54.         moveq.l #OCTANT4+LINEMODE,d5    ; otherwise it's 4
  55.         bra     lineagain
  56. xnygtx:
  57.         exg     d2,d3           ; X must be greater than Y
  58.         moveq.l #OCTANT3+LINEMODE,d5    ; we are in octant 3
  59.         bra     lineagain
  60. xyneg:
  61.         neg.w   d3              ; y was negative, in one of [5,6]
  62.         cmp.w   d3,d2           ; is y>x?
  63.         bmi     xynygtx         ; if so, octant is 6
  64.         moveq.l #OCTANT5+LINEMODE,d5    ; otherwise, octant is 5
  65.         bra     lineagain
  66. xynygtx:
  67.         exg     d2,d3           ; X must be greater than Y
  68.         moveq.l #OCTANT6+LINEMODE,d5    ; we are in octant 6
  69. lineagain:
  70.         mulu.w  d4,d1           ; Calculate y1 * width
  71.         ror.l   #4,d0           ; move upper four bits into hi word
  72.         add.w   d0,d0           ; multiply by 2
  73.         add.l   d1,a0           ; ptr += (x1 >> 3)
  74.         add.w   d0,a0           ; ptr += y1 * width
  75.         swap    d0              ; get the four bits of x1
  76.         or.w    #$BFA,d0        ; or with USEA, USEC, USED, F=A+C
  77.         lsl.w   #2,d3           ; Y = 4 * Y
  78.         add.w   d2,d2           ; X = 2 * X
  79.         move.w  d2,d1           ; set up size word
  80.         lsl.w   #5,d1           ; shift five left
  81.         add.w   #$42,d1         ; and add 1 to height, 2 to width
  82.         btst    #DMAB_BLTDONE-8,DMACONR(a1)     ; safety check
  83. waitblit:
  84.         btst    #DMAB_BLTDONE-8,DMACONR(a1)     ; wait for blitter
  85.         bne     waitblit
  86.         move.w  d3,BLTBMOD(a1)  ; B mod = 4 * Y
  87.         sub.w   d2,d3
  88.         ext.l   d3
  89.         move.l  d3,BLTAPT(a1)   ; A ptr = 4 * Y - 2 * X
  90.         bpl     lineover        ; if negative,
  91.         or.w    #SIGNFLAG,d5    ; set sign bit in con1
  92. lineover:
  93.         move.w  d0,BLTCON0(a1)  ; write control registers
  94.         move.w  d5,BLTCON1(a1)
  95.         move.w  d4,BLTCMOD(a1)  ; C mod = bitplane width
  96.         move.w  d4,BLTDMOD(a1)  ; D mod = bitplane width
  97.         sub.w   d2,d3
  98.         move.w  d3,BLTAMOD(a1)  ; A mod = 4 * Y - 4 * X
  99.         move.w  #$8000,BLTADAT(a1)      ; A data = 0x8000
  100.         moveq.l #-1,d5          ; Set masks to all ones
  101.         move.l  d5,BLTAFWM(a1)  ; we can hit both masks at once
  102.         move.l  a0,BLTCPT(a1)   ; Pointer to first pixel to set
  103.         move.l  a0,BLTDPT(a1)
  104.         move.w  d1,BLTSIZE(a1)  ; Start blit
  105.         rts                     ; and return, blit still in progress.
  106.         end
  107.