Stencil blitting works on the IIgs!
This commit is contained in:
parent
cd094cf23a
commit
436314f3f8
2 changed files with 11 additions and 123 deletions
|
@ -125,118 +125,6 @@ blitTop ldy source ; Load Y register with source pixel offset
|
|||
end
|
||||
|
||||
|
||||
;----------------------------------------
|
||||
; Blit an 8x8 block with alpha to (almost) anywhere on a surface.
|
||||
;----------------------------------------
|
||||
asmB88ax start
|
||||
|
||||
source equ 1 ; Source Pixels Offset
|
||||
target equ 3 ; Target Pixels Offset
|
||||
mask equ 5 ; Mask Offset
|
||||
t equ 7 ; Temp
|
||||
xc equ 9 ; X Counter
|
||||
yc equ 11 ; Y Counter
|
||||
|
||||
jsubroutine (4:surface,4:tiles,2:sx,2:sy,2:tx,2:ty,2:offset),12
|
||||
using GlobalData
|
||||
|
||||
; Find offset into tile memory
|
||||
lda sx ; Multiply sx by 4 to get offset (two pixels per byte)
|
||||
asl a
|
||||
asl a
|
||||
sta t
|
||||
clc
|
||||
lda sy ; Multiply sy by 16 to get index into scanline table
|
||||
asl a
|
||||
asl a
|
||||
asl a
|
||||
asl a ; y screen location is now in the accumulator
|
||||
tay
|
||||
clc
|
||||
lda ScTable,y ; Load byte offset of y position from table
|
||||
adc t ; Add t to scanline offset
|
||||
sta source ; Offset to start of source pixels
|
||||
|
||||
; Find offset into tile memory for mask data
|
||||
lda offset ; Load offset
|
||||
asl a ; Multiply by 4
|
||||
asl a
|
||||
clc
|
||||
adc source ; Add to source pixel offset
|
||||
sta mask ; Offset to start of mask pixels
|
||||
|
||||
; Divide target horizontal position by two since there are two pixels per byte
|
||||
lda tx ; Load X target position into accumulator
|
||||
lsr a ; Shift Right - divide by 2
|
||||
clc
|
||||
sta tx ; Store it back into tx
|
||||
|
||||
; Find offset into target surface memory
|
||||
lda ty ; Load ty to get index into scanline table
|
||||
asl a ; Multiply by two to get offset into scanline table (two bytes per entry in table)
|
||||
tay
|
||||
lda ScTable,y ; Load byte offset of y position from table
|
||||
adc tx ; Add x position to scanline offset
|
||||
sta target ; Offset to start of target pixels
|
||||
|
||||
lda #0 ; Load 0 into X and Y counters
|
||||
sta xc
|
||||
sta yc
|
||||
|
||||
blitTop ldy target ; Load Y register with target pixel offset
|
||||
lda [surface],y ; Load target pixels
|
||||
ldy mask ; Load Y register with mask pixel offset
|
||||
and [tiles],y ; AND with mask
|
||||
ldy source ; Load Y register with source pixel offset
|
||||
ora [tiles],y ; OR with source pixels
|
||||
ldy target ; Load Y register with target pixel offset
|
||||
sta [surface],y ; Store 4 pixels into screen
|
||||
|
||||
clc ; Increment to next pixel target quad
|
||||
lda #2
|
||||
adc target
|
||||
sta target
|
||||
clc ; Increment to next pixel source quad
|
||||
lda #2
|
||||
adc source
|
||||
sta source
|
||||
clc ; Increment to next pixel mask quad
|
||||
lda #2
|
||||
adc mask
|
||||
sta mask
|
||||
|
||||
clc
|
||||
lda xc ; Increment X counter
|
||||
adc #1
|
||||
sta xc
|
||||
cmp #2 ; End of X pixels?
|
||||
bcc blitTop ; Nope!
|
||||
|
||||
lda #0 ; Reset X counter
|
||||
sta xc
|
||||
clc ; Increment target offset
|
||||
lda #156
|
||||
adc target
|
||||
sta target
|
||||
clc ; Increment source offset
|
||||
lda #156
|
||||
adc source
|
||||
sta source
|
||||
clc ; Increment mask offset
|
||||
lda #156
|
||||
adc mask
|
||||
sta mask
|
||||
clc
|
||||
lda yc ; Increment Y counter
|
||||
adc #1
|
||||
sta yc
|
||||
cmp #8 ; End of Y pixels?
|
||||
bcc blitTop ; Nope!
|
||||
|
||||
jreturn
|
||||
end
|
||||
|
||||
|
||||
;----------------------------------------
|
||||
; Blit an 8x8 block with stencil to (almost) anywhere on a surface.
|
||||
;----------------------------------------
|
||||
|
@ -285,9 +173,6 @@ maskW equ 15 ; Actual mask bytes for pixels
|
|||
adc tx ; Add x position to scanline offset
|
||||
sta target ; Offset to start of target pixels
|
||||
|
||||
|
||||
brk
|
||||
|
||||
; Find starting stencil byte
|
||||
clc
|
||||
lda sy ; Vertical cell position
|
||||
|
@ -307,19 +192,21 @@ stenTop ldy stenO ; Load byte at stencil offset
|
|||
xba ; Shift it into the high byte
|
||||
sta stenB ; Put it in to the stencil byte
|
||||
|
||||
|
||||
; Convert stencil byte to mask word (4 pixels)
|
||||
blitTop ldx #4 ; How many pixels to process?
|
||||
lda #0 ; Initially, the mask word is all zero bits
|
||||
lda #$ffff ; Initially, the mask word is all one bits
|
||||
sta maskW
|
||||
nextNib lda stenB ; Load stencil byte into accumulator
|
||||
asl a ; Shift first bit out of stencil byte into C
|
||||
bcs pixOn ; If C is set, we draw the pixel
|
||||
sta stenB ; Update stencil byte
|
||||
bcc pixOn ; If C is clear, we draw the pixel (opposite of the mask data)
|
||||
lda maskW ; Load mask word into accumulator
|
||||
asl a ; Shift mask word over a pixel (4 bits)
|
||||
asl a
|
||||
asl a
|
||||
asl a
|
||||
and #$fff0 ; Do not draw pixel - mask it off
|
||||
; or #$0000 ; Do not draw pixel - mask it off
|
||||
sta maskW ; Store updated mask word
|
||||
jmp nextPix ; Start next pixel
|
||||
pixOn lda maskW ; Load mask word into accumulator
|
||||
|
@ -327,15 +214,16 @@ pixOn lda maskW ; Load mask word into accumulator
|
|||
asl a
|
||||
asl a
|
||||
asl a
|
||||
and #$ffff ; Draw pixel
|
||||
ora #$000f ; Draw pixel
|
||||
sta maskW ; Store updated mask word
|
||||
nextPix dex ; Decrement pixel counter in X
|
||||
bne nextNib ; Not zero? Do next nibble/pixel
|
||||
|
||||
; Draw four pixels
|
||||
lda maskW ; Load mask word
|
||||
xba ; Flip MSB and LSB
|
||||
ldy target ; Load Y register with target pixel offset
|
||||
lda [surface],y ; Load target pixels
|
||||
and maskW ; AND with mask word
|
||||
and [surface],y ; AND target pixels with mask word
|
||||
ldy source ; Load Y register with source pixel offset
|
||||
ora [tiles],y ; OR with source pixels
|
||||
ldy target ; Load Y register with target pixel offset
|
||||
|
@ -368,7 +256,7 @@ nextPix dex ; Decrement pixel counter in X
|
|||
adc source
|
||||
sta source
|
||||
clc ; Increment stencil mask offset
|
||||
lda #39
|
||||
lda #40
|
||||
adc stenO
|
||||
sta stenO
|
||||
clc
|
||||
|
|
|
@ -333,7 +333,7 @@ extern void asmPoint(jlSurfaceT target, jint16 color, jint16 x, jint16 y);
|
|||
|
||||
// Inlined functions
|
||||
#define jlDrawBlit8x8(source, cx1, cy1, cx2, cy2) asmB88(_jlDrawTargetActual, source, cx1, cy1, cx2, cy2)
|
||||
#define jlDrawBlit8x8a(source, stencil, cx1, cy1, cx2, cy2) asmB88a(_jlDrawTargetActual, source, (byte *)stencil, cx1, cy1, cx2, cy2)
|
||||
#define jlDrawBlit8x8a(source, stencil, cx1, cy1, cx2, cy2) asmB88a(_jlDrawTargetActual, source, (byte *)stencil->pixels, cx1, cy1, cx2, cy2)
|
||||
#define jlDrawBlitMap(startX, startY, width, height, mapData, stride, source) asmDrawBM(_jlDrawTargetActual, startX, startY, width, height, (byte *)mapData, stride, source)
|
||||
#define jlDrawPixelGet(x, y) asmGetPoint(_jlDrawTargetActual, x, y)
|
||||
#define jlDrawPixelSet(x, y) asmPoint(_jlDrawTargetActual, _jlDrawColorNibbles, x, y)
|
||||
|
|
Loading…
Add table
Reference in a new issue