sim: CoreTop_isim.exe
-CoreTop.ngc: CoreTop.xst CoreTop.prj $(VLOGS_ALL) rom.mem
+CoreTop.ngc: CoreTop.xst CoreTop.prj $(VLOGS_ALL) fpgaboot.hex gbboot.hex
xst -ifn CoreTop.xst -ofn CoreTop.syr
CoreTop.ngd: CoreTop.ngc foo.bmm CoreTop.ucf
%.mem: %.bin mashrom
./mashrom < $< > $@
+fpgaboot.hex: fpgaboot.bin mashrom
+ ./mashrom 256 < $< > $@
+
+
CoreTop.svf: CoreTop.bit impact.cmd
sed -e s/XXX/$(subst .bit,,$<)/ < impact.cmd > tmp.cmd
impact -batch tmp.cmd
reg rdlatch = 0;
reg [7:0] addrlatch = 0;
- reg [7:0] brom [255:0];
- initial $readmemh("bootstrap.hex", brom);
+ reg romno = 0, romnotmp = 0;
+ reg [7:0] brom0 [255:0];
+ reg [7:0] brom1 [255:0];
+
+ initial $readmemh("fpgaboot.hex", brom0);
+ initial $readmemh("gbboot.hex", brom1);
wire decode = address[15:8] == 0;
- wire [7:0] odata = brom[addrlatch];
+ wire [7:0] odata = (romno == 0) ? brom0[addrlatch] : brom1[addrlatch];
always @(posedge clk) begin
rdlatch <= rd && decode;
addrlatch <= address[7:0];
+ if (wr && decode) romnotmp <= data[0];
+ if (rd && address == 16'h0000) romno <= romnotmp; /* Latch when the program restarts. */
end
assign data = rdlatch ? odata : 8'bzzzzzzzz;
endmodule
--- /dev/null
+ SECTION "boot", HOME[$0]
+ ld a, $AA
+ ld [$FF51], A ; Poke the LEDs
+
+ ; Write a little bit to the RAM
+ ld H, $01
+ ld L, $00
+ ld A, $00
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+
+ ld a, $55
+ ld [$FF51], A ; Poke the LEDs
+
+ ld A, $FF
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+ ld [HLI], A
+
+ ld H, $00
+ ld L, $00
+ ld [HL], $01 ; Select the GB boot rom
+ rst $00 ; Boot
+
+ SECTION "a", HOME[$100]
+ nop ; Make sure we don't overflow.
+
\ No newline at end of file