If we were documented, we'd be dangerous (nw)

This commit is contained in:
Olivier Galibert 2014-09-17 20:50:32 +00:00
parent c61142c217
commit f5570dc9c6
13 changed files with 38 additions and 77 deletions

View File

@ -95,13 +95,13 @@ everything goes through normal memory-map read/write calls. The state
of the sync line is given by the cpu method get_sync(), making of the sync line is given by the cpu method get_sync(), making
implementing the decryption in the handler possible. implementing the decryption in the handler possible.
In a final addition, the cpu method get_cycle() gives the current time Also, as for every executable device, the cpu method total_cycles()
in cycles since the start of the machine from the point of view of the gives the current time in cycles since the start of the machine from
cpu. Or, in other words, what is usually called the cycle number for the point of view of the cpu. Or, in other words, what is usually
the cpu when somebody talks about bus contention or wait states. The called the cycle number for the cpu when somebody talks about bus
call is designed to be fast (no system-wide sync, usually no call to contention or wait states. The call is designed to be fast (no
machine.time()) and is precise. Cycle number for every access is system-wide sync, no call to machine.time()) and is precise. Cycle
exact at the sub-instruction level. number for every access is exact at the sub-instruction level.
The 4510 special nomap line is accessible through get_nomap(). The 4510 special nomap line is accessible through get_nomap().

View File

@ -130,14 +130,12 @@ void h8_device::device_start()
MACF = 0; MACF = 0;
inst_state = STATE_RESET; inst_state = STATE_RESET;
inst_substate = 0; inst_substate = 0;
end_cycles = 0;
} }
void h8_device::device_reset() void h8_device::device_reset()
{ {
inst_state = STATE_RESET; inst_state = STATE_RESET;
inst_substate = 0; inst_substate = 0;
end_cycles = 0;
irq_vector = 0; irq_vector = 0;
irq_level = -1; irq_level = -1;
@ -162,26 +160,18 @@ UINT32 h8_device::execute_input_lines() const
return 0; return 0;
} }
UINT64 h8_device::get_cycle()
{
return end_cycles == 0 || icount <= 0 ? machine().time().as_ticks(clock()) : end_cycles - icount;
}
void h8_device::recompute_bcount(UINT64 event_time) void h8_device::recompute_bcount(UINT64 event_time)
{ {
if(!event_time || event_time >= end_cycles) { if(!event_time || event_time >= total_cycles() + icount) {
bcount = 0; bcount = 0;
return; return;
} }
bcount = end_cycles - event_time; bcount = total_cycles() - event_time;
} }
void h8_device::execute_run() void h8_device::execute_run()
{ {
start_cycles = machine().time().as_ticks(clock()); internal_update(total_cycles());
end_cycles = start_cycles + icount;
internal_update(start_cycles);
if(inst_substate) if(inst_substate)
do_exec_partial(); do_exec_partial();
@ -196,11 +186,10 @@ void h8_device::execute_run()
do_exec_full(); do_exec_full();
} }
while(bcount && icount && icount <= bcount) while(bcount && icount && icount <= bcount)
internal_update(end_cycles - bcount); internal_update(total_cycles() + icount - bcount);
if(inst_substate) if(inst_substate)
do_exec_partial(); do_exec_partial();
} }
end_cycles = 0;
} }
void h8_device::add_event(UINT64 &event_time, UINT64 new_event) void h8_device::add_event(UINT64 &event_time, UINT64 new_event)
@ -213,7 +202,7 @@ void h8_device::add_event(UINT64 &event_time, UINT64 new_event)
void h8_device::internal_update() void h8_device::internal_update()
{ {
internal_update(get_cycle()); internal_update(total_cycles());
} }
const address_space_config *h8_device::memory_space_config(address_spacenum spacenum) const const address_space_config *h8_device::memory_space_config(address_spacenum spacenum) const

View File

@ -76,7 +76,6 @@ public:
h8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, bool mode_a16, address_map_delegate map_delegate); h8_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, bool mode_a16, address_map_delegate map_delegate);
UINT64 get_cycle();
void internal_update(); void internal_update();
void set_irq(int irq_vector, int irq_level, bool irq_nmi); void set_irq(int irq_vector, int irq_level, bool irq_nmi);
@ -214,7 +213,6 @@ protected:
int inst_state, inst_substate; int inst_state, inst_substate;
int icount, bcount; int icount, bcount;
UINT64 start_cycles, end_cycles;
int irq_vector, taken_irq_vector; int irq_vector, taken_irq_vector;
int irq_level, taken_irq_level; int irq_level, taken_irq_level;
bool irq_required, irq_nmi; bool irq_required, irq_nmi;

