summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/apricotp.c
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2012-08-21 10:41:19 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2012-08-21 10:41:19 +0000
commit7285b359d259b2ae0fdf85096571c386ec8c991a (patch)
treea027aff57f1a255f9ec6cfd3b68cabe4b6683998 /src/mess/drivers/apricotp.c
parent67c425e90757876a6716b7867df30c0149912e74 (diff)
Merge of MESS sources (no whatsnew)
Diffstat (limited to 'src/mess/drivers/apricotp.c')
-rw-r--r--src/mess/drivers/apricotp.c657
1 files changed, 657 insertions, 0 deletions
diff --git a/src/mess/drivers/apricotp.c b/src/mess/drivers/apricotp.c
new file mode 100644
index 00000000000..01b782750e2
--- /dev/null
+++ b/src/mess/drivers/apricotp.c
@@ -0,0 +1,657 @@
+/***************************************************************************
+
+ ACT Apricot F1 series
+
+ preliminary driver by Angelo Salese
+
+
+11/09/2011 - modernised. The portable doesn't seem to have
+ scroll registers, and it sets the palette to black.
+ I've added a temporary video output so that you can get
+ an idea of what the screen should look like. [Robbbert]
+
+****************************************************************************/
+
+/*
+
+ TODO:
+
+ - devices
+ - LCD
+ - sound
+
+*/
+
+#include "includes/apricotp.h"
+#include "apricotp.lh"
+
+
+
+//**************************************************************************
+// MACROS/CONSTANTS
+//**************************************************************************
+
+enum
+{
+ LED_STOP = 0,
+ LED_POWER,
+ LED_SHIFT_LOCK,
+ LED_DISK,
+ LED_VOICE,
+ LED_COLOUR_SELECT,
+ LED_CAPS_LOCK
+};
+
+
+
+//**************************************************************************
+// VIDEO
+//**************************************************************************
+
+//-------------------------------------------------
+// mc6845_interface crtc_intf
+//-------------------------------------------------
+
+static MC6845_UPDATE_ROW( fp_update_row )
+{
+}
+
+static const mc6845_interface crtc_intf =
+{
+ SCREEN_CRT_TAG,
+ 8,
+ NULL,
+ fp_update_row,
+ NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ NULL
+};
+
+
+void fp_state::video_start()
+{
+ // allocate memory
+ m_video_ram = auto_alloc_array(machine(), UINT16, 0x20000);
+}
+
+
+UINT32 fp_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ offs_t addr = (!BIT(m_video, 4) << 15) | (BIT(m_video, 1) << 14);
+
+ for (int y = 0; y < 200; y++)
+ {
+ for (int sx = 0; sx < 40; sx++)
+ {
+ UINT16 data = m_video_ram[addr++];
+
+ for (int x = 0; x < 16; x++)
+ {
+ int color = BIT(data, 15);
+
+ bitmap.pix16(y, (sx * 16) + x) = color;
+
+ data <<= 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+static const gfx_layout charset_8x8 =
+{
+ 8,8,
+ 256,
+ 1,
+ { 0 },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+
+static GFXDECODE_START( act_f1 )
+ GFXDECODE_ENTRY( I8086_TAG, 0x0800, charset_8x8, 0, 1 )
+GFXDECODE_END
+
+
+READ8_MEMBER( fp_state::prtr_snd_r )
+{
+ /*
+
+ bit description
+
+ 0 BUSY
+ 1 SE
+ 2 _FAULT
+ 3 PE
+ 4 LP23
+ 5 DCNG-L
+ 6 J9 1-2
+ 7 J9 3-4
+
+ */
+
+ UINT8 data = 0;
+
+ data |= m_centronics->busy_r();
+ data |= m_centronics->vcc_r() << 1;
+ data |= m_centronics->fault_r() << 2;
+ data |= m_centronics->pe_r() << 3;
+
+ return data;
+}
+
+WRITE8_MEMBER( fp_state::pint_clr_w )
+{
+ pic8259_ir6_w(m_pic, CLEAR_LINE);
+}
+
+
+WRITE8_MEMBER( fp_state::ls_w )
+{
+ m_centronics->strobe_w(!BIT(data, 0));
+}
+
+
+WRITE8_MEMBER( fp_state::contrast_w )
+{
+
+}
+
+
+WRITE8_MEMBER( fp_state::palette_w )
+{
+ /*
+
+ bit description
+
+ 0 B
+ 1 G
+ 2 R
+ 3 I
+ 4 index
+ 5 index
+ 6 index
+ 7 index
+
+ */
+}
+
+
+WRITE16_MEMBER( fp_state::video_w )
+{
+ /*
+
+ bit description
+
+ 0 CRTRES-H
+ 1 SEL1
+ 2 DON-H
+ 3 LCDON-H
+ 4 SEL2
+ 5 L3 even access
+ 6 L2 odd access
+ 7 L1 video RAM enable
+ 8
+ 9 STOP LED
+ 10 POWER LED
+ 11 SHIFT LOCK LED
+ 12 DISK LED
+ 13 VOICE LED
+ 14 COLOUR SELECT LED
+ 15 CAPS LOCK LED
+
+ */
+
+ m_video = data & 0xff;
+}
+
+
+READ16_MEMBER( fp_state::mem_r )
+{
+ UINT16 data = 0xffff;
+
+ if (offset >= 0xd0000/2 && offset < 0xf0000/2)
+ {
+ if (BIT(m_video, 7))
+ {
+ data = m_video_ram[offset - 0xd0000/2];
+ }
+ else
+ {
+ if (offset < m_ram->size()/2)
+ {
+ data = m_work_ram[offset];
+ }
+ }
+ }
+ else
+ {
+ if (offset < m_ram->size()/2)
+ {
+ data = m_work_ram[offset];
+ }
+ }
+
+ return data;
+}
+
+
+WRITE16_MEMBER( fp_state::mem_w )
+{
+ if (offset >= 0xd0000/2 && offset < 0xe0000/2)
+ {
+ if (BIT(m_video, 7))
+ {
+ m_video_ram[offset - 0xd0000/2] = data;
+ }
+ else
+ {
+ if (offset < m_ram->size()/2)
+ {
+ m_work_ram[offset] = data;
+ }
+ }
+ }
+ else if (offset >= 0xe0000/2 && offset < 0xf0000/2)
+ {
+ if (BIT(m_video, 7))
+ {
+ if (BIT(m_video, 5))
+ {
+ m_video_ram[offset - 0xd0000/2] = (data & 0xff00) | (m_video_ram[offset - 0xd0000/2] & 0x00ff);
+ }
+
+ if (BIT(m_video, 6))
+ {
+ m_video_ram[offset - 0xd0000/2] = (data & 0x00ff) | (m_video_ram[offset - 0xd0000/2] & 0xff00);
+ }
+ }
+ else
+ {
+ if (offset < m_ram->size()/2)
+ {
+ m_work_ram[offset] = data;
+ }
+ }
+ }
+ else
+ {
+ if (offset < m_ram->size()/2)
+ {
+ m_work_ram[offset] = data;
+ }
+ }
+}
+
+
+//**************************************************************************
+// ADDRESS MAPS
+//**************************************************************************
+
+//-------------------------------------------------
+// ADDRESS_MAP( fp_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( fp_mem, AS_PROGRAM, 16, fp_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x00000, 0xf7fff) AM_READWRITE(mem_r, mem_w)
+ AM_RANGE(0xf8000, 0xfffff) AM_ROM AM_REGION(I8086_TAG, 0)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( fp_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( fp_io, AS_IO, 16, fp_state )
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE(0x000, 0x007) AM_DEVREADWRITE8_LEGACY(WD2797_TAG, wd17xx_r, wd17xx_w, 0x00ff)
+ AM_RANGE(0x008, 0x00f) AM_DEVREADWRITE8_LEGACY(I8253A5_TAG, pit8253_r, pit8253_w, 0x00ff)
+ AM_RANGE(0x018, 0x01f) AM_DEVREADWRITE8_LEGACY(Z80SIO0_TAG, z80dart_ba_cd_r, z80dart_ba_cd_w, 0x00ff)
+ AM_RANGE(0x020, 0x021) AM_DEVWRITE8(CENTRONICS_TAG, centronics_device, write, 0x00ff)
+ AM_RANGE(0x022, 0x023) AM_WRITE8(pint_clr_w, 0x00ff)
+ AM_RANGE(0x024, 0x025) AM_READ8(prtr_snd_r, 0x00ff)
+ AM_RANGE(0x026, 0x027) AM_DEVWRITE8_LEGACY(SN76489AN_TAG, sn76496_w, 0x00ff)
+ AM_RANGE(0x028, 0x029) AM_WRITE8(contrast_w, 0x00ff)
+ AM_RANGE(0x02a, 0x02b) AM_WRITE8(palette_w, 0x00ff)
+ AM_RANGE(0x02e, 0x02f) AM_WRITE(video_w)
+ AM_RANGE(0x040, 0x05f) AM_DEVREADWRITE8(I8237_TAG, am9517a_device, read, write, 0x00ff)
+ AM_RANGE(0x068, 0x06b) AM_DEVREADWRITE8_LEGACY(I8259A_TAG, pic8259_r, pic8259_w, 0x00ff)
+ AM_RANGE(0x06c, 0x06d) AM_DEVWRITE8(MC6845_TAG, mc6845_device, address_w, 0x00ff)
+ AM_RANGE(0x06e, 0x06f) AM_DEVREADWRITE8(MC6845_TAG, mc6845_device, register_r, register_w, 0x00ff)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( sound_mem )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( sound_mem, AS_PROGRAM, 8, fp_state )
+ AM_RANGE(0xf000, 0xffff) AM_ROM AM_REGION(HD63B01V1_TAG, 0)
+ADDRESS_MAP_END
+
+
+//-------------------------------------------------
+// ADDRESS_MAP( sound_io )
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( sound_io, AS_IO, 8, fp_state )
+ AM_RANGE(M6801_PORT1, M6801_PORT1)
+ AM_RANGE(M6801_PORT2, M6801_PORT2)
+ AM_RANGE(M6801_PORT3, M6801_PORT3)
+ AM_RANGE(M6801_PORT4, M6801_PORT4)
+ADDRESS_MAP_END
+
+
+
+//**************************************************************************
+// INPUT PORTS
+//**************************************************************************
+
+//-------------------------------------------------
+// INPUT_PORTS( act )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( fp )
+ // defined in machine/apricotkb.c
+INPUT_PORTS_END
+
+
+
+//**************************************************************************
+// DEVICE CONFIGURATION
+//**************************************************************************
+
+//-------------------------------------------------
+// APRICOT_KEYBOARD_INTERFACE( kb_intf )
+//-------------------------------------------------
+
+static APRICOT_KEYBOARD_INTERFACE( kb_intf )
+{
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// pic8259_interface pic_intf
+//-------------------------------------------------
+
+static IRQ_CALLBACK( fp_irq_callback )
+{
+ fp_state *state = device->machine().driver_data<fp_state>();
+
+ return pic8259_acknowledge(state->m_pic);
+}
+
+/*
+
+ INT0 TIMER
+ INT1 FDC
+ INT2 6301
+ INT3 COMS
+ INT4 USART
+ INT5 COMS
+ INT6 PRINT
+ INT7 EOP
+
+*/
+
+static const struct pic8259_interface pic_intf =
+{
+ DEVCB_CPU_INPUT_LINE(I8086_TAG, INPUT_LINE_IRQ0),
+ DEVCB_LINE_VCC,
+ DEVCB_NULL
+};
+
+
+//-------------------------------------------------
+// pit8253_config pit_intf
+//-------------------------------------------------
+
+static const struct pit8253_config pit_intf =
+{
+ {
+ {
+ 2000000,
+ DEVCB_LINE_VCC,
+ DEVCB_DEVICE_LINE(I8259A_TAG, pic8259_ir0_w)
+ }, {
+ 2000000,
+ DEVCB_LINE_VCC,
+ DEVCB_NULL
+ }, {
+ 2000000,
+ DEVCB_LINE_VCC,
+ DEVCB_NULL
+ }
+ }
+};
+
+
+//-------------------------------------------------
+// I8237_INTERFACE( dmac_intf )
+//-------------------------------------------------
+
+static I8237_INTERFACE( dmac_intf )
+{
+ DEVCB_NULL,
+ DEVCB_DEVICE_LINE(I8259A_TAG, pic8259_ir7_w),
+ DEVCB_NULL,
+ DEVCB_NULL,
+ { DEVCB_NULL, DEVCB_DEVICE_HANDLER(WD2797_TAG, wd17xx_data_r), DEVCB_NULL, DEVCB_NULL },
+ { DEVCB_NULL, DEVCB_DEVICE_HANDLER(WD2797_TAG, wd17xx_data_w), DEVCB_NULL, DEVCB_NULL },
+ { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }
+};
+
+
+//-------------------------------------------------
+// Z80DART_INTERFACE( sio_intf )
+//-------------------------------------------------
+
+static Z80DART_INTERFACE( sio_intf )
+{
+ 0, 0, 0, 0,
+
+ 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_DEVICE_LINE(I8259A_TAG, pic8259_ir4_w)
+};
+
+
+//-------------------------------------------------
+// wd17xx_interface fdc_intf
+//-------------------------------------------------
+
+static LEGACY_FLOPPY_OPTIONS_START( act )
+ LEGACY_FLOPPY_OPTION( img2hd, "dsk", "2HD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
+ HEADS([2])
+ TRACKS([80])
+ SECTORS([16])
+ SECTOR_LENGTH([256])
+ FIRST_SECTOR_ID([1]))
+LEGACY_FLOPPY_OPTIONS_END
+
+static const floppy_interface act_floppy_interface =
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ FLOPPY_STANDARD_3_5_DSDD, // Sony OA-D32W
+ LEGACY_FLOPPY_OPTIONS_NAME(act),
+ "floppy_3_5",
+ NULL
+};
+
+static const wd17xx_interface fdc_intf =
+{
+ DEVCB_LINE_GND,
+ DEVCB_DEVICE_LINE(I8259A_TAG, pic8259_ir1_w),
+ DEVCB_DEVICE_LINE_MEMBER(I8237_TAG, am9517a_device, dreq1_w),
+ { FLOPPY_0, NULL, NULL, NULL }
+};
+
+
+//-------------------------------------------------
+// centronics_interface centronics_intf
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( fp_state::busy_w )
+{
+ if (!state) pic8259_ir6_w(m_pic, ASSERT_LINE);
+}
+
+static const centronics_interface centronics_intf =
+{
+ DEVCB_NULL,
+ DEVCB_DRIVER_LINE_MEMBER(fp_state, busy_w),
+ DEVCB_NULL
+};
+
+
+
+//**************************************************************************
+// MACHINE INITIALIZATION
+//**************************************************************************
+
+//-------------------------------------------------
+// MACHINE_START( fp )
+//-------------------------------------------------
+
+void fp_state::machine_start()
+{
+ // register CPU IRQ callback
+ device_set_irq_callback(m_maincpu, fp_irq_callback);
+
+ // allocate memory
+ m_work_ram = auto_alloc_array(machine(), UINT16, m_ram->size() / 2);
+}
+
+
+//-------------------------------------------------
+// MACHINE_RESET( fp )
+//-------------------------------------------------
+
+void fp_state::machine_reset()
+{
+ m_video = 0;
+}
+
+
+
+//**************************************************************************
+// MACHINE DRIVERS
+//**************************************************************************
+
+//-------------------------------------------------
+// MACHINE_CONFIG( fp )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_START( fp, fp_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD(I8086_TAG, I8086, XTAL_15MHz/3)
+ MCFG_CPU_PROGRAM_MAP(fp_mem)
+ MCFG_CPU_IO_MAP(fp_io)
+
+ MCFG_CPU_ADD(HD63B01V1_TAG, HD6301, 2000000)
+ MCFG_CPU_PROGRAM_MAP(sound_mem)
+ MCFG_CPU_IO_MAP(sound_io)
+ MCFG_DEVICE_DISABLE()
+
+ /* video hardware */
+ MCFG_DEFAULT_LAYOUT( layout_apricotp )
+
+ MCFG_SCREEN_ADD(SCREEN_LCD_TAG, LCD)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_UPDATE_DRIVER(fp_state, screen_update)
+ MCFG_SCREEN_SIZE(640, 200)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
+
+ MCFG_SCREEN_ADD(SCREEN_CRT_TAG, RASTER)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
+ MCFG_SCREEN_SIZE(640, 256)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 256-1)
+
+ MCFG_PALETTE_LENGTH(16)
+ MCFG_GFXDECODE(act_f1)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, 4000000, crtc_intf)
+
+ // sound hardware
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD(SN76489AN_TAG, SN76489A, 2000000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+
+ /* Devices */
+ MCFG_APRICOT_KEYBOARD_ADD(kb_intf)
+ MCFG_I8237_ADD(I8237_TAG, 250000, dmac_intf)
+ MCFG_PIC8259_ADD(I8259A_TAG, pic_intf)
+ MCFG_PIT8253_ADD(I8253A5_TAG, pit_intf)
+ MCFG_Z80DART_ADD(Z80SIO0_TAG, 2500000, sio_intf)
+ MCFG_WD2797_ADD(WD2797_TAG, fdc_intf)
+ MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(act_floppy_interface)
+ MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf)
+
+ /* internal ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("256K")
+ MCFG_RAM_EXTRA_OPTIONS("512K,1M")
+MACHINE_CONFIG_END
+
+
+
+//**************************************************************************
+// ROMS
+//**************************************************************************
+
+//-------------------------------------------------
+// ROM( fp )
+//-------------------------------------------------
+
+ROM_START( fp )
+ ROM_REGION( 0x8000, I8086_TAG, 0 )
+ ROM_LOAD16_BYTE( "lo_fp_3.1.ic20", 0x0000, 0x4000, CRC(0572add2) SHA1(c7ab0e5ced477802e37f9232b5673f276b8f5623) ) // Labelled 11212721 F97E PORT LO VR 3.1
+ ROM_LOAD16_BYTE( "hi_fp_3.1.ic9", 0x0001, 0x4000, CRC(3903674b) SHA1(8418682dcc0c52416d7d851760fea44a3cf2f914) ) // Labelled 11212721 BD2D PORT HI VR 3.1
+
+ ROM_REGION( 0x1000, HD63B01V1_TAG, 0 )
+ ROM_LOAD( "voice interface hd63b01v01.ic29", 0x0000, 0x1000, NO_DUMP )
+
+ ROM_REGION( 0x100, "proms", 0 )
+ ROM_LOAD( "tbp24s10.ic73", 0x000, 0x100, NO_DUMP ) // address decoder 256x4
+
+ ROM_REGION( 0x100, "plds", 0 )
+ ROM_LOAD( "pal1 pal12l6.ic2", 0x000, 0x100, NO_DUMP ) // ?
+ ROM_LOAD( "pal2 pal10l8.ic35", 0x000, 0x100, NO_DUMP ) // address decoder
+ ROM_LOAD( "pal3 pal12l6.ic77", 0x000, 0x100, NO_DUMP ) // ?
+ROM_END
+
+
+
+//**************************************************************************
+// SYSTEM DRIVERS
+//**************************************************************************
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS
+COMP( 1984, fp, 0, 0, fp, fp, driver_device, 0, "ACT", "Apricot Portable / FP", GAME_NOT_WORKING )