Skip to content

Commit 5bde943

Browse files
author
root
committed
connected cartridge connector
2 parents b819112 + 2648bc0 commit 5bde943

File tree

4 files changed

+169
-35
lines changed

4 files changed

+169
-35
lines changed

Diff for: cpu.vh

+2-2
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@
128128
`define MEM_HIGH_START 16'hff80
129129
`define MEM_OAM_END 16'hfe9f
130130
`define MEM_OAM_START 16'hfe00
131-
`define MEM_CART_END 16'hbfff
132-
`define MEM_CART_START 16'ha000
131+
`define MEM_CART_END 16'h7fff
132+
`define MEM_CART_START 16'h0000
133133
`define MEM_WRAM_END 16'hdfff
134134
`define MEM_WRAM_START 16'hc000
135135
`define MEM_VRAM_END 16'h9fff

Diff for: cpu/cpusynth/bootstrap_real.mcs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
:020000040000FA
2+
:100000003131FEFEFFFFAFAF2121FFFF9F9F323254
3+
:10001000CBCB7C7C2020FBFB21212626FFFF0E0E74
4+
:1000200011113E3E80803232E2E20C0C3E3EF3F390
5+
:10003000E2E232323E3E777777773E3EFCFCE0E00C
6+
:1000400047471111040401012121101080801A1A60
7+
:10005000CDCD95950000CDCD9696000013137B7BFA
8+
:10006000FEFE34342020F3F31111D8D80000060628
9+
:1000700008081A1A13132222232305052020F9F950
10+
:100080003E3E1919EAEA1010999921212F2F9999CA
11+
:100090000E0E0C0C3D3D2828080832320D0D202094
12+
:1000A000F9F92E2E0F0F1818F3F367673E3E6464BC
13+
:1000B0005757E0E042423E3E9191E0E04040040468
14+
:1000C0001E1E02020E0E0C0CF0F04444FEFE909038
15+
:1000D0002020FAFA0D0D2020F7F71D1D2020F2F246
16+
:1000E0000E0E131324247C7C1E1E8383FEFE62628C
17+
:1000F000282806061E1EC1C1FEFE646420200606D6
18+
:100100007B7BE2E20C0C3E3E8787E2E2F0F042426B
19+
:100110009090E0E0424215152020D2D20505202023
20+
:100120004F4F161620201818CBCB4F4F060604044D
21+
:10013000C5C5CBCB11111717C1C1CBCB11111717E7
22+
:1001400005052020F5F52222232322222323C9C9D5
23+
:10015000CECEEDED66666666CCCC0D0D00000B0BC9
24+
:10016000030373730000838300000C0C00000D0D6B
25+
:100170000000080811111F1F8888898900000E0ED1
26+
:10018000DCDCCCCC6E6EE6E6DDDDDDDDD9D999991F
27+
:10019000BBBBBBBB676763636E6E0E0EECECCCCC77
28+
:1001A000DDDDDCDC99999F9FBBBBB9B933333E3EA3
29+
:1001B0003C3C4242B9B9A5A5B9B9A5A542423C3CCF
30+
:1001C0002121040401011111A8A800001A1A131317
31+
:1001D000BEBE2020131323237D7DFEFE3434202059
32+
:1001E000F5F506061919787886862323050520205B
33+
:1001F000FBFB8686202002023E3E0101E0E05050DB
34+
:100200000000767676760000CECEEDED6666666608
35+
:10021000CCCC0D0D00000B0B030373730000838324
36+
:1002200000000C0C00000D0D0000080811111F1F2C
37+
:100230008888898900000E0EDCDCCCCC6E6EE6E688
38+
:10024000DDDDDDDDD9D99999BBBBBBBB67676363D6
39+
:100250006E6E0E0EECECCCCCDDDDDCDC99999F9F54
40+
:10026000BBBBB9B933333E3E0000000000000000C4
41+
:10027000000000000000E7E70000000000000000B0
42+
:10028000000000000000000000000000000000006E
43+
:100290000000000000000000FFFF0101000000005E
44+
:0802A0007676767676767676A6
45+
:00000001FF