View File

@ -152,7 +152,7 @@ void h8_adc_device::conversion_wait(bool first, bool poweron, UINT64 current_tim
if(current_time) if(current_time)
next_event = current_time + conversion_time(first, poweron); next_event = current_time + conversion_time(first, poweron);
else { else {
next_event = cpu->get_cycle() + conversion_time(first, poweron); next_event = cpu->total_cycles() + conversion_time(first, poweron);
cpu->internal_update(); cpu->internal_update();
} }
} }

View File

@ -461,19 +461,19 @@ void h8_sci_device::clock_start(int mode)
case CLKM_INTERNAL_ASYNC_OUT: case CLKM_INTERNAL_ASYNC_OUT:
case CLKM_INTERNAL_SYNC_OUT: case CLKM_INTERNAL_SYNC_OUT:
logerror("%s: Starting internal clock\n", tag()); logerror("%s: Starting internal clock\n", tag());
clock_base = cpu->get_cycle(); clock_base = cpu->total_cycles();
cpu->internal_update(); cpu->internal_update();
break; break;
case CLKM_EXTERNAL_RATE_ASYNC: case CLKM_EXTERNAL_RATE_ASYNC:
logerror("%s: Simulating external clock async\n", tag()); logerror("%s: Simulating external clock async\n", tag());
clock_base = UINT64(cpu->get_cycle()*internal_to_external_ratio); clock_base = UINT64(cpu->total_cycles()*internal_to_external_ratio);
cpu->internal_update(); cpu->internal_update();
break; break;
case CLKM_EXTERNAL_RATE_SYNC: case CLKM_EXTERNAL_RATE_SYNC:
logerror("%s: Simulating external clock sync\n", tag()); logerror("%s: Simulating external clock sync\n", tag());
clock_base = UINT64(cpu->get_cycle()*2*internal_to_external_ratio); clock_base = UINT64(cpu->total_cycles()*2*internal_to_external_ratio);
cpu->internal_update(); cpu->internal_update();
break; break;

View File

@ -199,7 +199,7 @@ void h8_timer16_channel_device::update_counter(UINT64 cur_time)
return; return;
if(!cur_time) if(!cur_time)
cur_time = cpu->get_cycle(); cur_time = cpu->total_cycles();
if(!channel_active) { if(!channel_active) {
last_clock_update = cur_time; last_clock_update = cur_time;
@ -257,7 +257,7 @@ void h8_timer16_channel_device::recalc_event(UINT64 cur_time)
} }
if(!cur_time) if(!cur_time)
cur_time = cpu->get_cycle(); cur_time = cpu->total_cycles();
if(counter_incrementing) { if(counter_incrementing) {
UINT32 event_delay = 0xffffffff; UINT32 event_delay = 0xffffffff;
@ -297,7 +297,7 @@ void h8_timer16_channel_device::recalc_event(UINT64 cur_time)
event_time = 0; event_time = 0;
if(event_time && 0) if(event_time && 0)
logerror("%s: next event in %d cycles (%ld)\n", tag(), int(event_time - cpu->get_cycle()), long(event_time)); logerror("%s: next event in %d cycles (%ld)\n", tag(), int(event_time - cpu->total_cycles()), long(event_time));
} else { } else {
logerror("decrementing counter\n"); logerror("decrementing counter\n");

View File

@ -212,7 +212,7 @@ void h8_timer8_channel_device::update_counter(UINT64 cur_time)
return; return;
if(!cur_time) if(!cur_time)
cur_time = cpu->get_cycle(); cur_time = cpu->total_cycles();
UINT64 base_time = (last_clock_update + clock_divider/2) / clock_divider; UINT64 base_time = (last_clock_update + clock_divider/2) / clock_divider;
UINT64 new_time = (cur_time + clock_divider/2) / clock_divider; UINT64 new_time = (cur_time + clock_divider/2) / clock_divider;
@ -262,7 +262,7 @@ void h8_timer8_channel_device::recalc_event(UINT64 cur_time)
} }
if(!cur_time) if(!cur_time)
cur_time = cpu->get_cycle(); cur_time = cpu->total_cycles();
UINT32 event_delay = 0xffffffff; UINT32 event_delay = 0xffffffff;
if(clear_type == CLEAR_A || clear_type == CLEAR_B) if(clear_type == CLEAR_A || clear_type == CLEAR_B)

View File

