home *** CD-ROM | disk | FTP | other *** search
- ;
- ; rotatebits.asm
- ;
- ; Here we rotate bits. This code takes a single raster row of a
- ; bitplane, and `rotates' it into an array of 16-bit words, setting
- ; the specified bit of each word in the array according to the
- ; corresponding bit in the raster row. We use the line mode in
- ; conjunction with patterns to do this magic. Link this code with amiga.lib.
- ;
- ; Input: d0 contains the number of words in the raster row. d1
- ; contains the number of the bit to set (0..15). a0 contains a
- ; pointer to the raster data, and a1 contains a pointer to the
- ; array we are filling; the array must be at least (d0)*16 words
- ; (or (d0)*32 bytes) long.
- ;
- ;
- include 'exec/types.i'
- include 'hardware/custom.i'
- include 'hardware/blit.i'
- include 'hardware/dmabits.i'
-
- include 'hardware/hw_examples.i'
- ;
- xref _custom
- ;
- xdef rotatebits
- ;
- ;
- ; Our entry point.
- ;
- rotatebits:
- lea _custom,a2 ; We need to access the custom registers
- tst d0 ; if no words, just return
- beq gone
- lea DMACONR(a2),a3 ; get the address of dmaconr
- moveq.l #DMAB_BLTDONE-8,d2 ; get the bit number BLTDONE
- btst d2,(a3) ; check to see if we're done
- wait1:
- btst d2,(a3) ; check again.
- bne wait1 ; not done? Keep waiting
- moveq.l #-30,d3 ; Line mode: aptr = 4Y-2X, Y=0; X=15
- move.l d3,BLTAPT(a2)
- move.w #-60,BLTAMOD(a2) ; amod = 4Y-4X
- clr.w BLTBMOD(a2) ; bmod = 4Y
- move.w #2,BLTCMOD(a2) ; cmod = width of bitmap (2)
- move.w #2,BLTDMOD(a2) ; ditto
- ror.w #4,d1 ; grab the four bits of the bit number
- and.w #$f000,d1 ; mask them out
- or.w #$bca,d1 ; USEA, USEC, USED, F=AB+~AC
- move.w d1,BLTCON0(a2) ; stuff it
- move.w #$f049,BLTCON1(a2) ; BSH=15, SGN, LINE
- move.w #$8000,BLTADAT(a2) ; Initialize A dat for line
- move.w #$ffff,BLTAFWM(a2) ; Initialize masks
- move.w #$ffff,BLTALWM(a2)
- move.l a1,BLTCPT(a2) ; Initialize pointer
- move.l a1,BLTDPT(a2)
- lea BLTBDAT(a2),a4 ; For quick access, we grab these two
- lea BLTSIZE(a2),a5 ; addresses
- move.w #$402,d1 ; Stuff bltsize; width=2, height=16
- move.w (a0)+,d3 ; Get next word
- bra inloop ; Go into the loop
- again:
- move.w (a0)+,d3 ; Grab another word
- btst d2,(a3) ; Check blit done
- wait2:
- btst d2,(a3) ; Check again
- bne wait2 ; oops, not ready, loop around
- inloop:
- move.w d3,(a4) ; stuff new word to make vertical
- move.w d1,(a5) ; start the blit
- subq.w #1,d0 ; is that the last word?
- bne again ; keep going if not
- gone:
- rts
- end
-