Skip to content

Commit 4ee4258

Browse files
committed
Replace CPU with emu-russia/dmgcpu
1 parent 63ce589 commit 4ee4258

4 files changed

Lines changed: 74 additions & 53 deletions

File tree

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "dmgcpu"]
2+
path = dmgcpu
3+
url = git@github.com:emurussia/dmgcpu.git

Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,23 @@ $(DMG_CPU_B_CELLS) \
5555
$(DMG_CPU_B_PAGES)
5656

5757
SM83 = \
58+
dmgcpu/HDL/sm83/_GekkioNames.v \
59+
dmgcpu/HDL/sm83/ALU.v \
60+
dmgcpu/HDL/sm83/Bottom.v \
61+
dmgcpu/HDL/sm83/DataMux.v \
62+
dmgcpu/HDL/sm83/Decoder1.v \
63+
dmgcpu/HDL/sm83/Decoder2.v \
64+
dmgcpu/HDL/sm83/Decoder3.v \
65+
dmgcpu/HDL/sm83/IDU.v \
66+
dmgcpu/HDL/sm83/IRNots.v \
67+
dmgcpu/HDL/sm83/IRQ.v \
68+
dmgcpu/HDL/sm83/Regs.v \
69+
dmgcpu/HDL/sm83/SeqCells.v \
70+
dmgcpu/HDL/sm83/Seq.v \
71+
dmgcpu/HDL/sm83/Thingy.v \
72+
dmgcpu/HDL/sm83/Top.v \
73+
74+
#SM83 = \
5875
sm83/sm83.sv \
5976
sm83/sm83_adr_inc.sv \
6077
sm83/sm83_alu.sv \

dmg_cpu_b_gameboy.sv

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,59 @@ module dmg_cpu_b_gameboy;
120120
logic [7:0] cpu_d_out;
121121
logic [15:0] cpu_a_out;
122122

