1
0
mirror of synced 2026-01-13 07:19:45 +00:00

fixed MEX field setting

This commit is contained in:
brad 2010-04-16 01:30:13 +00:00
parent c6008db64b
commit 2969d31d34
2 changed files with 145 additions and 65 deletions

View File

@ -102,6 +102,7 @@ module pdp8_io(clk, brgclk, reset, iot, state, mb,
.io_data_avail(rf_io_data_avail),
.io_interrupt(rf_io_interrupt),
.io_skip(rf_io_skip),
.io_clear_ac(rf_io_cleac_ac),
.ram_read_req(io_ram_read_req),
.ram_write_req(io_ram_write_req),
@ -117,7 +118,6 @@ module pdp8_io(clk, brgclk, reset, iot, state, mb,
.ide_data_bus(ide_data_bus));
assign tt_io_clear_ac = 1'b0;
assign rf_io_clear_ac = 1'b0;
assign io_data_out =
tt_io_selected ? tt_io_data_out :

View File

@ -246,19 +246,20 @@ will process the information.
// read word count
DB_start_xfer1:
disk_addr <= {ema, dma};
ma_out = wc-address;
ram_read_req = 1;
dma_wc <= mb_in;
ma_out = wc-address
ram_read_req = 1
dma_wc <= mb_in + 1;
if ram_done db_next_state = DB_start_xfer2;
// read addr
DB_start_xfer2:
ma_out = wc-address | 1;
ram_read_req = 1;
dma_addr <= mb_in
ma_out = wc-address | 1
ram_read_req = 1
dma_addr <= mb_in + 1
db_next_state = DB_start_xfer3;
DB_start_xfer3:
dma_done = dma_wc == 0
if read
db_next_state = DB_check_xfer_read;
else
@ -278,19 +279,28 @@ will process the information.
// write to ram
DB_next_xfer_read:
disk_addr <= disk_addr + 1
ma_out = dma_addr
mb_out = buffer_out
ram_write_req = 1
if ram_done db_next_state = DB_next_xfer_incr;
if ma_out = 7750
dma_wc = buffer_out + 1
if ma_out = 7751
dma_addr = buffer_out + 1
if ram_done
else
dma_done = dma_wc == 0
if dma_done
db_next_state = DB_done_xfer
else
db_next_state = DB_next_xfer_incr;
DB_next_xfer_incr:
disk_addr <= disk_addr + 1
dma_addr <= dma_addr + 1
dma_addr <= dma_addr + 1
dma_wc <= dma_wc + 1
dma_done = dma_wc == 07777
if dma_done
db_next_state = DB_done_xfer;
else
if read
db_next_state = DB_check_xfer_read;
else
@ -309,7 +319,12 @@ will process the information.
if disk-addr-page == memory-buffer-addr-page
buffer_wr = 1
buffer_dirty <= 1
db_next_state = DB_next_xfer_incr;
disk_addr <= disk_addr + 1
dma_done = dma_wc == 0
if dma_done
db_next_state = DB_done_xfer
else
db_next_state = DB_next_xfer_incr;
else
if buffer_dirty == 0
db_next_state = DB_read_new_page
@ -358,14 +373,13 @@ will process the information.
buffer_dirty <= 0
db_next_state = DB_read_new_page
----------- ----------- ----------- -----------
*/
module pdp8_rf(clk, reset, iot, state, mb,
io_data_in, io_data_out, io_select, io_selected,
io_data_avail, io_interrupt, io_skip,
io_data_avail, io_interrupt, io_skip, io_clear_ac,
ram_read_req, ram_write_req, ram_done,
ram_ma, ram_in, ram_out,
ide_dior, ide_diow, ide_cs, ide_da, ide_data_bus);
@ -383,7 +397,8 @@ module pdp8_rf(clk, reset, iot, state, mb,
output reg io_data_avail;
output io_interrupt;
output reg io_skip;
output reg io_clear_ac;
output ram_read_req;
output ram_write_req;
output [11:0] ram_out;
@ -418,10 +433,10 @@ module pdp8_rf(clk, reset, iot, state, mb,
parameter CA_ADDR = 15'o07751;
wire ADC;
wire PCA;
wire DRE;
wire DRL;
wire PER;
wire PCA;
reg [11:0] DMA;
reg [7:0] EMA;
@ -433,24 +448,24 @@ module pdp8_rf(clk, reset, iot, state, mb,
assign DRL = 1'b0;
assign PER = 1'b0;
reg [10:0] photocell_counter;
reg [7:0] photocell_counter;
parameter [3:0]
DB_idle = 4'b0000,
DB_start_xfer1 = 4'b0001,
DB_start_xfer2 = 4'b0010,
DB_start_xfer3 = 4'b0011,
DB_check_xfer_read = 4'b0100,
DB_next_xfer_read = 4'b0101,
DB_next_xfer_incr = 4'b0110,
DB_begin_xfer_write = 4'b0111,
DB_check_xfer_write = 4'b1000,
DB_done_xfer = 4'b1001,
DB_done_xfer1 = 4'b1010,
DB_done_xfer2 = 4'b1011,
DB_done_xfer3 = 4'b1100,
DB_read_new_page = 4'b1101,
DB_write_old_page = 4'b1111;
DB_idle = 4'd0,
DB_start_xfer1 = 4'd1,
DB_start_xfer2 = 4'd2,
DB_start_xfer3 = 4'd3,
DB_check_xfer_read = 4'd4,
DB_next_xfer_read = 4'd5,
DB_next_xfer_incr = 4'd6,
DB_begin_xfer_write = 4'd7,
DB_check_xfer_write = 4'd8,
DB_done_xfer = 4'd9,
DB_done_xfer1 = 4'd10,
DB_done_xfer2 = 4'd11,
DB_done_xfer3 = 4'd12,
DB_read_new_page = 4'd13,
DB_write_old_page = 4'd14;
reg [3:0] db_next_state;
reg [3:0] db_state;
@ -561,6 +576,7 @@ module pdp8_rf(clk, reset, iot, state, mb,
begin
// sampled during f1
io_skip = 0;
io_clear_ac = 0;
io_data_out = io_data_in;
io_data_avail = 1'b1;
dma_start = 1'b0;
@ -576,14 +592,16 @@ module pdp8_rf(clk, reset, iot, state, mb,
begin
io_data_out = 0;
dma_start = 1'b1;
`ifdef debug
$display("rf: go! disk_addr %o", disk_addr);
`endif
io_clear_ac = 1;
//`ifdef debug
// $display("rf: go! disk_addr %o", disk_addr);
//`endif
end
3'o5: // DMAW
begin
io_data_out = 0;
dma_start = 1'b1;
io_clear_ac = 1;
end
endcase
end // case: 6'o60
@ -604,7 +622,10 @@ module pdp8_rf(clk, reset, iot, state, mb,
MEX,
DRL,NXD,PER };
3'o5: // DIML
io_data_out = 0;
begin
io_data_out = 0;
io_clear_ac = 1;
end
endcase // case(mb[2:0])
end
@ -622,7 +643,10 @@ module pdp8_rf(clk, reset, iot, state, mb,
if (DRL | PER | WLS | NXD | DCF)
io_skip = 1;
3'o6: // DMAC
io_data_out = DMA;
begin
io_data_out = DMA;
io_clear_ac = 1;
end
endcase
end
@ -631,7 +655,10 @@ module pdp8_rf(clk, reset, iot, state, mb,
io_selected = 1'b1;
case (mb[2:0])
3'o3: // DXAL
io_data_out = 0;
begin
io_data_out = 0;
io_clear_ac = 1;
end
3'o5: // DXAC
io_data_out = EMA;
endcase // case(mb[2:0])
@ -652,6 +679,7 @@ module pdp8_rf(clk, reset, iot, state, mb,
EMA <= 1'b0;
DMA <= 1'b0;
MEX <= 3'b0;
PEF <= 1'b0;
CIE <= 1'b0;
DCF <= 1'b1;
@ -713,6 +741,9 @@ module pdp8_rf(clk, reset, iot, state, mb,
DMA <= io_data_in;
is_read <= 1'b1;
DCF <= 1'b0;
`ifdef debug
$display("rf: DMAR ac %o", io_data_in);
`endif
end
3'o5: // DMAW
@ -745,8 +776,10 @@ is_read <= 1'b1;
1: // DCXA
EMA <= 0;
3: // DXAL
// clear ac
EMA <= io_data_in;
begin
// clear ac
EMA <= io_data_in;
end
endcase
endcase
@ -779,10 +812,14 @@ is_read <= 1'b1;
always @(*)
begin
db_next_state = DB_idle;
// load_disk_addr = 0;
case (db_state)
DB_idle:
if (dma_start)
db_next_state = DB_start_xfer1;
begin
if (dma_start)
db_next_state = DB_start_xfer1;
// if (ram_done) load_disk_addr = 1;
end
DB_start_xfer1:
db_next_state = ram_done ? DB_start_xfer2 : DB_start_xfer1;
@ -794,18 +831,25 @@ is_read <= 1'b1;
db_next_state = is_read ? DB_check_xfer_read : DB_begin_xfer_write;
DB_check_xfer_read:
if (buffer_matches_DMA)
db_next_state = DB_next_xfer_read;
else
db_next_state = buffer_dirty ? DB_write_old_page:DB_read_new_page;
begin
if (buffer_matches_DMA)
db_next_state = DB_next_xfer_read;
else
db_next_state = buffer_dirty ?
DB_write_old_page :
DB_read_new_page;
// if (ram_done) load_disk_addr = 1;
end
DB_next_xfer_read:
db_next_state = ram_done ? DB_next_xfer_incr : DB_next_xfer_read;
db_next_state = ram_done ?
(dma_done ? DB_done_xfer : DB_next_xfer_incr) :
DB_next_xfer_read;
DB_next_xfer_incr:
if (dma_done)
db_next_state = DB_done_xfer;
else
// if (dma_done)
// db_next_state = DB_done_xfer;
// else
db_next_state = is_read ? DB_check_xfer_read:DB_begin_xfer_write;
DB_begin_xfer_write:
@ -813,7 +857,7 @@ is_read <= 1'b1;
DB_check_xfer_write:
if (buffer_matches_DMA)
db_next_state = DB_next_xfer_incr;
db_next_state = dma_done ? DB_done_xfer : DB_next_xfer_incr;
else
db_next_state = buffer_dirty ? DB_write_old_page:DB_read_new_page;
@ -868,11 +912,11 @@ is_read <= 1'b1;
case (db_state)
DB_idle:
begin
disk_addr <= {EMA, DMA};
end
DB_start_xfer1:
begin
disk_addr <= {EMA, DMA};
dma_wc <= ram_in + 12'o0001;
db_done <= 0;
`ifdef debug
@ -892,6 +936,7 @@ is_read <= 1'b1;
DB_start_xfer3:
begin
// this state might be not be needed
$display("rf: start! disk_addr %o (%o %o)", disk_addr, EMA, DMA);
end
DB_begin_xfer_write:
@ -901,22 +946,43 @@ is_read <= 1'b1;
DB_next_xfer_incr:
begin
disk_addr <= disk_addr + 20'b1;
dma_addr <= dma_addr + 14'o00001;
// disk_addr <= disk_addr + 20'b1;
dma_addr[11:0] <= dma_addr[11:0] + 12'o00001;
dma_wc <= dma_wc + 12'b1;
`ifdef debug_rf
$display("dma_wc %o dma_addr %o MEX %o",dma_wc,dma_addr,MEX);
`endif
end
`ifdef debug_rf
DB_next_xfer_read:
if (ram_done)
$display("rf: buffer read[%o] = %o", buff_addr, buff_out);
begin
if (ram_done)
disk_addr <= disk_addr + 20'b1;
if (dma_addr == 12'o7750 && ram_done)
begin
dma_wc <= buff_out;
$display("rf: snoop update wc %o", buff_out);
end
if (dma_addr == 12'o7751 && ram_done)
begin
dma_addr[11:0] <= buff_out;
$display("rf: snoop update ca %o", buff_out);
end
`ifdef debug_rf
if (ram_done)
$display("rf: buffer read[%o] = %o", buff_addr, buff_out);
`endif
end
DB_check_xfer_write:
buffer_dirty <= 1;
begin
buffer_dirty <= 1;
if (buffer_matches_DMA)
disk_addr <= disk_addr + 20'b1;
end
`ifdef debug
DB_done_xfer:
@ -948,6 +1014,18 @@ is_read <= 1'b1;
endcase
end
//
// always @(posedge clk)
// if (reset)
// disk_addr <= 0;
// else
// if (load_disk_addr)
// disk_addr <= {EMA, DMA};
// else
// if (incr_disk_addr)
// disk_addr <= disk_addr + 20'b1;
//
// external ram control (for dma to/from pdp-8 memory)
//
@ -993,10 +1071,12 @@ is_read <= 1'b1;
if (reset)
photocell_counter <= 0;
else
photocell_counter <= photocell_counter + 1;
begin
photocell_counter <= photocell_counter + 1;
end
assign PCA = photocell_counter == 0;
assign DRE = PCA;
assign PCA = photocell_counter < 16;
assign DRE = ~db_done;
/* we don't support write lock */
always @(posedge clk)