Instead of using the bootsector to load a bootloader, just put the bootloader in the ROM and call it a day. It looks for a file on the SD card in the root directory named `kernel.bin` and loads it into memory. This is not a perfect solution, as the kernel will grow larger and the kernel load address will have to change. At this point I could add back the bootloader, but that is for later. Also the bootloader is just a copy of the kernel, so that can be trimmed down a lot.
36 lines
1.1 KiB
Plaintext
36 lines
1.1 KiB
Plaintext
MEMORY
|
|
{
|
|
ZP: start = $0, size = $100, type = rw, define = yes;
|
|
SDRAM: start = $200, size = $7cf0, type = rw, define = yes;
|
|
ROM: start = $8000, size = $8000, file = %O;
|
|
}
|
|
|
|
SEGMENTS {
|
|
ZEROPAGE: load = ZP, type = zp, define = yes;
|
|
DATA: load = ROM, type = rw, define = yes, run = SDRAM;
|
|
BSS: load = SDRAM, type = bss, define = yes;
|
|
HEAP: load = SDRAM, type = bss, optional = yes;
|
|
STARTUP: load = ROM, type = ro;
|
|
ONCE: load = ROM, type = ro, optional = yes;
|
|
CODE: load = ROM, type = ro;
|
|
RODATA: load = ROM, type = ro;
|
|
VECTORS: load = ROM, type = ro, start = $FFFA;
|
|
}
|
|
|
|
FEATURES {
|
|
CONDES: segment = STARTUP,
|
|
type = constructor,
|
|
label = __CONSTRUCTOR_TABLE__,
|
|
count = __CONSTRUCTOR_COUNT__;
|
|
CONDES: segment = STARTUP,
|
|
type = destructor,
|
|
label = __DESTRUCTOR_TABLE__,
|
|
count = __DESTRUCTOR_COUNT__;
|
|
}
|
|
|
|
SYMBOLS {
|
|
# Define the stack size for the application
|
|
__STACKSIZE__: value = $0200, type = weak;
|
|
__STACKSTART__: type = weak, value = $0800; # 2k stack
|
|
}
|