From d5bdae504b0cd6440d215ff41862d2cfd22a86ca Mon Sep 17 00:00:00 2001 From: Banjo Kazooie Date: Wed, 23 Nov 2022 11:56:16 -0600 Subject: [PATCH] draw_sprite_ci8() done --- Makefile | 4 +- README.md | 2 +- decompressed.us.v10.yaml | 7 +- progress/progress_core1.svg | 6 +- progress/progress_total.svg | 4 +- src/core1/code_9D30.c | 704 ++++------------------------------- src/core1/code_ABB0.c | 708 ++++++++++++++++++++++++++++++++++++ tools/bk_tools | 1 + 8 files changed, 790 insertions(+), 646 deletions(-) create mode 100644 src/core1/code_ABB0.c create mode 160000 tools/bk_tools diff --git a/Makefile b/Makefile index 65c6196c..c9cb490a 100644 --- a/Makefile +++ b/Makefile @@ -128,7 +128,7 @@ TOTAL_PROG_CSV := progress/progress.total.csv TOTAL_PROG_SVG := progress/progress_total.svg OVERLAY_PROG_CSVS := $(addprefix progress/progress., $(addsuffix .csv, $(OVERLAYS))) OVERLAY_PROG_SVGS := $(addprefix progress/progress_, $(addsuffix .svg, $(OVERLAYS))) -README_MD := README.md +README := README.md ### 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) &&) \ $(PROGRESS_READ) $(MAIN_PROG_CSV) $(VERSION) bk_boot @$(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) $(addprefix progress-,$(OVERLAYS)) : progress-% : progress/progress.%.csv diff --git a/README.md b/README.md index b409adb5..113e3980 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# banjo (94.3651%) +# banjo (94.4536%) diff --git a/decompressed.us.v10.yaml b/decompressed.us.v10.yaml index be94a8e8..5ae87c7f 100644 --- a/decompressed.us.v10.yaml +++ b/decompressed.us.v10.yaml @@ -158,6 +158,7 @@ segments: - [0xF211B0, c, code_7F60] - [0xF21EA0, c, code_8C50] #DONE - [0xF22F80, c, code_9D30] + - [0xF23E00, c, code_ABB0] - [0xF260B0, c, done/code_CE60] #DONE - [0xF275B0, c, code_E360] #DONE - [0xF27D40, c, code_EAF0] @@ -366,7 +367,8 @@ segments: - [0xF510F0, bin, data_37EA0] # .data, code_5650] - [0xF51110, bin, data_37EC0] - [0xF51140, .data, code_8C50] - - [0xF51280, bin, data_38030] + - [0xF51280, .data, code_9D30] + - [0xF51430, .data, code_ABB0] - [0xF51440, bin, data_381F0] # .data, done/code_CE60] - [0xF514B0, bin, data_38260] - [0xF51570, .data, code_11AC0] @@ -400,6 +402,7 @@ segments: - [0xF52EF0, .rodata, code_72B0] - [0xF52F10, .rodata, code_7F60] - [0xF52F30, .rodata, code_9D30] + # - [0xF52F30, .rodata, code_ABB0] - [0xF52F50, .rodata, done/code_CE60] - [0xF53220, .rodata, code_EAF0] - [0xF532A0, .rodata, code_10A00] @@ -447,7 +450,7 @@ segments: - [0xF55960, .bss, code_7090] - [0xF55960, .bss, code_72B0] - [0xF55960, .bss, code_8C50] - - [0xF55960, .bss, code_9D30] + - [0xF55960, .bss, code_ABB0] - [0xF55960, .bss, done/code_CE60] - [0xF55960, .bss, code_E360] - [0xF55960, .bss, code_EAF0] diff --git a/progress/progress_core1.svg b/progress/progress_core1.svg index b284e866..1f61dc60 100644 --- a/progress/progress_core1.svg +++ b/progress/progress_core1.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core1 - 88.6623% - 88.6623% + 89.2720% + 89.2720% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 4283e05b..a9f35b76 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 94.3651% - 94.3651% + 94.4536% + 94.4536% \ No newline at end of file diff --git a/src/core1/code_9D30.c b/src/core1/code_9D30.c index 458065f2..17027d18 100644 --- a/src/core1/code_9D30.c +++ b/src/core1/code_9D30.c @@ -3,46 +3,81 @@ #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 /* .data */ -extern u8 D_80275A50[][3]; -extern s32 D_80275A68; -extern s32 D_80275A6C; -extern s32 D_80275A70; -extern u8 D_80275A74[]; -extern u32 D_80275A7C[0x140]; +u8 D_80275A50[8][3] = { + {0xFF, 0x00, 0x00}, + {0x00, 0xFF, 0x00}, + {0x00, 0x00, 0xFF}, + {0xFF, 0xFF, 0x00}, + {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; -extern s16 D_80275BC0; -extern s16 D_80275BC4; +s16 D_80275BBC = 0; +s16 D_80275BC0 = 0; +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 */ 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; -} diff --git a/src/core1/code_ABB0.c b/src/core1/code_ABB0.c new file mode 100644 index 00000000..94758fac --- /dev/null +++ b/src/core1/code_ABB0.c @@ -0,0 +1,708 @@ +#include +#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; +} diff --git a/tools/bk_tools b/tools/bk_tools new file mode 160000 index 00000000..5a880b49 --- /dev/null +++ b/tools/bk_tools @@ -0,0 +1 @@ +Subproject commit 5a880b4978b9c8c7954ef0dc5d3faeeca754229b