almost works

This commit is contained in:
sShemet
2025-10-05 16:30:50 +05:00
parent f44ef257ae
commit 9a82929c8b
6 changed files with 101 additions and 76 deletions

Binary file not shown.

View File

@@ -121,3 +121,14 @@ Custom regs:
s2 - char count for current sprite s2 - char count for current sprite
s8 - chunk block index (cpu2vram) s8 - chunk block index (cpu2vram)
- всегда за тобой
- splash screen переводчика
- имя в боёвке
- группа пернатых феникс р
- розовый аргус
- майя-прайм
- оракул где-то рядом
- ортр
- аэшма

View File

@@ -168,41 +168,53 @@ shadow_row_loop:
clear a2 // a2 = счётчик пикселей в строке (X координата) clear a2 // a2 = счётчик пикселей в строке (X координата)
li a1, 0x4 // a1 = сдвиг 1 пиксель вправо (4 бита) li a1, 0x4 // a1 = сдвиг 1 пиксель вправо (4 бита)
// Внутренний цикл по пикселям в строке // Внутренний цикл по пикселям в строке
shadow_pixel_loop: shadow_pixel_loop:
sll v0, a2, 0x2 // v0 = смещение битов (X * 4) move a1, a2 // a1 = текущий X пиксель
sllv v0, t2, v0 // v0 = маска исходного пикселя addiu a1, a1, 0x1 // +1 пиксель вправо
sll a1, a1, 0x2 // ×4 (перевод в биты)
sll v0, a2, 0x2 // v0 = смещение исходного пикселя (X * 4)
sllv v0, t2, v0 // v0 = маска для исходного пикселя
and v0, t0, v0 // проверяем есть ли исходный пиксель and v0, t0, v0 // проверяем есть ли исходный пиксель
beq v0, zero, no_s // если нет, пропускаем beq v0, zero, no_s // если пикселя нет, пропускаем
// ВЫЧИСЛЯЕМ АДРЕС ТЕНИ С УЧЕТОМ ГРАНИЦ
move t8, t7 // по умолчанию тот же спрайт
move v1, a1 // позиция тени в том же спрайте
// Если это пиксель 7 (последний), тень в следующем спрайте
sltiu v0, a2, 7 // проверяем X < 7
bne v0, zero, same_sprite // если не граничный, остаемся в том же спрайте
// Граничный случай: пиксель 7 -> тень в следующем спрайте, позиция 0
addiu t8, t7, 4 // следующий спрайт
li v1, 0x0 // позиция тени = 0 (младшие 4 бита)
same_sprite:
lw v0, 0x0(t8) // загружаем целевой спрайт для тени
nop nop
sllv a3, t2, v1 // маска для позиции тени
and v1, v0, a3 // проверяем занято ли место
bne v1, zero, no_s // если занято, пропускаем
sllv v1, t1, v1 // цвет тени в нужной позиции // Проверяем граничный случай (8-й пиксель)
or v0, v0, v1 // добавляем тень li v0, 0x7 // последний пиксель (X = 7)
sw v0, 0x0(t8) // сохраняем bne a2, v0, normal_case // если не 8-й пиксель - обычная обработка
nop
// Граничный случай: 8-й пиксель исходного спрайта
// Тень будет в позиции a1 = 32 (8 × 4) - это следующий word!
addu t8, t7, s3 // адрес следующей строки
addiu t8, t8, 0x4 // переходим к следующему word
lw v1, 0x0(t8) // загружаем следующий word
li v0, 0xF // маска для ПЕРВОГО пикселя в новом word
and v0, v1, v0 // проверяем занятость (биты 0-3 нового word)
bne v0, zero, no_s // если занято - пропускаем
nop
move v0, t1 // цвет тени (в биты 0-3 нового word)
or v0, v1, v0 // добавляем тень
sw v0, 0x0(t8) // сохраняем
b no_s
nop
normal_case:
addu t8, t7, s3 // этот же word в следующей строке
lw v1, 0x0(t8) // следующая строка
sllv v0, t2, a1 // маска для пикселя тени
and v0, v1, v0 // проверяем занятость
bne v0, zero, no_s // если занято - пропускаем
nop
sllv v0, t1, a1 // цвет тени
or v0, v1, v0 // добавляем тень
sw v0, 0x0(t8) // сохраняем
no_s: no_s:
addiu a2, a2, 0x1 // следующий пиксель (X+1) addiu a2, a2, 0x1 // следующий пиксель
sltiu v0, a2, 0x8 // проверяем X < 8 (ВСЕ 8 пикселей!) sltiu v0, a2, 0x8 // X < 8 (все 8 пикселей!)
bne v0, zero, shadow_pixel_loop // продолжаем цикл по пикселям bne v0, zero, shadow_pixel_loop
addiu a1, a1, 0x4 // следующая позиция тени (+4 бита = +1 пиксель) nop
addiu t5, t5, 0x04 addiu t5, t5, 0x04
bne t5, s3, shadow_sprites_loop bne t5, s3, shadow_sprites_loop

