diff --git a/src/Makefile b/src/Makefile index fb4dfe2..fdf975a 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,6 +15,8 @@ SRC = \ cdcacm.c \ main.c \ +ROM = ../osi_bas/ROM.HEX + CROSS_COMPILE ?= arm-none-eabi- CC = $(CROSS_COMPILE)gcc OBJCOPY = $(CROSS_COMPILE)objcopy @@ -38,6 +40,7 @@ host_clean: -$(Q)$(RM) pill_6502.bin OBJ = $(SRC:.c=.o) +OBJ += $(ROM:.HEX=.o) pill_6502.elf: version.h $(OBJ) @echo " LD $@" @@ -47,6 +50,12 @@ pill_6502.elf: version.h $(OBJ) @echo " CC $<" $(Q)$(CC) $(CFLAGS) -c $< -o $@ +%.o: %.HEX + @echo " OBJCOPY $@.bin" + $(Q)$(OBJCOPY) -I ihex -O binary $^ $@.bin + @echo " OBJCOPY $@" + $(Q)$(OBJCOPY) -I binary -O elf32-littlearm -B arm --rename-section .data=.rodata,alloc,load,readonly,data,contents $@.bin $@ + %.bin: %.elf @echo " OBJCOPY $@" $(Q)$(OBJCOPY) -O binary $^ $@ diff --git a/src/main.c b/src/main.c index febbf55..de72e79 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,7 @@ #include #include "fake6502.h" +#include "rom.h" #include "cdcacm.h" #include "version.h" @@ -137,12 +138,19 @@ uint8_t usbd_control_buffer[128]; // 6502 processor memory, 16KB (< 20KB) uint8_t ram[0x4000]; +// TODO: serial interface, 0xa000-0xbfff uint8_t read6502(uint16_t address) { + // RAM if (address < sizeof(ram)) { return ram[address]; } - // TODO: serial interface, 0xa000-0xbfff - // TODO: ROM, 0xc000-0xffff + + // ROM + if (address >= 0xc000) { + const uint8_t *rom = &_binary____osi_bas_ROM_o_bin_start; + + return rom[address - 0xc000]; + } return 0xff; } diff --git a/src/rom.h b/src/rom.h new file mode 100644 index 0000000..df28d30 --- /dev/null +++ b/src/rom.h @@ -0,0 +1,5 @@ + +// Symbols exported by rom.o, see https://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/ +extern unsigned char _binary____osi_bas_ROM_o_bin_end; +extern unsigned char _binary____osi_bas_ROM_o_bin_size; +extern unsigned char _binary____osi_bas_ROM_o_bin_start;