I found somewhere a couple of crt0.s a bit simpler than Jeff Frohwein's one:
Code:
@********************************************************************
@* crt0.s *
@ This file is a hack. It is not meant for serious work. *
@********************************************************************
.TEXT
.GLOBAL _start
_start:
.ALIGN
.CODE 32
@ Start Vector
rom_header: b rom_header_end
@ Nintendo Logo Character Data (8000004h)
.byte 0x24,0xff,0xae,0x51,0x69,0x9a,0xa2,0x21
.byte 0x3d,0x84,0x82,0x0a,0x84,0xe4,0x09,0xad
.byte 0x11,0x24,0x8b,0x98,0xc0,0x81,0x7f,0x21
.byte 0xa3,0x52,0xbe,0x19,0x93,0x09,0xce,0x20
.byte 0x10,0x46,0x4a,0x4a,0xf8,0x27,0x31,0xec
.byte 0x58,0xc7,0xe8,0x33,0x82,0xe3,0xce,0xbf
.byte 0x85,0xf4,0xdf,0x94,0xce,0x4b,0x09,0xc1
.byte 0x94,0x56,0x8a,0xc0,0x13,0x72,0xa7,0xfc
.byte 0x9f,0x84,0x4d,0x73,0xa3,0xca,0x9a,0x61
.byte 0x58,0x97,0xa3,0x27,0xfc,0x03,0x98,0x76
.byte 0x23,0x1d,0xc7,0x61,0x03,0x04,0xae,0x56
.byte 0xbf,0x38,0x84,0x00,0x40,0xa7,0x0e,0xfd
.byte 0xff,0x52,0xfe,0x03,0x6f,0x95,0x30,0xf1
.byte 0x97,0xfb,0xc0,0x85,0x60,0xd6,0x80,0x25
.byte 0xa9,0x63,0xbe,0x03,0x01,0x4e,0x38,0xe2
.byte 0xf9,0xa2,0x34,0xff,0xbb,0x3e,0x03,0x44
.byte 0x78,0x00,0x90,0xcb,0x88,0x11,0x3a,0x94
.byte 0x65,0xc0,0x7c,0x63,0x87,0xf0,0x3c,0xaf
.byte 0xd6,0x25,0xe4,0x8b,0x38,0x0a,0xac,0x72
.byte 0x21,0xd4,0xf8,0x07
@ Software Titles (80000A0h)
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
.byte 0x00,0x00,0x00,0x00
@ Initial Code (80000ACh)
.byte 0x00,0x00,0x00,0x00
@ Maker Code (80000B0h)
.byte 0x30,0x31
@ Fixed Value (80000B2h)
.byte 0x96
@ Main Unit Code (80000B3h)
.byte 0x00
@ Device Type (80000B4h)
.byte 0x00
@ Unused Data (7Byte) (80000B5h)
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00
@ Software Version No (80000BCh)
.byte 0x00
@ Complement Check (80000BDh)
.byte 0xf0
@ Check Sum (80000BEh)
.byte 0x00,0x00
rom_header_end:
@--------------------------------------------------------------------
@- Reset -
@--------------------------------------------------------------------
.EXTERN AgbMain
.GLOBAL start_vector
.CODE 32
.ALIGN
start_vector:
mov r0, #0x12 @ Switch to IRQ Mode
msr cpsr, r0
ldr sp, sp_irq @ Set SP_irq
mov r0, #0x1f @ Switch to System Mode
msr cpsr, r0
ldr sp, sp_usr @ Set SP_usr
str r0, [r1]
ldr r1, =AgbMain @ Start & Switch to 16bit Code
mov lr, pc
bx r1
b start_vector @ Reset
.ALIGN
sp_usr: .word 0x3008000 - 0x100
sp_irq: .word 0x3008000 - 0x60
.ALIGN
.CODE 32
.END
and
Code:
# This code belong to the 'text' section
.section .text,"ax"
# All the following code is using ARM instruction set
.arm
# Align with word boundaries
.align 4
# Some external function used later
.extern main
# The startup code function
.global _start
_start:
b rom_start
# Above his the ROM header with dummy values
# and will be override with tools like gba-header
# Nintendo Logo (156 bytes)
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0
# Game Title (12 bytes)
.ascii "ABCDEFGHIJKL"
# Game Code (4 bytes)
.ascii "1234"
# Maker Code (2 bytes)
.ascii "_$"
# Fixed value (1 byte)
.byte 0x96
# Main unit code (1 byte)
.byte 0
# Device Type (1 byte)
.byte 0
# Reserved (7 bytes)
.byte 0,0,0,0,0,0,0
# Software version (1 byte)
.byte 0
# Complement check (1 byte)
.byte 0
# Reserved (2 bytes)
.byte 0,0
.align 4
rom_start:
# Set the User stack
mov r0, #0x1f
msr cpsr, r0
ldr sp, =0x3007ff0
# argc=0 and arg=NULL
mov r0, #0
mov r1, r0
# Jump to the main
bl main
# Just loop now (the program finished)
__loop:
b __loop
In the second I think you must replace all '#' with '@', according with your assembler.
In my gpc-gba attempt I have some problem with direct memory access. Seems like I can't write in $4000000 location when I try to set the screen mode.
Bookmarks