View File

@@ -253,7 +253,8 @@ TextGroupReadLoop:
sll v0, 1 sll v0, 1
addu t6, v0 // Сдвигаем X (прочитаем со следующим блоком символов) addu t6, v0 // Сдвигаем X (прочитаем со следующим блоком символов)
rect_set_width: rect_set_width:
sh v0, 0x10(s3) //И, не отходя от кассы, сохраняем в rect эту ширину sll v0, t5, 3 //Количество блоков спрайта * 8 = ширина спрайта
sh v0, 0x10(s3) // Сохраняем ширину спрайта
PageLoop: PageLoop:
// Создание цепочки копирования спрайта // Создание цепочки копирования спрайта

Binary file not shown.

View File

@@ -28,48 +28,49 @@
80090244 rect_cmd_init 80090244 rect_cmd_init
8009026C rect_set_x 8009026C rect_set_x
80090280 rect_set_width 80090280 rect_set_width
80090284 pageloop 80090288 pageloop
800902B4 rect_copy_scratch_to_ram 800902B8 rect_copy_scratch_to_ram
800902E0 rect_scratch_connect 800902E4 rect_scratch_connect
80090334 cpu2vram_cmd_loop 80090338 cpu2vram_cmd_loop
8009039C copy_char_data_start 800903A0 copy_char_data_start
800903B8 copy_char_data_loop 800903BC copy_char_data_loop
800903E0 set_flush_cache_cmd 800903E4 set_flush_cache_cmd
800903F0 cpu2vram_dma_link 800903F4 cpu2vram_dma_link
8009044C chunk_making_end 80090450 chunk_making_end
80090468 textend 8009046C textend
80090484 pagetloop 80090488 pagetloop
80090518 .asc:005A 8009051C .asc:005A
80090572 .byt:0001 80090576 .byt:0001
80090573 .byt:0001 80090577 .byt:0001
80090574 make_char_line_in_scratch 80090578 make_char_line_in_scratch
80090590 char_data_clear 80090594 char_data_clear
800905A0 char_data_loop 800905A4 char_data_loop
800905CC chars_font_loop 800905D0 chars_font_loop
800905F4 char_lines_loop 800905F8 char_lines_loop
80090604 its_not_empty 80090608 its_not_empty
80090694 not_last 80090698 not_last
800906A0 divideby4 800906A4 divideby4
800906A0 zero_jump 800906A4 zero_jump
800906B0 spacejump 800906B4 spacejump
800906CC sprite_end 800906D0 sprite_end
800906E4 make_shadow 800906E8 make_shadow
80090708 shadow_row_loop 8009070C shadow_row_loop
8009070C shadow_sprites_loop 80090710 shadow_sprites_loop
8009071C shadow_pixel_loop 80090720 shadow_pixel_loop
80090750 no_s 80090754 normal_case
8009077C notshadow 80090778 no_s
80090790 returncharsinstring 800907A4 notshadow
800907AC ismy1bytestring 800907B8 returncharsinstring
800907C8 notand1 800907D4 ismy1bytestring
800907D8 getnewchar 800907F0 notand1
800907DC startreading 80090800 getnewchar
800907F8 calcnextxcustom 80090804 startreading
80090820 japoldtext 80090820 calcnextxcustom
80090828 ihavestringlength 80090848 japoldtext
80090840 retuncharstocity 80090850 ihavestringlength
8009085C ismy1bytecity 80090868 retuncharstocity
80090870 retuncharstocitydiv2 80090884 ismy1bytecity
8009088C ismy1bytecitydiv2 80090898 retuncharstocitydiv2
800908A8 notand1_2 800908B4 ismy1bytecitydiv2
800908D0 notand1_2