mirror of
https://github.com/holub/mame
synced 2025-10-06 00:54:22 +03:00
osborne1: add 6850ACIA serial port (untested), use configured banking
This commit is contained in:
parent
82b0259145
commit
87b633a97c
@ -47,6 +47,7 @@ TODO:
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "includes/osborne1.h"
|
#include "includes/osborne1.h"
|
||||||
|
#include "bus/rs232/rs232.h"
|
||||||
|
|
||||||
|
|
||||||
#define MAIN_CLOCK 15974400
|
#define MAIN_CLOCK 15974400
|
||||||
@ -167,6 +168,11 @@ static INPUT_PORTS_START( osborne1 )
|
|||||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
|
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
|
||||||
|
|
||||||
PORT_START("CNF")
|
PORT_START("CNF")
|
||||||
|
PORT_CONFNAME(0x06, 0x00, "Serial Speed")
|
||||||
|
PORT_CONFSETTING(0x00, "300/1200")
|
||||||
|
PORT_CONFSETTING(0x02, "600/1200")
|
||||||
|
PORT_CONFSETTING(0x04, "1200/4800")
|
||||||
|
PORT_CONFSETTING(0x06, "2400/9600")
|
||||||
PORT_CONFNAME(0x01, 0x00, "Video Output")
|
PORT_CONFNAME(0x01, 0x00, "Video Output")
|
||||||
PORT_CONFSETTING(0x00, "Standard")
|
PORT_CONFSETTING(0x00, "Standard")
|
||||||
PORT_CONFSETTING(0x01, "SCREEN-PAC")
|
PORT_CONFSETTING(0x01, "SCREEN-PAC")
|
||||||
@ -241,6 +247,17 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state )
|
|||||||
MCFG_PIA_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy))
|
MCFG_PIA_CB2_HANDLER(WRITELINE(osborne1_state, video_pia_out_cb2_dummy))
|
||||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func))
|
MCFG_PIA_IRQA_HANDLER(WRITELINE(osborne1_state, video_pia_irq_a_func))
|
||||||
|
|
||||||
|
MCFG_DEVICE_ADD("acia", ACIA6850, 0)
|
||||||
|
MCFG_ACIA6850_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
|
||||||
|
MCFG_ACIA6850_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))
|
||||||
|
MCFG_ACIA6850_IRQ_HANDLER(WRITELINE(osborne1_state, serial_acia_irq_func))
|
||||||
|
|
||||||
|
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, NULL)
|
||||||
|
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_rxd))
|
||||||
|
MCFG_RS232_DCD_HANDLER(DEVWRITELINE("acia", acia6850_device, write_dcd))
|
||||||
|
MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", acia6850_device, write_cts))
|
||||||
|
MCFG_RS232_RI_HANDLER(DEVWRITELINE("pia_1", pia6821_device, ca2_w))
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("mb8877", MB8877, MAIN_CLOCK/16)
|
MCFG_DEVICE_ADD("mb8877", MB8877, MAIN_CLOCK/16)
|
||||||
MCFG_WD_FDC_FORCE_READY
|
MCFG_WD_FDC_FORCE_READY
|
||||||
MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("mb8877:0", osborne1_floppies, "525ssdd", floppy_image_device::default_floppy_formats)
|
||||||
@ -250,9 +267,9 @@ static MACHINE_CONFIG_START( osborne1, osborne1_state )
|
|||||||
MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w))
|
MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia_0", pia6821_device, ca2_w))
|
||||||
MCFG_SOFTWARE_LIST_ADD("flop_list","osborne1")
|
MCFG_SOFTWARE_LIST_ADD("flop_list","osborne1")
|
||||||
|
|
||||||
/* internal ram */
|
// internal ram
|
||||||
MCFG_RAM_ADD(RAM_TAG)
|
MCFG_RAM_ADD(RAM_TAG)
|
||||||
MCFG_RAM_DEFAULT_SIZE("68K") /* 64KB Main RAM and 4Kbit video attribute RAM */
|
MCFG_RAM_DEFAULT_SIZE("68K") // 64bB main RAM and 4kbit video attribute RAM
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,20 +24,23 @@ public:
|
|||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TIMER_VIDEO,
|
TIMER_VIDEO,
|
||||||
|
TIMER_ACIA_RXC_TXC,
|
||||||
TIMER_SETUP
|
TIMER_SETUP
|
||||||
};
|
};
|
||||||
|
|
||||||
osborne1_state(const machine_config &mconfig, device_type type, const char *tag)
|
osborne1_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_pia0(*this, "pia_0"),
|
m_pia0(*this, "pia_0"),
|
||||||
m_pia1(*this, "pia_1"),
|
m_pia1(*this, "pia_1"),
|
||||||
|
m_acia(*this, "acia"),
|
||||||
m_fdc(*this, "mb8877"),
|
m_fdc(*this, "mb8877"),
|
||||||
m_beep(*this, "beeper"),
|
m_beep(*this, "beeper"),
|
||||||
m_ram(*this, RAM_TAG),
|
m_ram(*this, RAM_TAG),
|
||||||
m_ieee(*this, IEEE488_TAG),
|
m_ieee(*this, IEEE488_TAG),
|
||||||
m_floppy0(*this, "mb8877:0:525ssdd"),
|
m_floppy0(*this, "mb8877:0:525ssdd"),
|
||||||
m_floppy1(*this, "mb8877:1:525ssdd"),
|
m_floppy1(*this, "mb8877:1:525ssdd"),
|
||||||
|
m_video_timer(NULL),
|
||||||
m_keyb_row0(*this, "ROW0"),
|
m_keyb_row0(*this, "ROW0"),
|
||||||
m_keyb_row1(*this, "ROW1"),
|
m_keyb_row1(*this, "ROW1"),
|
||||||
m_keyb_row2(*this, "ROW2"),
|
m_keyb_row2(*this, "ROW2"),
|
||||||
@ -48,26 +51,13 @@ public:
|
|||||||
m_keyb_row7(*this, "ROW7"),
|
m_keyb_row7(*this, "ROW7"),
|
||||||
m_btn_reset(*this, "RESET"),
|
m_btn_reset(*this, "RESET"),
|
||||||
m_cnf(*this, "CNF"),
|
m_cnf(*this, "CNF"),
|
||||||
|
m_region_maincpu(*this, "maincpu"),
|
||||||
m_bank_0xxx(*this, "bank_0xxx"),
|
m_bank_0xxx(*this, "bank_0xxx"),
|
||||||
m_bank_1xxx(*this, "bank_1xxx"),
|
m_bank_1xxx(*this, "bank_1xxx"),
|
||||||
m_bank_fxxx(*this, "bank_fxxx"),
|
m_bank_fxxx(*this, "bank_fxxx"),
|
||||||
m_region_maincpu(*this, "maincpu") { }
|
m_acia_rxc_txc_timer(NULL)
|
||||||
|
{ }
|
||||||
|
|
||||||
virtual void video_start();
|
|
||||||
|
|
||||||
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
|
||||||
|
|
||||||
bitmap_ind16 m_bitmap;
|
|
||||||
|
|
||||||
required_device<cpu_device> m_maincpu;
|
|
||||||
required_device<pia6821_device> m_pia0;
|
|
||||||
required_device<pia6821_device> m_pia1;
|
|
||||||
required_device<mb8877_t> m_fdc;
|
|
||||||
required_device<beep_device> m_beep;
|
|
||||||
required_device<ram_device> m_ram;
|
|
||||||
required_device<ieee488_device> m_ieee;
|
|
||||||
required_device<floppy_image_device> m_floppy0;
|
|
||||||
required_device<floppy_image_device> m_floppy1;
|
|
||||||
|
|
||||||
DECLARE_WRITE8_MEMBER(bank_0xxx_w);
|
DECLARE_WRITE8_MEMBER(bank_0xxx_w);
|
||||||
DECLARE_WRITE8_MEMBER(bank_1xxx_w);
|
DECLARE_WRITE8_MEMBER(bank_1xxx_w);
|
||||||
@ -87,8 +77,30 @@ public:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy);
|
DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy);
|
||||||
DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func);
|
DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func);
|
||||||
|
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(serial_acia_irq_func);
|
||||||
|
|
||||||
|
DECLARE_DRIVER_INIT(osborne1);
|
||||||
|
virtual void machine_reset();
|
||||||
|
virtual void video_start();
|
||||||
|
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
|
TIMER_CALLBACK_MEMBER(video_callback);
|
||||||
|
TIMER_CALLBACK_MEMBER(setup_callback);
|
||||||
|
|
||||||
|
bitmap_ind16 m_bitmap;
|
||||||
|
|
||||||
|
required_device<cpu_device> m_maincpu;
|
||||||
|
required_device<pia6821_device> m_pia0;
|
||||||
|
required_device<pia6821_device> m_pia1;
|
||||||
|
required_device<acia6850_device> m_acia;
|
||||||
|
required_device<mb8877_t> m_fdc;
|
||||||
|
required_device<beep_device> m_beep;
|
||||||
|
required_device<ram_device> m_ram;
|
||||||
|
required_device<ieee488_device> m_ieee;
|
||||||
|
required_device<floppy_image_device> m_floppy0;
|
||||||
|
required_device<floppy_image_device> m_floppy1;
|
||||||
|
|
||||||
/* video related */
|
/* video related */
|
||||||
UINT8 m_screen_pac;
|
|
||||||
UINT8 m_resolution;
|
UINT8 m_resolution;
|
||||||
UINT8 m_hc_left;
|
UINT8 m_hc_left;
|
||||||
UINT8 m_new_start_x;
|
UINT8 m_new_start_x;
|
||||||
@ -96,12 +108,16 @@ public:
|
|||||||
emu_timer *m_video_timer;
|
emu_timer *m_video_timer;
|
||||||
UINT8 *m_p_chargen;
|
UINT8 *m_p_chargen;
|
||||||
bool m_beep_state;
|
bool m_beep_state;
|
||||||
DECLARE_DRIVER_INIT(osborne1);
|
|
||||||
virtual void machine_reset();
|
|
||||||
TIMER_CALLBACK_MEMBER(osborne1_video_callback);
|
|
||||||
TIMER_CALLBACK_MEMBER(setup_osborne1);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||||
|
|
||||||
|
bool set_rom_mode(UINT8 value);
|
||||||
|
bool set_bit_9(UINT8 value);
|
||||||
|
void update_irq();
|
||||||
|
void update_acia_rxc_txc();
|
||||||
|
|
||||||
|
// user inputs
|
||||||
required_ioport m_keyb_row0;
|
required_ioport m_keyb_row0;
|
||||||
required_ioport m_keyb_row1;
|
required_ioport m_keyb_row1;
|
||||||
required_ioport m_keyb_row2;
|
required_ioport m_keyb_row2;
|
||||||
@ -112,13 +128,20 @@ protected:
|
|||||||
required_ioport m_keyb_row7;
|
required_ioport m_keyb_row7;
|
||||||
required_ioport m_btn_reset;
|
required_ioport m_btn_reset;
|
||||||
|
|
||||||
|
// fake inputs for hardware configuration and things that need rewiring
|
||||||
required_ioport m_cnf;
|
required_ioport m_cnf;
|
||||||
|
|
||||||
|
// pieces of memory
|
||||||
|
required_memory_region m_region_maincpu;
|
||||||
required_memory_bank m_bank_0xxx;
|
required_memory_bank m_bank_0xxx;
|
||||||
required_memory_bank m_bank_1xxx;
|
required_memory_bank m_bank_1xxx;
|
||||||
required_memory_bank m_bank_fxxx;
|
required_memory_bank m_bank_fxxx;
|
||||||
|
|
||||||
required_memory_region m_region_maincpu;
|
// configuration (reloaded on reset)
|
||||||
|
UINT8 m_screen_pac;
|
||||||
|
UINT8 m_acia_rxc_txc_div;
|
||||||
|
UINT8 m_acia_rxc_txc_p_low;
|
||||||
|
UINT8 m_acia_rxc_txc_p_high;
|
||||||
|
|
||||||
// bank switch control bits
|
// bank switch control bits
|
||||||
UINT8 m_ub4a_q;
|
UINT8 m_ub4a_q;
|
||||||
@ -126,11 +149,10 @@ protected:
|
|||||||
UINT8 m_rom_mode;
|
UINT8 m_rom_mode;
|
||||||
UINT8 m_bit_9;
|
UINT8 m_bit_9;
|
||||||
|
|
||||||
bool set_rom_mode(UINT8 value);
|
// serial state
|
||||||
bool set_bit_9(UINT8 value);
|
int m_acia_irq_state;
|
||||||
void update_irq();
|
int m_acia_rxc_txc_state;
|
||||||
|
emu_timer *m_acia_rxc_txc_timer;
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* OSBORNE1_H_ */
|
#endif /* OSBORNE1_H_ */
|
||||||
|
@ -55,6 +55,8 @@ READ8_MEMBER( osborne1_state::bank_2xxx_3xxx_r )
|
|||||||
data = m_pia0->read(space, offset & 0x03);
|
data = m_pia0->read(space, offset & 0x03);
|
||||||
break;
|
break;
|
||||||
case 0xA00: /* Serial */
|
case 0xA00: /* Serial */
|
||||||
|
if (offset & 0x01) data = m_acia->data_r(space, 0);
|
||||||
|
else data = m_acia->status_r(space, 0);
|
||||||
break;
|
break;
|
||||||
case 0xC00: /* Video PIA */
|
case 0xC00: /* Video PIA */
|
||||||
data = m_pia1->read(space, offset & 0x03);
|
data = m_pia1->read(space, offset & 0x03);
|
||||||
@ -77,7 +79,10 @@ WRITE8_MEMBER( osborne1_state::bank_2xxx_3xxx_w )
|
|||||||
if ((offset & 0x900) == 0x900) // IEEE488 PIA
|
if ((offset & 0x900) == 0x900) // IEEE488 PIA
|
||||||
m_pia0->write(space, offset & 0x03, data);
|
m_pia0->write(space, offset & 0x03, data);
|
||||||
if ((offset & 0xA00) == 0xA00) // Serial
|
if ((offset & 0xA00) == 0xA00) // Serial
|
||||||
/* not implemented */;
|
{
|
||||||
|
if (offset & 0x01) m_acia->data_w(space, 0, data);
|
||||||
|
else m_acia->control_w(space, 0, data);
|
||||||
|
}
|
||||||
if ((offset & 0xC00) == 0x400) // SCREEN-PAC
|
if ((offset & 0xC00) == 0x400) // SCREEN-PAC
|
||||||
{
|
{
|
||||||
m_resolution = data & 0x01;
|
m_resolution = data & 0x01;
|
||||||
@ -195,10 +200,6 @@ WRITE_LINE_MEMBER( osborne1_state::ieee_pia_irq_a_func )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE8_MEMBER( osborne1_state::video_pia_port_a_w )
|
WRITE8_MEMBER( osborne1_state::video_pia_port_a_w )
|
||||||
{
|
{
|
||||||
m_fdc->dden_w(BIT(data, 0));
|
m_fdc->dden_w(BIT(data, 0));
|
||||||
@ -235,42 +236,100 @@ WRITE8_MEMBER( osborne1_state::video_pia_port_b_w )
|
|||||||
//logerror("Video pia port b write: %02X\n", data );
|
//logerror("Video pia port b write: %02X\n", data );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER( osborne1_state::video_pia_out_cb2_dummy )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
WRITE_LINE_MEMBER( osborne1_state::video_pia_irq_a_func )
|
WRITE_LINE_MEMBER( osborne1_state::video_pia_irq_a_func )
|
||||||
{
|
{
|
||||||
update_irq();
|
update_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//static const struct aica6850_interface osborne1_6850_config =
|
WRITE_LINE_MEMBER( osborne1_state::serial_acia_irq_func )
|
||||||
//{
|
|
||||||
// 10, /* tx_clock */
|
|
||||||
// 10, /* rx_clock */
|
|
||||||
// NULL, /* rx_pin */
|
|
||||||
// NULL, /* tx_pin */
|
|
||||||
// NULL, /* cts_pin */
|
|
||||||
// NULL, /* rts_pin */
|
|
||||||
// NULL, /* dcd_pin */
|
|
||||||
// NULL /* int_callback */
|
|
||||||
//};
|
|
||||||
|
|
||||||
|
|
||||||
void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
|
||||||
{
|
{
|
||||||
switch (id)
|
m_acia_irq_state = state;
|
||||||
{
|
update_irq();
|
||||||
case TIMER_VIDEO:
|
|
||||||
osborne1_video_callback(ptr, param);
|
|
||||||
break;
|
|
||||||
case TIMER_SETUP:
|
|
||||||
setup_osborne1(ptr, param);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert_always(FALSE, "Unknown id in osborne1_state::device_timer");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback)
|
DRIVER_INIT_MEMBER( osborne1_state, osborne1 )
|
||||||
|
{
|
||||||
|
m_bank_0xxx->configure_entries(0, 1, m_ram->pointer(), 0);
|
||||||
|
m_bank_0xxx->configure_entries(1, 1, m_region_maincpu->base(), 0);
|
||||||
|
m_bank_1xxx->configure_entries(0, 1, m_ram->pointer() + 0x1000, 0);
|
||||||
|
m_bank_1xxx->configure_entries(1, 1, m_region_maincpu->base(), 0);
|
||||||
|
m_bank_fxxx->configure_entries(0, 1, m_ram->pointer() + 0xF000, 0);
|
||||||
|
m_bank_fxxx->configure_entries(1, 1, m_ram->pointer() + 0x10000, 0);
|
||||||
|
|
||||||
|
m_video_timer = timer_alloc(TIMER_VIDEO);
|
||||||
|
m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0));
|
||||||
|
|
||||||
|
m_acia_rxc_txc_timer = timer_alloc(TIMER_ACIA_RXC_TXC);
|
||||||
|
|
||||||
|
timer_set(attotime::zero, TIMER_SETUP);
|
||||||
|
}
|
||||||
|
|
||||||
|
void osborne1_state::machine_reset()
|
||||||
|
{
|
||||||
|
// Refresh configuration
|
||||||
|
m_screen_pac = 0 != (m_cnf->read() & 0x01);
|
||||||
|
switch (m_cnf->read() & 0x06)
|
||||||
|
{
|
||||||
|
case 0x00:
|
||||||
|
m_acia_rxc_txc_div = 16;
|
||||||
|
m_acia_rxc_txc_p_low = 23;
|
||||||
|
m_acia_rxc_txc_p_high = 29;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
m_acia_rxc_txc_div = 16;
|
||||||
|
m_acia_rxc_txc_p_low = 9;
|
||||||
|
m_acia_rxc_txc_p_high = 15;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
m_acia_rxc_txc_div = 16;
|
||||||
|
m_acia_rxc_txc_p_low = 5;
|
||||||
|
m_acia_rxc_txc_p_high = 8;
|
||||||
|
break;
|
||||||
|
case 0x06:
|
||||||
|
m_acia_rxc_txc_div = 8;
|
||||||
|
m_acia_rxc_txc_p_low = 5;
|
||||||
|
m_acia_rxc_txc_p_high = 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialise memory configuration
|
||||||
|
m_rom_mode = 0;
|
||||||
|
m_bit_9 = 1;
|
||||||
|
set_rom_mode(1);
|
||||||
|
set_bit_9(0);
|
||||||
|
|
||||||
|
// Reset serial state
|
||||||
|
m_acia_irq_state = 0;
|
||||||
|
m_acia_rxc_txc_state = 0;
|
||||||
|
update_acia_rxc_txc();
|
||||||
|
|
||||||
|
m_resolution = 0;
|
||||||
|
m_hc_left = 0;
|
||||||
|
m_p_chargen = memregion( "chargen" )->base();
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 0x1000; i++)
|
||||||
|
m_ram->pointer()[0x10000 + i] |= 0x7F;
|
||||||
|
}
|
||||||
|
|
||||||
|
void osborne1_state::video_start()
|
||||||
|
{
|
||||||
|
machine().first_screen()->register_screen_bitmap(m_bitmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||||
|
{
|
||||||
|
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TIMER_CALLBACK_MEMBER(osborne1_state::video_callback)
|
||||||
{
|
{
|
||||||
int const y = machine().first_screen()->vpos();
|
int const y = machine().first_screen()->vpos();
|
||||||
UINT8 ra = 0;
|
UINT8 ra = 0;
|
||||||
@ -330,51 +389,31 @@ TIMER_CALLBACK_MEMBER(osborne1_state::osborne1_video_callback)
|
|||||||
m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0));
|
m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(osborne1_state::setup_osborne1)
|
TIMER_CALLBACK_MEMBER(osborne1_state::setup_callback)
|
||||||
{
|
{
|
||||||
m_beep->set_state( 0 );
|
m_beep->set_state( 0 );
|
||||||
m_beep->set_frequency( 300 /* 60 * 240 / 2 */ );
|
m_beep->set_frequency( 300 /* 60 * 240 / 2 */ );
|
||||||
m_pia1->ca1_w(0);
|
m_pia1->ca1_w(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void osborne1_state::machine_reset()
|
|
||||||
|
void osborne1_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||||
{
|
{
|
||||||
// Initialize memory configuration
|
switch (id)
|
||||||
m_rom_mode = 0;
|
{
|
||||||
m_bit_9 = 1;
|
case TIMER_VIDEO:
|
||||||
set_rom_mode(1);
|
video_callback(ptr, param);
|
||||||
set_bit_9(0);
|
break;
|
||||||
|
case TIMER_ACIA_RXC_TXC:
|
||||||
m_screen_pac = 0 != (m_cnf->read() & 0x01);
|
m_acia_rxc_txc_state = m_acia_rxc_txc_state ? 0 : 1;
|
||||||
m_resolution = 0;
|
update_acia_rxc_txc();
|
||||||
m_hc_left = 0;
|
break;
|
||||||
m_p_chargen = memregion( "chargen" )->base();
|
case TIMER_SETUP:
|
||||||
|
setup_callback(ptr, param);
|
||||||
memset(m_ram->pointer() + 0x10000, 0xFF, 0x1000);
|
break;
|
||||||
|
default:
|
||||||
|
assert_always(FALSE, "Unknown id in osborne1_state::device_timer");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DRIVER_INIT_MEMBER(osborne1_state,osborne1)
|
|
||||||
{
|
|
||||||
/* Configure the 6850 ACIA */
|
|
||||||
// acia6850_config( 0, &osborne1_6850_config );
|
|
||||||
m_video_timer = timer_alloc(TIMER_VIDEO);
|
|
||||||
m_video_timer->adjust(machine().first_screen()->time_until_pos(1, 0));
|
|
||||||
|
|
||||||
timer_set(attotime::zero, TIMER_SETUP);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void osborne1_state::video_start()
|
|
||||||
{
|
|
||||||
machine().first_screen()->register_screen_bitmap(m_bitmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
UINT32 osborne1_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
|
||||||
{
|
|
||||||
copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -383,16 +422,8 @@ bool osborne1_state::set_rom_mode(UINT8 value)
|
|||||||
if (value != m_rom_mode)
|
if (value != m_rom_mode)
|
||||||
{
|
{
|
||||||
m_rom_mode = value;
|
m_rom_mode = value;
|
||||||
if (m_rom_mode)
|
m_bank_0xxx->set_entry(m_rom_mode);
|
||||||
{
|
m_bank_1xxx->set_entry(m_rom_mode);
|
||||||
m_bank_0xxx->set_base(m_region_maincpu->base());
|
|
||||||
m_bank_1xxx->set_base(m_region_maincpu->base());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_bank_0xxx->set_base(m_ram->pointer());
|
|
||||||
m_bank_1xxx->set_base(m_ram->pointer() + 0x1000);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -406,7 +437,7 @@ bool osborne1_state::set_bit_9(UINT8 value)
|
|||||||
if (value != m_bit_9)
|
if (value != m_bit_9)
|
||||||
{
|
{
|
||||||
m_bit_9 = value;
|
m_bit_9 = value;
|
||||||
m_bank_fxxx->set_base(m_ram->pointer() + (m_bit_9 ? 0x10000 : 0xF000));
|
m_bank_fxxx->set_entry(m_bit_9);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -421,6 +452,17 @@ void osborne1_state::update_irq()
|
|||||||
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF0);
|
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF0);
|
||||||
else if (m_pia1->irq_a_state())
|
else if (m_pia1->irq_a_state())
|
||||||
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF8);
|
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xF8);
|
||||||
|
else if (m_acia_irq_state)
|
||||||
|
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0xFC);
|
||||||
else
|
else
|
||||||
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, CLEAR_LINE, 0xFE);
|
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, CLEAR_LINE, 0xFE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void osborne1_state::update_acia_rxc_txc()
|
||||||
|
{
|
||||||
|
m_acia->write_rxc(m_acia_rxc_txc_state);
|
||||||
|
m_acia->write_txc(m_acia_rxc_txc_state);
|
||||||
|
attoseconds_t const dividend = (ATTOSECONDS_PER_SECOND / 100) * (m_acia_rxc_txc_state ? m_acia_rxc_txc_p_high : m_acia_rxc_txc_p_low);
|
||||||
|
attoseconds_t const divisor = (15974400 / 100) / m_acia_rxc_txc_div;
|
||||||
|
m_acia_rxc_txc_timer->adjust(attotime(0, dividend / divisor));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user