123+
// See dmgcpu/ports.md
124+
SM83Core cpu(
125+
.M1(cpu_out_t1), // out T1
126+
.CLK1(cpu_clkin_t2), // in T2
127+
.CLK2(cpu_clkin_t3), // in T3
128+
.CLK3(cpu_clkin_t4), // in T4
129+
.CLK4(cpu_clkin_t5), // in T5
130+
.CLK5(cpu_clkin_t6), // in T6
131+
.CLK6(cpu_clkin_t7), // in T7
132+
.CLK7(cpu_clkin_t8), // in T8
133+
.CLK8(cpu_clkin_t9), // in T9
134+
.CLK9(cpu_clkin_t10), // in T10
135+
.CLK_ENA(cpu_clk_ena), // out T11
136+
.SYNC_RESET(cpu_in_t12), // in T12
137+
.RESET(cpu_in_t13), // in T13
138+
.OSC_ENA(cpu_xo_ena), // out T14
139+
.OSC_STABLE(cpu_in_t15), // in T15
140+
// .in(cpu_in_t16), // in T16
141+
.RD(cpu_raw_rd), // out R1
142+
.WR(cpu_raw_wr), // out R2
143+
.BUS_DISABLE(cpu_in_r3), // in R3
144+
.MMIO_REQ(cpu_in_r4), // in R4
145+
.IPL_REQ(cpu_in_r5), // in R5
146+
.IPL_DISABLE(cpu_in_r6), // in R6
147+
.MREQ(cpu_out_r7), // out R7
148+
149+
.CPU_IRQ_ACK({
150+
cpu_irq7_ack, // out R28
151+
cpu_irq6_ack, // out R26
152+
cpu_irq5_ack, // out R24
153+
cpu_irq4_ack, // out R22
154+
cpu_irq3_ack, // out R20
155+
cpu_irq2_ack, // out R18
156+
cpu_irq1_ack, // out R16
157+
cpu_irq0_ack // out R14
158+
}),
159+
160+
.CPU_IRQ_TRIG({
161+
cpu_irq7_trig, // in R29
162+
cpu_irq6_trig, // in R27
163+
cpu_irq5_trig, // in R25
164+
cpu_irq4_trig, // in R23
165+
cpu_irq3_trig, // in R21
166+
cpu_irq2_trig, // in R19
167+
cpu_irq1_trig, // in R17
168+
cpu_irq0_trig // in R15
169+
}),
170+
.D(d), // I/O B1-B8
171+
.A(cpu_a), // out B9-B24
172+
.WAKE(cpu_wakeup), // in B25
173+
.NMI(1'b0)
174+
);
175+
123176
dmg_cpu_b dmg(.*, .t1('0), .t2('0), .vin(0.0), .unbonded_pad0('1), .unbonded_pad1());
124177

125178
task automatic xi_tick();
@@ -245,55 +298,16 @@ module dmg_cpu_b_gameboy;
245298
end
246299
end
247300

248-
sm83 cpu(.*);
249-
250301
assign ncyc = !dmg.p1_clocks_reset.adyk && !dmg.p1_clocks_reset.alef;
251-
assign cpu_a = cpu_a_out;
252-
assign d = cpu_drv_d ? cpu_d_out : 'z;
253302
assign din = d;
254-
assign cpu_out_r7 = (cpu_raw_rd || cpu_raw_wr) && !cpu_in_r4 && !cpu_in_r5;
255303
assign clk_stable = cpu_in_t15;
256-
assign cpu_clk_ena = clk_ena;
257304
assign reset = cpu_in_t12;
258305
assign areset = cpu_in_t13;
259306

260-
initial cpu_a_out = 0;
261-
initial cpu_raw_rd = 0;
262-
initial cpu_raw_wr = 0;
263-
264307
/* CPU must not drive data bus when cpu_clkin_t3 (BEDO) is low or cpu_clkin_t2 (BOWA) is high,
265308
* otherwise it collides with 0xff driven on the right side of page 5. */
266309
assign cpu_drv_d = cpu_raw_wr && cpu_clkin_t3 && !cpu_clkin_t2;
267310

268-
always @(posedge cpu_clkin_t3) if (rd && !cpu_in_t12 && !cpu_in_t13) begin :read_cycle
269-
cpu_a_out <= adr;
270-
cpu_raw_rd <= 1;
271-
@(posedge cpu_clkin_t2);
272-
cpu_raw_rd <= 0;
273-
if (!cpu_in_r4 && !cpu_in_r5) /* Higher address byte is supposed to go low after external memory access */
274-
cpu_a_out[15:8] <= 0;
275-
end
276-
277-
always @(posedge cpu_clkin_t3) if (wr && !cpu_in_t12 && !cpu_in_t13) begin :write_cycle
278-
cpu_a_out <= adr;
279-
cpu_d_out <= '1;
280-
cpu_raw_wr <= 1;
281-
@(posedge cpu_clkin_t5);
282-
cpu_d_out <= dout;
283-
@(posedge cpu_clkin_t2);
284-
cpu_raw_wr <= 0;
285-
if (!cpu_in_r4 && !cpu_in_r5) /* Higher address byte is supposed to go low after external memory access */
286-
cpu_a_out[15:8] <= 0;
287-
end
288-
289-
always @(posedge cpu_clkin_t10, posedge cpu_in_t12, posedge cpu_in_t13) if (cpu_in_t12 || cpu_in_t13) begin
290-
disable read_cycle;
291-
disable write_cycle;
292-
cpu_raw_rd <= 0;
293-
cpu_raw_wr <= 0;
294-
cpu_a_out <= 0;
295-
end
296-
297311
assign irq[0] = cpu_irq0_trig;
298312
assign irq[1] = cpu_irq1_trig;
299313
assign irq[2] = cpu_irq2_trig;
@@ -303,17 +317,6 @@ module dmg_cpu_b_gameboy;
303317
assign irq[6] = cpu_irq6_trig;
304318
assign irq[7] = cpu_irq7_trig;
305319

306-
always_ff @(posedge clk) begin
307-
cpu_irq0_ack <= iack[0];
308-
cpu_irq1_ack <= iack[1];
309-
cpu_irq2_ack <= iack[2];
310-
cpu_irq3_ack <= iack[3];
311-
cpu_irq4_ack <= iack[4];
312-
cpu_irq5_ack <= iack[5];
313-
cpu_irq6_ack <= iack[6];
314-
cpu_irq7_ack <= iack[7];
315-
end
316-
317320
program test;
318321
int sample_idx;
319322

@@ -370,9 +373,6 @@ module dmg_cpu_b_gameboy;
370373

371374
clk = 0;
372375

373-
cpu_out_t1 = 0;
374-
cpu_xo_ena = 1;
375-
376376
cyc(64);
377377
nrst = 1;
378378

dmgcpu

Submodule dmgcpu added at 4b11304

0 commit comments

Comments
 (0)