Diff for: cpu/cpusynth/cpu.vh

+26
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,32 @@
110110
`define MB_SET 3'h3
111111
`define MB_RES 3'h4
112112

113+
/**
114+
* MMIO addresses
115+
*/
116+
`define MMIO_IF 16'hff0f
117+
`define MMIO_IE 16'hffff
118+
`define MMIO_DMA 16'hff46
119+
`define MMIO_DIV 16'hff04
120+
`define MMIO_TIMA 16'hff05
121+
`define MMIO_TMA 16'hff06
122+
`define MMIO_TAC 16'hff07
123+
`define MMIO_BOOTSTRAP 16'hff50
124+
125+
/**
126+
* Memory boundaries
127+
*/
128+
`define MEM_HIGH_END 16'hfffe
129+
`define MEM_HIGH_START 16'hff80
130+
`define MEM_OAM_END 16'hfe9f
131+
`define MEM_OAM_START 16'hfe00
132+
`define MEM_CART_END 16'hbfff
133+
`define MEM_CART_START 16'ha000
134+
`define MEM_WRAM_END 16'hdfff
135+
`define MEM_WRAM_START 16'hc000
136+
`define MEM_VRAM_END 16'h9fff
137+
`define MEM_VRAM_START 16'h8000
138+
113139
/**
114140
* Small chart of values
115141
* 0000 0 0

Diff for: cpu/cpusynth/lcd_top.v

+96-33
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// The Flash memory stores bytes from the hex -> mcs file as follows:
22
// Little Endian
3-
// Intellllll!!!!
43
// Notice that the Flash clock should be 1 for asynchronous read mode, which is
54
// the default mode.
65

@@ -28,7 +27,15 @@ module lcd_top(CLK_33MHZ_FPGA,
2827
rotary_inc_a, rotary_inc_b,
2928
dvi_d, dvi_vs, dvi_hs, dvi_xclk_p, dvi_xclk_n, dvi_reset_b,
3029
dvi_de,
31-
dvi_sda, dvi_scl
30+
dvi_sda, dvi_scl,
31+
HDR1_2, HDR1_6, HDR1_8, HDR1_10,
32+
HDR1_12, HDR1_14, HDR1_16, HDR1_18,
33+
HDR1_20, HDR1_22, HDR1_24, HDR1_26,
34+
HDR1_28, HDR1_30, HDR1_32, HDR1_34,
35+
HDR1_36, HDR1_38, HDR1_40, HDR1_42,
36+
HDR1_44, HDR1_46, HDR1_48, HDR1_50,
37+
HDR1_52, HDR1_54, HDR1_56, HDR1_58,
38+
HDR1_60, HDR1_64
3239
);
3340
parameter
3441
I_HILO = 4, I_SERIAL = 3, I_TIMA = 2, I_LCDC = 1, I_VBLANK = 0;
@@ -57,7 +64,14 @@ module lcd_top(CLK_33MHZ_FPGA,
5764
dvi_de, //DIV Outputs
5865
dvi_reset_b; //DIV Outputs
5966
inout dvi_sda, dvi_scl;
60-
67+
output wire HDR1_2, HDR1_6, HDR1_8, HDR1_10;
68+
output wire HDR1_12, HDR1_14, HDR1_16, HDR1_18;
69+
output wire HDR1_20, HDR1_22, HDR1_24, HDR1_26;
70+
output wire HDR1_28, HDR1_30, HDR1_32, HDR1_34;
71+
output wire HDR1_36, HDR1_38, HDR1_40, HDR1_42;
72+
input HDR1_44, HDR1_46, HDR1_48, HDR1_50;
73+
input HDR1_52, HDR1_54, HDR1_56, HDR1_58;
74+
output wire HDR1_60, HDR1_64;
6175
wire clock;
6276

6377
assign clock = CLK_33MHZ_FPGA;
@@ -324,14 +338,6 @@ module lcd_top(CLK_33MHZ_FPGA,
324338
.clock(clock),
325339
.reset(reset));
326340

327-
`define MMIO_IF 16'hff0f
328-
`define MMIO_IE 16'hffff
329-
`define MMIO_DMA 16'hff46
330-
`define MMIO_DIV 16'hff04
331-
`define MMIO_TIMA 16'hff05
332-
`define MMIO_TMA 16'hff06
333-
`define MMIO_TAC 16'hff07
334-
335341
assign timer_reg_addr = (addr_ext == `MMIO_DIV) |
336342
(addr_ext == `MMIO_TMA) |
337343
(addr_ext == `MMIO_TIMA) |
@@ -350,16 +356,15 @@ module lcd_top(CLK_33MHZ_FPGA,
350356

351357
assign IF_load = timer_interrupt;
352358

353-
timers tima_module(/*AUTOINST*/
354-
// Outputs
359+
timers tima_module(// Outputs
355360
.timer_interrupt (timer_interrupt),
356361
// Inouts
357362
.addr_ext (addr_ext[15:0]),
358363
.data_ext (data_ext[7:0]),
359364
// Inputs
360365
.mem_re (mem_re),
361366
.mem_we (mem_we),
362-
.clock (clock),
367+
.clock (cpu_clock),
363368
.reset (reset));
364369

