@@ -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
0 commit comments