@ -129,7 +129,6 @@ void m6502_device::init()
inst_substate = 0; inst_substate = 0;
inst_state_base = 0; inst_state_base = 0;
sync = false; sync = false;
end_cycles = 0;
inhibit_interrupts = false; inhibit_interrupts = false;
} }
@ -143,7 +142,6 @@ void m6502_device::device_reset()
apu_irq_state = false; apu_irq_state = false;
irq_taken = false; irq_taken = false;
v_state = false; v_state = false;
end_cycles = 0;
sync = false; sync = false;
sync_w(CLEAR_LINE); sync_w(CLEAR_LINE);
inhibit_interrupts = false; inhibit_interrupts = false;
@ -400,18 +398,8 @@ UINT8 m6502_device::do_asr(UINT8 v)
return v; return v;
} }
UINT64 m6502_device::get_cycle()
{
return end_cycles == 0 || icount <= 0 ? machine().time().as_ticks(clock()) : end_cycles - icount;
}
void m6502_device::execute_run() void m6502_device::execute_run()
{ {
// get_cycle() is currently unused, and this precalculation
// enormously slows down drivers with high interleave
#if 0
end_cycles = machine().time().as_ticks(clock()) + icount;
#endif
if(inst_substate) if(inst_substate)
do_exec_partial(); do_exec_partial();
@ -424,7 +412,6 @@ void m6502_device::execute_run()
} }
do_exec_full(); do_exec_full();
} }
end_cycles = 0;
} }
void m6502_device::execute_set_input(int inputnum, int state) void m6502_device::execute_set_input(int inputnum, int state)

View File

@ -61,7 +61,6 @@ public:
DECLARE_WRITE_LINE_MEMBER( irq_line ); DECLARE_WRITE_LINE_MEMBER( irq_line );
DECLARE_WRITE_LINE_MEMBER( nmi_line ); DECLARE_WRITE_LINE_MEMBER( nmi_line );
UINT64 get_cycle();
bool get_sync() const { return sync; } bool get_sync() const { return sync; }
void disable_direct() { direct_disabled = true; } void disable_direct() { direct_disabled = true; }
@ -201,7 +200,6 @@ protected:
int icount; int icount;
bool nmi_state, irq_state, apu_irq_state, v_state; bool nmi_state, irq_state, apu_irq_state, v_state;
bool irq_taken, sync, direct_disabled, inhibit_interrupts; bool irq_taken, sync, direct_disabled, inhibit_interrupts;
UINT64 end_cycles;
static const disasm_entry disasm_entries[0x100]; static const disasm_entry disasm_entries[0x100];

View File

@ -77,7 +77,6 @@ void m740_device::device_reset()
apu_irq_state = false; apu_irq_state = false;
irq_taken = false; irq_taken = false;
v_state = false; v_state = false;
end_cycles = 0;
sync = false; sync = false;
inhibit_interrupts = false; inhibit_interrupts = false;
SP = 0x00ff; SP = 0x00ff;

View File

