1
0
mirror of https://frontier.innolan.net/github/AmigaExamples.git synced 2025-11-23 05:03:06 +00:00
Files
AmigaExamples/025.scroll_text/blit.s
2016-04-01 09:32:43 +11:00

89 lines
2.0 KiB
ArmAsm

include "includes.i"
xdef BlitFillColor
xdef BlitScroll
;; A(mask) B(bob) C(bg) D(dest)
;; - - - -
;; 0 0 0 0
;; 0 0 1 1
;; 0 1 0 0
;; 0 1 1 1
;; 1 0 0 0
;; 1 0 1 0
;; 1 1 0 1
;; 1 1 1 1
BlitFillColor:
;; kills a0,d2,d3,d5,d5
;; a0 - bitplane
;; d0 - color#
;; d1 - height
;; d2 - ypos
;; movem.l d2-d5/a0,-(sp)
mulu.w #BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH,d2
add.l d2,a0
move.b #0,d3 ; bitplane #
.loop:
move.w d1,d4
btst d3,d0 ; is the color's bit set in this plane?
beq .zero
move.w #BLIT_DEST|$FF,d5 ; yes ? all ones
bra .doblit
.zero
move.w #BLIT_DEST|$0,d5 ; no ? all zeros
.doblit
WaitBlitter
move.w #0,BLTCON1(A6)
move.w d5,BLTCON0(A6)
move.w #BITPLANE_WIDTH_BYTES*(SCREEN_BIT_DEPTH-1),BLTDMOD(a6)
move.l a0,BLTDPTH(a6)
lsl.w #6,d4
ori.w #BITPLANE_WIDTH_WORDS,d4
move.w d4,BLTSIZE(a6)
add.b #1,d3
add.w #BITPLANE_WIDTH_BYTES,a0
cmp.b #SCREEN_BIT_DEPTH,d3 ; all planes for a single line done ?
bne .loop ; no ? do the next plane
;; movem.l (sp)+,d2-d5/a0
rts
BlitScroll:
;; kills a0,d1,d2
;; a0 - bitplane
;; d1 - height
;; d2 - ypos
;; movem.l d2-d5/a0,-(sp)
add.l d1,d2 ;point to end of data for ascending mode
mulu.w #BITPLANE_WIDTH_BYTES*SCREEN_BIT_DEPTH,d2
add.l d2,a0
WaitBlitter
move.w #$1002,BLTCON1(a6)
move.w #$1000|BLIT_SRCB|BLIT_SRCC|BLIT_DEST|$ca,BLTCON0(a6)
move.w #$ffff,BLTADAT(a6); preload source mask so only BLTA?WM mask is used
move.w #0,BLTBMOD(a6)
move.w #0,BLTCMOD(a6)
move.w #0,BLTDMOD(a6)
move.l a0,BLTBPTH(a6)
move.l a0,BLTCPTH(a6)
move.l a0,BLTDPTH(a6)
move.w #$0000,BLTAFWM(a6)
move.w #$ffff,BLTALWM(a6)
mulu.w #SCREEN_BIT_DEPTH,d1
lsl.w #6,d1
ori.w #BITPLANE_WIDTH_WORDS,d1
move.w d1,BLTSIZE(a6)
;; movem.l (sp)+,d2-d5/a0
rts