mirror of
https://github.com/holub/mame
synced 2025-06-01 10:31:48 +03:00
(MESS) Applix: added some code but it's still light years away from working.
This commit is contained in:
parent
710c5bbac7
commit
9fa0c5f4ce
@ -18,11 +18,17 @@
|
||||
- Keyboard is a standard pc keyboard
|
||||
- Sound is stereo dac-sound, plus an analog output. Details unknown.
|
||||
|
||||
In non-debug mode it runs for a few seconds then freezes requiring MESS
|
||||
to be forceably closed. In debug mode, it can be seen that a processor
|
||||
exeception occurs, although sometimes the cpu 'just stops', causing a
|
||||
MESS freeze. Obviously the real machine doesn't do these things.
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "video/mc6845.h"
|
||||
#include "machine/6522via.h"
|
||||
|
||||
|
||||
class applix_state : public driver_device
|
||||
@ -30,30 +36,81 @@ class applix_state : public driver_device
|
||||
public:
|
||||
applix_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_crtc(*this, "crtc")
|
||||
,
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_crtc(*this, "crtc"),
|
||||
m_via(*this, "via6522"),
|
||||
m_base(*this, "base"){ }
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<mc6845_device> m_crtc;
|
||||
DECLARE_READ16_MEMBER(applix_inputs_r);
|
||||
DECLARE_WRITE16_MEMBER(applix_index_w);
|
||||
DECLARE_WRITE16_MEMBER(applix_register_w);
|
||||
required_shared_ptr<UINT16> m_base;
|
||||
DECLARE_WRITE16_MEMBER(palette_w);
|
||||
DECLARE_WRITE16_MEMBER(analog_latch_w);
|
||||
DECLARE_WRITE16_MEMBER(dac_latch_w);
|
||||
DECLARE_WRITE16_MEMBER(video_latch_w);
|
||||
DECLARE_READ8_MEMBER(applix_pa_r);
|
||||
DECLARE_READ8_MEMBER(applix_pb_r);
|
||||
DECLARE_WRITE8_MEMBER(applix_pa_w);
|
||||
DECLARE_WRITE8_MEMBER(applix_pb_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(vsync_w);
|
||||
UINT8 m_pa;
|
||||
UINT8 m_pb;
|
||||
UINT8 m_analog_latch;
|
||||
UINT8 m_dac_latch;
|
||||
UINT8 m_video_latch;
|
||||
UINT8 m_palette_latch[4];
|
||||
virtual void machine_reset();
|
||||
virtual void video_start();
|
||||
virtual void palette_init();
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<mc6845_device> m_crtc;
|
||||
required_device<via6522_device> m_via;
|
||||
required_shared_ptr<UINT16> m_base;
|
||||
};
|
||||
|
||||
// dac-latch seems to be:
|
||||
// bit 7 cassette relay, low=on
|
||||
// bit 6,5,4 sound outputs
|
||||
// bit 3 cassette LED, low=on
|
||||
// bit 2,1,0 joystick
|
||||
WRITE16_MEMBER( applix_state::dac_latch_w )
|
||||
{//printf("%X ",data);
|
||||
if (ACCESSING_BITS_0_7)
|
||||
m_dac_latch = data;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( applix_state::analog_latch_w )
|
||||
{//printf("%X ",data);
|
||||
if (ACCESSING_BITS_0_7)
|
||||
m_analog_latch = data;
|
||||
}
|
||||
|
||||
//cent = odd, video = even
|
||||
WRITE16_MEMBER( applix_state::palette_w )
|
||||
{
|
||||
offset >>= 4;
|
||||
if (ACCESSING_BITS_0_7)
|
||||
{} //centronics
|
||||
else
|
||||
m_palette_latch[offset] = (data >> 8) & 15;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( applix_state::video_latch_w )
|
||||
{//printf("%X ",data);
|
||||
if (ACCESSING_BITS_0_7)
|
||||
m_video_latch = data;
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( applix_state::applix_index_w )
|
||||
{
|
||||
m_crtc->address_w( space, offset, data >> 8 );
|
||||
if (ACCESSING_BITS_8_15)
|
||||
m_crtc->address_w( space, offset, data >> 8 );
|
||||
}
|
||||
|
||||
WRITE16_MEMBER( applix_state::applix_register_w )
|
||||
{
|
||||
m_crtc->register_w( space, offset, data >> 8 );
|
||||
if (ACCESSING_BITS_8_15)
|
||||
m_crtc->register_w( space, offset, data >> 8 );
|
||||
}
|
||||
|
||||
READ16_MEMBER( applix_state::applix_inputs_r )
|
||||
@ -62,14 +119,28 @@ READ16_MEMBER( applix_state::applix_inputs_r )
|
||||
// bits 2,3 joystick in
|
||||
// bit 1 cassette in
|
||||
// bit 0 something to do with audio
|
||||
return 0;
|
||||
return 0x70; // video test, screen changes colours. This is the only thing working atm.
|
||||
}
|
||||
|
||||
// dac-latch seems to be:
|
||||
// bit 7 cassette relay, low=on
|
||||
// bit 6,5,4 sound outputs
|
||||
// bit 3 cassette LED, low=on
|
||||
// bit 2,1,0 joystick
|
||||
READ8_MEMBER( applix_state::applix_pa_r )
|
||||
{
|
||||
return m_pa;
|
||||
}
|
||||
|
||||
READ8_MEMBER( applix_state::applix_pb_r )
|
||||
{
|
||||
return m_pb;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( applix_state::applix_pa_w )
|
||||
{
|
||||
m_pa = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( applix_state::applix_pb_w )
|
||||
{//printf("%X ",data);
|
||||
m_pb = data;
|
||||
}
|
||||
|
||||
static ADDRESS_MAP_START(applix_mem, AS_PROGRAM, 16, applix_state)
|
||||
ADDRESS_MAP_UNMAP_HIGH
|
||||
@ -77,18 +148,15 @@ static ADDRESS_MAP_START(applix_mem, AS_PROGRAM, 16, applix_state)
|
||||
AM_RANGE(0x000000, 0x07ffff) AM_RAM AM_SHARE("base")
|
||||
AM_RANGE(0x080000, 0x47ffff) AM_NOP //AM_RAM // expansion
|
||||
AM_RANGE(0x500000, 0x5fffff) AM_ROM
|
||||
//AM_RANGE(0x600000, 0x600001) centronics latch (odd), video palette entry 0 (even)
|
||||
//AM_RANGE(0x600020, 0x600021) video palette entry 1 (even)
|
||||
//AM_RANGE(0x600040, 0x600041) video palette entry 2 (even)
|
||||
//AM_RANGE(0x600060, 0x600061) video palette entry 3 (even)
|
||||
//AM_RANGE(0x600080, 0x600081) dac latch (odd)
|
||||
//AM_RANGE(0x600100, 0x600101) video latch (=border colour, high nybble; video base, low nybble) (odd)
|
||||
//AM_RANGE(0x600180, 0x600181) analog multiplexer latch (odd)
|
||||
AM_RANGE(0x600000, 0x60007f) AM_WRITE(palette_w)
|
||||
AM_RANGE(0x600080, 0x6000ff) AM_WRITE(dac_latch_w)
|
||||
AM_RANGE(0x600100, 0x60017f) AM_WRITE(video_latch_w) //video latch (=border colour, high nybble; video base, low nybble) (odd)
|
||||
AM_RANGE(0x600180, 0x6001ff) AM_WRITE(analog_latch_w) //analog multiplexer latch (odd)
|
||||
//AM_RANGE(0x700000, 0x700007) z80-scc (ch b control, ch b data, ch a control, ch a data) on even addresses
|
||||
AM_RANGE(0x700080, 0x700081) AM_READ(applix_inputs_r) //input port (odd)
|
||||
//AM_RANGE(0x700100, 0x70011f) VIA base address (even)
|
||||
AM_RANGE(0x700180, 0x700181) AM_WRITE(applix_index_w)
|
||||
AM_RANGE(0x700182, 0x700183) AM_WRITE(applix_register_w)
|
||||
AM_RANGE(0x700080, 0x7000ff) AM_READ(applix_inputs_r) //input port (odd)
|
||||
AM_RANGE(0x700100, 0x70011f) AM_MIRROR(0x60) AM_DEVREADWRITE8("via6522", via6522_device, read, write, 0xff00)
|
||||
AM_RANGE(0x700180, 0x700181) AM_MIRROR(0x7c) AM_WRITE(applix_index_w)
|
||||
AM_RANGE(0x700182, 0x700183) AM_MIRROR(0x7c) AM_WRITE(applix_register_w)
|
||||
//600000, 6FFFFF io ports and latches
|
||||
//700000, 7FFFFF peripheral chips and devices
|
||||
//800000, FFC000 optional roms
|
||||
@ -147,46 +215,42 @@ void applix_state::video_start()
|
||||
{
|
||||
}
|
||||
|
||||
MC6845_UPDATE_ROW( applix_update_row )
|
||||
static MC6845_UPDATE_ROW( applix_update_row )
|
||||
{
|
||||
#if 0
|
||||
// This needs complete rewriting
|
||||
// Need to display a border but the mame mc6845 code doesn't allow it.
|
||||
// 640x200, display 4 of 16 colours, each 2 bits points at a palette entry.
|
||||
// 320x200, display all 16 colours, each nybble has the colour code
|
||||
// The display is bitmapped. 2 modes are supported here, 320x200x16 and 640x200x4.
|
||||
// Need to display a border colour.
|
||||
// There is a monochrome mode, but no info found as yet.
|
||||
// Display is bitmapped, no character generator.
|
||||
// The video page can be moved around to almost anywhere in memory.
|
||||
applix_state *state = device->machine().driver_data<applix_state>();
|
||||
const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
|
||||
UINT8 chr,gfx,fg,bg;
|
||||
UINT16 mem,x,col;
|
||||
UINT16 colourm = (state->m_08 & 0x0e) << 7;
|
||||
UINT32 *p = &bitmap.pix32(y);
|
||||
UINT8 i;
|
||||
UINT16 chr,x;
|
||||
UINT32 mem, vidbase = (state->m_video_latch & 15) << 14, *p = &bitmap.pix32(y);
|
||||
|
||||
for (x = 0; x < x_count; x++) // for each character
|
||||
for (x = 0; x < x_count; x++)
|
||||
{
|
||||
UINT8 inv=0;
|
||||
mem = (ma + x) & 0x7ff;
|
||||
chr = state->m_videoram[mem];
|
||||
col = state->m_colorram[mem] | colourm; // read a byte of colour
|
||||
mem = vidbase + ma + x + ra * x_count;
|
||||
chr = state->m_base[mem];
|
||||
|
||||
/* get pattern of pixels for that character scanline */
|
||||
gfx = state->m_gfxram[(chr<<4) | ra] ^ inv;
|
||||
fg = (col & 0x001f) | 64; // map to foreground palette
|
||||
bg = (col & 0x07e0) >> 5; // and background palette
|
||||
|
||||
/* Display a scanline of a character (8 pixels) */
|
||||
*p++ = palette[( gfx & 0x80 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x40 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x20 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x10 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x08 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x04 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x02 ) ? fg : bg];
|
||||
*p++ = palette[( gfx & 0x01 ) ? fg : bg];
|
||||
if (BIT(state->m_pa, 3))
|
||||
// 640 x 200 x 4of16 mode
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
*p++ = palette[state->m_palette_latch[chr>>14]];
|
||||
chr <<= 2;
|
||||
}
|
||||
}
|
||||
else
|
||||
// 320 x 200 x 16 mode
|
||||
{
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
*p++ = palette[chr>>12];
|
||||
*p++ = palette[chr>>12];
|
||||
chr <<= 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static MC6845_INTERFACE( applix_crtc )
|
||||
@ -200,27 +264,49 @@ static MC6845_INTERFACE( applix_crtc )
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_NULL,
|
||||
DEVCB_DRIVER_LINE_MEMBER(applix_state, vsync_w),
|
||||
NULL
|
||||
};
|
||||
|
||||
WRITE_LINE_MEMBER( applix_state::vsync_w )
|
||||
{
|
||||
m_via->write_ca2(state);
|
||||
}
|
||||
|
||||
static const via6522_interface applix_via =
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(applix_state, applix_pa_r), // in port A
|
||||
DEVCB_DRIVER_MEMBER(applix_state, applix_pb_r), // in port B
|
||||
DEVCB_NULL, // in CA1 cent ack
|
||||
DEVCB_NULL, // in CB1 kbd clk
|
||||
DEVCB_NULL, // in CA2 vsync
|
||||
DEVCB_NULL, // in CB2 kdb data
|
||||
DEVCB_DRIVER_MEMBER(applix_state, applix_pa_w),// out Port A
|
||||
DEVCB_DRIVER_MEMBER(applix_state, applix_pb_w), // out port B
|
||||
DEVCB_NULL, // out CA1
|
||||
DEVCB_NULL, // out CB1
|
||||
DEVCB_NULL, // out CA2
|
||||
DEVCB_NULL, // out CB2
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M68K_IRQ_2) //IRQ
|
||||
};
|
||||
|
||||
static MACHINE_CONFIG_START( applix, applix_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M68000, 7500000)
|
||||
MCFG_CPU_PROGRAM_MAP(applix_mem)
|
||||
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_REFRESH_RATE(50)
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
|
||||
MCFG_SCREEN_SIZE(640, 480)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
||||
MCFG_SCREEN_SIZE(640, 200)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
|
||||
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
|
||||
|
||||
MCFG_PALETTE_LENGTH(16)
|
||||
|
||||
/* Devices */
|
||||
MCFG_MC6845_ADD("crtc", MC6845, 1875000, applix_crtc) // 6545
|
||||
MCFG_VIA6522_ADD("via6522", 0, applix_via)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
/* ROM definition */
|
||||
@ -228,10 +314,12 @@ ROM_START( applix )
|
||||
ROM_REGION(0x1000000, "maincpu", 0)
|
||||
ROM_LOAD16_BYTE( "1616oshv.044", 0x500000, 0x10000, CRC(4a1a90d3) SHA1(4df504bbf6fc5dad76c29e9657bfa556500420a6) )
|
||||
ROM_LOAD16_BYTE( "1616oslv.044", 0x500001, 0x10000, CRC(ef619994) SHA1(ff16fe9e2c99a1ffc855baf89278a97a2a2e881a) )
|
||||
//ROM_LOAD16_BYTE( "1616oshv.045", 0x520000, 0x10000, CRC(9dfb3224) SHA1(5223833a357f90b147f25826c01713269fc1945f) )
|
||||
//ROM_LOAD16_BYTE( "1616oslv.045", 0x520001, 0x10000, CRC(951bd441) SHA1(e0a38c8d0d38d84955c1de3f6a7d56ce06b063f6) )
|
||||
//ROM_LOAD( "1616osv.045", 0x540000, 0x20000, CRC(b9f75432) SHA1(278964e2a02b1fe26ff34f09dc040e03c1d81a6d) )
|
||||
//ROM_LOAD( "1616ssdv.022", 0x560000, 0x08000, CRC(6d8e413a) SHA1(fc27d92c34f231345a387b06670f36f8c1705856) )
|
||||
|
||||
ROM_REGION(0x50000, "user1", 0)
|
||||
ROM_LOAD16_BYTE( "1616oshv.045", 0x00000, 0x10000, CRC(9dfb3224) SHA1(5223833a357f90b147f25826c01713269fc1945f) )
|
||||
ROM_LOAD16_BYTE( "1616oslv.045", 0x00001, 0x10000, CRC(951bd441) SHA1(e0a38c8d0d38d84955c1de3f6a7d56ce06b063f6) )
|
||||
ROM_LOAD( "1616osv.045", 0x20000, 0x20000, CRC(b9f75432) SHA1(278964e2a02b1fe26ff34f09dc040e03c1d81a6d) )
|
||||
ROM_LOAD( "1616ssdv.022", 0x40000, 0x08000, CRC(6d8e413a) SHA1(fc27d92c34f231345a387b06670f36f8c1705856) )
|
||||
ROM_END
|
||||
|
||||
/* Driver */
|
||||
|
Loading…
Reference in New Issue
Block a user