(MESS) lisa: Removed runtime tagmap lookups. (nw)

This commit is contained in:
Curt Coder 2013-01-26 22:35:29 +00:00
parent 9fde608c12
commit fc452e743b
3 changed files with 242 additions and 227 deletions

View File

@ -29,20 +29,20 @@ static ADDRESS_MAP_START(lisa_map, AS_PROGRAM, 16, lisa_state )
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( lisa_cop_io_map, AS_IO, 8, lisa_state ) static ADDRESS_MAP_START( lisa_cop_io_map, AS_IO, 8, lisa_state )
AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_NOP
AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_NOP
AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_NOP
AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_NOP
AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP
AM_RANGE(COP400_PORT_SIO, COP400_PORT_SIO) AM_NOP AM_RANGE(COP400_PORT_SIO, COP400_PORT_SIO) AM_NOP
AM_RANGE(COP400_PORT_CKO, COP400_PORT_CKO) AM_READNOP AM_RANGE(COP400_PORT_CKO, COP400_PORT_CKO) AM_READNOP
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( kb_cop_io_map, AS_IO, 8, lisa_state ) static ADDRESS_MAP_START( kb_cop_io_map, AS_IO, 8, lisa_state )
AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_RANGE(COP400_PORT_L, COP400_PORT_L) AM_NOP
AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_RANGE(COP400_PORT_G, COP400_PORT_G) AM_NOP
AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_RANGE(COP400_PORT_D, COP400_PORT_D) AM_NOP
AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_RANGE(COP400_PORT_IN, COP400_PORT_IN) AM_NOP
AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP AM_RANGE(COP400_PORT_SK, COP400_PORT_SK) AM_WRITENOP
AM_RANGE(COP400_PORT_SIO, COP400_PORT_SIO) AM_NOP AM_RANGE(COP400_PORT_SIO, COP400_PORT_SIO) AM_NOP
AM_RANGE(COP400_PORT_CKO, COP400_PORT_CKO) AM_READNOP AM_RANGE(COP400_PORT_CKO, COP400_PORT_CKO) AM_READNOP

View File

@ -9,8 +9,14 @@
#ifndef LISA_H_ #ifndef LISA_H_
#define LISA_H_ #define LISA_H_
#include "emu.h"
#include "machine/6522via.h" #include "machine/6522via.h"
#include "machine/8530scc.h" #include "machine/8530scc.h"
#include "machine/6522via.h"
#include "machine/applefdc.h"
#include "devices/sonydriv.h"
#include "cpu/m68000/m68000.h"
#include "sound/speaker.h"
#define COP421_TAG "u9f" #define COP421_TAG "u9f"
#define KB_COP421_TAG "kbcop" #define KB_COP421_TAG "kbcop"
@ -95,15 +101,46 @@ public:
lisa_state(const machine_config &mconfig, device_type type, const char *tag) lisa_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_via0(*this, "via6522_0"),
m_via1(*this, "via6522_1"),
m_fdc(*this, "fdc"),
m_scc(*this, "scc"), m_scc(*this, "scc"),
m_speaker(*this, SPEAKER_TAG),
m_fdc_rom(*this,"fdc_rom"), m_fdc_rom(*this,"fdc_rom"),
m_fdc_ram(*this,"fdc_ram") { } m_fdc_ram(*this,"fdc_ram"),
m_io_line0(*this, "LINE0"),
m_io_line1(*this, "LINE1"),
m_io_line2(*this, "LINE2"),
m_io_line3(*this, "LINE3"),
m_io_line4(*this, "LINE4"),
m_io_line5(*this, "LINE5"),
m_io_line6(*this, "LINE6"),
m_io_line7(*this, "LINE7"),
m_io_mouse_x(*this, "MOUSE_X"),
m_io_mouse_y(*this, "MOUSE_Y")
{ }
required_device<cpu_device> m_maincpu; required_device<legacy_cpu_device> m_maincpu;
required_device<via6522_device> m_via0;
required_device<via6522_device> m_via1;
optional_device<applefdc_base_device> m_fdc;
required_device<scc8530_t> m_scc; required_device<scc8530_t> m_scc;
required_device<speaker_sound_device> m_speaker;
required_shared_ptr<UINT8> m_fdc_rom; required_shared_ptr<UINT8> m_fdc_rom;
required_shared_ptr<UINT8> m_fdc_ram; required_shared_ptr<UINT8> m_fdc_ram;
required_ioport m_io_line0;
required_ioport m_io_line1;
required_ioport m_io_line2;
required_ioport m_io_line3;
required_ioport m_io_line4;
required_ioport m_io_line5;
required_ioport m_io_line6;
required_ioport m_io_line7;
required_ioport m_io_mouse_x;
required_ioport m_io_mouse_y;
UINT8 *m_ram_ptr; UINT8 *m_ram_ptr;
UINT8 *m_rom_ptr; UINT8 *m_rom_ptr;
UINT8 *m_videoROM_ptr; UINT8 *m_videoROM_ptr;
@ -174,6 +211,20 @@ public:
DECLARE_WRITE8_MEMBER(COPS_via_out_b); DECLARE_WRITE8_MEMBER(COPS_via_out_b);
DECLARE_WRITE8_MEMBER(COPS_via_out_cb2); DECLARE_WRITE8_MEMBER(COPS_via_out_cb2);
DECLARE_READ8_MEMBER(parallel_via_in_b); DECLARE_READ8_MEMBER(parallel_via_in_b);
void field_interrupts();
void set_parity_error_pending(int value);
void set_VTIR(int value);
void cpu_board_control_access(offs_t offset);
void init_COPS();
void reset_COPS();
void lisa_fdc_ttl_glue_access(offs_t offset);
void COPS_send_data_if_possible();
void COPS_queue_data(const UINT8 *data, int len);
void COPS_via_irq_func(int val);
void scan_keyboard();
void unplug_keyboard();
void plug_keyboard();
}; };

View File