@ -87,7 +87,7 @@ void i8x9x_device::commit_hso_cam()
hso_info[i].active = true; hso_info[i].active = true;
hso_info[i].command = hso_command; hso_info[i].command = hso_command;
hso_info[i].time = hso_time; hso_info[i].time = hso_time;
internal_update(get_cycle()); internal_update(total_cycles());
return; return;
} }
hso_cam_hold.active = true; hso_cam_hold.active = true;
@ -105,7 +105,7 @@ void i8x9x_device::ad_start(UINT64 current_time)
void i8x9x_device::serial_send(UINT8 data) void i8x9x_device::serial_send(UINT8 data)
{ {
serial_send_buf = data; serial_send_buf = data;
serial_send_timer = get_cycle() + 9600; serial_send_timer = total_cycles() + 9600;
} }
void i8x9x_device::serial_send_done() void i8x9x_device::serial_send_done()
@ -123,7 +123,7 @@ void i8x9x_device::io_w8(UINT8 adr, UINT8 data)
case 0x02: case 0x02:
ad_command = data; ad_command = data;
if(ad_command & 8) if(ad_command & 8)
ad_start(get_cycle()); ad_start(total_cycles());
break; break;
case 0x03: case 0x03:
logerror("%s: hsi_mode %02x (%04x)\n", tag(), data, PPC); logerror("%s: hsi_mode %02x (%04x)\n", tag(), data, PPC);
@ -229,16 +229,16 @@ UINT8 i8x9x_device::io_r8(UINT8 adr)
return pending_irq; return pending_irq;
case 0x0a: case 0x0a:
logerror("%s: read timer1 l (%04x)\n", tag(), PPC); logerror("%s: read timer1 l (%04x)\n", tag(), PPC);
return timer_value(1, get_cycle()); return timer_value(1, total_cycles());
case 0x0b: case 0x0b:
logerror("%s: read timer1 h (%04x)\n", tag(), PPC); logerror("%s: read timer1 h (%04x)\n", tag(), PPC);
return timer_value(1, get_cycle()) >> 8; return timer_value(1, total_cycles()) >> 8;
case 0x0c: case 0x0c:
logerror("%s: read timer2 l (%04x)\n", tag(), PPC); logerror("%s: read timer2 l (%04x)\n", tag(), PPC);
return timer_value(2, get_cycle()); return timer_value(2, total_cycles());
case 0x0d: case 0x0d:
logerror("%s: read timer2 h (%04x)\n", tag(), PPC); logerror("%s: read timer2 h (%04x)\n", tag(), PPC);
return timer_value(2, get_cycle()) >> 8; return timer_value(2, total_cycles()) >> 8;
case 0x0e: { case 0x0e: {
static int last = -1; static int last = -1;
if(io->read_word(P0*2) != last) { if(io->read_word(P0*2) != last) {
@ -282,10 +282,10 @@ UINT16 i8x9x_device::io_r16(UINT8 adr)
logerror("%s: read hsi time (%04x)\n", tag(), PPC); logerror("%s: read hsi time (%04x)\n", tag(), PPC);
return 0x0000; return 0x0000;
case 0x0a: case 0x0a:
return timer_value(1, get_cycle()); return timer_value(1, total_cycles());
case 0x0c: case 0x0c:
logerror("%s: read timer2 (%04x)\n", tag(), PPC); logerror("%s: read timer2 (%04x)\n", tag(), PPC);
return timer_value(2, get_cycle()); return timer_value(2, total_cycles());
default: default:
return io_r8(adr) | (io_r8(adr+1) << 8); return io_r8(adr) | (io_r8(adr+1) << 8);
} }

View File

@ -94,18 +94,13 @@ UINT32 mcs96_device::execute_input_lines() const
return 1; return 1;
} }
UINT64 mcs96_device::get_cycle()
{
return end_cycles == 0 || icount <= 0 ? machine().time().as_ticks(clock()) : end_cycles - icount;
}
void mcs96_device::recompute_bcount(UINT64 event_time) void mcs96_device::recompute_bcount(UINT64 event_time)
{ {
if(!event_time || event_time >= end_cycles) { if(!event_time || event_time >= total_cycles()+icount) {
bcount = 0; bcount = 0;
return; return;
} }
bcount = end_cycles - event_time; bcount = total_cycles() - event_time;
} }
void mcs96_device::check_irq() void mcs96_device::check_irq()
@ -115,13 +110,10 @@ void mcs96_device::check_irq()
void mcs96_device::execute_run() void mcs96_device::execute_run()
{ {
UINT64 start_cycles = machine().time().as_ticks(clock()); internal_update(total_cycles());
end_cycles = start_cycles + icount;
internal_update(start_cycles); // if(inst_substate)
// do_exec_partial();
if(/*inst_substate*/ 0)
do_exec_partial();
while(icount > 0) { while(icount > 0) {
while(icount > bcount) { while(icount > bcount) {
@ -132,9 +124,10 @@ void mcs96_device::execute_run()
} }
} }
while(bcount && icount <= bcount) while(bcount && icount <= bcount)
internal_update(end_cycles - bcount); internal_update(total_cycles() + icount - bcount);
// if(inst_substate)
// do_exec_partial();
} }
end_cycles = 0;
} }
void mcs96_device::execute_set_input(int inputnum, int state) void mcs96_device::execute_set_input(int inputnum, int state)

View File

@ -48,8 +48,6 @@ public:
mcs96_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, int data_width, const char *shortname, const char *source); mcs96_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, int data_width, const char *shortname, const char *source);
UINT64 get_cycle();
protected: protected:
enum { enum {
STATE_FETCH = 0x200, STATE_FETCH = 0x200,
@ -127,7 +125,6 @@ protected:
address_space *program; address_space *program;
direct_read_data *direct; direct_read_data *direct;
UINT64 end_cycles;
int icount, bcount, inst_state, cycles_scaling; int icount, bcount, inst_state, cycles_scaling;
UINT8 pending_irq; UINT8 pending_irq;
UINT16 PC, PPC, PSW; UINT16 PC, PPC, PSW;