@ --------------------------------------------------------------------------------
@ main.s - Setups the protection unit, initializes the system.
@ --------------------------------------------------------------------------------
@ --------------------------------------------------------------------------------
@ Crucial assembler information
@ --------------------------------------------------------------------------------
.arch armv5te
.cpu arm946e-s
.align 4
.arm
@ --------------------------------------------------------------------------------
@ Global declarations
@ --------------------------------------------------------------------------------
.global arm9_main
@ --------------------------------------------------------------------------------
@ Program entry point. Clear caches, define ITCM/DTCM, setup protection unit.
@ This code is used courtesy of Sasq; the addresses have been slightly modified.
@ --------------------------------------------------------------------------------
arm9_main:
@ ----------------------------------------
@ Clear instruction and data cache
@ Then wait for write buffer to empty
@ ----------------------------------------
mov r0, #0x00
mcr p15, 0, r0, c7, c5, 0
mcr p15, 0, r0, c7, c6, 0
mcr p15, 0, r0, c7, c10, 4
@ ----------------------------------------
@ Tell the co-processor where our
@ instruction and data memory caches
@ are located.
@
@ DTCM = 0x0B000000, size = 16kb
@ ITCM = 0x00000000, size = 32kb
@ ----------------------------------------
ldr r0, =0x0B00000A
mcr p15, 0, r0, c9, c1, 0
mov r0, #0x00000020
mcr p15, 0, r0, c9, c1, 1
@ --------------------------------------------------------------------------------
@ Setup the protection unit similar to how it is for commercial cartridges.
@ There are some slight modifications based on what genuine Nintendo cartridges
@ use. This table was pulled directly from Martin Korth's documentation.
@
@ I have not bothered to check/verify R/W-ability for most sections...
@ --------------------------------------------------------------------------------
@
@ Region Name Address Size Cache WBuf
@ - Background 00000000h 4GB - -
@ 0 I/O & VRAM 04000000h 64MB - -
@ 1 Main Memory 02000000h 4MB On On
@ 2 ARM7-Dedic. 027C0000h 256KB - -
@ 3 GBA Slot 08000000h 128MB - -
@ 4 DTCM 027C0000h 16KB - -
@ 5 ITCM 01000000h 32KB - -
@ 6 BIOS FFFF0000h 32KB On -
@ 7 Shared Mem 027FF000h 4KB - -
@ --------------------------------------------------------------------------------
#define PAGE_4K (0b01011 << 1)
#define PAGE_8K (0b01100 << 1)
#define PAGE_16K (0b01101 << 1)
#define PAGE_32K (0b01110 << 1)
#define PAGE_64K (0b00111 << 1)
#define PAGE_128K (0b10000 << 1)
#define PAGE_256K (0b10001 << 1)
#define PAGE_512K (0b10010 << 1)
#define PAGE_1M (0b10011 << 1)
#define PAGE_2M (0b10100 << 1)
#define PAGE_4M (0b10101 << 1)
#define PAGE_8M (0b10110 << 1)
#define PAGE_16M (0b10111 << 1)
#define PAGE_32M (0b11000 << 1)
#define PAGE_64M (0b11001 << 1)
#define PAGE_128M (0b11010 << 1)
#define PAGE_256M (0b11011 << 1)
#define PAGE_512M (0b11100 << 1)
#define PAGE_1G (0b11101 << 1)
#define PAGE_2G (0b11110 << 1)
#define PAGE_4G (0b11111 << 1)
@ ----------------------------------------
@ Region 0: I/O Registers
@ ----------------------------------------
ldr r0, =(0b11001 << 1 | 0x04000000 | 1)
mcr p15, 0, r0, c6, c0, 0
@ ----------------------------------------
@ Region 1: Main Memory
@ ----------------------------------------
ldr r0, =(0b10101 << 1 | 0x02000000 | 1)
mcr p15, 0, r0, c6, c1, 0
@ ----------------------------------------
@ Region 2: ARM7 Dedicated
@ ----------------------------------------
ldr r0, =(0b10001 << 1 | 0x027C0000 | 1)
mcr p15, 0, r0, c6, c2, 0
@ ----------------------------------------
@ Region 3: GBA Slot
@ ----------------------------------------
ldr r0, =(0b11010 << 1 | 0x08000000 | 1)
mcr p15, 0, r0, c6, c3, 0
@ ----------------------------------------
@ Region 4: DTCM
@
@ Base must be size-aligned, so
@ have to do lsr #15, lsl #15
@ ----------------------------------------
ldr r0, =(0b01101 << 1 | 0x027C0000 | 1)
mcr p15, 0, r0, c6, c4, 0
@ ----------------------------------------
@ Region 5: ITCM
@
@ Base must be size-aligned, so
@ have to do lsr #15, lsl #15
@ ----------------------------------------
ldr r0, =(0b01110 << 1 | 0x01000000 | 1)
mcr p15, 0, r0, c6, c5, 0
@ ----------------------------------------
@ Region 6: BIOS
@ ----------------------------------------
ldr r0, =(0b01110 << 1 | 0xFFFF0000 | 1)
mcr p15, 0, r0, c6, c6, 0
@ ----------------------------------------
@ Region 7: Shared Mem
@ ----------------------------------------
ldr r0, =(0b01011 << 1 | 0x027FF000 | 1)
mcr p15, 0, r0, c6, c7, 0
@ ----------------------------------------
@ Determine which regions have wr-buffer
@ Determine which regions are cached
@ ----------------------------------------
ldr r0, =0b00000010
mcr p15, 0, r0, c3, c0, 0
ldr r0, =0b01000010
mcr p15, 0, r0, c2, c0, 0
mcr p15, 0, r0, c2, c0, 1
@ ----------------------------------------
@ Set extended access permission regions
@ for instruction and data accesses
@
@ Bits Privileged User
@ 0000 -- --
@ 0001 R/W --
@ 0010 R/W R
@ 0011 R/W R/W
@ 0100 UNP UNP
@ 0101 R --
@ 0110 R R
@ 0111 UNP UNP
@ 1XXX UNP UNP
@ ----------------------------------------
ldr r0, =0x36636633
mcr p15, 0, r0, c5, c0, 3
ldr r0, =0x36333633
mcr p15, 0, r0, c5, c0, 2
@ ----------------------------------------
@ Enable ITCM/DTCM and their caches
@ ----------------------------------------
#define ITCM_ENABLE (1<<18)
#define DTCM_ENABLE (1<<16)
#define ICACHE_ENABLE (1<<12)
#define DCACHE_ENABLE (1<<2)
#define PROTECT_ENABLE (1<<0)
mrc p15, 0, r0, c1, c0, 0
ldr r1, = 1<<18 | 1<<16 | 1<<12 | 1<<2 | 1<<0
orr r0, r0, r1
mcr p15, 0, r0, c1, c0, 0
lcd_enable:
mov r0, #0x04000000
mov r2, #0x00020000
mov r3, #0x80
str r2, [r0]
str r3, [r0, #0x240]
freeze:
bl freeze
|