365370

@@ -392,7 +397,7 @@ module lcd_top(CLK_33MHZ_FPGA,
392397
cdiv(.clock_out(cpu_clock),
393398
.clock_in(clock));
394399

395-
breakpoints #(.reset_addr(16'h0007))
400+
breakpoints #(.reset_addr(16'hffff))
396401
bpmod(.bp_addr(bp_addr[15:0]),
397402
.bp_addr_disp(bp_addr_disp[7:0]),
398403
// Inputs
@@ -402,11 +407,24 @@ module lcd_top(CLK_33MHZ_FPGA,
402407
.reset(reset),
403408
.clock(cpu_clock));
404409

405-
wire addr_in_flash;
410+
wire addr_in_bootstrap_reg;
411+
addr_in_bootstrap_reg = addr_ext == `MMIO_BOOTSTRAP;
412+
register #(8) bootstrap_reg(.in(data_ext),
413+
.out(bootstrap_reg_data),
414+
.load(addr_in_bootstrap_reg & mem_we),
415+
.reset(reset),
416+
.clock(clock));
406417

407-
assign addr_in_flash = addr_ext <= 16'h140;
418+
wire addr_in_flash;
419+
assign addr_in_flash = (bootstrap_reg_data[0]) ? 1'b0 : addr_ext <= 16'h103;
408420

409421
/* The GPU */
422+
wire addr_in_cart;
423+
assign addr_in_cart = (bootstrap_reg_data[0]) ?
424+
(`MEM_CART_START <= addr_ext) &&
425+
(addr_ext <= `MEM_CART_END) :
426+
1'b0;
427+
410428
wire video_reg_w_enable;
411429
wire [7:0] video_reg_data_in;
412430
wire [7:0] video_reg_data_out;
@@ -441,8 +459,7 @@ module lcd_top(CLK_33MHZ_FPGA,
441459
wire mem_enable_video;
442460
assign mem_enable_video = video_reg_w_enable || video_vram_w_enable ||
443461
video_oam_w_enable;
444-
gpu_top gpu (/*AUTOINST*/
445-
// Outputs
462+
gpu_top gpu (// Outputs
446463
.do_video (do_video[7:0] ),
447464
.mode_video (mode_video[1:0]),
448465
.int_req (int_req[1:0]),
@@ -507,18 +524,57 @@ module lcd_top(CLK_33MHZ_FPGA,
507524
.reg_w_enable(reg_w_enable)
508525
);
509526

510-
/* Dealing with memory */
511-
`define MEM_HIGH_END 16'hfffe
512-
`define MEM_HIGH_START 16'hff80
513-
`define MEM_OAM_END 16'hfe9f
514-
`define MEM_OAM_START 16'hfe00
515-
`define MEM_CART_END 16'hbfff
516-
`define MEM_CART_START 16'ha000
517-
`define MEM_WRAM_END 16'hdfff
518-
`define MEM_WRAM_START 16'hc000
519-
`define MEM_VRAM_END 16'h9fff
520-
`define MEM_VRAM_START 16'h8000
521-
527+
/* The cartridge */
528+
wire [7:0] cart_data;
529+
wire [15:0] cart_address;
530+
wire cart_w_enable_l, cart_r_enable_l, cart_reset_l, cart_cs_sram_l;
531+
assign cart_address = addr_ext;
532+
assign cart_w_enable_l = 1;
533+
assign cart_r_enable_l = 0;
534+
assign cart_reset_l = 1;
535+
assign cart_cs_sram_l = 1;
536+
537+
cartridge cart (/*AUTOINST*/
538+
// Outputs
539+
.HDR1_2 (HDR1_2),
540+
.HDR1_6 (HDR1_6),
541+
.HDR1_8 (HDR1_8),
542+
.HDR1_10 (HDR1_10),
543+
.HDR1_12 (HDR1_12),
544+
.HDR1_14 (HDR1_14),
545+
.HDR1_16 (HDR1_16),
546+
.HDR1_18 (HDR1_18),
547+
.HDR1_20 (HDR1_20),
548+
.HDR1_22 (HDR1_22),
549+
.HDR1_24 (HDR1_24),
550+
.HDR1_26 (HDR1_26),
551+
.HDR1_28 (HDR1_28),
552+
.HDR1_30 (HDR1_30),
553+
.HDR1_32 (HDR1_32),
554+
.HDR1_34 (HDR1_34),
555+
.HDR1_36 (HDR1_36),
556+
.HDR1_38 (HDR1_38),
557+
.HDR1_40 (HDR1_40),
558+
.HDR1_42 (HDR1_42),
559+
.HDR1_60 (HDR1_60),
560+
.HDR1_64 (HDR1_64),
561+
.cart_data (cart_data[7:0]),
562+
// Inputs
563+
.HDR1_44 (HDR1_44),
564+
.HDR1_46 (HDR1_46),
565+
.HDR1_48 (HDR1_48),
566+
.HDR1_50 (HDR1_50),
567+
.HDR1_52 (HDR1_52),
568+
.HDR1_54 (HDR1_54),
569+
.HDR1_56 (HDR1_56),
570+
.HDR1_58 (HDR1_58),
571+
.cart_address (cart_address[15:0]),
572+
.clock (clock),
573+
.cart_w_enable_l (cart_w_enable_l),
574+
.cart_r_enable_l (cart_r_enable_l),
575+
.cart_reset_l (cart_reset_l),
576+
.cart_cs_sram_l (cart_cs_sram_l));
577+
522578
wire addr_in_wram, addr_in_junk;
523579
wire addr_in_dma, addr_in_tima;
524580

@@ -549,7 +605,7 @@ module lcd_top(CLK_33MHZ_FPGA,
549605
.addra(wram_addr),
550606
.dina(wram_data_in),
551607
.douta(wram_data_out));
552-
608+
553609
/* tristate #(8) gating_ff44(.out(data_ext),
554610
.in(FF44_data),
555611
.en(FF44_read&~mem_we));*/
@@ -578,9 +634,16 @@ module lcd_top(CLK_33MHZ_FPGA,
578634
tristate #(8) gating_video_oam(.out(data_ext),
579635
.in(do_video),//video_oam_data_out),
580636
.en(video_oam_w_enable&~mem_we));
637+
tristate #(8) gating_boostrap_reg(.out(data_ext),
638+
.in(bootstrap_reg_data),
639+
.en(addr_in_bootstrap_reg & ~mem_we));
640+
tristate #(8) gating_boostrap_reg(.out(data_ext),
641+
.in(cart_data),
642+
.en(addr_in_cart & ~mem_we));
581643

644+
582645
endmodule
583646
// Local Variables:
584647
// verilog-library-directories:("." "../../fpgaboy_files/" "../..")
585-
// verilog-library-files:("./cpu.v")
648+
// verilog-library-files:("./cpu.v" "../../cartridge_interface.v")
586649
// End:

0 commit comments

Comments
 (0)