arm9: use instruction TCM

This commit is contained in:
Zack Buhman 2024-09-11 08:58:05 -05:00
parent b7720547c7
commit 3aea58f4a9
5 changed files with 51 additions and 29 deletions

View File

@ -15,32 +15,32 @@ SECTIONS
*(.text) *(.text)
*(.text.*) *(.text.*)
. = ALIGN(32); . = ALIGN(32);
} >arm7_exclusive_internal_work_ram AT>main_memory } > arm7_exclusive_internal_work_ram AT> main_memory
.data ALIGN(4) : .data ALIGN(4) :
{ {
*(.data) *(.data)
*(.data.*) *(.data.*)
} >arm7_exclusive_internal_work_ram AT>main_memory } > arm7_exclusive_internal_work_ram AT> main_memory
.rodata ALIGN(4) : .rodata ALIGN(4) :
{ {
*(.rodata) *(.rodata)
*(.rodata.*) *(.rodata.*)
} >arm7_exclusive_internal_work_ram AT>main_memory } > arm7_exclusive_internal_work_ram AT> main_memory
.ctors ALIGN(4) : .ctors ALIGN(4) :
{ {
KEEP(*(.ctors)) KEEP(*(.ctors))
KEEP(*(.ctors.*)) KEEP(*(.ctors.*))
} >arm7_exclusive_internal_work_ram AT>main_memory } > arm7_exclusive_internal_work_ram AT> main_memory
.bss ALIGN(4) (NOLOAD) : .bss ALIGN(4) (NOLOAD) :
{ {
*(.bss) *(.bss)
*(.bss.*) *(.bss.*)
*(COMMON) *(COMMON)
} >arm7_exclusive_internal_work_ram } > arm7_exclusive_internal_work_ram
/DISCARD/ : /DISCARD/ :
{ {

View File

@ -2,47 +2,47 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm) OUTPUT_ARCH(arm)
MEMORY MEMORY
{ {
ram : ORIGIN = 0x02000000, LENGTH = 4M main_memory : ORIGIN = 0x02000000, LENGTH = 4M - 256K
arm9_instruction_tcm : ORIGIN = 0x01000000, LENGTH = 32K
arm9_data_tcm : ORIGIN = 0x027e0000, LENGTH = 16K
} }
SECTIONS SECTIONS
{ {
. = ORIGIN(ram); . = ORIGIN(arm9_instruction_tcm);
.text ALIGN(4) : .text ALIGN(4) :
{ {
KEEP(*(.text.start)) KEEP(*(.text.start))
*(.text) *(.text)
*(.text.*) *(.text.*)
*(.glue_7t) . = ALIGN(32);
*(.glue_7) } > arm9_instruction_tcm AT> main_memory
*(.vfp11_veneer)
*(.v4_bx) . = ORIGIN(main_memory) + SIZEOF(.text);
} > ram
.data ALIGN(4) : .data ALIGN(4) :
{ {
*(.data) *(.data)
*(.data.*) *(.data.*)
} > ram } > main_memory
.rodata ALIGN(4) : .rodata ALIGN(4) :
{ {
*(.rodata) *(.rodata)
*(.rodata.*) *(.rodata.*)
} > ram } > main_memory
.ctors ALIGN(4) :
{
KEEP(*(.ctors))
KEEP(*(.ctors.*))
} > ram
.bss ALIGN(4) (NOLOAD) : .bss ALIGN(4) (NOLOAD) :
{ {
*(.bss) *(.bss)
*(.bss.*) *(.bss.*)
*(COMMON) *(COMMON)
} > ram } > main_memory
/DISCARD/ :
{
*(.glue_7) *(.glue_7t) *(.vfp11_veneer) *(.v4_bx)
}
INCLUDE "../debug.lds" INCLUDE "../debug.lds"
} }
@ -50,4 +50,4 @@ SECTIONS
INCLUDE "../symbols.lds" INCLUDE "../symbols.lds"
INCLUDE "addresses.lds" INCLUDE "addresses.lds"
__stack_end = ORIGIN(ram) + LENGTH(ram) - 4; __stack_end = ORIGIN(main_memory) + LENGTH(main_memory) - 4;

View File

@ -287,8 +287,8 @@ void main()
io_registers.a.MTX_IDENTITY = 0; io_registers.a.MTX_IDENTITY = 0;
io_registers.a.MTX_TRANS = 0; io_registers.a.MTX_TRANS = 0;
io_registers.a.MTX_TRANS = (int)(-0.7 * (float)(1 << 12)); io_registers.a.MTX_TRANS = (int)(-1.0 * (float)(1 << 12));
io_registers.a.MTX_TRANS = (int)(-0.1 * (float)(1 << 12)); io_registers.a.MTX_TRANS = (int)(0.15 * (float)(1 << 12));
// multiply by a y-axis rotation // multiply by a y-axis rotation

View File

@ -1,4 +1,17 @@
.macro FILL_ZERO_32_BYTE_ALIGNED /* DDI0201D_arm946es_r1p1_trm.pdf pdf page 40 ; printed page 2-12 */
.set INSTRUCTION_TCM_LOAD_MODE, (1 << 19)
.set INSTRUCTION_TCM_ENABLE, (1 << 18)
.set DATA_TCM_LOAD_MODE, (1 << 17)
.set DATA_TCM_ENABLE, (1 << 16)
.set DISABLE_LOADING_TBIT, (1 << 15)
.set ROUND_ROBIN_REPLACEMENT, (1 << 14)
.set ALTERNATE_VECTOR_SELET, (1 << 13)
.set INSTRUCTION_CACHE_ENABLE, (1 << 12)
.set BIG_ENDIAN, (1 << 7)
.set DATA_CACHE_ENABLE, (1 << 2)
.set PROTECTION_UNIT_ENABLE, (1 << 0)
.macro FILL_ZERO_32_BYTE_ALIGNED
cmp r1, r10 cmp r1, r10
beq _fill_break.\@ beq _fill_break.\@
.irp i, 2, 3, 4, 5, 6, 7, 8, 9 .irp i, 2, 3, 4, 5, 6, 7, 8, 9
@ -25,13 +38,25 @@ _fill_break.\@:
.section .text.start .section .text.start
.global _start .global _start
_start: _start:
/* // https://developer.arm.com/documentation/ddi0338/g/system-control-coprocessor/system-control-processor-registers/c9--data-tcm-region-register?lang=en
// set data tcm address
ldr r0, =0x027e0000
mcr p15, 0, r0, c9, c1, 0
// enable instruction and data TCM
mrc p15, 0, r0, c1, c0, 0
ldr r1, =INSTRUCTION_TCM_ENABLE | DATA_TCM_ENABLE | INSTRUCTION_CACHE_ENABLE | DATA_CACHE_ENABLE
orr r0, r0, r1
mcr p15, 0, r0, c1, c0, 0
_link_text: _link_text:
ldr r0, =__text_load_start ldr r0, =__text_load_start
ldr r1, =__text_link_start ldr r1, =__text_link_start
ldr r10, =__text_link_end ldr r10, =__text_link_end
COPY_32_BYTE_ALIGNED COPY_32_BYTE_ALIGNED
/*
_link_data: _link_data:
ldr r0, =__data_load_start ldr r0, =__data_load_start
ldr r1, =__data_link_start ldr r1, =__data_link_start

View File

@ -10,8 +10,5 @@ __rodata_link_start = ADDR(.rodata);
__rodata_link_end = ADDR(.rodata) + SIZEOF(.rodata); __rodata_link_end = ADDR(.rodata) + SIZEOF(.rodata);
__rodata_load_start = LOADADDR(.rodata); __rodata_load_start = LOADADDR(.rodata);
__ctors_link_start = ADDR(.ctors);
__ctors_link_end = ADDR(.ctors) + SIZEOF(.ctors);
__bss_link_start = ADDR(.bss); __bss_link_start = ADDR(.bss);
__bss_link_end = ADDR(.bss) + SIZEOF(.bss); __bss_link_end = ADDR(.bss) + SIZEOF(.bss);