draw_sprite_ci8() done

This commit is contained in:
Banjo Kazooie 2022-11-23 11:56:16 -06:00
parent 2ade0605a9
commit d5bdae504b
8 changed files with 790 additions and 646 deletions

View File

@ -128,7 +128,7 @@ TOTAL_PROG_CSV := progress/progress.total.csv
TOTAL_PROG_SVG := progress/progress_total.svg TOTAL_PROG_SVG := progress/progress_total.svg
OVERLAY_PROG_CSVS := $(addprefix progress/progress., $(addsuffix .csv, $(OVERLAYS))) OVERLAY_PROG_CSVS := $(addprefix progress/progress., $(addsuffix .csv, $(OVERLAYS)))
OVERLAY_PROG_SVGS := $(addprefix progress/progress_, $(addsuffix .svg, $(OVERLAYS))) OVERLAY_PROG_SVGS := $(addprefix progress/progress_, $(addsuffix .svg, $(OVERLAYS)))
README_MD := README.md README := README.md
### Functions ### ### Functions ###
@ -179,7 +179,7 @@ progress: $(OVERLAY_PROG_CSVS) $(MAIN_PROG_CSV) $(TOTAL_PROG_CSV)
@$(foreach overlay,$(OVERLAYS),$(PROGRESS_READ) progress/progress.$(overlay).csv $(VERSION) $(overlay) &&) \ @$(foreach overlay,$(OVERLAYS),$(PROGRESS_READ) progress/progress.$(overlay).csv $(VERSION) $(overlay) &&) \
$(PROGRESS_READ) $(MAIN_PROG_CSV) $(VERSION) bk_boot $(PROGRESS_READ) $(MAIN_PROG_CSV) $(VERSION) bk_boot
@$(PROGRESS_READ) $(TOTAL_PROG_CSV) $(VERSION) total @$(PROGRESS_READ) $(TOTAL_PROG_CSV) $(VERSION) total
@head -n 21 $(TOTAL_PROG_CSV) | tail -n 1 | head -c -8 | tail -c +32 | xargs -i sed -i "/# banjo*/c\# banjo ({})" $(README_MD) @head -n 21 $(TOTAL_PROG_SVG) | tail -n 1 | head -c -8 | tail -c +32 | xargs -i sed -i "/# banjo*/c\# banjo ({})" $(README)
# Shows progress for a single overlay (e.g. progress-SM) # Shows progress for a single overlay (e.g. progress-SM)
$(addprefix progress-,$(OVERLAYS)) : progress-% : progress/progress.%.csv $(addprefix progress-,$(OVERLAYS)) : progress-% : progress/progress.%.csv

View File

@ -1,4 +1,4 @@
# banjo (94.3651%) # banjo (94.4536%)
<img src="./progress/progress_total.svg"> <img src="./progress/progress_total.svg">

View File

@ -158,6 +158,7 @@ segments:
- [0xF211B0, c, code_7F60] - [0xF211B0, c, code_7F60]
- [0xF21EA0, c, code_8C50] #DONE - [0xF21EA0, c, code_8C50] #DONE
- [0xF22F80, c, code_9D30] - [0xF22F80, c, code_9D30]
- [0xF23E00, c, code_ABB0]
- [0xF260B0, c, done/code_CE60] #DONE - [0xF260B0, c, done/code_CE60] #DONE
- [0xF275B0, c, code_E360] #DONE - [0xF275B0, c, code_E360] #DONE
- [0xF27D40, c, code_EAF0] - [0xF27D40, c, code_EAF0]
@ -366,7 +367,8 @@ segments:
- [0xF510F0, bin, data_37EA0] # .data, code_5650] - [0xF510F0, bin, data_37EA0] # .data, code_5650]
- [0xF51110, bin, data_37EC0] - [0xF51110, bin, data_37EC0]
- [0xF51140, .data, code_8C50] - [0xF51140, .data, code_8C50]
- [0xF51280, bin, data_38030] - [0xF51280, .data, code_9D30]
- [0xF51430, .data, code_ABB0]
- [0xF51440, bin, data_381F0] # .data, done/code_CE60] - [0xF51440, bin, data_381F0] # .data, done/code_CE60]
- [0xF514B0, bin, data_38260] - [0xF514B0, bin, data_38260]
- [0xF51570, .data, code_11AC0] - [0xF51570, .data, code_11AC0]
@ -400,6 +402,7 @@ segments:
- [0xF52EF0, .rodata, code_72B0] - [0xF52EF0, .rodata, code_72B0]
- [0xF52F10, .rodata, code_7F60] - [0xF52F10, .rodata, code_7F60]
- [0xF52F30, .rodata, code_9D30] - [0xF52F30, .rodata, code_9D30]
# - [0xF52F30, .rodata, code_ABB0]
- [0xF52F50, .rodata, done/code_CE60] - [0xF52F50, .rodata, done/code_CE60]
- [0xF53220, .rodata, code_EAF0] - [0xF53220, .rodata, code_EAF0]
- [0xF532A0, .rodata, code_10A00] - [0xF532A0, .rodata, code_10A00]
@ -447,7 +450,7 @@ segments:
- [0xF55960, .bss, code_7090] - [0xF55960, .bss, code_7090]
- [0xF55960, .bss, code_72B0] - [0xF55960, .bss, code_72B0]
- [0xF55960, .bss, code_8C50] - [0xF55960, .bss, code_8C50]
- [0xF55960, .bss, code_9D30] - [0xF55960, .bss, code_ABB0]
- [0xF55960, .bss, done/code_CE60] - [0xF55960, .bss, done/code_CE60]
- [0xF55960, .bss, code_E360] - [0xF55960, .bss, code_E360]
- [0xF55960, .bss, code_EAF0] - [0xF55960, .bss, code_EAF0]

View File

@ -9,7 +9,7 @@
</mask> </mask>
<g mask="url(#anybadge_1)"> <g mask="url(#anybadge_1)">
<path fill="#555" d="M0 0h44v20H0z"/> <path fill="#555" d="M0 0h44v20H0z"/>
<path fill="#33e000" d="M44 0h67v20H44z"/> <path fill="#30e000" d="M44 0h67v20H44z"/>
<path fill="url(#b)" d="M0 0h111v20H0z"/> <path fill="url(#b)" d="M0 0h111v20H0z"/>
</g> </g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
@ -17,7 +17,7 @@
<text x="22.0" y="14">core1</text> <text x="22.0" y="14">core1</text>
</g> </g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="78.5" y="15" fill="#010101" fill-opacity=".3">88.6623%</text> <text x="78.5" y="15" fill="#010101" fill-opacity=".3">89.2720%</text>
<text x="77.5" y="14">88.6623%</text> <text x="77.5" y="14">89.2720%</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -17,7 +17,7 @@
<text x="75.0" y="14">Banjo-Kazooie (us.v10)</text> <text x="75.0" y="14">Banjo-Kazooie (us.v10)</text>
</g> </g>
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="184.5" y="15" fill="#010101" fill-opacity=".3">94.3651%</text> <text x="184.5" y="15" fill="#010101" fill-opacity=".3">94.4536%</text>
<text x="183.5" y="14">94.3651%</text> <text x="183.5" y="14">94.4536%</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -3,46 +3,81 @@
#include "variables.h" #include "variables.h"
#define IA8_I(ia) ((ia) >> 4)
#define IA8_A(ia) ((ia) & 0xF)
#define I4_2_RGBA16(i,a) ((i << 12) | (i << 7) | (i << 2) | (a))
void func_8024A3C8(s32 x, s32 y);
void draw_prim_rect(s32 x, s32 y, s32 w, s32 h);
void set_prim_color(s32 r, s32 g, s32 b);
void func_8024A85C(s32 buffer_indx);
extern u16 D_803A5D00[2][0xF660]; //framebuffer extern u16 D_803A5D00[2][0xF660]; //framebuffer
extern s32 D_80276588; //framebuffer width extern s32 D_80276588; //framebuffer width
extern s32 D_8027658C; //framebuffer height extern s32 D_8027658C; //framebuffer height
/* .data */ /* .data */
extern u8 D_80275A50[][3]; u8 D_80275A50[8][3] = {
extern s32 D_80275A68; {0xFF, 0x00, 0x00},
extern s32 D_80275A6C; {0x00, 0xFF, 0x00},
extern s32 D_80275A70; {0x00, 0x00, 0xFF},
extern u8 D_80275A74[]; {0xFF, 0xFF, 0x00},
extern u32 D_80275A7C[0x140]; {0xFF, 0x00, 0xFF},
{0xFF, 0xFF, 0xFF},
{0xFF, 0x80, 0x00},
{0x00, 0xFF, 0xFF}
};
s32 D_80275A68 = 0xFF;
s32 D_80275A6C = 0xFF;
s32 D_80275A70 = 0xFF;
u8 D_80275A74[] = {1, 7, 3, 4, 0, 6, 5, 0};
u32 D_80275A7C[] = {
3, 0x0F6DE000,
1, 0x0F800000,
3, 0x0C4AE000,
3, 0x0E59E000,
4, 0x088AF200,
3, 0x0F39E000,
3, 0x0F3DE000,
3, 0x0E4A4000,
3, 0x0F7DE000,
3, 0x0F79E000,
3, 0x0F6FA000,
3, 0x0D75C000,
3, 0x0F24E000,
3, 0x0D6DC000,
3, 0x0F34E000,
3, 0x0F348000,
3, 0x0F25E000,
3, 0x0B7DA000,
3, 0x0E92E000,
3, 0x0E928000,
3, 0x0B75A000,
3, 0x0924E000,
5, 0x08EEB188,
4, 0x09DFB900,
4, 0x06999600,
3, 0x0F7C8000,
4, 0x069DB700,
3, 0x0F7EA000,
3, 0x0F39E000,
3, 0x0E924000,
4, 0x09999600,
5, 0x08C62A20,
5, 0x08C63550,
3, 0x0B55A000,
3, 0x0B79E000,
4, 0x0F124F00,
1, 0x00800000,
1, 0x05000000,
3, 0x00380000,
2, 0x00000000
};
extern s16 D_80275BBC; s16 D_80275BBC = 0;
extern s16 D_80275BC0; s16 D_80275BC0 = 0;
extern s16 D_80275BC4; s16 D_80275BC4 = 0;
s16 D_80275BC8 = 0;
s16 D_80275BCC = 0;
s16 D_80275BD0 = 0;
s16 D_80275BD4 = 0;
s16 D_80275BD8 = 0;
s16 D_80275BDC = 0;
u8 D_80275BE0 = 0;
s32 D_80275BE4 = 0;
char D_80275BE8[] = {'a','z','A','Z','0','9','.',':', '-', ' '};
extern s16 D_80275BC8;
extern s16 D_80275BCC;
extern s16 D_80275BD0;
extern s16 D_80275BD4;
extern s16 D_80275BD8;
extern s16 D_80275BDC;
extern u8 D_80275BE0;
extern s32 D_80275BE4;
extern u8 D_80275BE8[];
/* .bss */
s32 D_802806E0;
s32 D_802806E4;
s32 D_802806E8;
s32 D_802806EC;
/* .h */ /* .h */
void func_802484D0(void); void func_802484D0(void);
@ -393,606 +428,3 @@ void func_802485C8(UNK_TYPE(s32) arg0){
} }
//BREAK?
#ifndef NONMATCHING
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_ci4.s")
#else
void draw_sprite_ci4(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
BKSpriteFrame *sprite_frame;
u16 *palette;
s32 fb_y;
s32 fb_x;
s32 iy;
s32 i_chunk;
s32 ix;
u8 *tmem;
BKSpriteTextureBlock *chunk;
u16 *pxl_ptr;
u16 *framebuffer;
s32 indx1;
s32 indx2;
s32 color1;
s32 color2;
framebuffer = D_803A5D00[D_802806EC];
sprite_frame = spriteGetFramePtr(sprite, (u32) frame);
if (alpha_enabled == 0) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
palette = (u16 *)(sprite_frame + 1);
for(tmem = palette; (s32)tmem % 8; tmem++);
palette = tmem;
chunk = (BKSpriteTextureBlock *)(palette + 0x10);
for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++){
for(tmem = (u16 *)(chunk + 1); (s32)tmem % 8; tmem++);
for(iy = 0; iy < chunk->h; iy++){
for(ix = 0; ix < chunk->w; ix += 2){
indx1 = (*tmem >> 4) & 0xF;
indx2 = (*tmem >> 0) & 0xF;
fb_x = chunk->x + x + ix;
if (0 <= fb_x && fb_x < D_80276588) {
fb_y = chunk->y + y + iy;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
pxl_ptr = framebuffer + fb_x + (fb_y * D_80276588);
color1 = palette[indx1];
if (color1 & 1) {
*pxl_ptr = color1;
} else if (!alpha_enabled) {
*pxl_ptr = 1U;
}
color2 = palette[indx2];
if (color2 & 1) {
*(pxl_ptr + 1) = color2;
} else if (!alpha_enabled) {
*(pxl_ptr + 1) = 1U;
}
}
}
tmem++;
}
}
chunk = (BKSpriteTextureBlock *) tmem;
}
}
#endif
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_ci8.s")
void draw_sprite_rgba16(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) {
BKSpriteFrame *sprite_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *tmem;
u16 *framebuffer_ptr;
s32 fb_x;
s32 fb_y;
s32 i_chunk;
s32 txtr_x;
s32 txtr_y;
u16 *pxl_ptr;
u16 rgba;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
sprite_ptr = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_ptr->w, sprite_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(sprite_ptr + 1);
for(i_chunk = 0; i_chunk < sprite_ptr->chunkCnt; i_chunk++) {
for(tmem = (u16 *)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++) {
fb_x = chunk_ptr->x + x + txtr_x;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);
rgba = *tmem;
if (rgba & 1) {
*pxl_ptr = rgba;
} else if (!alpha_enabled) {
*pxl_ptr = rgba | 1;
}
}
}
tmem++;
}
}
chunk_ptr = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_i4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) {
BKSpriteFrame *frame_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *temp_v0;
u8 *tmem;
s32 fb_x;
s32 fb_y;
s32 p1;
s32 p2;
u16 *framebuffer_ptr;
s32 txtr_y;
s32 i_chunk;
s32 txtr_x;
u16 *fb_pxl_ptr;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
frame_ptr = spriteGetFramePtr(sprite, frame);
if (!aplha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) {
for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) {
fb_x = chunk_ptr->x + x + txtr_x;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
p1 = (*tmem >> 4);
p2 = (*tmem & 0xF);
fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);
if (p1) {
*fb_pxl_ptr = (p1 << 0xC) | (p1 << 0x7) | (p1 << 0x2) | 1;
} else if (!aplha_enabled) {
*fb_pxl_ptr = 1;
}
if (p2) {
*(fb_pxl_ptr + 1) = (p2 << 0xC) | (p2 << 7) | (p2 << 2) | 1;
} else if (!aplha_enabled) {
*(fb_pxl_ptr + 1) = 1;
}
}
}
tmem++;
}
}
chunk_ptr = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_ia4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) {
BKSpriteFrame *frame_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *temp_v0;
u8 *tmem;
s32 fb_x;
s32 fb_y;
s32 p1;
s32 p2;
u16 *framebuffer_ptr;
u32 p1_i;
u32 p1_a;
u32 p2_i;
u32 p2_a;
s32 txtr_y;
s32 i_chunk;
s32 txtr_x;
u16 *fb_pxl_ptr;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
frame_ptr = spriteGetFramePtr(sprite, frame);
if (!aplha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) {
for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) {
fb_x = chunk_ptr->x + x + txtr_x;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);\
p1 = (*tmem >> 4);
p2 = (*tmem & 0xF);
p1_i = p1 & 0xE;
p1_a = p1 & 1;
p2_i = p2 & 0xE;
p2_a = p2 & 1;
if (p1_a) { \
*fb_pxl_ptr = ((p1_i << 0xC) | (p1_i << 0x7) | (p1_i << 0x2)) | p1_a;
} else if (!aplha_enabled) {
*fb_pxl_ptr = 1;
}
if (p2_a) {\
*(fb_pxl_ptr + 1) = (p2_i << 0xC) | (p2_i << 7) | (p2_i << 2) | p2_a;
} else if (!aplha_enabled) {
*(fb_pxl_ptr + 1) = 1;
}
}
}
tmem++;
}
}
chunk_ptr = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_i8(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
BKSpriteFrame *frame_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *pixel_ptr;
u8 *txtr_ptr;
s32 fb_y;
u16 *framebuffer_ptr;
s32 intensity;
s32 fb_x;
s32 txtr_x;
s32 i_chunk;
s32 txtr_y;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
frame_ptr = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++){
//align
for(txtr_ptr = (u8*)(chunk_ptr + 1); (s32)txtr_ptr % 8; txtr_ptr++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++){
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++){
fb_x = chunk_ptr->x + x + txtr_x;
if (fb_x >= 0) {
if (fb_x < D_80276588) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
pixel_ptr = framebuffer_ptr + fb_x + fb_y * D_80276588;
intensity = (s32) *txtr_ptr >> 3;
if (intensity != 0) {
*pixel_ptr = (intensity << 0xB) | (intensity << 6) | (intensity << 1) | 1;
} else if (!alpha_enabled) {
*pixel_ptr = 1;
}
}
}
}
txtr_ptr += 1;
}
}
chunk_ptr = (BKSpriteFrame *) txtr_ptr;
}
}
void draw_sprite_ia8(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) {
BKSpriteFrame *sprite_frame;
BKSpriteTextureBlock *chunk_ptr;
s16 *temp_a1;
s16 *temp_v0;
u8 *var_t2;
u16 *framebuffer_ptr;
s32 fb_x;
s32 fb_y;
s32 var_a3;
s32 i_chunk;
s32 var_t3;
u32 temp_a2;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
sprite_frame = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
//draw blue rect over display area
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1);
for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) {
for(var_t2 = (u8*)(chunk_ptr + 1); (s32)var_t2 % 8; var_t2++);//align
for(var_t3 = 0; var_t3 < chunk_ptr->h; var_t3++){
for(var_a3 = 0; var_a3 < chunk_ptr->w; var_a3++) {
fb_x = chunk_ptr->x + x + var_a3;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + var_t3;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
temp_a1 = framebuffer_ptr + fb_x + fb_y * D_80276588;
temp_a2 = *var_t2;
if (IA8_A(temp_a2)) {
*temp_a1 = I4_2_RGBA16(IA8_I(temp_a2), 1);
} else if (!alpha_enabled) {
*temp_a1 = 1;
}
}
}
var_t2++;
}
}
chunk_ptr = (BKSpriteFrame *) var_t2;
}
}
#ifndef NONMATCHING
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/draw_sprite_rgba32.s")
#else
void draw_sprite_rgba32(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
s32 i_chunk;
BKSpriteFrame *sprite_frame;
BKSpriteTextureBlock *chunk_ptr;
u32 *var_t4;
s16 temp_v0;
s16 var_v1;
s32 temp_a1;
s32 temp_a2;
u16 *temp_s5;
s32 temp_t1;
s32 alpha;
s32 temp_v0_5;
s32 var_s0;
s32 var_t2;
u16 *temp_a3;
u16 p1_a;
u32 temp_v1;
s32 red8;
s32 green8;
s32 blue8;
temp_s5 = &D_803A5D00[D_802806EC][0];
sprite_frame = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1);
for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++){
if( ((chunk_ptr->x >= -5) && (chunk_ptr->x < 0x29))
&& (chunk_ptr->y >= -5) && (chunk_ptr->y < 0x29)
) {
//align
var_t4 = (u32 *)(chunk_ptr + 1);
while((s32)var_t4 % 8){var_t4++;}
for(var_s0 = 0; var_s0 < chunk_ptr->h; var_s0++){
for(var_t2 = 0; var_t2 < chunk_ptr->w; var_t2++) {
temp_a1 = chunk_ptr->x + x + var_t2;
if ((temp_a1 >= 0) && (temp_a1 < D_80276588)) {
temp_a2 = chunk_ptr->y + y + var_s0;
if ((temp_a2 >= 0) && (temp_a2 < D_8027658C)) {
temp_v1 = *var_t4;
temp_a3 = temp_s5 + temp_a1 + temp_a2 * D_80276588;
alpha = _SHIFTR(temp_v1, 0, 8);
temp_t0 = *temp_a3;
if (alpha != 0) {
temp_v0_5 = 0xFF - alpha;
red8 = (((_SHIFTR(temp_v1, 24, 8) * alpha) + ((_SHIFTR(temp_t0, 11, 5) << 3) * temp_v0_5)) / 0xFF);
green8 = (((_SHIFTR(temp_v1, 16, 8) * alpha) + ((_SHIFTR(temp_t0, 6, 5) << 3) * temp_v0_5)) / 0xFF);
blue8 = (((_SHIFTR(temp_v1, 8, 8) * alpha) + ((_SHIFTR(temp_t0, 1, 5) << 3) * temp_v0_5)) / 0xFF);
*temp_a3 = _SHIFTL((red8 >> 3), 11, 5)
| _SHIFTL((green8 >> 3), 6, 5)
| _SHIFTL((blue8 >> 3), 1, 5)
| 1;
} else if (!alpha_enabled) {
*temp_a3 = 0x0001;
}
}
}
var_t4++;
}
}
chunk_ptr = (BKSpriteFrame *) var_t4;
}
}
}
#endif
void func_802499BC(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in
}
void func_802499D0(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in
}
void draw_texture_ci4(s32 x, s32 y, void *tmem, s32 w, s32 h, bool alpha_enabled){
s32 ix;
s32 iy;
s32 icolor;
u16 *framebuffer_ptr;
u16 *palette_ptr;
u8 *pixel_ptr;
palette_ptr = (u16*)tmem;
pixel_ptr = (u8*)&palette_ptr[0x10];
framebuffer_ptr = &D_803A5D00[D_802806EC][x + y * D_80276588];
for(iy = 0; iy < h; iy++){
for(ix = 0; ix < w; ix++){
icolor = (ix & 1)? pixel_ptr[ix/2 + (iy*w)/2] & 0xF
: pixel_ptr[ix/2 + (iy*w)/2] >> 4;
*framebuffer_ptr = palette_ptr[icolor];
framebuffer_ptr++;
}
framebuffer_ptr += (D_80276588 - w);
}
}
void func_80249CEC(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
s16 temp_v0;
temp_v0 = sprite->type;
if (temp_v0 & SPRITE_TYPE_I4) {
draw_sprite_i4(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_IA4) {
draw_sprite_ia4(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_I8) {
draw_sprite_i8(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_IA8) {
draw_sprite_ia8(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_RGBA16) {
draw_sprite_rgba16(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_RGBA32) {
draw_sprite_rgba32(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_CI4) {
draw_sprite_ci4(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_CI8) {
draw_sprite_ci8(x, y, sprite, frame, alpha_enabled);
}
}
//arg4 = alpha enabled?
void func_80249DE0(s32 x, s32 y, s16 *arg2, s32 arg3, s32 arg4) {
s32 ix;
s32 var_t2;
s32 iy;
u16 *framebuffer_ptr;
u16 *texture_ptr;
u16 temp_v1;
BKSpriteTextureBlock *temp_v0;
temp_v0 = func_8033EFB0(arg2, arg3);
texture_ptr = (u16*)(temp_v0 + 1);
if (*arg2 == SPRITE_TYPE_CI4) {
draw_texture_ci4(x, y, temp_v0 + 1, temp_v0->w, temp_v0->h, arg4);
return;
}
//otherwise RGBA16
framebuffer_ptr = &D_803A5D00[D_802806EC][x + y*D_80276588];
for(iy = 0; iy < temp_v0->h; iy++){
for(ix = 0; ix < temp_v0->w; ix++){
temp_v1 = *texture_ptr;
if (temp_v1 & 1) { //if visible
*framebuffer_ptr = temp_v1;
} else if (arg4 == 0) {
*framebuffer_ptr = 1;
}
texture_ptr++;
framebuffer_ptr++;
}
framebuffer_ptr += (D_80276588 - temp_v0->w);
}
}
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80249F34.s")
//fill framebuffer with vert and horz lines
void func_8024A284(s32 x, s32 y, s32 arg2, s32 arg3, s32 horz_spacing, s32 vert_spacing) {
s32 var_s2;
s32 var_s3;
for(var_s2 = 0; var_s2 < D_80276588; var_s2 += horz_spacing){
for(var_s3 = 0; var_s3 < D_8027658C; var_s3++){
func_8024A3C8(x + var_s2, y + var_s3);
}
}
for(var_s3 = 0; var_s3 < D_8027658C; var_s3 += vert_spacing) {
for(var_s2 = 0; var_s2 < D_80276588; var_s2++){
func_8024A3C8(x + var_s2, y + var_s3);
}
}
}
//fills in pixel in frame buffer with D_802806E0 color
void func_8024A3C8(s32 x, s32 y) {
s32 temp_v0;
if (x >= 0) {
if ((x < D_80276588) && (y >= 0) && (y < D_8027658C)) {
D_803A5D00[D_802806EC][x + y * D_80276588] = _SHIFTL(D_802806E0 >> 3, 11, 5) | _SHIFTL(D_802806E4 >> 3, 6, 5) | _SHIFTL(D_802806E8 >> 3, 1, 5) | _SHIFTL(1, 0, 1);
}
}
}
//draw rectangular outline
void func_8024A490(s32 x, s32 y, s32 w, s32 h) {
s32 var_s1;
for(var_s1 = 0; var_s1 < w; var_s1++){
func_8024A3C8(x + var_s1, y);
func_8024A3C8(x + var_s1, y + h - 1);
}
for(var_s1 = 1; var_s1 < h - 1; var_s1++){
func_8024A3C8(x, y + var_s1);
func_8024A3C8(x + w - 1, y + var_s1);
}
}
void func_8024A564(s32 x, s32 y, u16 *arg2, s32 arg3, s32 arg4, f32 arg5, f32 arg6)
{
s32 temp_a2;
s32 temp_a2_2;
s32 temp_a2_3;
s32 temp_f6;
s32 temp_f6_2;
s32 temp_lo;
s32 temp_t5;
s32 var_a0;
s32 var_a2;
s32 new_var;
f32 new_var3;
s32 new_var2;
s32 var_t1;
s32 var_t3;
s32 var_v0;
s32 var_v1;
u16 temp_t8;
s16 *var_t0;
s16 *var_t2;
var_v0 = 0;
var_v1 = D_80276588;
var_t0 = &D_803A5D00[D_802806EC][x + (y * D_80276588)];
new_var = (s32) (((f64) (256.0f / (new_var3 = arg6))) + 0.5);
new_var2 = (s32) (((f64) (256.0f / arg5)) + 0.5);
for (var_t1 = (arg4 * arg6) + 0.5; var_t1 != 0; var_t1--)
{
temp_lo = (arg3 * arg5) + 0.5;
var_a2 = ((var_v0 >> 8) * arg3) << 8;
var_t2 = var_t0;
for (var_t3 = temp_lo; var_t3 != 0; var_t3--)
{
*var_t2 = arg2[var_a2 >> 8];
var_a2 += new_var2;
var_t2++;
}
var_t0 += D_80276588;
var_v0 += new_var;
}
}
//fills in rectangle in frame buffer with D_802806E0 color
void draw_prim_rect(s32 x, s32 y, s32 w, s32 h) {
s32 var_s0;
s32 var_s1;
s32 var_s4;
var_s4 = 0;
for(var_s4 = 0; var_s4 < w; var_s4++) {
for(var_s0 = 0; var_s0 < h; var_s0++){
func_8024A3C8(x + var_s4, y + var_s0);
}
}
}
void func_8024A810(void){
set_prim_color(0, 0x80, 0);
func_8024A85C(0);
}
void set_prim_color(s32 r, s32 g, s32 b){
D_802806E0 = r;
D_802806E4 = g;
D_802806E8 = b;
}
void func_8024A85C(s32 buffer_indx){
D_802806EC = buffer_indx;
}
s32 func_8024A868(void){
return D_802806EC;
}

708
src/core1/code_ABB0.c Normal file
View File

@ -0,0 +1,708 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#define IA8_I(ia) ((ia) >> 4)
#define IA8_A(ia) ((ia) & 0xF)
#define I4_2_RGBA16(i,a) ((i << 12) | (i << 7) | (i << 2) | (a))
void func_8024A3C8(s32 x, s32 y);
void draw_prim_rect(s32 x, s32 y, s32 w, s32 h);
void set_prim_color(s32 r, s32 g, s32 b);
void func_8024A85C(s32 buffer_indx);
extern u16 D_803A5D00[2][0xF660]; //framebuffer
extern s32 D_80276588; //framebuffer width
extern s32 D_8027658C; //framebuffer height
/* .bss */
s32 D_802806E0;
s32 D_802806E4;
s32 D_802806E8;
s32 D_802806EC;
void draw_sprite_ci4(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled)
{
BKSpriteFrame *sprite_frame;
s32 palette_offset;
u16 *palette;
s32 fb_y;
s32 fb_x;
s32 iy;
s32 i_chunk;
s32 ix;
u8 *tmem;
BKSpriteTextureBlock *chunk;
u16 *pxl_ptr;
u16 *framebuffer;
s32 indx1;
s32 indx2;
s32 color1;
s32 color2;
framebuffer = D_803A5D00[D_802806EC];
sprite_frame = spriteGetFramePtr(sprite, (u32) frame);
if (!alpha_enabled){
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
//align palette
for(palette_offset = (s32) (sprite_frame + 1); palette_offset % 8; palette_offset++){
continue;
}
palette = (u16*)palette_offset;
chunk = (BKSpriteTextureBlock *) (palette + 16);
for (i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) {
//align texture
tmem = (u8 *) (chunk + 1);
while (((s32) tmem) % 8)
{
tmem = ((s32) tmem) + 1;
}
//copy texture to framebuffer
for (iy = 0; iy < chunk->h; iy++) {
for (ix = 0; ix < chunk->w; ix += 2) {
indx1 = ((*tmem) >> 4) & 0xF;
indx2 = *tmem & 0xF;
fb_x = (chunk->x + x) + ix;
if ((0 <= fb_x) && (fb_x < D_80276588))
{
fb_y = (chunk->y + y) + iy;
if ((fb_y >= 0) && (fb_y < D_8027658C))
{
pxl_ptr = (framebuffer + fb_x) + (fb_y * D_80276588);
color1 = palette[indx1];
if (color1 & 1) {
*pxl_ptr = color1;
} else if (!alpha_enabled) {
*pxl_ptr = (unsigned long) 1;
palette_offset = (u16 *) (sprite_frame + 1); //THIS IS GARBAGE for correct reg alloc
}
if (palette[indx2] & 1) {
pxl_ptr[1] = palette[indx2];
} else if (!alpha_enabled) {
pxl_ptr[1] = 1;
}
}
}
tmem++;
}
}
chunk = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_ci8(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled)
{
static s32 D_80275C00 = 0;
u16 *palette;
s32 fb_y;
s32 fb_x;
s32 iy;
s32 i_chunk;
s32 ix;
u8 *tmem;
BKSpriteTextureBlock *chunk;
u16 *pxl_ptr;
int new_var;
BKSpriteFrame *sprite_frame;
u16 *framebuffer;
s32 indx;
s32 palette_unaligned;
D_80275C00++;
if (D_80275C00 == 0xA) {
D_80275C00 = 0;
}
framebuffer = D_803A5D00[D_802806EC];
sprite_frame = spriteGetFramePtr(sprite, (u32) frame);
if (!alpha_enabled){
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
palette = (u16 *) (sprite_frame + 1);
for (palette_unaligned = palette; ((s32) palette_unaligned) % 8; palette_unaligned++){
;
}
palette = palette_unaligned;
chunk = (BKSpriteTextureBlock *) (palette + 0x100);
for (i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++){
palette_unaligned = (u16 *) (chunk + 1);
for (tmem = (u16 *) (chunk + 1); ((s32) tmem) % 8; tmem++){
;
}
for (iy = 0; iy < chunk->h; iy++){
for (ix = 0; ix < chunk->w; ix++){
fb_x = (chunk->x + x) + ix;
if ((0 <= fb_x) && (fb_x < D_80276588))
{
fb_y = (chunk->y + y) + iy;
if ((fb_y >= 0) && (fb_y < D_8027658C))
{
pxl_ptr = (framebuffer + fb_x) + (fb_y * D_80276588);
if (palette[*tmem] & 1){
*pxl_ptr = palette[*tmem];
}
else if (!alpha_enabled)
{
if (palette[*tmem] & 0xFFFE){
*pxl_ptr = (D_80275C00 < 5) ? (0xFFFF) : (palette[*tmem] | 1);
}
else{
*pxl_ptr = 1;
}
}
}
}
tmem++;
}
}
chunk = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_rgba16(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) {
BKSpriteFrame *sprite_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *tmem;
u16 *framebuffer_ptr;
s32 fb_x;
s32 fb_y;
s32 i_chunk;
s32 txtr_x;
s32 txtr_y;
u16 *pxl_ptr;
u16 rgba;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
sprite_ptr = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_ptr->w, sprite_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(sprite_ptr + 1);
for(i_chunk = 0; i_chunk < sprite_ptr->chunkCnt; i_chunk++) {
for(tmem = (u16 *)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++) {
fb_x = chunk_ptr->x + x + txtr_x;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);
rgba = *tmem;
if (rgba & 1) {
*pxl_ptr = rgba;
} else if (!alpha_enabled) {
*pxl_ptr = rgba | 1;
}
}
}
tmem++;
}
}
chunk_ptr = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_i4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) {
BKSpriteFrame *frame_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *temp_v0;
u8 *tmem;
s32 fb_x;
s32 fb_y;
s32 p1;
s32 p2;
u16 *framebuffer_ptr;
s32 txtr_y;
s32 i_chunk;
s32 txtr_x;
u16 *fb_pxl_ptr;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
frame_ptr = spriteGetFramePtr(sprite, frame);
if (!aplha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) {
for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) {
fb_x = chunk_ptr->x + x + txtr_x;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
p1 = (*tmem >> 4);
p2 = (*tmem & 0xF);
fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);
if (p1) {
*fb_pxl_ptr = (p1 << 0xC) | (p1 << 0x7) | (p1 << 0x2) | 1;
} else if (!aplha_enabled) {
*fb_pxl_ptr = 1;
}
if (p2) {
*(fb_pxl_ptr + 1) = (p2 << 0xC) | (p2 << 7) | (p2 << 2) | 1;
} else if (!aplha_enabled) {
*(fb_pxl_ptr + 1) = 1;
}
}
}
tmem++;
}
}
chunk_ptr = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_ia4(s32 x, s32 y, BKSprite *sprite, s32 frame, bool aplha_enabled) {
BKSpriteFrame *frame_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *temp_v0;
u8 *tmem;
s32 fb_x;
s32 fb_y;
s32 p1;
s32 p2;
u16 *framebuffer_ptr;
u32 p1_i;
u32 p1_a;
u32 p2_i;
u32 p2_a;
s32 txtr_y;
s32 i_chunk;
s32 txtr_x;
u16 *fb_pxl_ptr;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
frame_ptr = spriteGetFramePtr(sprite, frame);
if (!aplha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++) {
for(tmem = (u8*)(chunk_ptr + 1); (s32)tmem % 8; tmem++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++) {
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x += 2) {
fb_x = chunk_ptr->x + x + txtr_x;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
fb_pxl_ptr = framebuffer_ptr + fb_x + (fb_y * D_80276588);\
p1 = (*tmem >> 4);
p2 = (*tmem & 0xF);
p1_i = p1 & 0xE;
p1_a = p1 & 1;
p2_i = p2 & 0xE;
p2_a = p2 & 1;
if (p1_a) { \
*fb_pxl_ptr = ((p1_i << 0xC) | (p1_i << 0x7) | (p1_i << 0x2)) | p1_a;
} else if (!aplha_enabled) {
*fb_pxl_ptr = 1;
}
if (p2_a) {\
*(fb_pxl_ptr + 1) = (p2_i << 0xC) | (p2_i << 7) | (p2_i << 2) | p2_a;
} else if (!aplha_enabled) {
*(fb_pxl_ptr + 1) = 1;
}
}
}
tmem++;
}
}
chunk_ptr = (BKSpriteTextureBlock *) tmem;
}
}
void draw_sprite_i8(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
BKSpriteFrame *frame_ptr;
BKSpriteTextureBlock *chunk_ptr;
s16 *pixel_ptr;
u8 *txtr_ptr;
s32 fb_y;
u16 *framebuffer_ptr;
s32 intensity;
s32 fb_x;
s32 txtr_x;
s32 i_chunk;
s32 txtr_y;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
frame_ptr = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, frame_ptr->w, frame_ptr->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(frame_ptr + 1);
for(i_chunk = 0; i_chunk < frame_ptr->chunkCnt; i_chunk++){
//align
for(txtr_ptr = (u8*)(chunk_ptr + 1); (s32)txtr_ptr % 8; txtr_ptr++);
for(txtr_y = 0; txtr_y < chunk_ptr->h; txtr_y++){
for(txtr_x = 0; txtr_x < chunk_ptr->w; txtr_x++){
fb_x = chunk_ptr->x + x + txtr_x;
if (fb_x >= 0) {
if (fb_x < D_80276588) {
fb_y = chunk_ptr->y + y + txtr_y;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
pixel_ptr = framebuffer_ptr + fb_x + fb_y * D_80276588;
intensity = (s32) *txtr_ptr >> 3;
if (intensity != 0) {
*pixel_ptr = (intensity << 0xB) | (intensity << 6) | (intensity << 1) | 1;
} else if (!alpha_enabled) {
*pixel_ptr = 1;
}
}
}
}
txtr_ptr += 1;
}
}
chunk_ptr = (BKSpriteFrame *) txtr_ptr;
}
}
void draw_sprite_ia8(s32 x, s32 y, BKSprite *sprite, s32 frame, bool alpha_enabled) {
BKSpriteFrame *sprite_frame;
BKSpriteTextureBlock *chunk_ptr;
s16 *temp_a1;
s16 *temp_v0;
u8 *var_t2;
u16 *framebuffer_ptr;
s32 fb_x;
s32 fb_y;
s32 var_a3;
s32 i_chunk;
s32 var_t3;
u32 temp_a2;
framebuffer_ptr = &D_803A5D00[D_802806EC][0];
sprite_frame = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
//draw blue rect over display area
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1);
for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++) {
for(var_t2 = (u8*)(chunk_ptr + 1); (s32)var_t2 % 8; var_t2++);//align
for(var_t3 = 0; var_t3 < chunk_ptr->h; var_t3++){
for(var_a3 = 0; var_a3 < chunk_ptr->w; var_a3++) {
fb_x = chunk_ptr->x + x + var_a3;
if ((fb_x >= 0) && (fb_x < D_80276588)) {
fb_y = chunk_ptr->y + y + var_t3;
if ((fb_y >= 0) && (fb_y < D_8027658C)) {
temp_a1 = framebuffer_ptr + fb_x + fb_y * D_80276588;
temp_a2 = *var_t2;
if (IA8_A(temp_a2)) {
*temp_a1 = I4_2_RGBA16(IA8_I(temp_a2), 1);
} else if (!alpha_enabled) {
*temp_a1 = 1;
}
}
}
var_t2++;
}
}
chunk_ptr = (BKSpriteFrame *) var_t2;
}
}
#ifndef NONMATCHING
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_ABB0/draw_sprite_rgba32.s")
#else
void draw_sprite_rgba32(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
s32 i_chunk;
BKSpriteFrame *sprite_frame;
BKSpriteTextureBlock *chunk_ptr;
u32 *var_t4;
s16 temp_v0;
s16 var_v1;
s32 temp_a1;
s32 temp_a2;
u16 *temp_s5;
s32 temp_t1;
s32 alpha;
s32 temp_v0_5;
s32 var_s0;
s32 var_t2;
u16 *temp_a3;
u16 p1_a;
u32 temp_v1;
s32 red8;
s32 green8;
s32 blue8;
temp_s5 = &D_803A5D00[D_802806EC][0];
sprite_frame = spriteGetFramePtr(sprite, frame);
if (!alpha_enabled) {
set_prim_color(0, 0, 0x80);
draw_prim_rect(x, y, sprite_frame->w, sprite_frame->h);
}
chunk_ptr = (BKSpriteTextureBlock *)(sprite_frame + 1);
for(i_chunk = 0; i_chunk < sprite_frame->chunkCnt; i_chunk++){
if( ((chunk_ptr->x >= -5) && (chunk_ptr->x < 0x29))
&& (chunk_ptr->y >= -5) && (chunk_ptr->y < 0x29)
) {
//align
var_t4 = (u32 *)(chunk_ptr + 1);
while((s32)var_t4 % 8){var_t4++;}
for(var_s0 = 0; var_s0 < chunk_ptr->h; var_s0++){
for(var_t2 = 0; var_t2 < chunk_ptr->w; var_t2++) {
temp_a1 = chunk_ptr->x + x + var_t2;
if ((temp_a1 >= 0) && (temp_a1 < D_80276588)) {
temp_a2 = chunk_ptr->y + y + var_s0;
if ((temp_a2 >= 0) && (temp_a2 < D_8027658C)) {
temp_v1 = *var_t4;
temp_a3 = temp_s5 + temp_a1 + temp_a2 * D_80276588;
alpha = _SHIFTR(temp_v1, 0, 8);
temp_t0 = *temp_a3;
if (alpha != 0) {
temp_v0_5 = 0xFF - alpha;
red8 = (((_SHIFTR(temp_v1, 24, 8) * alpha) + ((_SHIFTR(temp_t0, 11, 5) << 3) * temp_v0_5)) / 0xFF);
green8 = (((_SHIFTR(temp_v1, 16, 8) * alpha) + ((_SHIFTR(temp_t0, 6, 5) << 3) * temp_v0_5)) / 0xFF);
blue8 = (((_SHIFTR(temp_v1, 8, 8) * alpha) + ((_SHIFTR(temp_t0, 1, 5) << 3) * temp_v0_5)) / 0xFF);
*temp_a3 = _SHIFTL((red8 >> 3), 11, 5)
| _SHIFTL((green8 >> 3), 6, 5)
| _SHIFTL((blue8 >> 3), 1, 5)
| 1;
} else if (!alpha_enabled) {
*temp_a3 = 0x0001;
}
}
}
var_t4++;
}
}
chunk_ptr = (BKSpriteFrame *) var_t4;
}
}
}
#endif
void func_802499BC(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in
}
void func_802499D0(s32 arg0, s32 arg1, s32 arg2, s32 arg3){//signature may have more variables passed in
}
void draw_texture_ci4(s32 x, s32 y, void *tmem, s32 w, s32 h, bool alpha_enabled){
s32 ix;
s32 iy;
s32 icolor;
u16 *framebuffer_ptr;
u16 *palette_ptr;
u8 *pixel_ptr;
palette_ptr = (u16*)tmem;
pixel_ptr = (u8*)&palette_ptr[0x10];
framebuffer_ptr = &D_803A5D00[D_802806EC][x + y * D_80276588];
for(iy = 0; iy < h; iy++){
for(ix = 0; ix < w; ix++){
icolor = (ix & 1)? pixel_ptr[ix/2 + (iy*w)/2] & 0xF
: pixel_ptr[ix/2 + (iy*w)/2] >> 4;
*framebuffer_ptr = palette_ptr[icolor];
framebuffer_ptr++;
}
framebuffer_ptr += (D_80276588 - w);
}
}
void func_80249CEC(s32 x, s32 y, BKSprite *sprite, s32 frame, s32 alpha_enabled) {
s16 temp_v0;
temp_v0 = sprite->type;
if (temp_v0 & SPRITE_TYPE_I4) {
draw_sprite_i4(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_IA4) {
draw_sprite_ia4(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_I8) {
draw_sprite_i8(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_IA8) {
draw_sprite_ia8(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_RGBA16) {
draw_sprite_rgba16(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_RGBA32) {
draw_sprite_rgba32(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_CI4) {
draw_sprite_ci4(x, y, sprite, frame, alpha_enabled);
} else if (temp_v0 & SPRITE_TYPE_CI8) {
draw_sprite_ci8(x, y, sprite, frame, alpha_enabled);
}
}
//arg4 = alpha enabled?
void func_80249DE0(s32 x, s32 y, s16 *arg2, s32 arg3, s32 arg4) {
s32 ix;
s32 var_t2;
s32 iy;
u16 *framebuffer_ptr;
u16 *texture_ptr;
u16 temp_v1;
BKSpriteTextureBlock *temp_v0;
temp_v0 = func_8033EFB0(arg2, arg3);
texture_ptr = (u16*)(temp_v0 + 1);
if (*arg2 == SPRITE_TYPE_CI4) {
draw_texture_ci4(x, y, temp_v0 + 1, temp_v0->w, temp_v0->h, arg4);
return;
}
//otherwise RGBA16
framebuffer_ptr = &D_803A5D00[D_802806EC][x + y*D_80276588];
for(iy = 0; iy < temp_v0->h; iy++){
for(ix = 0; ix < temp_v0->w; ix++){
temp_v1 = *texture_ptr;
if (temp_v1 & 1) { //if visible
*framebuffer_ptr = temp_v1;
} else if (arg4 == 0) {
*framebuffer_ptr = 1;
}
texture_ptr++;
framebuffer_ptr++;
}
framebuffer_ptr += (D_80276588 - temp_v0->w);
}
}
#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_ABB0/func_80249F34.s")
//fill framebuffer with vert and horz lines
void func_8024A284(s32 x, s32 y, s32 arg2, s32 arg3, s32 horz_spacing, s32 vert_spacing) {
s32 var_s2;
s32 var_s3;
for(var_s2 = 0; var_s2 < D_80276588; var_s2 += horz_spacing){
for(var_s3 = 0; var_s3 < D_8027658C; var_s3++){
func_8024A3C8(x + var_s2, y + var_s3);
}
}
for(var_s3 = 0; var_s3 < D_8027658C; var_s3 += vert_spacing) {
for(var_s2 = 0; var_s2 < D_80276588; var_s2++){
func_8024A3C8(x + var_s2, y + var_s3);
}
}
}
//fills in pixel in frame buffer with D_802806E0 color
void func_8024A3C8(s32 x, s32 y) {
s32 temp_v0;
if (x >= 0) {
if ((x < D_80276588) && (y >= 0) && (y < D_8027658C)) {
D_803A5D00[D_802806EC][x + y * D_80276588] = _SHIFTL(D_802806E0 >> 3, 11, 5) | _SHIFTL(D_802806E4 >> 3, 6, 5) | _SHIFTL(D_802806E8 >> 3, 1, 5) | _SHIFTL(1, 0, 1);
}
}
}
//draw rectangular outline
void func_8024A490(s32 x, s32 y, s32 w, s32 h) {
s32 var_s1;
for(var_s1 = 0; var_s1 < w; var_s1++){
func_8024A3C8(x + var_s1, y);
func_8024A3C8(x + var_s1, y + h - 1);
}
for(var_s1 = 1; var_s1 < h - 1; var_s1++){
func_8024A3C8(x, y + var_s1);
func_8024A3C8(x + w - 1, y + var_s1);
}
}
void func_8024A564(s32 x, s32 y, u16 *arg2, s32 arg3, s32 arg4, f32 arg5, f32 arg6)
{
s32 temp_a2;
s32 temp_a2_2;
s32 temp_a2_3;
s32 temp_f6;
s32 temp_f6_2;
s32 temp_lo;
s32 temp_t5;
s32 var_a0;
s32 var_a2;
s32 new_var;
f32 new_var3;
s32 new_var2;
s32 var_t1;
s32 var_t3;
s32 var_v0;
s32 var_v1;
u16 temp_t8;
s16 *var_t0;
s16 *var_t2;
var_v0 = 0;
var_v1 = D_80276588;
var_t0 = &D_803A5D00[D_802806EC][x + (y * D_80276588)];
new_var = (s32) (((f64) (256.0f / (new_var3 = arg6))) + 0.5);
new_var2 = (s32) (((f64) (256.0f / arg5)) + 0.5);
for (var_t1 = (arg4 * arg6) + 0.5; var_t1 != 0; var_t1--)
{
temp_lo = (arg3 * arg5) + 0.5;
var_a2 = ((var_v0 >> 8) * arg3) << 8;
var_t2 = var_t0;
for (var_t3 = temp_lo; var_t3 != 0; var_t3--)
{
*var_t2 = arg2[var_a2 >> 8];
var_a2 += new_var2;
var_t2++;
}
var_t0 += D_80276588;
var_v0 += new_var;
}
}
//fills in rectangle in frame buffer with D_802806E0 color
void draw_prim_rect(s32 x, s32 y, s32 w, s32 h) {
s32 var_s0;
s32 var_s1;
s32 var_s4;
var_s4 = 0;
for(var_s4 = 0; var_s4 < w; var_s4++) {
for(var_s0 = 0; var_s0 < h; var_s0++){
func_8024A3C8(x + var_s4, y + var_s0);
}
}
}
void func_8024A810(void){
set_prim_color(0, 0x80, 0);
func_8024A85C(0);
}
void set_prim_color(s32 r, s32 g, s32 b){
D_802806E0 = r;
D_802806E4 = g;
D_802806E8 = b;
}
void func_8024A85C(s32 buffer_indx){
D_802806EC = buffer_indx;
}
s32 func_8024A868(void){
return D_802806EC;
}

1
tools/bk_tools Submodule

@ -0,0 +1 @@
Subproject commit 5a880b4978b9c8c7954ef0dc5d3faeeca754229b