Working on new stencil blitter for IIgs.
This commit is contained in:
parent
0be3ee69ba
commit
bfc7dc093e
8 changed files with 222 additions and 88 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -11,3 +11,5 @@ notes.txt
|
||||||
assets/JoeyLib Logo - 320x200.png
|
assets/JoeyLib Logo - 320x200.png
|
||||||
assets/JoeyLib Logo.jpg
|
assets/JoeyLib Logo.jpg
|
||||||
assets/JoeyLib Logo.png
|
assets/JoeyLib Logo.png
|
||||||
|
*.stn
|
||||||
|
*.img
|
||||||
|
|
|
@ -97,7 +97,7 @@ void convertStencil(char *filename, char *basename) {
|
||||||
for (int y=0; y<image->h; y++) {
|
for (int y=0; y<image->h; y++) {
|
||||||
for (int x=0; x<image->w; x++) {
|
for (int x=0; x<image->w; x++) {
|
||||||
data <<= 1;
|
data <<= 1;
|
||||||
data |= (getPixel(image, x, y) == 0);
|
data |= (getPixel(image, x, y) != 0);
|
||||||
bits++;
|
bits++;
|
||||||
if (bits > 7) {
|
if (bits > 7) {
|
||||||
bytes++;
|
bytes++;
|
||||||
|
|
|
@ -99,8 +99,9 @@ function doIIgsBuild() {
|
||||||
rm "${IMPORT}" 2> /dev/null || true
|
rm "${IMPORT}" 2> /dev/null || true
|
||||||
|
|
||||||
cp "${OUT}/test" "${OUT}/Test#B30000"
|
cp "${OUT}/test" "${OUT}/Test#B30000"
|
||||||
cp "${JOEY}/joeylib/joeylib/src/kanga.sta" "${OUT}/kanga.sta#060000"
|
cp "${JOEY}/joeylib/joeylib/src/kanga.img" "${OUT}/kanga.img#060000"
|
||||||
cp "${JOEY}/joeylib/joeylib/src/font.sta" "${OUT}/font.sta#060000"
|
cp "${JOEY}/joeylib/joeylib/src/font.img" "${OUT}/font.img#060000"
|
||||||
|
cp "${JOEY}/joeylib/joeylib/src/font.stn" "${OUT}/font.stn#060000"
|
||||||
cp "${JOEY}/joeylib/joeylib/src/music" "${OUT}/music#D50000"
|
cp "${JOEY}/joeylib/joeylib/src/music" "${OUT}/music#D50000"
|
||||||
cp "${JOEY}/joeylib/joeylib/src/music.w" "${OUT}/music.w#060000"
|
cp "${JOEY}/joeylib/joeylib/src/music.w" "${OUT}/music.w#060000"
|
||||||
|
|
||||||
|
@ -108,8 +109,9 @@ function doIIgsBuild() {
|
||||||
"${CADIUS}" createfolder "${IMPORT}" ${VOL}/data > /dev/null
|
"${CADIUS}" createfolder "${IMPORT}" ${VOL}/data > /dev/null
|
||||||
"${CADIUS}" addfile "${IMPORT}" ${VOL} "${JOEY}/dist/IIgs/Tool221#ba0000" > /dev/null
|
"${CADIUS}" addfile "${IMPORT}" ${VOL} "${JOEY}/dist/IIgs/Tool221#ba0000" > /dev/null
|
||||||
"${CADIUS}" addfile "${IMPORT}" ${VOL} "${OUT}/Test#b30000" > /dev/null
|
"${CADIUS}" addfile "${IMPORT}" ${VOL} "${OUT}/Test#b30000" > /dev/null
|
||||||
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/kanga.sta#060000" > /dev/null
|
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/kanga.img#060000" > /dev/null
|
||||||
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/font.sta#060000" > /dev/null
|
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/font.img#060000" > /dev/null
|
||||||
|
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/font.stn#060000" > /dev/null
|
||||||
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/music#D50000" > /dev/null
|
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/music#D50000" > /dev/null
|
||||||
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/music.w#060000" > /dev/null
|
"${CADIUS}" addfile "${IMPORT}" ${VOL}/data "${OUT}/music.w#060000" > /dev/null
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
|
|
||||||
|
|
||||||
GlobalData data
|
GlobalData data
|
||||||
ScanTable entry
|
ScTable ds 400 ; 400 bytes for 200 scanline offsets
|
||||||
ds 400 ; 400 bytes for scanline offsets
|
StTable ds 50 ; 50 bytes for 25 stencil table offsets
|
||||||
VblRate ds 2 ; Either 5 or 6 depending on PAL or NTSC.
|
VblRate ds 2 ; Either 5 or 6 depending on PAL or NTSC.
|
||||||
VblTime ds 2 ; Integer Counter
|
VblTime ds 2 ; Integer Counter
|
||||||
end
|
end
|
||||||
|
@ -61,7 +61,7 @@ yc equ 9 ; Y Counter
|
||||||
asl a ; y screen location is now in the accumulator
|
asl a ; y screen location is now in the accumulator
|
||||||
tay
|
tay
|
||||||
clc
|
clc
|
||||||
lda ScanTable,y ; Load byte offset of y position from table
|
lda ScTable,y ; Load byte offset of y position from table
|
||||||
adc t ; Add t to scanline offset
|
adc t ; Add t to scanline offset
|
||||||
sta source ; Offset to start of source pixels
|
sta source ; Offset to start of source pixels
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ yc equ 9 ; Y Counter
|
||||||
lda ty ; Load ty to get index into scanline table
|
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)
|
asl a ; Multiply by two to get offset into scanline table (two bytes per entry in table)
|
||||||
tay
|
tay
|
||||||
lda ScanTable,y ; Load byte offset of y position from table
|
lda ScTable,y ; Load byte offset of y position from table
|
||||||
adc tx ; Add x position to scanline offset
|
adc tx ; Add x position to scanline offset
|
||||||
sta target ; Offset to start of target pixels
|
sta target ; Offset to start of target pixels
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ blitTop ldy source ; Load Y register with source pixel offset
|
||||||
;----------------------------------------
|
;----------------------------------------
|
||||||
; Blit an 8x8 block with alpha to (almost) anywhere on a surface.
|
; Blit an 8x8 block with alpha to (almost) anywhere on a surface.
|
||||||
;----------------------------------------
|
;----------------------------------------
|
||||||
asmB88a start
|
asmB88ax start
|
||||||
|
|
||||||
source equ 1 ; Source Pixels Offset
|
source equ 1 ; Source Pixels Offset
|
||||||
target equ 3 ; Target Pixels Offset
|
target equ 3 ; Target Pixels Offset
|
||||||
|
@ -153,7 +153,7 @@ yc equ 11 ; Y Counter
|
||||||
asl a ; y screen location is now in the accumulator
|
asl a ; y screen location is now in the accumulator
|
||||||
tay
|
tay
|
||||||
clc
|
clc
|
||||||
lda ScanTable,y ; Load byte offset of y position from table
|
lda ScTable,y ; Load byte offset of y position from table
|
||||||
adc t ; Add t to scanline offset
|
adc t ; Add t to scanline offset
|
||||||
sta source ; Offset to start of source pixels
|
sta source ; Offset to start of source pixels
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ yc equ 11 ; Y Counter
|
||||||
lda ty ; Load ty to get index into scanline table
|
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)
|
asl a ; Multiply by two to get offset into scanline table (two bytes per entry in table)
|
||||||
tay
|
tay
|
||||||
lda ScanTable,y ; Load byte offset of y position from table
|
lda ScTable,y ; Load byte offset of y position from table
|
||||||
adc tx ; Add x position to scanline offset
|
adc tx ; Add x position to scanline offset
|
||||||
sta target ; Offset to start of target pixels
|
sta target ; Offset to start of target pixels
|
||||||
|
|
||||||
|
@ -237,6 +237,150 @@ blitTop ldy target ; Load Y register with target pixel offset
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
;----------------------------------------
|
||||||
|
; Blit an 8x8 block with stencil to (almost) anywhere on a surface.
|
||||||
|
;----------------------------------------
|
||||||
|
asmB88a start
|
||||||
|
|
||||||
|
source equ 1 ; Source Pixels Offset
|
||||||
|
target equ 3 ; Target Pixels Offset
|
||||||
|
t equ 5 ; Temp
|
||||||
|
xc equ 7 ; X Counter
|
||||||
|
yc equ 9 ; Y Counter
|
||||||
|
stenO equ 11 ; Stencil Buffer Offset
|
||||||
|
stenB equ 12 ; Stencil Buffer Data - bits - two bytes, but we only use one
|
||||||
|
maskW equ 14 ; Actual mask bytes for pixels
|
||||||
|
|
||||||
|
jsubroutine (4:surface,4:tiles,4:stencil,2:sx,2:sy,2:tx,2:ty),16
|
||||||
|
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
|
||||||
|
|
||||||
|
; 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
|
||||||
|
|
||||||
|
; Find starting stencil byte
|
||||||
|
clc
|
||||||
|
ldy ty ; Vertical cell position
|
||||||
|
lda StTable,y ; Load offset location of start of this row in the stencil buffer
|
||||||
|
adc tx ; Add x position to address offset
|
||||||
|
sta stenO ; Offset to start of mask data
|
||||||
|
|
||||||
|
|
||||||
|
lda #0 ; Load 0 into X and Y counters
|
||||||
|
sta xc
|
||||||
|
sta yc
|
||||||
|
|
||||||
|
blitTop lda [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)
|
||||||
|
ldx #4 ; How many pixels to process?
|
||||||
|
lda #0 ; Initially, the mask word is all zero 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
|
||||||
|
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
|
||||||
|
sta maskW ; Store updated mask word
|
||||||
|
jmp nextPix ; Start next pixel
|
||||||
|
pixOn lda maskW ; Load mask word into accumulator
|
||||||
|
asl a ; Shift mask word over a pixel (4 bits)
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
and #$ffff ; 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
|
||||||
|
ldy target ; Load Y register with target pixel offset
|
||||||
|
lda [surface],y ; Load target pixels
|
||||||
|
and maskW ; AND 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
|
||||||
|
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 stencil byte
|
||||||
|
lda #1
|
||||||
|
adc stenO
|
||||||
|
sta stenO
|
||||||
|
|
||||||
|
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 stencil mask offset
|
||||||
|
lda #39
|
||||||
|
adc stenO
|
||||||
|
sta stenO
|
||||||
|
clc
|
||||||
|
lda yc ; Increment Y counter
|
||||||
|
adc #1
|
||||||
|
sta yc
|
||||||
|
cmp #8 ; End of Y pixels?
|
||||||
|
bcs blitDone ; Yep!
|
||||||
|
brl blitTop ; Back for more
|
||||||
|
|
||||||
|
blitDone jreturn
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
;----------------------------------------
|
;----------------------------------------
|
||||||
; Set Border Color
|
; Set Border Color
|
||||||
;----------------------------------------
|
;----------------------------------------
|
||||||
|
@ -879,7 +1023,7 @@ temp1 equ 1
|
||||||
lda Yp ; Load accumulator with Y location
|
lda Yp ; Load accumulator with Y location
|
||||||
asl a ; Shift accumulator left (multiply by 2) for word offset into table
|
asl a ; Shift accumulator left (multiply by 2) for word offset into table
|
||||||
tay ; Transfer accumulator to y register
|
tay ; Transfer accumulator to y register
|
||||||
lda ScanTable,y ; Look up scan line address offset
|
lda ScTable,y ; Look up scan line address offset
|
||||||
sta temp1 ; Store accumulator (row offset into SHR memory) into temp1
|
sta temp1 ; Store accumulator (row offset into SHR memory) into temp1
|
||||||
clc ; Clear carry flag
|
clc ; Clear carry flag
|
||||||
lda Xp ; Place X position in accumulator
|
lda Xp ; Place X position in accumulator
|
||||||
|
@ -1100,7 +1244,7 @@ PBoth sta temp3 ; Store accumulator in temp3
|
||||||
lda Yp ; Load accumulator with Y location
|
lda Yp ; Load accumulator with Y location
|
||||||
asl a ; Shift accumulator left (multiply by 2)
|
asl a ; Shift accumulator left (multiply by 2)
|
||||||
tay ; Transfer accumulator to y register
|
tay ; Transfer accumulator to y register
|
||||||
lda ScanTable,y ; Look up scan line address offset
|
lda ScTable,y ; Look up scan line address offset
|
||||||
adc temp1 ; Add X position to address with carry
|
adc temp1 ; Add X position to address with carry
|
||||||
tay ; Transfer accumulator to y
|
tay ; Transfer accumulator to y
|
||||||
|
|
||||||
|
@ -1348,13 +1492,24 @@ asmStart start
|
||||||
ldy #0 ; Load 0 into y register
|
ldy #0 ; Load 0 into y register
|
||||||
lda #0 ; Load 0 into accumulator
|
lda #0 ; Load 0 into accumulator
|
||||||
clc ; Clear carry flag
|
clc ; Clear carry flag
|
||||||
buildTable anop
|
tScan anop
|
||||||
sta ScanTable,y ; Store accumulator in ScanTable+x
|
sta ScTable,y ; Store accumulator in ScTable+x
|
||||||
adc #160 ; Add 160 to accumulator
|
adc #160 ; Add 160 to accumulator (320 pixels / 2 pixels per byte)
|
||||||
iny ; Increment y
|
iny ; Increment y
|
||||||
iny ; Increment y
|
iny ; Increment y
|
||||||
cpy #400 ; Compare y to 400 (200 scanlines)
|
cpy #400 ; Compare y to 400 (200 scanlines)
|
||||||
bcc buildTable ; Repeat Scan Table Loop until we do all 200 lines
|
bcc tScan ; Repeat Scan Table Loop until we do all 200 lines
|
||||||
|
|
||||||
|
ldy #0 ; Load 0 into y register
|
||||||
|
lda #0 ; Load 0 into accumulator
|
||||||
|
clc ; Clear carry flag
|
||||||
|
tSten anop
|
||||||
|
sta StTable,y ; Store accumulator in StencilTable+x
|
||||||
|
adc #320 ; Add 320 to accumulator (8 lines * 40 bytes)
|
||||||
|
iny ; Increment y
|
||||||
|
iny ; Increment y
|
||||||
|
cpy #50 ; Compare y to 50 (25 stencil cell offsets)
|
||||||
|
bcc tSten ; Repeat Stencil Table Loop until we do all 25 cells
|
||||||
|
|
||||||
lda hertz ; Store refresh rate / 10 in VblCount and VblRate
|
lda hertz ; Store refresh rate / 10 in VblCount and VblRate
|
||||||
sta >VblRate
|
sta >VblRate
|
||||||
|
|
|
@ -156,6 +156,29 @@ bool jlGameGetButton(byte which) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool _jlImgCreate(jlImgT **img) {
|
||||||
|
jlImgT *t = (jlImgT *)jlMalloc(sizeof(jlImgT));
|
||||||
|
if (t != NULL) {
|
||||||
|
memset(t, 0, sizeof(jlImgT));
|
||||||
|
t->id[0] = 'I';
|
||||||
|
t->id[1] = 'M';
|
||||||
|
t->id[2] = 'G';
|
||||||
|
t->version = 0;
|
||||||
|
memcpy(t->palette, SHRCOLORS, sizeof(t->palette));
|
||||||
|
memcpy(t->pixels, SHRPIXELS, sizeof(t->pixels));
|
||||||
|
*img = t;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void jlImgDisplay(jlImgT *img) {
|
||||||
|
memcpy(SHRCOLORS, img->palette, sizeof(img->palette));
|
||||||
|
memcpy(SHRPIXELS, img->pixels, sizeof(img->pixels));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
char _jlKeyCheck(char key) {
|
char _jlKeyCheck(char key) {
|
||||||
if ((key < 8) || (key > 127)) {
|
if ((key < 8) || (key > 127)) {
|
||||||
key = 0;
|
key = 0;
|
||||||
|
@ -206,8 +229,8 @@ void jlPaletteSet(byte index, byte r, byte g, byte b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void jlPaletteSetFromSta(jlStaT *sta) {
|
void jlPaletteSetFromImg(jlImgT *img) {
|
||||||
memcpy(SHRCOLORS, sta->palette, sizeof(sta->palette));
|
memcpy(SHRCOLORS, img->palette, sizeof(img->palette));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -266,29 +289,6 @@ void jlSoundPlay(jlSoundT *sound) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool _jlStaCreate(jlStaT **sta) {
|
|
||||||
jlStaT *t = (jlStaT *)jlMalloc(sizeof(jlStaT));
|
|
||||||
if (t != NULL) {
|
|
||||||
memset(t, 0, sizeof(jlStaT));
|
|
||||||
t->id[0] = 'S';
|
|
||||||
t->id[1] = 'T';
|
|
||||||
t->id[2] = 'A';
|
|
||||||
t->version = 0;
|
|
||||||
memcpy(t->palette, SHRCOLORS, sizeof(t->palette));
|
|
||||||
memcpy(t->pixels, SHRPIXELS, sizeof(t->pixels));
|
|
||||||
*sta = t;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void jlStaDisplay(jlStaT *sta) {
|
|
||||||
memcpy(SHRCOLORS, sta->palette, sizeof(sta->palette));
|
|
||||||
memcpy(SHRPIXELS, sta->pixels, sizeof(sta->pixels));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void jlUtilIdle(void) {
|
void jlUtilIdle(void) {
|
||||||
// No need to pump the message loop on the IIgs
|
// No need to pump the message loop on the IIgs
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,42 +177,6 @@ void jlDrawBlit8x8(jlSurfaceT source, jint16 sx, jint16 sy, jint16 tx, jint16 ty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
void jlDrawBlit8x8a(jlSurfaceT source, jint16 sx, jint16 sy, jint16 tx, jint16 ty, byte offset) {
|
|
||||||
int mo; // Mask offset
|
|
||||||
int so; // Source Pixel Offset
|
|
||||||
int to; // Target Pixel Offset
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
jlPixelPairT m; // Mask
|
|
||||||
jlPixelPairT s; // Source Pixel
|
|
||||||
jlPixelPairT t; // Target Pixel
|
|
||||||
jlPixelPairT *pixels = (jlPixelPairT *)source;
|
|
||||||
jlPixelPairT *target = (jlPixelPairT *)_jlDrawTargetActual;
|
|
||||||
|
|
||||||
// We mask off unused bits in the source tile location so they can be used to hold other data.
|
|
||||||
mo = ((sy & 0x1f) * 8 * 160) + (((sx & 0x3f) + offset) * 4); // This is in tiles
|
|
||||||
so = ((sy & 0x1f) * 8 * 160) + ((sx & 0x3f) * 4); // This is in tiles
|
|
||||||
if (jlUtilIsOdd(tx)) tx--; // tx must be even because there are two pixels per byte
|
|
||||||
to = ty * 160 + (int)(tx * 0.5); // This is in pixels...
|
|
||||||
|
|
||||||
for (y=0; y<8; y++) {
|
|
||||||
for (x=0; x<4; x++) {
|
|
||||||
m = pixels[mo++];
|
|
||||||
s = pixels[so++];
|
|
||||||
t = target[to];
|
|
||||||
t.r = (t.r & m.r) | s.r;
|
|
||||||
t.l = (t.l & m.l) | s.l;
|
|
||||||
target[to++] = t;
|
|
||||||
}
|
|
||||||
mo += 156;
|
|
||||||
so += 156;
|
|
||||||
to += 156;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void jlDrawBlit8x8a(jlSurfaceT source, jlStnT *stencil, jint16 sx, jint16 sy, jint16 tx, jint16 ty) {
|
void jlDrawBlit8x8a(jlSurfaceT source, jlStnT *stencil, jint16 sx, jint16 sy, jint16 tx, jint16 ty) {
|
||||||
int mo; // Mask offset
|
int mo; // Mask offset
|
||||||
int so; // Source Pixel Offset
|
int so; // Source Pixel Offset
|
||||||
|
@ -238,11 +202,11 @@ void jlDrawBlit8x8a(jlSurfaceT source, jlStnT *stencil, jint16 sx, jint16 sy, ji
|
||||||
s = pixels[so++];
|
s = pixels[so++];
|
||||||
|
|
||||||
//***FIX*** Another endian order issue. Left & Right are swapped.
|
//***FIX*** Another endian order issue. Left & Right are swapped.
|
||||||
if ((stencil->pixels[mo] & (1 << b--)) == 0) {
|
if ((stencil->pixels[mo] & (1 << b--)) != 0) {
|
||||||
t.r = s.r;
|
t.r = s.r;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((stencil->pixels[mo] & (1 << b--)) == 0) {
|
if ((stencil->pixels[mo] & (1 << b--)) != 0) {
|
||||||
t.l = s.l;
|
t.l = s.l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -324,7 +324,7 @@ bool _jlVecLoad(jlVecT **vec, char *filename);
|
||||||
#ifdef JOEY_IIGS
|
#ifdef JOEY_IIGS
|
||||||
// Inlined functions - asm code
|
// Inlined functions - asm code
|
||||||
extern void asmB88(jlSurfaceT target, jlSurfaceT source, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2);
|
extern void asmB88(jlSurfaceT target, jlSurfaceT source, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2);
|
||||||
extern void asmB88a(jlSurfaceT target, jlSurfaceT source, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2, byte alphaOffset);
|
extern void asmB88a(jlSurfaceT target, jlSurfaceT source, byte *stencil, jint16 cx1, jint16 cy1, jint16 cx2, jint16 cy2);
|
||||||
extern void asmDrawBM(jlSurfaceT target, jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlSurfaceT source);
|
extern void asmDrawBM(jlSurfaceT target, jint16 startX, jint16 startY, jint16 width, jint16 height, byte *mapData, juint16 stride, jlSurfaceT source);
|
||||||
//extern void asmDrawLine(jlSurfaceT target, jint16 color, jint16 x1, jint16 y1, jint16 x2, jint16 y2);
|
//extern void asmDrawLine(jlSurfaceT target, jint16 color, jint16 x1, jint16 y1, jint16 x2, jint16 y2);
|
||||||
extern jint16 asmGetPoint(jlSurfaceT target, jint16 x, jint16 y);
|
extern jint16 asmGetPoint(jlSurfaceT target, jint16 x, jint16 y);
|
||||||
|
@ -334,7 +334,7 @@ extern void asmPoint(jlSurfaceT target, jint16 color, jint16 x, jint16 y);
|
||||||
|
|
||||||
// Inlined functions
|
// Inlined functions
|
||||||
#define jlDrawBlit8x8(source, cx1, cy1, cx2, cy2) asmB88(_jlDrawTargetActual, source, cx1, cy1, cx2, cy2)
|
#define jlDrawBlit8x8(source, cx1, cy1, cx2, cy2) asmB88(_jlDrawTargetActual, source, cx1, cy1, cx2, cy2)
|
||||||
#define jlDrawBlit8x8a(source, cx1, cy1, cx2, cy2, offset) asmB88a(_jlDrawTargetActual, source, cx1, cy1, cx2, cy2, offset)
|
#define jlDrawBlit8x8a(source, stencil, cx1, cy1, cx2, cy2) asmB88a(_jlDrawTargetActual, source, (byte *)stencil, cx1, cy1, cx2, cy2)
|
||||||
#define jlDrawBlitMap(startX, startY, width, height, mapData, stride, source) asmDrawBM(_jlDrawTargetActual, startX, startY, width, height, (byte *)mapData, stride, source)
|
#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 jlDrawPixelGet(x, y) asmGetPoint(_jlDrawTargetActual, x, y)
|
||||||
#define jlDrawPixelSet(x, y) asmPoint(_jlDrawTargetActual, _jlDrawColorNibbles, x, y)
|
#define jlDrawPixelSet(x, y) asmPoint(_jlDrawTargetActual, _jlDrawColorNibbles, x, y)
|
||||||
|
|
|
@ -41,8 +41,8 @@ extern void asmDrawLine(jlSurfaceT target, jint16 color, jint16 x1, jint16 y1
|
||||||
|
|
||||||
|
|
||||||
// Font hacking!
|
// Font hacking!
|
||||||
__attribute__((__format__ (__printf__, 4, 0)))
|
__attribute__((__format__ (__printf__, 5, 0)))
|
||||||
void printAt(jlImgT *font, jint16 cx, jint16 cy, const char *what, ...) {
|
void printAt(jlImgT *font, jlStnT *stencil, jint16 cx, jint16 cy, const char *what, ...) {
|
||||||
jint16 x;
|
jint16 x;
|
||||||
jint16 y;
|
jint16 y;
|
||||||
jint16 tx;
|
jint16 tx;
|
||||||
|
@ -63,7 +63,11 @@ void printAt(jlImgT *font, jint16 cx, jint16 cy, const char *what, ...) {
|
||||||
//y = (msg[counter] - ' ') / 40;
|
//y = (msg[counter] - ' ') / 40;
|
||||||
x = msg[counter] % 40;
|
x = msg[counter] % 40;
|
||||||
y = msg[counter] / 40;
|
y = msg[counter] / 40;
|
||||||
|
if (stencil) {
|
||||||
|
jlDrawBlit8x8a(jlImgSurfaceGet(font), stencil, x, y, tx, ty);
|
||||||
|
} else {
|
||||||
jlDrawBlit8x8(jlImgSurfaceGet(font), x, y, tx, ty);
|
jlDrawBlit8x8(jlImgSurfaceGet(font), x, y, tx, ty);
|
||||||
|
}
|
||||||
tx += 8;
|
tx += 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +103,7 @@ void lineTest(void) {
|
||||||
while (!jlKeyPressed()) {
|
while (!jlKeyPressed()) {
|
||||||
y = 17;
|
y = 17;
|
||||||
//printAt(font, 1, y++, "R = %d ", asmTest((jlSurfaceT)0x012000));
|
//printAt(font, 1, y++, "R = %d ", asmTest((jlSurfaceT)0x012000));
|
||||||
printAt(font, 1, y++, "Drawing %s ", what);
|
printAt(font, NULL, 1, y++, "Drawing %s ", what);
|
||||||
|
|
||||||
jlDrawColorSet((byte)color);
|
jlDrawColorSet((byte)color);
|
||||||
if (phase < 2) {
|
if (phase < 2) {
|
||||||
|
@ -191,6 +195,12 @@ void blitTest(void) {
|
||||||
jlDrawClear();
|
jlDrawClear();
|
||||||
jlPaletteSet(15, 15, 15, 15);
|
jlPaletteSet(15, 15, 15, 15);
|
||||||
|
|
||||||
|
printAt(font, NULL, 1, 2, "%s", "Blitting without stencil buffer.");
|
||||||
|
printAt(font, stencil, 1, 4, "%s", "Blitting with stencil buffer.");
|
||||||
|
jlDisplayPresent();
|
||||||
|
jlKeyWaitForAny();
|
||||||
|
|
||||||
|
/*
|
||||||
y = 91;
|
y = 91;
|
||||||
while (!jlKeyPressed()) {
|
while (!jlKeyPressed()) {
|
||||||
for (x=0; x<319-8; x++) {
|
for (x=0; x<319-8; x++) {
|
||||||
|
@ -202,7 +212,7 @@ void blitTest(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
jlDrawBlit8x8(jlImgSurfaceGet(font), 1, 0, x, y);
|
jlDrawBlit8x8(jlImgSurfaceGet(font), 1, 0, x, y);
|
||||||
printAt(font, 1, 1, "Drawing at %d x %d ", x, y);
|
printAt(font, NULL, 1, 1, "Drawing at %d x %d ", x, y);
|
||||||
jlDisplayPresent();
|
jlDisplayPresent();
|
||||||
jlDrawBlit8x8(jlImgSurfaceGet(font), 0, 0, x, y);
|
jlDrawBlit8x8(jlImgSurfaceGet(font), 0, 0, x, y);
|
||||||
jlUtilSleep(1);
|
jlUtilSleep(1);
|
||||||
|
@ -212,6 +222,7 @@ void blitTest(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
jlKeyRead();
|
jlKeyRead();
|
||||||
|
*/
|
||||||
|
|
||||||
jlStnFree(stencil);
|
jlStnFree(stencil);
|
||||||
jlImgFree(font);
|
jlImgFree(font);
|
||||||
|
|
Loading…
Add table
Reference in a new issue