; ; 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