gbaunixのコンパイル

UNIX® on the Game Boy Advanceコンパイルしてみた。

devkitProのdevkitARM release 24の場合、以下の修正が必要でした。リンカのエラーが良くわからなくてハマった。

  • Makefilewindows用にてきとーに変更
  • iwram.textをiwramに変更
  • 大きな変数をEWRAMに確保するように指定する。
diff -ru gbaunix-0.0_org/Makefile gbaunix/Makefile
--- gbaunix-0.0_org/Makefile	Wed Sep  8 11:01:36 2004
+++ gbaunix/Makefile	Wed Dec 24 02:24:47 2008
@@ -5,16 +5,19 @@
 #
 
 # Host: Mac OS X
+include $(DEVKITARM)\gba_rules
 
-CROSSTOOLS_PREFIX = arm-elf
-CROSSTOOLS_PATH   = /usr/local/devkitARM
+export DEPSDIR	:=	$(CURDIR)/build
+
+CROSSTOOLS_PREFIX = arm-eabi
+#CROSSTOOLS_PATH   = /devkitpro/devkitARM
 AS                = $(CROSSTOOLS_PREFIX)-as
 CC                = $(CROSSTOOLS_PREFIX)-gcc
 LD                = $(CROSSTOOLS_PREFIX)-ld
 OBJCOPY           = $(CROSSTOOLS_PREFIX)-objcopy
-INCLUDES          = -I$(CROSSTOOLS_PATH)/$(CROSSTOOLS_PREFIX)/include
-LOCAL_INCLUDES    =
-ASFLAGS           = $(INCLUDES)
+#INCLUDES          = -I$(CROSSTOOLS_PATH)/$(CROSSTOOLS_PREFIX)/include
+#LOCAL_INCLUDES    =
+#ASFLAGS           = $(INCLUDES)
 
 # -DGAMEBOY       mandatory
 # -DGAMEBOY_DMA
@@ -34,12 +37,13 @@
                     -mtune=arm7tdmi
 CFLAGS_ARM        = $(GAMEBOY_FLAGS) $(INCLUDES) $(LOCAL_INCLUDES) $(COPTFLAG) \
                     -marm -mthumb-interwork -specs=gba.specs -mcpu=arm7tdmi \
-                    -mtune=arm7tdmi
-LDFLAGS           = -Map /tmp/gba.map -lm
+                    -mtune=arm7tdmi -Igba
+LDFLAGS           = -Map unixv5.map -lm 
 #LDFLAGS           = -lm
+#LDFLAGS            = -lm -g $(ARCH) -Wl,-Map,$(notdir $@).map
 OBJCOPYFLAGS      = -v -O binary
 
-GBAUNIXV5_ELF     = unixv5
+GBAUNIXV5_ELF     = unixv5.elf
 GBAUNIXV5_TMP     = unixv5.tmp
 GBAUNIXV5_ROM     = unixv5.gba
 UNIXV5_DISK       = disks/unixv5.dsk
@@ -130,7 +134,7 @@
 	$(OBJCOPY) $(OBJCOPYFLAGS) $< $@
 
 $(GBAUNIXV5_ELF): $(OBJS) Makefile
-	$(CC) $(CFLAGS) -o $@ $(OBJS) -Wl,$(LDFLAGS)
+	$(CC) $(CFLAGS) -o $@ $(OBJS)  -Wl,$(LDFLAGS) 
 
 .PHONY: all clean realclean
 
diff -ru gbaunix-0.0_org/gba/gba_fsio.c gbaunix/gba/gba_fsio.c
--- gbaunix-0.0_org/gba/gba_fsio.c	Tue Aug 24 18:01:32 2004
+++ gbaunix/gba/gba_fsio.c	Wed Dec 24 02:21:44 2008
@@ -9,7 +9,7 @@
 
 long fpos[GBA_MAXFILES];
 int filestable[GBA_MAXFILES];
-dcache_t D[DI_MAX];
+__attribute__ ((section(".ewram"))) dcache_t D[DI_MAX];
 int di = 0;
 
 void
diff -ru gbaunix-0.0_org/gba/gba_fsio.h gbaunix/gba/gba_fsio.h
--- gbaunix-0.0_org/gba/gba_fsio.h	Tue Aug 24 15:39:42 2004
+++ gbaunix/gba/gba_fsio.h	Wed Dec 24 01:32:53 2008
@@ -7,7 +7,8 @@
 #define GBA_FSIO_IWRAM_CALL_LENGTH ,long_call
 #endif
 
-#define GBA_FSIO_IWRAM_FUNC(func) __attribute__ ((section(".iwram.text") GBA_FSIO_IWRAM_CALL_LENGTH)) func
+#define GBA_FSIO_IWRAM_FUNC(func) __attribute__ ((section(".iwram") GBA_FSIO_IWRAM_CALL_LENGTH)) func
 
 /* Experimental write pre-caching */
 // #define GAMEBOY_WCACHE   1
diff -ru gbaunix-0.0_org/scp.c gbaunix/scp.c
--- gbaunix-0.0_org/scp.c	Tue Aug 24 10:21:59 2004
+++ gbaunix/scp.c	Wed Dec 24 02:19:06 2008
@@ -78,7 +78,7 @@
 volatile int32 stop_cpu = 0;
 t_value *sim_eval = NULL;
 int32 sim_end = 1;				/* 1 = little, 0 = big */
-unsigned char sim_flip[FLIP_SIZE];
+__attribute__ ((section(".ewram"))) unsigned char sim_flip[FLIP_SIZE];
 
 #define print_val(a,b,c,d) fprint_val (stdout, (a), (b), (c), (d))
 #define SZ_D(dp) (size_map[((dp) -> dwidth + CHAR_BIT - 1) / CHAR_BIT])

参考:Runtime error