3
module Bottom ( CLK2, CLK4, CLK5, CLK6, CLK7, DL, DV, bc, bq4, bq5, bq7, Temp_C, Temp_H, Temp_N, Temp_Z, alu, Res, IR, d, w, x,
4
SYNC_RES, TTB1, TTB2, TTB3, BUS_DISABLE, bro, A );
12
inout [7:0] DL; // Internal databus
13
output [7:0] DV; // ALU Operand2
18
output Temp_C; // Flag C from temp Z register
19
output Temp_H; // Flag H from temp Z register
20
output Temp_N; // Flag N from temp Z register
21
output Temp_Z; // Flag Z from temp Z register / zbus msb
22
output [7:0] alu; // ALU Operand1
23
input [7:0] Res; // ALU Result
25
output [7:0] IR; // Current opcode
26
input [106:0] d; // Decoder1 output
27
input [40:0] w; // Decoder2 output
28
input [68:0] x; // Decoder3 output
31
input TTB1; // 1: Perform pairwise increment/decrement (simultaneously for two 8-bit IncDec halves)
32
input TTB2; // 1: Perform decrement
33
input TTB3; // 1: Perform increment
34
input BUS_DISABLE; // 1: Bus disable
35
input [7:3] bro; // IRQ Logic interrupt address
36
output [15:0] A; // External core address bus
38
// Internal bottom buses
51
wire [7:0] Aout; // Reg A out to bq Logic
55
BusPrecharge precharge (
63
BottomLeftLogic bottom_left (
90
TempRegsBuses temp_regs (
94
.d60(`s1_op_ld_nn_sp_s010),
115
.d60(`s1_op_ld_nn_sp_s010),
116
.d66(`s1_op_ld_nn_sp_s011),
133
.d92(`s1_op_rst_sx10),
146
.SYNC_RES(SYNC_RES) );
153
.BUS_DISABLE(BUS_DISABLE),
160
assign Temp_C = zbus[4];
161
assign Temp_H = zbus[5];
162
assign Temp_N = zbus[6];
163
assign Temp_Z = zbus[7];
167
module BusPrecharge ( CLK2, DL, abus, bbus, cbus, dbus );
176
assign DL = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
177
assign abus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
178
assign bbus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
179
assign cbus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
180
assign dbus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
182
endmodule // BusPrecharge
184
// It is very difficult to put this circuit into any category. It belongs to both ALU and registers at the same time, and is generally at the bottom. So it's going to stay here untouched for now.
185
module BottomLeftLogic ( CLK2, bc, bq4, bq5, bq7, Aout, abus, bbus, alu, DV );
192
input [7:0] Aout; // Current value of the `A` register (directly from the register bits output)
193
input [7:0] abus; // ⚠️ inverse hold (active low)
194
input [7:0] bbus; // ⚠️ inverse hold (active low)
195
output [7:0] alu; // abus -> ALU Operand 1
196
output [7:0] DV; // bbus -> ALU Operand 2
198
wire [7:0] abq; // abus Bus keepers outputs
199
wire [7:0] bbq; // bbus Bus keepers outputs
201
assign bq4 = Aout[1] | Aout[2] | Aout[3];
202
assign bq5 = Aout[5] | Aout[6] | Aout[7];
203
assign bq7 = Aout[4] & Aout[7];
205
// This requires transparent latches, since nobody could set up a abus/bbus. On the actual circuit, they are also present as a memory on the `not` gate.
206
BusKeeper abus_keepers [7:0] ( .d(abus), .q(abq) );
207
BusKeeper bbus_keepers [7:0] ( .d(bbus), .q(bbq) );
209
// TODO: wtf is this at all?
211
assign DV[0] = ~(CLK2 ? (bbq[0] & ~bc[4]) : 1'b1);
212
assign DV[1] = ~(CLK2 ? (bbq[1] & ~bc[4]) : 1'b1);
213
assign DV[2] = ~(CLK2 ? (bbq[2] & ~bc[4]) : 1'b1);
214
assign DV[3] = ~(CLK2 ? (bbq[3] & ~bc[4]) : 1'b1);
215
assign DV[4] = ~(CLK2 ? (bbq[4] & ~(bc[4] | (bc[0] & bc[1])) ) : 1'b1);
216
assign DV[5] = ~(CLK2 ? (bbq[5] & ~(bc[4] | (bc[0] & bc[5])) ) : 1'b1);
217
assign DV[6] = ~(CLK2 ? (bbq[6] & ~(bc[4] | (bc[0] & bc[2])) ) : 1'b1);
218
assign DV[7] = ~(CLK2 ? (bbq[7] & ~(bc[4] | (bc[0] & bc[3])) ) : 1'b1);
222
// I decided to put the bc0/bc4 generation in the ALU, so that the bc signals would be made as output from the ALU (for beauty).
224
endmodule // BottomLeftLogic