@ -36,13 +36,7 @@
Raphael Nabet, 2000-2003 Raphael Nabet, 2000-2003
*/ */
#include "emu.h"
#include "includes/lisa.h" #include "includes/lisa.h"
#include "machine/6522via.h"
#include "machine/applefdc.h"
#include "devices/sonydriv.h"
#include "cpu/m68000/m68000.h"
#include "sound/speaker.h"
/* /*
@ -91,9 +85,6 @@ the drive type (TWIGGY or 3.5'')) */
a hard disk a hard disk
*/ */
static void COPS_via_irq_func(device_t *device, int val);
const via6522_interface lisa_via6522_0_intf = const via6522_interface lisa_via6522_0_intf =
{ {
/* COPS via */ /* COPS via */
@ -103,7 +94,7 @@ const via6522_interface lisa_via6522_0_intf =
DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_a), DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_b), DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_a), DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_b),
DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_ca2), DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_cb2), DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_ca2), DEVCB_DRIVER_MEMBER(lisa_state,COPS_via_out_cb2),
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL,
DEVCB_LINE(COPS_via_irq_func), DEVCB_DRIVER_LINE_MEMBER(lisa_state,COPS_via_irq_func)
}; };
const via6522_interface lisa_via6522_1_intf = const via6522_interface lisa_via6522_1_intf =
@ -114,7 +105,7 @@ const via6522_interface lisa_via6522_1_intf =
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL
}; };
/* /*
@ -149,75 +140,72 @@ enum lisa_model_t
Interrupt handling Interrupt handling
*/ */
static void lisa_field_interrupts(running_machine &machine) void lisa_state::field_interrupts()
{ {
lisa_state *state = machine.driver_data<lisa_state>(); if (m_parity_error_pending)
if (state->m_parity_error_pending)
return; /* don't touch anything... */ return; /* don't touch anything... */
#if 0 #if 0
if (RSIR) if (RSIR)
// serial interrupt // serial interrupt
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_6, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_6, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
else if (int0) else if (int0)
// external interrupt // external interrupt
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_5, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_5, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
else if (int1) else if (int1)
// external interrupt // external interrupt
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_4, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_4, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
else if (int2) else if (int2)
// external interrupt // external interrupt
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_3, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_3, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
else else
#endif #endif
if (state->m_KBIR) if (m_KBIR)
/* COPS VIA interrupt */ /* COPS VIA interrupt */
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_2, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_2, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
else if (state->m_FDIR || state->m_VTIR) else if (m_FDIR || m_VTIR)
/* floppy disk or VBl */ /* floppy disk or VBl */
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_1, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_1, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
else else
/* clear all interrupts */ /* clear all interrupts */
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_1, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_1, CLEAR_LINE, M68K_INT_ACK_AUTOVECTOR);
} }
static void set_parity_error_pending(running_machine &machine, int value) void lisa_state::set_parity_error_pending(int value)
{ {
lisa_state *state = machine.driver_data<lisa_state>();
#if 1 #if 1
/* does not work well due to bugs in 68k cores */ /* does not work well due to bugs in 68k cores */
state->m_parity_error_pending = value; m_parity_error_pending = value;
if (state->m_parity_error_pending) if (m_parity_error_pending)
{ {
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_7, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_7, ASSERT_LINE, M68K_INT_ACK_AUTOVECTOR);
} }
else else
{ {
machine.device("maincpu")->execute().set_input_line(M68K_IRQ_7, CLEAR_LINE); m_maincpu->set_input_line(M68K_IRQ_7, CLEAR_LINE);
} }
#else #else
/* work-around... */ /* work-around... */
if ((! state->m_parity_error_pending) && value) if ((! m_parity_error_pending) && value)
{ {
state->m_parity_error_pending = 1; m_parity_error_pending = 1;
machine.device("maincpu")->execute().set_input_line_and_vector(M68K_IRQ_7, PULSE_LINE, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_and_vector(M68K_IRQ_7, PULSE_LINE, M68K_INT_ACK_AUTOVECTOR);
} }
else if (state->m_parity_error_pending && (! value)) else if (m_parity_error_pending && (! value))
{ {
state->m_parity_error_pending = 0; m_parity_error_pending = 0;
lisa_field_interrupts(machine); field_interrupts();
} }
#endif #endif
} }
INLINE void set_VTIR(running_machine &machine, int value) void lisa_state::set_VTIR(int value)
{ {
lisa_state *state = machine.driver_data<lisa_state>(); if (m_VTIR != value)
if (state->m_VTIR != value)
{ {
state->m_VTIR = value; m_VTIR = value;
if (state->m_VTIR==1) if (m_VTIR==1)
lisa_field_interrupts(machine); field_interrupts();
} }
} }
@ -227,40 +215,37 @@ INLINE void set_VTIR(running_machine &machine, int value)
keyboard interface (COPS simulation; our COPS CPU core is too broken and too esoteric to emulate this correctly, I tried) keyboard interface (COPS simulation; our COPS CPU core is too broken and too esoteric to emulate this correctly, I tried)
*/ */
INLINE void COPS_send_data_if_possible(running_machine &machine) void lisa_state::COPS_send_data_if_possible()
{ {
lisa_state *state = machine.driver_data<lisa_state>(); address_space &space = m_maincpu->space(AS_PROGRAM);
via6522_device *via_0 = machine.device<via6522_device>("via6522_0");
address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
if ((! state->m_hold_COPS_data) && state->m_fifo_size && (! state->m_COPS_Ready)) if ((! m_hold_COPS_data) && m_fifo_size && (! m_COPS_Ready))
{ {
// printf("COPsim: sending %02x to VIA\n", state->m_fifo_data[state->m_fifo_head]); // printf("COPsim: sending %02x to VIA\n", m_fifo_data[m_fifo_head]);
via_0->write_porta(space, 0, state->m_fifo_data[state->m_fifo_head]); /* output data */ m_via0->write_porta(space, 0, m_fifo_data[m_fifo_head]); /* output data */
if (state->m_fifo_head == state->m_mouse_data_offset) if (m_fifo_head == m_mouse_data_offset)
state->m_mouse_data_offset = -1; /* we just phased out the mouse data in buffer */ m_mouse_data_offset = -1; /* we just phased out the mouse data in buffer */
state->m_fifo_head = (state->m_fifo_head+1) & 0x7; m_fifo_head = (m_fifo_head+1) & 0x7;
state->m_fifo_size--; m_fifo_size--;
via_0->write_ca1(1); /* pulse ca1 so that VIA reads it */ m_via0->write_ca1(1); /* pulse ca1 so that VIA reads it */
via_0->write_ca1(0); /* BTW, I have no idea how a real COPS does it ! */ m_via0->write_ca1(0); /* BTW, I have no idea how a real COPS does it ! */
} }
} }
/* send data (queue it into the FIFO if needed) */ /* send data (queue it into the FIFO if needed) */
static void COPS_queue_data(running_machine &machine, const UINT8 *data, int len) void lisa_state::COPS_queue_data(const UINT8 *data, int len)
{ {
lisa_state *state = machine.driver_data<lisa_state>();
#if 0 #if 0
if (state->m_fifo_size + len <= 8) if (m_fifo_size + len <= 8)
#else #else
/* trash old data */ /* trash old data */
while (state->m_fifo_size > 8 - len) while (m_fifo_size > 8 - len)
{ {
if (state->m_fifo_head == state->m_mouse_data_offset) if (m_fifo_head == m_mouse_data_offset)
state->m_mouse_data_offset = -1; /* we just phased out the mouse data in buffer */ m_mouse_data_offset = -1; /* we just phased out the mouse data in buffer */
state->m_fifo_head = (state->m_fifo_head+1) & 0x7; m_fifo_head = (m_fifo_head+1) & 0x7;
state->m_fifo_size--; m_fifo_size--;
} }
#endif #endif
@ -269,13 +254,13 @@ static void COPS_queue_data(running_machine &machine, const UINT8 *data, int len
while (len--) while (len--)
{ {
state->m_fifo_data[state->m_fifo_tail] = * (data++); m_fifo_data[m_fifo_tail] = * (data++);
state->m_fifo_tail = (state->m_fifo_tail+1) & 0x7; m_fifo_tail = (m_fifo_tail+1) & 0x7;
state->m_fifo_size++; m_fifo_size++;
} }
/*logerror("COPS_queue_data : trying to send data to VIA\n");*/ /*logerror("COPS_queue_data : trying to send data to VIA\n");*/
COPS_send_data_if_possible(machine); COPS_send_data_if_possible();
} }
} }
@ -288,44 +273,41 @@ static void COPS_queue_data(running_machine &machine, const UINT8 *data, int len
/* keyboard matrix to detect transition */ /* keyboard matrix to detect transition */
static void scan_keyboard(running_machine &machine) void lisa_state::scan_keyboard()
{ {
lisa_state *state = machine.driver_data<lisa_state>();
int i, j; int i, j;
int keybuf;
UINT8 keycode; UINT8 keycode;
static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7" }; UINT8 keybuf[8] = { m_io_line0->read(), m_io_line1->read(), m_io_line2->read(), m_io_line3->read(),
m_io_line4->read(), m_io_line5->read(), m_io_line6->read(), m_io_line7->read() };
if (! state->m_COPS_force_unplug) if (! m_COPS_force_unplug)
for (i=0; i<8; i++) for (i=0; i<8; i++)
{ {
keybuf = machine.root_device().ioport(keynames[i])->read(); if (keybuf[i] != m_key_matrix[i])
if (keybuf != state->m_key_matrix[i])
{ /* if state has changed, find first bit which has changed */ { /* if state has changed, find first bit which has changed */
/*logerror("keyboard state changed, %d %X\n", i, keybuf);*/ /*logerror("keyboard state changed, %d %X\n", i, keybuf);*/
for (j=0; j<16; j++) for (j=0; j<16; j++)
{ {
if (((keybuf ^ state->m_key_matrix[i]) >> j) & 1) if (((keybuf[i] ^ m_key_matrix[i]) >> j) & 1)
{ {
/* update key_matrix */ /* update key_matrix */
state->m_key_matrix[i] = (state->m_key_matrix[i] & ~ (1 << j)) | (keybuf & (1 << j)); m_key_matrix[i] = (m_key_matrix[i] & ~ (1 << j)) | (keybuf[i] & (1 << j));
/* create key code */ /* create key code */
keycode = (i << 4) | j; keycode = (i << 4) | j;
if (keybuf & (1 << j)) if (keybuf[i] & (1 << j))
{ /* key down */ { /* key down */
keycode |= 0x80; keycode |= 0x80;
} }
#if 0 #if 0
if (keycode == state->m_NMIcode) if (keycode == m_NMIcode)
{ /* generate NMI interrupt */ { /* generate NMI interrupt */
machine.device("maincpu")->execute().set_input_line(M68K_IRQ_7, PULSE_LINE); m_maincpu->set_input_line(M68K_IRQ_7, PULSE_LINE);
machine.device("maincpu")->execute().set_input_line_vector(M68K_IRQ_7, M68K_INT_ACK_AUTOVECTOR); m_maincpu->set_input_line_vector(M68K_IRQ_7, M68K_INT_ACK_AUTOVECTOR);
} }
#endif #endif
COPS_queue_data(machine, & keycode, 1); COPS_queue_data(&keycode, 1);
} }
} }
} }
@ -344,8 +326,8 @@ TIMER_CALLBACK_MEMBER(lisa_state::handle_mouse)
return; /* ???? */ return; /* ???? */
#endif #endif
new_mx = machine().root_device().ioport("MOUSE_X")->read(); new_mx = m_io_mouse_x->read();
new_my = machine().root_device().ioport("MOUSE_Y")->read(); new_my = m_io_mouse_y->read();
/* see if it moved in the x coord */ /* see if it moved in the x coord */
if (new_mx != m_last_mx) if (new_mx != m_last_mx)
@ -407,7 +389,7 @@ TIMER_CALLBACK_MEMBER(lisa_state::handle_mouse)
m_fifo_size += 3; m_fifo_size += 3;
/*logerror("handle_mouse : trying to send data to VIA\n");*/ /*logerror("handle_mouse : trying to send data to VIA\n");*/
COPS_send_data_if_possible(machine()); COPS_send_data_if_possible();
} }
/* else, mouse data is lost forever (correct ??) */ /* else, mouse data is lost forever (correct ??) */
} }
@ -418,16 +400,15 @@ TIMER_CALLBACK_MEMBER(lisa_state::handle_mouse)
TIMER_CALLBACK_MEMBER(lisa_state::read_COPS_command) TIMER_CALLBACK_MEMBER(lisa_state::read_COPS_command)
{ {
int command; int command;
via6522_device *via_0 = machine().device<via6522_device>("via6522_0"); address_space &space = m_maincpu->space(AS_PROGRAM);
address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
m_COPS_Ready = 0; m_COPS_Ready = 0;
/*logerror("read_COPS_command : trying to send data to VIA\n");*/ /*logerror("read_COPS_command : trying to send data to VIA\n");*/
COPS_send_data_if_possible(machine()); COPS_send_data_if_possible();
/* some pull-ups allow the COPS to read 1s when the VIA port is not set as output */ /* some pull-ups allow the COPS to read 1s when the VIA port is not set as output */
command = (m_COPS_command | (~ via_0->read(space, VIA_DDRA))) & 0xff; command = (m_COPS_command | (~ m_via0->read(space, VIA_DDRA))) & 0xff;
// printf("Dropping Ready, command = %02x\n", command); // printf("Dropping Ready, command = %02x\n", command);
@ -581,7 +562,7 @@ TIMER_CALLBACK_MEMBER(lisa_state::read_COPS_command)
reply[5] = (m_clock_regs.minutes2 << 4) | m_clock_regs.seconds1; reply[5] = (m_clock_regs.minutes2 << 4) | m_clock_regs.seconds1;
reply[6] = (m_clock_regs.seconds2 << 4) | m_clock_regs.tenths; reply[6] = (m_clock_regs.seconds2 << 4) | m_clock_regs.tenths;
COPS_queue_data(machine(), reply, 7); COPS_queue_data(reply, 7);
} }
break; break;
} }
@ -597,22 +578,22 @@ TIMER_CALLBACK_MEMBER(lisa_state::set_COPS_ready)
machine().scheduler().timer_set(attotime::from_usec(20), timer_expired_delegate(FUNC(lisa_state::read_COPS_command),this)); machine().scheduler().timer_set(attotime::from_usec(20), timer_expired_delegate(FUNC(lisa_state::read_COPS_command),this));
} }
static void reset_COPS(lisa_state *state) void lisa_state::reset_COPS()
{ {
int i; int i;
state->m_fifo_size = 0; m_fifo_size = 0;
state->m_fifo_head = 0; m_fifo_head = 0;
state->m_fifo_tail = 0; m_fifo_tail = 0;
state->m_mouse_data_offset = -1; m_mouse_data_offset = -1;
for (i=0; i<8; i++) for (i=0; i<8; i++)
state->m_key_matrix[i] = 0; m_key_matrix[i] = 0;
state->m_mouse_timer->reset(); m_mouse_timer->reset();
} }
static void unplug_keyboard(running_machine &machine) void lisa_state::unplug_keyboard()
{ {
static const UINT8 cmd[2] = static const UINT8 cmd[2] =
{ {
@ -620,11 +601,10 @@ static void unplug_keyboard(running_machine &machine)
0xFD /* keyboard unplugged */ 0xFD /* keyboard unplugged */
}; };
COPS_queue_data(machine, cmd, 2); COPS_queue_data(cmd, 2);
} }
void lisa_state::plug_keyboard()
static void plug_keyboard(running_machine &machine)
{ {
/* /*
possible keyboard IDs according to Lisa Hardware Manual and boot ROM source code possible keyboard IDs according to Lisa Hardware Manual and boot ROM source code
@ -648,17 +628,16 @@ static void plug_keyboard(running_machine &machine)
0x3f /* keyboard ID - US for now */ 0x3f /* keyboard ID - US for now */
}; };
COPS_queue_data(machine, cmd, 2); COPS_queue_data(cmd, 2);
} }
/* called at power-up */ /* called at power-up */
static void init_COPS(running_machine &machine) void lisa_state::init_COPS()
{ {
lisa_state *state = machine.driver_data<lisa_state>(); m_COPS_Ready = 0;
state->m_COPS_Ready = 0;
reset_COPS(state); reset_COPS();
} }
@ -683,7 +662,7 @@ WRITE8_MEMBER(lisa_state::COPS_via_out_ca2)
/*logerror("COPS CA2 line state : %d\n", val);*/ /*logerror("COPS CA2 line state : %d\n", val);*/
/*logerror("COPS_via_out_ca2 : trying to send data to VIA\n");*/ /*logerror("COPS_via_out_ca2 : trying to send data to VIA\n");*/
COPS_send_data_if_possible(machine()); COPS_send_data_if_possible();
} }
/* /*
@ -715,17 +694,15 @@ READ8_MEMBER(lisa_state::COPS_via_in_b)
WRITE8_MEMBER(lisa_state::COPS_via_out_b) WRITE8_MEMBER(lisa_state::COPS_via_out_b)
{ {
via6522_device *via_0 = machine().device<via6522_device>("via6522_0");
/* pull-up */ /* pull-up */
data |= (~ via_0->read(space,VIA_DDRA)) & 0x01; data |= (~ m_via0->read(space,VIA_DDRA)) & 0x01;
if (data & 0x01) if (data & 0x01)
{ {
if (m_COPS_force_unplug) if (m_COPS_force_unplug)
{ {
m_COPS_force_unplug = 0; m_COPS_force_unplug = 0;
plug_keyboard(machine()); plug_keyboard();
} }
} }
else else
@ -733,7 +710,7 @@ WRITE8_MEMBER(lisa_state::COPS_via_out_b)
if (! m_COPS_force_unplug) if (! m_COPS_force_unplug)
{ {
m_COPS_force_unplug = 1; m_COPS_force_unplug = 1;
unplug_keyboard(machine()); unplug_keyboard();
//reset_COPS(state); //reset_COPS(state);
} }
} }
@ -741,17 +718,15 @@ WRITE8_MEMBER(lisa_state::COPS_via_out_b)
WRITE8_MEMBER(lisa_state::COPS_via_out_cb2) WRITE8_MEMBER(lisa_state::COPS_via_out_cb2)
{ {
device_t *speaker = machine().device(SPEAKER_TAG); speaker_level_w(m_speaker, data);
speaker_level_w(speaker, data);
} }
static void COPS_via_irq_func(device_t *device, int val) void lisa_state::COPS_via_irq_func(int val)
{ {
lisa_state *state = device->machine().driver_data<lisa_state>(); if (m_KBIR != val)
if (state->m_KBIR != val)
{ {
state->m_KBIR = val; m_KBIR = val;
lisa_field_interrupts(device->machine()); field_interrupts();
} }
} }
@ -835,13 +810,13 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
lisa_state *state = machine.driver_data<lisa_state>(); lisa_state *state = machine.driver_data<lisa_state>();
/* upper 7 bits -> segment # */ /* upper 7 bits -> segment # */
int segment = (address >> 17) & 0x7f; int segment = (address >> 17) & 0x7f;
int the_seg = state->m_seg; int the_seg = m_seg;
address &= 0xffffff; address &= 0xffffff;
printf("lisa: logical address %x\n", address); printf("lisa: logical address %x\n", address);
if (state->m_setup) if (m_setup)
{ {
if (address & 0x004000) if (address & 0x004000)
{ {
@ -855,7 +830,7 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
} }
else else
{ /* system ROMs */ { /* system ROMs */
direct.explicit_configure((address & 0xffc000), (address & 0xffc000) + 0x003fff, 0xffffff, state->m_rom_ptr - (address & 0x3fff)); direct.explicit_configure((address & 0xffc000), (address & 0xffc000) + 0x003fff, 0xffffff, m_rom_ptr - (address & 0x3fff));
} }
return -1; return -1;
@ -863,7 +838,7 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
} }
if (machine.device("maincpu")->state().state_int(M68K_SR) & 0x2000) if (m_maincpu->state_int(M68K_SR) & 0x2000)
{ {
/* supervisor mode -> force register file 0 */ /* supervisor mode -> force register file 0 */
the_seg = 0; the_seg = 0;
@ -873,18 +848,18 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
int seg_offset = address & 0x01ffff; int seg_offset = address & 0x01ffff;
/* add revelant origin -> address */ /* add revelant origin -> address */
offs_t mapped_address = (state->m_mmu_regs[the_seg][segment].sorg + seg_offset) & 0x1fffff; offs_t mapped_address = (m_mmu_regs[the_seg][segment].sorg + seg_offset) & 0x1fffff;
switch ((mmu_entry_t)state->m_mmu_regs[the_seg][segment].type) switch ((mmu_entry_t)m_mmu_regs[the_seg][segment].type)
{ {
case RAM_r: case RAM_r:
case RAM_rw: case RAM_rw:
if (seg_offset > state->m_mmu_regs[the_seg][segment].slim) if (seg_offset > m_mmu_regs[the_seg][segment].slim)
{ {
/* out of segment limits : bus error */ /* out of segment limits : bus error */
printf("illegal opbase address%lX\n", (long) address); printf("illegal opbase address%lX\n", (long) address);
} }
direct.explicit_configure((address & 0xffc000), (address & 0xffc000) + 0x003fff, 0xffffff, state->m_ram_ptr + mapped_address - address); direct.explicit_configure((address & 0xffc000), (address & 0xffc000) + 0x003fff, 0xffffff, m_ram_ptr + mapped_address - address);
printf("RAM\n"); printf("RAM\n");
break; break;
@ -897,7 +872,7 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
break; break;
case special_IO: case special_IO:
direct.explicit_configure((address & 0xffc000), (address & 0xffc000) + 0x003fff, 0xffffff, state->m_rom_ptr + (mapped_address & 0x003fff) - address); direct.explicit_configure((address & 0xffc000), (address & 0xffc000) + 0x003fff, 0xffffff, m_rom_ptr + (mapped_address & 0x003fff) - address);
printf("ROM\n"); printf("ROM\n");
break; break;
} }
@ -912,6 +887,7 @@ DIRECT_UPDATE_HANDLER (lisa_OPbaseoverride)
NVRAM_HANDLER(lisa) NVRAM_HANDLER(lisa)
{ {
lisa_state *state = machine.driver_data<lisa_state>(); lisa_state *state = machine.driver_data<lisa_state>();
if (read_or_write) if (read_or_write)
{ {
file->write(state->m_fdc_ram, 1024); file->write(state->m_fdc_ram, 1024);
@ -950,16 +926,16 @@ NVRAM_HANDLER(lisa)
#if 0 #if 0
UINT32 temp32; UINT32 temp32;
SINT8 temp8; SINT8 temp8;
temp32 = (state->m_clock_regs.alarm << 12) | (state->m_clock_regs.years << 8) | (state->m_clock_regs.days1 << 4) temp32 = (m_clock_regs.alarm << 12) | (m_clock_regs.years << 8) | (m_clock_regs.days1 << 4)
| state->m_clock_regs.days2; | m_clock_regs.days2;
temp32 = (state->m_clock_regs.days3 << 28) | (state->m_clock_regs.hours1 << 24) | (state->m_clock_regs.hours2 << 20) temp32 = (m_clock_regs.days3 << 28) | (m_clock_regs.hours1 << 24) | (m_clock_regs.hours2 << 20)
| (state->m_clock_regs.minutes1 << 16) | (state->m_clock_regs.minutes2 << 12) | (m_clock_regs.minutes1 << 16) | (m_clock_regs.minutes2 << 12)
| (state->m_clock_regs.seconds1 << 8) | (state->m_clock_regs.seconds2 << 4) | state->m_clock_regs.tenths; | (m_clock_regs.seconds1 << 8) | (m_clock_regs.seconds2 << 4) | m_clock_regs.tenths;
temp8 = clock_mode; /* clock mode */ temp8 = clock_mode; /* clock mode */
temp8 = state->m_clock_regs.clock_write_ptr; /* clock byte to be written next (-1 if clock write disabled) */ temp8 = m_clock_regs.clock_write_ptr; /* clock byte to be written next (-1 if clock write disabled) */
#endif #endif
} }
@ -967,17 +943,17 @@ NVRAM_HANDLER(lisa)
void init_lisa1(void) void init_lisa1(void)
{ {
lisa_state *state = machine.driver_data<lisa_state>(); lisa_state *state = machine.driver_data<lisa_state>();
state->m_model = lisa1; m_model = lisa1;
state->m_features.has_fast_timers = 0; m_features.has_fast_timers = 0;
state->m_features.floppy_hardware = twiggy; m_features.floppy_hardware = twiggy;
state->m_features.has_double_sided_floppy = 1; m_features.has_double_sided_floppy = 1;
state->m_features.has_mac_xl_video = 0; m_features.has_mac_xl_video = 0;
} }
#endif #endif
DRIVER_INIT_MEMBER(lisa_state,lisa2) DRIVER_INIT_MEMBER(lisa_state,lisa2)
{ {
m_ram_ptr = machine().root_device().memregion("maincpu")->base() + RAM_OFFSET; m_ram_ptr = memregion("maincpu")->base() + RAM_OFFSET;
m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET; m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET;
m_model = lisa2; m_model = lisa2;
m_features.has_fast_timers = 0; m_features.has_fast_timers = 0;
@ -990,7 +966,7 @@ DRIVER_INIT_MEMBER(lisa_state,lisa2)
DRIVER_INIT_MEMBER(lisa_state,lisa210) DRIVER_INIT_MEMBER(lisa_state,lisa210)
{ {
m_ram_ptr = machine().root_device().memregion("maincpu")->base() + RAM_OFFSET; m_ram_ptr = memregion("maincpu")->base() + RAM_OFFSET;
m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET; m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET;
m_model = lisa210; m_model = lisa210;
m_features.has_fast_timers = 1; m_features.has_fast_timers = 1;
@ -1003,7 +979,7 @@ DRIVER_INIT_MEMBER(lisa_state,lisa210)
DRIVER_INIT_MEMBER(lisa_state,mac_xl) DRIVER_INIT_MEMBER(lisa_state,mac_xl)
{ {
m_ram_ptr = machine().root_device().memregion("maincpu")->base() + RAM_OFFSET; m_ram_ptr = memregion("maincpu")->base() + RAM_OFFSET;
m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET; m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET;
m_model = mac_xl; m_model = mac_xl;
m_features.has_fast_timers = 1; m_features.has_fast_timers = 1;
@ -1024,12 +1000,12 @@ void lisa_state::machine_start()
void lisa_state::machine_reset() void lisa_state::machine_reset()
{ {
m_ram_ptr = machine().root_device().memregion("maincpu")->base() + RAM_OFFSET; m_ram_ptr = memregion("maincpu")->base() + RAM_OFFSET;
m_rom_ptr = machine().root_device().memregion("maincpu")->base() + ROM_OFFSET; m_rom_ptr = memregion("maincpu")->base() + ROM_OFFSET;
m_videoROM_ptr = memregion("gfx1")->base(); m_videoROM_ptr = memregion("gfx1")->base();
// machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate_create_static(lisa_OPbaseoverride, *machine())); // m_maincpu->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate_create_static(lisa_OPbaseoverride, *machine()));
// m68k_set_reset_callback(machine().device("maincpu"), /*lisa_reset_instr_callback*/NULL); // m68k_set_reset_callback(m_maincpu, /*lisa_reset_instr_callback*/NULL);
/* init MMU */ /* init MMU */
m_setup = 1; m_setup = 1;
@ -1046,13 +1022,13 @@ void lisa_state::machine_reset()
/* init video */ /* init video */
m_VTMSK = 0; m_VTMSK = 0;
set_VTIR(machine(), 0); set_VTIR(0);
m_video_address_latch = 0; m_video_address_latch = 0;
m_videoram_ptr = (UINT16 *) m_ram_ptr; m_videoram_ptr = (UINT16 *) m_ram_ptr;
/* reset COPS keyboard/mouse controller */ /* reset COPS keyboard/mouse controller */
init_COPS(machine()); init_COPS();
{ {
COPS_via_out_ca2(generic_space(), 0, 0); /* VIA core forgets to do so */ COPS_via_out_ca2(generic_space(), 0, 0); /* VIA core forgets to do so */
@ -1062,12 +1038,12 @@ void lisa_state::machine_reset()
{ {
if (m_features.floppy_hardware == sony_lisa2) if (m_features.floppy_hardware == sony_lisa2)
{ {
sony_set_enable_lines(machine().device("fdc"),1); /* on lisa2, drive unit 1 is always selected (?) */ sony_set_enable_lines(m_fdc, 1); /* on lisa2, drive unit 1 is always selected (?) */
} }
} }
/* reset 68k to pick up proper vectors from MMU */ /* reset 68k to pick up proper vectors from MMU */
machine().device("maincpu")->reset(); m_maincpu->reset();
} }
INTERRUPT_GEN_MEMBER(lisa_state::lisa_interrupt) INTERRUPT_GEN_MEMBER(lisa_state::lisa_interrupt)
@ -1092,7 +1068,7 @@ INTERRUPT_GEN_MEMBER(lisa_state::lisa_interrupt)
0x80, /* RESET code */ 0x80, /* RESET code */
0xFC /* timer time-out */ 0xFC /* timer time-out */
}; };
COPS_queue_data(machine(), cmd, 2); COPS_queue_data(cmd, 2);
m_clock_regs.alarm = 0xfffffL; m_clock_regs.alarm = 0xfffffL;
} }
@ -1159,12 +1135,12 @@ INTERRUPT_GEN_MEMBER(lisa_state::lisa_interrupt)
/* set VBI */ /* set VBI */
if (m_VTMSK) if (m_VTMSK)
set_VTIR(machine(), 1); set_VTIR(1);
else else
set_VTIR(machine(), 0); set_VTIR(0);
/* do keyboard scan */ /* do keyboard scan */
scan_keyboard(machine()); scan_keyboard();
} }
/* /*
@ -1174,9 +1150,8 @@ INTERRUPT_GEN_MEMBER(lisa_state::lisa_interrupt)
cannot support 2 floppy drives)... cannot support 2 floppy drives)...
*/ */
INLINE void lisa_fdc_ttl_glue_access(running_machine &machine, offs_t offset) void lisa_state::lisa_fdc_ttl_glue_access(offs_t offset)
{ {
lisa_state *state = machine.driver_data<lisa_state>();
switch ((offset & 0x000E) >> 1) switch ((offset & 0x000E) >> 1)
{ {
case 0: case 0:
@ -1189,22 +1164,20 @@ INLINE void lisa_fdc_ttl_glue_access(running_machine &machine, offs_t offset)
/* enable/disable the motor on Lisa 1 */ /* enable/disable the motor on Lisa 1 */
/* can disable the motor on Lisa 2/10, too (although it is not useful) */ /* can disable the motor on Lisa 2/10, too (although it is not useful) */
/* On lisa 2, commands the loading of the speed register on lisalite board */ /* On lisa 2, commands the loading of the speed register on lisalite board */
if (state->m_features.floppy_hardware == sony_lisa2) if (m_features.floppy_hardware == sony_lisa2)
{ {
int oldMT1 = state->m_MT1; int oldMT1 = m_MT1;
state->m_MT1 = offset & 1; m_MT1 = offset & 1;
if (state->m_MT1 && ! oldMT1) if (m_MT1 && ! oldMT1)
{ {
applefdc_base_device *fdc = machine.device<applefdc_base_device>("fdc"); m_PWM_floppy_motor_speed = (m_PWM_floppy_motor_speed << 1) & 0xff;
if (m_fdc->get_lines() & APPLEFDC_PH0)
state->m_PWM_floppy_motor_speed = (state->m_PWM_floppy_motor_speed << 1) & 0xff; m_PWM_floppy_motor_speed |= 1;
if (fdc->get_lines() & APPLEFDC_PH0) sony_set_speed(((256-m_PWM_floppy_motor_speed) * 1.3) + 237);
state->m_PWM_floppy_motor_speed |= 1;
sony_set_speed(((256-state->m_PWM_floppy_motor_speed) * 1.3) + 237);
} }
} }
/*else /*else
state->m_MT1 = offset & 1;*/ m_MT1 = offset & 1;*/
break; break;
case 4: case 4:
/*DIS = offset & 1;*/ /* forbids access from the 68000 to our RAM */ /*DIS = offset & 1;*/ /* forbids access from the 68000 to our RAM */
@ -1212,19 +1185,19 @@ INLINE void lisa_fdc_ttl_glue_access(running_machine &machine, offs_t offset)
case 5: case 5:
/*HDS = offset & 1;*/ /* head select (-> disk side) on twiggy */ /*HDS = offset & 1;*/ /* head select (-> disk side) on twiggy */
#if 0 #if 0
if (state->m_features.floppy_hardware == twiggy) if (m_features.floppy_hardware == twiggy)
twiggy_set_head_line(offset & 1); twiggy_set_head_line(offset & 1);
else else
#endif #endif
if (state->m_features.floppy_hardware == sony_lisa210) if (m_features.floppy_hardware == sony_lisa210)
sony_set_sel_line(machine.device("fdc"), offset & 1); sony_set_sel_line(m_fdc, offset & 1);
break; break;
case 6: case 6:
state->m_DISK_DIAG = offset & 1; m_DISK_DIAG = offset & 1;
break; break;
case 7: case 7:
state->m_FDIR = offset & 1; /* Interrupt request to 68k */ m_FDIR = offset & 1; /* Interrupt request to 68k */
lisa_field_interrupts(machine); field_interrupts();
break; break;
} }
} }
@ -1232,16 +1205,15 @@ INLINE void lisa_fdc_ttl_glue_access(running_machine &machine, offs_t offset)
READ8_MEMBER(lisa_state::lisa_fdc_io_r) READ8_MEMBER(lisa_state::lisa_fdc_io_r)
{ {
int answer=0; int answer=0;
applefdc_base_device *fdc = machine().device<applefdc_base_device>("fdc");
switch ((offset & 0x0030) >> 4) switch ((offset & 0x0030) >> 4)
{ {
case 0: /* IWM */ case 0: /* IWM */
answer = fdc->read(offset); answer = m_fdc->read(offset);
break; break;
case 1: /* TTL glue */ case 1: /* TTL glue */
lisa_fdc_ttl_glue_access(machine(), offset); lisa_fdc_ttl_glue_access(offset);
answer = 0; /* ??? */ answer = 0; /* ??? */
break; break;
@ -1259,16 +1231,14 @@ READ8_MEMBER(lisa_state::lisa_fdc_io_r)
WRITE8_MEMBER(lisa_state::lisa_fdc_io_w) WRITE8_MEMBER(lisa_state::lisa_fdc_io_w)
{ {
applefdc_base_device *fdc = machine().device<applefdc_base_device>("fdc");
switch ((offset & 0x0030) >> 4) switch ((offset & 0x0030) >> 4)
{ {
case 0: /* IWM */ case 0: /* IWM */
fdc->write(offset, data); m_fdc->write(offset, data);
break; break;
case 1: /* TTL glue */ case 1: /* TTL glue */
lisa_fdc_ttl_glue_access(machine(), offset); lisa_fdc_ttl_glue_access(offset);
break; break;
case 2: /* writes the PWM register */ case 2: /* writes the PWM register */
@ -1391,7 +1361,7 @@ READ16_MEMBER(lisa_state::lisa_r)
} }
} }
if (machine().device("maincpu")->state().state_int(M68K_SR) & 0x2000) if (m_maincpu->state_int(M68K_SR) & 0x2000)
/* supervisor mode -> force register file 0 */ /* supervisor mode -> force register file 0 */
the_seg = 0; the_seg = 0;
@ -1420,7 +1390,7 @@ READ16_MEMBER(lisa_state::lisa_r)
&& (m_bad_parity_table[address >> 3] & (0x3 << (address & 0x7)))) && (m_bad_parity_table[address >> 3] & (0x3 << (address & 0x7))))
{ {
m_mem_err_addr_latch = address >> 5; m_mem_err_addr_latch = address >> 5;
set_parity_error_pending(machine(), 1); set_parity_error_pending(1);
} }
break; break;
@ -1438,7 +1408,7 @@ READ16_MEMBER(lisa_state::lisa_r)
&& (m_bad_parity_table[address >> 3] & (0x3 << (address & 0x7)))) && (m_bad_parity_table[address >> 3] & (0x3 << (address & 0x7))))
{ {
m_mem_err_addr_latch = address >> 5; m_mem_err_addr_latch = address >> 5;
set_parity_error_pending(machine(), 1); set_parity_error_pending(1);
} }
break; break;
@ -1493,12 +1463,12 @@ READ16_MEMBER(lisa_state::lisa_r)
if ((time_in_frame >= 364) && (time_in_frame <= 375)) if ((time_in_frame >= 364) && (time_in_frame <= 375))
{ {
answer = m_videoROM_ptr[m_videoROM_address|0x80] << 8; answer = m_videoROM_ptr[m_videoROM_address|0x80] << 8;
logerror("reading1 %06X=%04x PC=%06x time=%d\n", address, answer, machine().device("maincpu")->safe_pc(), time_in_frame); logerror("reading1 %06X=%04x %s time=%d\n", address, answer, machine().describe_context(), time_in_frame);
} }
else else
{ {
answer = m_videoROM_ptr[m_videoROM_address] << 8; answer = m_videoROM_ptr[m_videoROM_address] << 8;
logerror("reading2 %06X=%04x PC=%06x time=%d\n", address, answer, machine().device("maincpu")->safe_pc(), time_in_frame); logerror("reading2 %06X=%04x %s time=%d\n", address, answer, machine().describe_context(), time_in_frame);
} }
} }
@ -1597,7 +1567,7 @@ WRITE16_MEMBER(lisa_state::lisa_w)
} }
} }
if (machine().device("maincpu")->state().state_int(M68K_SR) & 0x2000) if (m_maincpu->state_int(M68K_SR) & 0x2000)
/* supervisor mode -> force register file 0 */ /* supervisor mode -> force register file 0 */
the_seg = 0; the_seg = 0;
@ -1728,70 +1698,67 @@ WRITE16_MEMBER(lisa_state::lisa_w)
* * * *
\**************************************************************************************/ \**************************************************************************************/
INLINE void cpu_board_control_access(running_machine &machine, offs_t offset) void lisa_state::cpu_board_control_access(offs_t offset)
{ {
lisa_state *state = machine.driver_data<lisa_state>();
switch ((offset & 0x03ff) << 1) switch ((offset & 0x03ff) << 1)
{ {
case 0x0002: /* Set DIAG1 Latch */ case 0x0002: /* Set DIAG1 Latch */
case 0x0000: /* Reset DIAG1 Latch */ case 0x0000: /* Reset DIAG1 Latch */
break; break;
case 0x0006: /* Set Diag2 Latch */ case 0x0006: /* Set Diag2 Latch */
state->m_diag2 = 1; m_diag2 = 1;
break; break;
case 0x0004: /* ReSet Diag2 Latch */ case 0x0004: /* ReSet Diag2 Latch */
state->m_diag2 = 0; m_diag2 = 0;
break; break;
case 0x000A: /* SEG1 Context Selection bit SET */ case 0x000A: /* SEG1 Context Selection bit SET */
/*logerror("seg bit 0 set\n");*/ /*logerror("seg bit 0 set\n");*/
state->m_seg |= 1; m_seg |= 1;
break; break;
case 0x0008: /* SEG1 Context Selection bit RESET */ case 0x0008: /* SEG1 Context Selection bit RESET */
/*logerror("seg bit 0 clear\n");*/ /*logerror("seg bit 0 clear\n");*/
state->m_seg &= ~1; m_seg &= ~1;
break; break;
case 0x000E: /* SEG2 Context Selection bit SET */ case 0x000E: /* SEG2 Context Selection bit SET */
/*logerror("seg bit 1 set\n");*/ /*logerror("seg bit 1 set\n");*/
state->m_seg |= 2; m_seg |= 2;
break; break;
case 0x000C: /* SEG2 Context Selection bit RESET */ case 0x000C: /* SEG2 Context Selection bit RESET */
/*logerror("seg bit 1 clear\n");*/ /*logerror("seg bit 1 clear\n");*/
state->m_seg &= ~2; m_seg &= ~2;
break; break;
case 0x0010: /* SETUP register SET */ case 0x0010: /* SETUP register SET */
logerror("setup SET PC=%x\n", machine.device("maincpu")->safe_pc()); logerror("setup SET %s\n", machine().describe_context());
state->m_setup = 1; m_setup = 1;
break; break;
case 0x0012: /* SETUP register RESET */ case 0x0012: /* SETUP register RESET */
logerror("setup UNSET PC=%x\n", machine.device("maincpu")->safe_pc()); logerror("setup UNSET %s\n", machine().describe_context());
state->m_setup = 0; m_setup = 0;
break; break;
case 0x001A: /* Enable Vertical Retrace Interrupt */ case 0x001A: /* Enable Vertical Retrace Interrupt */
logerror("enable retrace PC=%x\n", machine.device("maincpu")->safe_pc()); logerror("enable retrace %s\n", machine().describe_context());
state->m_VTMSK = 1; m_VTMSK = 1;
break; break;
case 0x0018: /* Disable Vertical Retrace Interrupt */ case 0x0018: /* Disable Vertical Retrace Interrupt */
logerror("disable retrace PC=%x\n", machine.device("maincpu")->safe_pc()); logerror("disable retrace %s\n", machine().describe_context());
state->m_VTMSK = 0; m_VTMSK = 0;
set_VTIR(machine, 2); set_VTIR(2);
break; break;
case 0x0016: /* Enable Soft Error Detect. */ case 0x0016: /* Enable Soft Error Detect. */
case 0x0014: /* Disable Soft Error Detect. */ case 0x0014: /* Disable Soft Error Detect. */
break; break;
case 0x001E: /* Enable Hard Error Detect */ case 0x001E: /* Enable Hard Error Detect */
state->m_test_parity = 1; m_test_parity = 1;
break; break;
case 0x001C: /* Disable Hard Error Detect */ case 0x001C: /* Disable Hard Error Detect */
state->m_test_parity = 0; m_test_parity = 0;
set_parity_error_pending(machine, 0); set_parity_error_pending(0);
break; break;
} }
} }
READ16_MEMBER(lisa_state::lisa_IO_r) READ16_MEMBER(lisa_state::lisa_IO_r)
{ {
via6522_device *via_0 = machine().device<via6522_device>("via6522_0");
via6522_device *via_1 = machine().device<via6522_device>("via6522_1");
int answer=0; int answer=0;
switch ((offset & 0x7000) >> 12) switch ((offset & 0x7000) >> 12)
@ -1841,13 +1808,13 @@ READ16_MEMBER(lisa_state::lisa_IO_r)
case 2: /* parallel port */ case 2: /* parallel port */
/* 1 VIA located at 0xD901 */ /* 1 VIA located at 0xD901 */
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
answer = via_1->read(space, (offset >> 2) & 0xf); answer = m_via1->read(space, (offset >> 2) & 0xf);
break; break;
case 3: /* keyboard/mouse cops via */ case 3: /* keyboard/mouse cops via */
/* 1 VIA located at 0xDD81 */ /* 1 VIA located at 0xDD81 */
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
answer = via_0->read(space, offset & 0xf); answer = m_via0->read(space, offset & 0xf);
break; break;
} }
} }
@ -1858,7 +1825,7 @@ READ16_MEMBER(lisa_state::lisa_IO_r)
switch ((offset & 0x0C00) >> 10) switch ((offset & 0x0C00) >> 10)
{ {
case 0x0: /* cpu board control */ case 0x0: /* cpu board control */
cpu_board_control_access(machine(), offset & 0x03ff); cpu_board_control_access(offset & 0x03ff);
break; break;
case 0x1: /* Video Address Latch */ case 0x1: /* Video Address Latch */
@ -1905,7 +1872,7 @@ READ16_MEMBER(lisa_state::lisa_IO_r)
else else
answer |= 0x04; answer |= 0x04;
/* huh... we need to emulate some other bits */ /* huh... we need to emulate some other bits */
logerror("read status PC=%x val=%x\n", machine().device("maincpu")->safe_pc(), answer); logerror("read status %s val=%x\n", machine().describe_context(), answer);
break; break;
} }
@ -1917,9 +1884,6 @@ READ16_MEMBER(lisa_state::lisa_IO_r)
WRITE16_MEMBER(lisa_state::lisa_IO_w) WRITE16_MEMBER(lisa_state::lisa_IO_w)
{ {
via6522_device *via_0 = machine().device<via6522_device>("via6522_0");
via6522_device *via_1 = machine().device<via6522_device>("via6522_1");
switch ((offset & 0x7000) >> 12) switch ((offset & 0x7000) >> 12)
{ {
case 0x0: case 0x0:
@ -1967,12 +1931,12 @@ WRITE16_MEMBER(lisa_state::lisa_IO_w)
case 2: /* paralel port */ case 2: /* paralel port */
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
via_1->write(space, (offset >> 2) & 0xf, data & 0xff); m_via1->write(space, (offset >> 2) & 0xf, data & 0xff);
break; break;
case 3: /* keyboard/mouse cops via */ case 3: /* keyboard/mouse cops via */
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
via_0->write(space, offset & 0xf, data & 0xff); m_via0->write(space, offset & 0xf, data & 0xff);
break; break;
} }
} }
@ -1983,7 +1947,7 @@ WRITE16_MEMBER(lisa_state::lisa_IO_w)
switch ((offset & 0x0C00) >> 10) switch ((offset & 0x0C00) >> 10)
{ {
case 0x0: /* cpu board control */ case 0x0: /* cpu board control */
cpu_board_control_access(machine(), offset & 0x03ff); cpu_board_control_access(offset & 0x03ff);
break; break;
case 0x1: /* Video Address Latch */ case 0x1: /* Video Address Latch */