I have a problem with the bank switching. I read different documents on the forums and tested different solutions.
I use gbdk 2.95 with windows.
Code:
REM Link banks
REM ROM+MBC1 : -Wl-yt1
REM ROM+MBC1+RAM : -Wl-yt2
REM 4 ROM banks : -Wl-yo4
REM 4 RAM banks : -Wl-ya4
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -Wf-ba0 -c -o -c -o banks.o banks.c
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -Wf-bo0 -c -o -c -o bank_0.o bank_0.c
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -Wf-bo1 -c -o -c -o bank_1.o bank_1.c
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -Wf-bo2 -c -o -c -o bank_2.o bank_2.c
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -Wf-bo3 -c -o -c -o bank_3.o bank_3.c
..\..\bin\lcc -Wa-l -Wl-m -Wl-j -Wl-yt2 -Wl-yo4 -Wl-ya1 -o banks.gb banks.o bank_0.o bank_1.o bank_2.o bank_3.o
I put my bank fixed code in banks.0 but I have an error at the compilation :
ERROR: address overflow (addr a002 >= 8000)
I use the same syntax for all my bank.
bank0:
Code:
int var_0; /* In external RAM bank 0 */
extern int var_internal;
void bank_0() ;
void bank_0() {
}
bank 1 to 3 with a same size const array cut1_tileset, cut2_tileset, cut3_tileset
Code:
#include <gb/gb.h>
#include <stdio.h>
#pragma bank=1
int var_1; /* In external RAM bank 1 */
extern var_internal;
const unsigned char cut1_tileset[] =
{
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,......
};
void bank_1() /* In ROM bank 1 */
{
DISPLAY_ON;
SPRITES_8x16;
SHOW_BKG;
}
In the external file from compilation :
Code:
AREA _CODE_0
RADIX HEX
BASE A002
SIZE 0016
ATTRIB REL CON
GLOBALS
_bank_fixed A002
_bank_0 A017
AREA _CODE_1
RADIX HEX
BASE 4000
SIZE 36C6
ATTRIB REL CON
GLOBALS
_bank_1 4000
_cut1_tileset 4001
_bank_1_test 76A1
AREA _CODE_2
RADIX HEX
BASE 4000
SIZE 36BC
ATTRIB REL CON
GLOBALS
_bank_2 4000
_cut2_tileset 400A
AREA _CODE_3
RADIX HEX
BASE 4000
SIZE 36A1
ATTRIB REL CON
GLOBALS
_bank_3 4000
_cut3_tileset 4001