mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
split memories away from Pico
saves ~3k of code on ARM because Pico no longer crosses ldr limit
This commit is contained in:
parent
e64886365d
commit
88fd63ad10
30 changed files with 633 additions and 587 deletions
116
pico/draw_arm.S
116
pico/draw_arm.S
|
@ -287,10 +287,10 @@ DrawLayer:
|
|||
ldr r12, [sp] @ est
|
||||
stmfd sp!, {r4-r11,lr}
|
||||
|
||||
ldr r11, [r12, #OFS_Pico_video]
|
||||
ldr r11, [r12, #OFS_EST_Pico]
|
||||
mov r8, #1
|
||||
|
||||
ldrb r7, [r11, #16] @ ??vv??hh
|
||||
ldrb r7, [r11, #OFS_Pico_video_reg+16] @ ??vv??hh
|
||||
|
||||
mov r6, r1 @ hcache
|
||||
orr r9, r3, r0, lsl #29 @ r9=force[31]|sh[30]|plane[29]
|
||||
|
@ -311,13 +311,13 @@ DrawLayer:
|
|||
cmp r10, #7
|
||||
subge r10, r10, #1 @ r10=shift[width] (5,6,6,7)
|
||||
|
||||
ldr r2, [r12, #OFS_DrawScanline]
|
||||
ldr lr, [r12, #OFS_Pico_vram]
|
||||
ldr r2, [r12, #OFS_EST_DrawScanline]
|
||||
ldr lr, [r12, #OFS_EST_PicoMem_vram]
|
||||
|
||||
@ Find name table:
|
||||
ands r0, r0, #1
|
||||
ldreqb r12, [r11, #2]
|
||||
ldrneb r12, [r11, #4]
|
||||
ldreqb r12, [r11, #OFS_Pico_video_reg+2]
|
||||
ldrneb r12, [r11, #OFS_Pico_video_reg+4]
|
||||
|
||||
@ calculate xmask:
|
||||
mov r5, r8, lsl r10
|
||||
|
@ -327,8 +327,8 @@ DrawLayer:
|
|||
movne r12, r12, lsl #13
|
||||
and r12, r12, #(7<<13) @ r12=(ts->nametab<<1) (halfword compliant)
|
||||
|
||||
ldrh r8, [r11, #12]
|
||||
ldrb r7, [r11, #11]
|
||||
ldrh r8, [r11, #OFS_Pico_video_reg+12]
|
||||
ldrb r7, [r11, #OFS_Pico_video_reg+11]
|
||||
|
||||
mov r4, r8, lsr #8 @ pvid->reg[13]
|
||||
mov r4, r4, lsl #10 @ htab=pvid->reg[13]<<9; (halfwords)
|
||||
|
@ -345,7 +345,7 @@ DrawLayer:
|
|||
|
||||
@ Get vertical scroll value:
|
||||
add r7, lr, #0x012000
|
||||
add r7, r7, #0x000180 @ r7=Pico.vsram (Pico+0x22180)
|
||||
add r7, r7, #0x000180 @ r7=PicoMem.vsram (PicoMem+0x22180)
|
||||
ldr r7, [r7]
|
||||
|
||||
tst r8, #2
|
||||
|
@ -392,7 +392,7 @@ DrawLayer:
|
|||
@ cache some stuff to avoid mem access
|
||||
ldr r11,[sp, #9*4] @ est
|
||||
mov r0, #0xf
|
||||
ldr r11,[r11, #OFS_HighCol]
|
||||
ldr r11,[r11, #OFS_EST_HighCol]
|
||||
|
||||
mvn r9, #0 @ r9=prevcode=-1
|
||||
add r1, r11, r7 @ r1=pdest
|
||||
|
@ -497,10 +497,10 @@ DrawLayer:
|
|||
tst r10, #1<<21 @ seen non hi-prio tile
|
||||
ldr r1, [sp, #9*4] @ est
|
||||
mov r0, #0
|
||||
ldreq r2, [r1, #OFS_rendstatus]
|
||||
ldreq r2, [r1, #OFS_EST_rendstatus]
|
||||
str r0, [r6] @ terminate the cache list
|
||||
orreq r2, r2, #PDRAW_PLANE_HI_PRIO @ had a layer with all hi-prio tiles
|
||||
streq r2, [r1, #OFS_rendstatus]
|
||||
streq r2, [r1, #OFS_EST_rendstatus]
|
||||
|
||||
ldmfd sp!, {r4-r11,lr}
|
||||
bx lr
|
||||
|
@ -515,7 +515,7 @@ DrawLayer:
|
|||
|
||||
ldr r11, [sp, #9*4] @ est
|
||||
orr r5, r1, r10, lsl #24
|
||||
ldr r4, [r11, #OFS_DrawScanline]
|
||||
ldr r4, [r11, #OFS_EST_DrawScanline]
|
||||
sub r1, r3, #1
|
||||
orr r5, r5, r4, lsl #16 @ r5=(shift_width[31:24]|scanline[23:16]|ymask[15:0])
|
||||
and r1, r1, #7
|
||||
|
@ -541,7 +541,7 @@ DrawLayer:
|
|||
@ cache some stuff to avoid mem access
|
||||
ldr r11,[sp, #9*4] @ est
|
||||
mov r0, #0xf
|
||||
ldr r11,[r11, #OFS_HighCol]
|
||||
ldr r11,[r11, #OFS_EST_HighCol]
|
||||
|
||||
mvn r9, #0 @ r9=prevcode=-1
|
||||
add r1, r11, r7 @ r1=pdest
|
||||
|
@ -557,7 +557,7 @@ DrawLayer:
|
|||
|
||||
@ calc offset and read tileline code to r7, also calc ty
|
||||
add r7, lr, #0x012000
|
||||
add r7, r7, #0x000180 @ r7=Pico.vsram (Pico+0x22180)
|
||||
add r7, r7, #0x000180 @ r7=PicoMem.vsram (PicoMem+0x22180)
|
||||
add r7, r7, r10,asr #23 @ vsram + ((cell&~1)<<1)
|
||||
bic r7, r7, #3
|
||||
tst r10,#0x8000 @ plane1?
|
||||
|
@ -576,7 +576,7 @@ DrawLayer:
|
|||
mov r4, r4, lsl r7 @ nametabadd
|
||||
|
||||
and r7, r8, r8, lsr #25
|
||||
add r7, lr, r7, lsl #1 @ Pico.vram+((tilex&ts->xmask) as halfwords)
|
||||
add r7, lr, r7, lsl #1 @ PicoMem.vram+((tilex&ts->xmask) as halfwords)
|
||||
add r7, r7, r4, lsl #1
|
||||
ldrh r7, [r7, r12] @ r7=code (int, but from unsigned, no sign extend)
|
||||
|
||||
|
@ -598,7 +598,7 @@ DrawLayer:
|
|||
mov r2, r2, lsr #17
|
||||
eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;
|
||||
|
||||
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
|
||||
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(PicoMem.vram+addr); // Get 8 pixels
|
||||
|
||||
bic r7, r3, #0x3f
|
||||
and r3, r9, #0x6000
|
||||
|
@ -656,7 +656,7 @@ DrawLayer:
|
|||
add r2, r2, r10, lsl #17
|
||||
mov r2, r2, lsr #17
|
||||
eorcs r2, r2, #0x0e @ if (code&0x1000) addr^=0xe;
|
||||
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
|
||||
ldr r2, [lr, r2, lsl #1] @ pack=*(unsigned int *)(PicoMem.vram+addr); // Get 8 pixels
|
||||
mov r9, r7 @ remember code
|
||||
tst r2, r2
|
||||
orrne r10, r10, #1<<22
|
||||
|
@ -667,10 +667,10 @@ DrawLayer:
|
|||
tst r8, #(1<<24) @ seen non hi-prio tile
|
||||
ldr r1, [sp, #9*4] @ est
|
||||
mov r0, #0
|
||||
ldreq r2, [r1, #OFS_rendstatus]
|
||||
ldreq r2, [r1, #OFS_EST_rendstatus]
|
||||
str r0, [r6] @ terminate the cache list
|
||||
orreq r2, r2, #PDRAW_PLANE_HI_PRIO @ had a layer with all hi-prio tiles
|
||||
streq r2, [r1, #OFS_rendstatus]
|
||||
streq r2, [r1, #OFS_EST_rendstatus]
|
||||
|
||||
ldmfd sp!, {r4-r11,lr}
|
||||
bx lr
|
||||
|
@ -716,7 +716,7 @@ BackFill:
|
|||
stmfd sp!, {r4-r9,lr}
|
||||
|
||||
mov r0, r0, lsl #26
|
||||
ldr lr, [r2, #OFS_HighCol]
|
||||
ldr lr, [r2, #OFS_EST_HighCol]
|
||||
mov r0, r0, lsr #26
|
||||
add lr, lr, #8
|
||||
|
||||
|
@ -758,9 +758,9 @@ DrawTilesFromCache:
|
|||
stmfd sp!, {r4-r9,r11,lr}
|
||||
|
||||
@ cache some stuff to avoid mem access
|
||||
ldr r11,[r3, #OFS_HighCol]
|
||||
ldr r11,[r3, #OFS_EST_HighCol]
|
||||
mov r12,#0xf
|
||||
ldr lr, [r3, #OFS_Pico_vram]
|
||||
ldr lr, [r3, #OFS_EST_PicoMem_vram]
|
||||
mov r9, r3 @ est
|
||||
|
||||
mvn r5, #0 @ r5=prevcode=-1
|
||||
|
@ -892,14 +892,14 @@ DrawTilesFromCache:
|
|||
|
||||
@ check if we have detected layer covered with hi-prio tiles:
|
||||
.dtfc_check_rendflags:
|
||||
ldr r2, [r9, #OFS_rendstatus]
|
||||
ldr r2, [r9, #OFS_EST_rendstatus]
|
||||
tst r2, #(PDRAW_PLANE_HI_PRIO|PDRAW_SHHI_DONE)
|
||||
beq .dtfc_loop
|
||||
bic r8, r8, #1 @ sh/hi mode off
|
||||
tst r2, #PDRAW_SHHI_DONE
|
||||
bne .dtfc_loop @ already processed
|
||||
orr r2, r2, #PDRAW_SHHI_DONE
|
||||
str r2, [r9, #OFS_rendstatus]
|
||||
str r2, [r9, #OFS_EST_rendstatus]
|
||||
|
||||
add r1, r11,#8
|
||||
mov r3, #320/4/4
|
||||
|
@ -939,16 +939,16 @@ DrawSpritesSHi:
|
|||
add r10,r0, #3 @ r10=HighLnSpr end
|
||||
add r10,r10,r3 @ r10=HighLnSpr end
|
||||
|
||||
ldr r11,[r1, #OFS_HighCol]
|
||||
ldr r11,[r1, #OFS_EST_HighCol]
|
||||
mov r12,#0xf
|
||||
ldr lr, [r1, #OFS_Pico_vram]
|
||||
ldr lr, [r1, #OFS_EST_PicoMem_vram]
|
||||
|
||||
|
||||
DrawSpriteSHi:
|
||||
@ draw next sprite
|
||||
ldrb r0, [r10,#-1]!
|
||||
ldr r7, [sp] @ est
|
||||
ldr r1, [r7, #OFS_HighPreSpr]
|
||||
ldr r1, [r7, #OFS_EST_HighPreSpr]
|
||||
cmp r0, #0xff
|
||||
ldmeqfd sp!, {r1,r4-r11,pc} @ end of list
|
||||
and r0, r0, #0x7f
|
||||
|
@ -974,7 +974,7 @@ DrawSpriteSHi:
|
|||
mov r5, r3, lsr #24
|
||||
and r5, r5, #7 @ r5=height
|
||||
|
||||
ldr r7, [r7, #OFS_DrawScanline]
|
||||
ldr r7, [r7, #OFS_EST_DrawScanline]
|
||||
mov r0, r3, lsl #16 @ r4=sy<<16 (tmp)
|
||||
|
||||
sub r7, r7, r0, asr #16 @ r7=row=DrawScanline-sy
|
||||
|
@ -1015,7 +1015,7 @@ DrawSpriteSHi:
|
|||
mov r8, r8, lsl #17
|
||||
mov r8, r8, lsr #17 @ tile&=0x7fff; // Clip tile address
|
||||
|
||||
ldr r2, [lr, r8, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
|
||||
ldr r2, [lr, r8, lsl #1] @ pack=*(unsigned int *)(PicoMem.vram+addr); // Get 8 pixels
|
||||
add r1, r11, r0 @ r1=pdest
|
||||
tst r2, r2
|
||||
beq .dsprShi_loop
|
||||
|
@ -1117,9 +1117,9 @@ DrawAllSprites:
|
|||
add r10,r0, #3
|
||||
add r10,r10,r2 @ r10=HighLnSpr end
|
||||
|
||||
ldr r11,[r3, #OFS_HighCol]
|
||||
ldr r11,[r3, #OFS_EST_HighCol]
|
||||
mov r12,#0xf
|
||||
ldr lr, [r3, #OFS_Pico_vram]
|
||||
ldr lr, [r3, #OFS_EST_PicoMem_vram]
|
||||
|
||||
@ + 0 : hhhhvvvv ----hhvv yyyyyyyy yyyyyyyy // v, h: horiz. size
|
||||
@ + 4 : xxxxxxxx xxxxxxxx pccvhnnn nnnnnnnn // x: x coord + 8
|
||||
|
@ -1134,12 +1134,12 @@ DrawSprite:
|
|||
ldmeqfd sp!, {r1,r3-r11,pc} @ end of list
|
||||
cmp r2, r8, lsr #1
|
||||
bne DrawSprite @ wrong priority
|
||||
ldr r1, [r7, #OFS_HighPreSpr]
|
||||
ldr r1, [r7, #OFS_EST_HighPreSpr]
|
||||
and r0, r0, #0x7f
|
||||
add r0, r1, r0, lsl #3
|
||||
|
||||
ldr r3, [r0] @ sprite[0]
|
||||
ldr r7, [r7, #OFS_DrawScanline]
|
||||
ldr r7, [r7, #OFS_EST_DrawScanline]
|
||||
mov r6, r3, lsr #28
|
||||
sub r6, r6, #1 @ r6=width-1 (inc later)
|
||||
mov r5, r3, lsr #24
|
||||
|
@ -1198,7 +1198,7 @@ DrawSprite:
|
|||
mov r8, r8, lsl #17
|
||||
mov r8, r8, lsr #17 @ tile&=0x7fff; // Clip tile address
|
||||
|
||||
ldr r2, [lr, r8, lsl #1] @ pack=*(unsigned int *)(Pico.vram+addr); // Get 8 pixels
|
||||
ldr r2, [lr, r8, lsl #1] @ pack=*(unsigned int *)(PicoMem.vram+addr); // Get 8 pixels
|
||||
add r1, r11, r0 @ r1=pdest
|
||||
tst r2, r2
|
||||
beq .dspr_loop
|
||||
|
@ -1267,12 +1267,12 @@ DrawWindow:
|
|||
ldr r12, [sp] @ est
|
||||
stmfd sp!, {r4-r11,lr}
|
||||
|
||||
ldr r6, [r12, #OFS_Pico_video]
|
||||
ldr r10, [r12, #OFS_DrawScanline]
|
||||
ldr r6, [r12, #OFS_EST_Pico]
|
||||
ldr r10, [r12, #OFS_EST_DrawScanline]
|
||||
mov r11, r12 @ est
|
||||
ldrb r12, [r6, #3] @ pvid->reg[3]
|
||||
ldrb r12, [r6, #OFS_Pico_video_reg+3] @ pvid->reg[3]
|
||||
|
||||
ldr r4, [r6, #12]
|
||||
ldr r4, [r6, #OFS_Pico_video_reg+12]
|
||||
mov r5, r10, lsr #3
|
||||
and r10, r10, #7
|
||||
mov r10, r10, lsl #1 @ r10=ty
|
||||
|
@ -1286,8 +1286,8 @@ DrawWindow:
|
|||
addeq r12, r12, r5, lsl #6 @ nametab
|
||||
add r12, r12, r0, lsl #2 @ +starttile
|
||||
|
||||
ldr lr, [r11, #OFS_Pico_vram]
|
||||
ldr r6, [r11, #OFS_rendstatus]
|
||||
ldr lr, [r11, #OFS_EST_PicoMem_vram]
|
||||
ldr r6, [r11, #OFS_EST_rendstatus]
|
||||
|
||||
@ fetch the first code now
|
||||
ldrh r7, [lr, r12]
|
||||
|
@ -1304,7 +1304,7 @@ DrawWindow:
|
|||
sub r8, r1, r0
|
||||
|
||||
@ cache some stuff to avoid mem access
|
||||
ldr r11, [r11, #OFS_HighCol]
|
||||
ldr r11, [r11, #OFS_EST_HighCol]
|
||||
mov r8, r8, lsl #1 @ cells
|
||||
add r11,r11,#8
|
||||
mvn r9, #0 @ r9=prevcode=-1
|
||||
|
@ -1392,9 +1392,9 @@ DrawWindow:
|
|||
and r2, r6, #PDRAW_WND_DIFF_PRIO
|
||||
ldmfd sp!, {r4-r11,lr}
|
||||
ldr r0, [sp]
|
||||
ldr r1, [r0, #OFS_rendstatus]
|
||||
ldr r1, [r0, #OFS_EST_rendstatus]
|
||||
orr r1, r1, r2
|
||||
str r1, [r0, #OFS_rendstatus]
|
||||
str r1, [r0, #OFS_EST_rendstatus]
|
||||
|
||||
bx lr
|
||||
|
||||
|
@ -1486,17 +1486,17 @@ PicoDoHighPal555:
|
|||
stmfd sp!, {r4-r10,lr}
|
||||
mov r10,r2 @ est
|
||||
mov r1, #0
|
||||
ldr r8, [r10, #OFS_Pico_video]
|
||||
ldr r8, [r10, #OFS_EST_Pico]
|
||||
|
||||
PicoDoHighPal555_nopush:
|
||||
orr r9, r1, r0, lsl #31 @ 0:called from FinalizeLine555, 31: s/h
|
||||
|
||||
add r0, r10, #OFS_HighPal
|
||||
add r0, r10, #OFS_EST_HighPal
|
||||
|
||||
mov r1, #0
|
||||
strb r1, [r8, #-0x1a] @ 0x2220e ~ dirtyPal
|
||||
strb r1, [r8, #OFS_Pico_m_dirtyPal]
|
||||
|
||||
sub r1, r8, #0x128 @ r1=Pico.cram
|
||||
ldr r1, [r10, #OFS_EST_PicoMem_cram]
|
||||
mov r2, #0x40
|
||||
mov r8, #0x0061
|
||||
orr r8, r8, #0x0800
|
||||
|
@ -1507,7 +1507,7 @@ PicoDoHighPal555_nopush:
|
|||
tst r9, #(1<<31)
|
||||
beq PicoDoHighPal555_end
|
||||
|
||||
add r3, r10, #OFS_HighPal
|
||||
add r3, r10, #OFS_EST_HighPal
|
||||
|
||||
@ shadowed pixels:
|
||||
mov r12, #0x008e
|
||||
|
@ -1550,7 +1550,7 @@ PicoDoHighPal555_end:
|
|||
tst r9, #1
|
||||
ldmeqfd sp!, {r4-r10,pc}
|
||||
|
||||
ldr r8, [r10, #OFS_Pico_video]
|
||||
ldr r8, [r10, #OFS_EST_Pico]
|
||||
b FinalizeLineRGB555_pal_done
|
||||
|
||||
|
||||
|
@ -1561,33 +1561,33 @@ PicoDoHighPal555_end:
|
|||
FinalizeLine555:
|
||||
stmfd sp!, {r4-r10,lr}
|
||||
mov r10,r2 @ est
|
||||
ldr r8, [r10, #OFS_Pico_video]
|
||||
ldr r8, [r10, #OFS_EST_Pico]
|
||||
|
||||
ldrb r2, [r8, #-0x1a] @ 0x2220e ~ dirtyPal
|
||||
ldrb r2, [r8, #OFS_Pico_m_dirtyPal]
|
||||
mov r1, #1
|
||||
tst r2, r2
|
||||
bne PicoDoHighPal555_nopush
|
||||
|
||||
FinalizeLineRGB555_pal_done:
|
||||
add r3, r10, #OFS_HighPal
|
||||
add r3, r10, #OFS_EST_HighPal
|
||||
|
||||
ldr r12, [r10, #OFS_rendstatus]
|
||||
ldr r12, [r10, #OFS_EST_rendstatus]
|
||||
eors r0, r0, #1 @ sh is 0
|
||||
mov lr, #0xff
|
||||
tstne r12,#PDRAW_ACC_SPRITES
|
||||
movne lr, #0x3f
|
||||
|
||||
ldr r1, [r10, #OFS_HighCol]
|
||||
ldr r0, [r10, #OFS_DrawLineDest]
|
||||
ldr r1, [r10, #OFS_EST_HighCol]
|
||||
ldr r0, [r10, #OFS_EST_DrawLineDest]
|
||||
add r1, r1, #8
|
||||
|
||||
ldrb r12, [r8, #12]
|
||||
ldrb r12, [r8, #OFS_Pico_video_reg+12]
|
||||
mov lr, lr, lsl #1
|
||||
|
||||
tst r12, #1
|
||||
movne r2, #320/8 @ len
|
||||
bne .fl_no32colRGB555
|
||||
ldr r4, [r10, #OFS_PicoOpt]
|
||||
ldr r4, [r10, #OFS_EST_PicoOpt]
|
||||
mov r2, #256/8
|
||||
ldr r4, [r4]
|
||||
tst r4, #0x4000
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue