(mess) radio86: convert to new 8257 and 8275 (nw)

i8257: fix off-by-one (nw)
---
Unior doesn't quite display properly.  Only remaining user of 8257dma is dkong.
This commit is contained in:
cracyc 2014-04-30 04:13:31 +00:00
parent 3ec0e3224a
commit 194b930934
17 changed files with 313 additions and 406 deletions

1
.gitattributes vendored
View File

@ -8926,7 +8926,6 @@ src/mess/video/poisk1.h svneol=native#text/plain
src/mess/video/poly88.c svneol=native#text/plain
src/mess/video/pp01.c svneol=native#text/plain
src/mess/video/primo.c svneol=native#text/plain
src/mess/video/radio86.c svneol=native#text/plain
src/mess/video/rm380z.c svneol=native#text/plain
src/mess/video/rmnimbus.c svneol=native#text/plain
src/mess/video/samcoupe.c svneol=native#text/plain

View File

@ -219,13 +219,18 @@ inline void i8257n_device::dma_write()
// end_of_process -
//-------------------------------------------------
inline void i8257n_device::end_of_process()
inline void i8257n_device::advance()
{
bool tc = (m_channel[m_current_channel].m_count == 0);
bool al = (MODE_AUTOLOAD && (m_current_channel == 2));
if(tc)
{
m_status |= 1 << m_current_channel;
m_request &= ~(1 << m_current_channel);
m_request &= ~(1 << m_current_channel); // docs imply this isn't right but pc-8001 works better with it
set_tc(1);
if (MODE_AUTOLOAD && (m_current_channel == 2))
if(al)
{
// autoinitialize
m_channel[2].m_address = m_channel[3].m_address;
@ -235,6 +240,14 @@ inline void i8257n_device::end_of_process()
else if(MODE_TC_STOP)
// disable channel
m_transfer_mode &= ~(1 << m_current_channel);
}
if(!(al && tc))
{
m_channel[m_current_channel].m_count--;
m_channel[m_current_channel].m_count &= 0x3fff;
m_channel[m_current_channel].m_address++;
}
}
@ -251,6 +264,7 @@ i8257n_device::i8257n_device(const machine_config &mconfig, const char *tag, dev
: device_t(mconfig, I8257N, "I8257N", tag, owner, clock, "i8257n", __FILE__),
device_execute_interface(mconfig, *this),
m_icount(0),
m_reverse_rw(0),
m_tc(false),
m_msb(0),
m_hreq(CLEAR_LINE),
@ -310,13 +324,6 @@ void i8257n_device::device_start()
m_out_dack_2_cb.resolve_safe();
m_out_dack_3_cb.resolve_safe();
for (int i = 0; i < 4; i++)
{
m_channel[i].m_address = 0;
m_channel[i].m_count = 0;
m_channel[i].m_mode = 0;
}
// state saving
save_item(NAME(m_msb));
save_item(NAME(m_hreq));
@ -328,6 +335,19 @@ void i8257n_device::device_start()
save_item(NAME(m_transfer_mode));
save_item(NAME(m_status));
save_item(NAME(m_request));
save_item(NAME(m_channel[0].m_address));
save_item(NAME(m_channel[0].m_count));
save_item(NAME(m_channel[0].m_mode));
save_item(NAME(m_channel[1].m_address));
save_item(NAME(m_channel[1].m_count));
save_item(NAME(m_channel[1].m_mode));
save_item(NAME(m_channel[2].m_address));
save_item(NAME(m_channel[2].m_count));
save_item(NAME(m_channel[2].m_mode));
save_item(NAME(m_channel[3].m_address));
save_item(NAME(m_channel[3].m_count));
save_item(NAME(m_channel[3].m_mode));
}
@ -347,6 +367,12 @@ void i8257n_device::device_reset()
m_hreq = -1;
m_tc = 0;
for (int i = 0; i < 4; i++)
{
m_channel[i].m_address = 0;
m_channel[i].m_count = 0;
m_channel[i].m_mode = 0;
}
set_hreq(0);
set_dack();
}
@ -444,12 +470,7 @@ void i8257n_device::execute_run()
{
dma_write();
}
m_channel[m_current_channel].m_count--;
m_channel[m_current_channel].m_count &= 0x3fff;
m_channel[m_current_channel].m_address++;
if(!m_channel[m_current_channel].m_count)
end_of_process();
advance();
if(next_channel())
m_state = STATE_S1;
@ -495,7 +516,11 @@ READ8_MEMBER( i8257n_device::read )
case REGISTER_WORD_COUNT:
if (m_msb)
{
data = (m_channel[channel].m_count >> 8) | (m_channel[channel].m_mode << 6);
data = (m_channel[channel].m_count >> 8);
if(m_reverse_rw && m_channel[channel].m_mode)
data |= (m_channel[channel].m_mode == 1) ? 0x2000 : 0x1000;
else
data |= (m_channel[channel].m_mode << 6);
}
else
{
@ -550,10 +575,14 @@ WRITE8_MEMBER( i8257n_device::write )
{
m_channel[channel].m_count = ((data & 0x3f) << 8) | (m_channel[channel].m_count & 0xff);
m_channel[channel].m_mode = (data >> 6);
if(m_reverse_rw && m_channel[channel].m_mode)
m_channel[channel].m_mode = (m_channel[channel].m_mode == 1) ? 2 : 1;
if(MODE_AUTOLOAD && (channel == 2))
{
m_channel[3].m_count = ((data & 0x3f) << 8) | (m_channel[3].m_count & 0xff);
m_channel[3].m_mode = (data >> 6);
m_channel[3].m_mode = m_channel[2].m_mode;
}
}
else

View File

@ -45,58 +45,62 @@
DEVICE CONFIGURATION MACROS
***************************************************************************/
#define MCFG_I8257N_ADD(_tag, _clock, _config) \
#define MCFG_I8257_ADD(_tag, _clock, _config) \
MCFG_DEVICE_ADD(_tag, I8257N, _clock) \
MCFG_DEVICE_CONFIG(_config)
#define MCFG_I8257N_OUT_HRQ_CB(_devcb) \
#define MCFG_I8257_OUT_HRQ_CB(_devcb) \
devcb = &i8257n_device::set_out_hrq_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_TC_CB(_devcb) \
#define MCFG_I8257_OUT_TC_CB(_devcb) \
devcb = &i8257n_device::set_out_tc_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_IN_MEMR_CB(_devcb) \
#define MCFG_I8257_IN_MEMR_CB(_devcb) \
devcb = &i8257n_device::set_in_memr_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_MEMW_CB(_devcb) \
#define MCFG_I8257_OUT_MEMW_CB(_devcb) \
devcb = &i8257n_device::set_out_memw_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_IN_IOR_0_CB(_devcb) \
#define MCFG_I8257_IN_IOR_0_CB(_devcb) \
devcb = &i8257n_device::set_in_ior_0_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_IN_IOR_1_CB(_devcb) \
#define MCFG_I8257_IN_IOR_1_CB(_devcb) \
devcb = &i8257n_device::set_in_ior_1_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_IN_IOR_2_CB(_devcb) \
#define MCFG_I8257_IN_IOR_2_CB(_devcb) \
devcb = &i8257n_device::set_in_ior_2_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_IN_IOR_3_CB(_devcb) \
#define MCFG_I8257_IN_IOR_3_CB(_devcb) \
devcb = &i8257n_device::set_in_ior_3_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_IOW_0_CB(_devcb) \
#define MCFG_I8257_OUT_IOW_0_CB(_devcb) \
devcb = &i8257n_device::set_out_iow_0_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_IOW_1_CB(_devcb) \
#define MCFG_I8257_OUT_IOW_1_CB(_devcb) \
devcb = &i8257n_device::set_out_iow_1_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_IOW_2_CB(_devcb) \
#define MCFG_I8257_OUT_IOW_2_CB(_devcb) \
devcb = &i8257n_device::set_out_iow_2_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_IOW_3_CB(_devcb) \
#define MCFG_I8257_OUT_IOW_3_CB(_devcb) \
devcb = &i8257n_device::set_out_iow_3_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_DACK_0_CB(_devcb) \
#define MCFG_I8257_OUT_DACK_0_CB(_devcb) \
devcb = &i8257n_device::set_out_dack_0_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_DACK_1_CB(_devcb) \
#define MCFG_I8257_OUT_DACK_1_CB(_devcb) \
devcb = &i8257n_device::set_out_dack_1_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_DACK_2_CB(_devcb) \
#define MCFG_I8257_OUT_DACK_2_CB(_devcb) \
devcb = &i8257n_device::set_out_dack_2_callback(*device, DEVCB2_##_devcb);
#define MCFG_I8257N_OUT_DACK_3_CB(_devcb) \
#define MCFG_I8257_OUT_DACK_3_CB(_devcb) \
devcb = &i8257n_device::set_out_dack_3_callback(*device, DEVCB2_##_devcb);
// HACK: the radio86 and alikes require this, is it a bug in the soviet clone or is there something else happening?
#define MCFG_I8257_REVERSE_RW_MODE(_flag) \
i8257n_device::static_set_reverse_rw_mode(*device, _flag);
// ======================> i8257n_device
class i8257n_device : public device_t,
@ -138,6 +142,7 @@ public:
template<class _Object> static devcb2_base &set_out_dack_2_callback(device_t &device, _Object object) { return downcast<i8257n_device &>(device).m_out_dack_2_cb.set_callback(object); }
template<class _Object> static devcb2_base &set_out_dack_3_callback(device_t &device, _Object object) { return downcast<i8257n_device &>(device).m_out_dack_3_cb.set_callback(object); }
static void static_set_reverse_rw_mode(device_t &device, bool flag) { downcast<i8257n_device &>(device).m_reverse_rw = flag; }
protected:
// device-level overrides
virtual void device_start();
@ -153,10 +158,11 @@ private:
inline void set_dack();
inline void dma_read();
inline void dma_write();
inline void end_of_process();
inline void advance();
inline void set_tc(int state);
bool next_channel();
bool m_reverse_rw;
bool m_tc;
int m_msb;
int m_hreq;

View File

@ -266,6 +266,12 @@ void i8275x_device::device_timer(emu_timer &timer, device_timer_id id, int param
if (m_scanline < m_vrtc_scanline)
{
if (OFFSET_LINE_COUNTER)
{
lc = (lc - 1) & 0x0f;
}
for (int sx = 0; sx < CHARACTERS_PER_ROW; sx++)
{
int m_lineattr = 0;
@ -329,11 +335,6 @@ void i8275x_device::device_timer(emu_timer &timer, device_timer_id id, int param
}
}
if (OFFSET_LINE_COUNTER)
{
lc = (lc - 1) & 0x0f;
}
if (!m_display_cb.isnull())
m_display_cb(m_bitmap,
sx * m_hpixels_per_column, // x position on screen of starting point

View File

@ -12,9 +12,7 @@
#include "sound/wave.h"
#include "sound/speaker.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "machine/pit8253.h"
#include "video/i8275.h"
#include "imagedev/cassette.h"
#include "formats/rk_cas.h"
#include "includes/radio86.h"
@ -33,6 +31,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(pit8253_out0_changed);
DECLARE_WRITE_LINE_MEMBER(pit8253_out1_changed);
DECLARE_WRITE_LINE_MEMBER(pit8253_out2_changed);
I8275_DRAW_CHARACTER_MEMBER(display_pixels);
required_device<speaker_sound_device> m_speaker;
};
@ -45,8 +44,8 @@ static ADDRESS_MAP_START(apogee_mem, AS_PROGRAM, 8, apogee_state )
AM_RANGE( 0xec00, 0xec03 ) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) AM_MIRROR(0x00fc)
AM_RANGE( 0xed00, 0xed03 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x00fc)
//AM_RANGE( 0xee00, 0xee03 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x00fc)
AM_RANGE( 0xef00, 0xef01 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xf000, 0xf0ff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xef00, 0xef01 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xf000, 0xf0ff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -178,6 +177,27 @@ WRITE_LINE_MEMBER(apogee_state::pit8253_out2_changed)
m_speaker->level_w(m_out0+m_out1+m_out2);
}
I8275_DRAW_CHARACTER_MEMBER(apogee_state::display_pixels)
{
int i;
const rgb_t *palette = m_palette->palette()->entry_list_raw();
const UINT8 *charmap = m_charmap + (gpa & 1) * 0x400;
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if(linecount == 8)
return;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
}
/* F4 Character Displayer */
static const gfx_layout apogee_charlayout =
@ -221,12 +241,15 @@ static MACHINE_CONFIG_START( apogee, apogee_state )
//MCFG_DEVICE_ADD("ppi8255_2", I8255, 0)
MCFG_I8275_ADD("i8275", apogee_i8275_interface)
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 9 / 4)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(apogee_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -241,11 +264,12 @@ static MACHINE_CONFIG_START( apogee, apogee_state )
MCFG_SOUND_CONFIG(apogee_speaker_interface)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
MCFG_DEVICE_ADD("dma8257", I8257, XTAL_16MHz / 9)
MCFG_DEVICE_ADD("dma8257", I8257N, XTAL_16MHz / 9)
MCFG_I8257_OUT_HRQ_CB(WRITELINE(radio86_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", apogee_cassette_interface )
MCFG_SOFTWARE_LIST_ADD("cass_list","apogee")

View File

@ -862,12 +862,12 @@ static MACHINE_CONFIG_START( fanucspmg, fanucspmg_state )
MCFG_PIT8253_CLK2(XTAL_15MHz/12)
MCFG_DEVICE_ADD(DMAC_TAG, I8257N, XTAL_15MHz / 5)
MCFG_I8257N_OUT_HRQ_CB(WRITELINE(fanucspmg_state, hrq_w))
MCFG_I8257N_OUT_TC_CB(WRITELINE(fanucspmg_state, tc_w))
MCFG_I8257N_IN_MEMR_CB(READ8(fanucspmg_state, memory_read_byte))
MCFG_I8257N_OUT_MEMW_CB(WRITE8(fanucspmg_state, memory_write_byte))
MCFG_I8257N_IN_IOR_0_CB(READ8(fanucspmg_state, fdcdma_r))
MCFG_I8257N_OUT_IOW_0_CB(WRITE8(fanucspmg_state, fdcdma_w))
MCFG_I8257_OUT_HRQ_CB(WRITELINE(fanucspmg_state, hrq_w))
MCFG_I8257_OUT_TC_CB(WRITELINE(fanucspmg_state, tc_w))
MCFG_I8257_IN_MEMR_CB(READ8(fanucspmg_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(fanucspmg_state, memory_write_byte))
MCFG_I8257_IN_IOR_0_CB(READ8(fanucspmg_state, fdcdma_r))
MCFG_I8257_OUT_IOW_0_CB(WRITE8(fanucspmg_state, fdcdma_w))
MCFG_PIC8259_ADD(PIC0_TAG, INPUTLINE("maincpu", 0), VCC, READ8(fanucspmg_state, get_slave_ack))
MCFG_PIC8259_ADD(PIC1_TAG, DEVWRITELINE(PIC0_TAG, pic8259_device, ir7_w), GND, NULL)

View File

@ -11,9 +11,7 @@
#include "cpu/i8085/i8085.h"
#include "sound/wave.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "machine/pit8253.h"
#include "video/i8275.h"
#include "imagedev/cassette.h"
#include "formats/rk_cas.h"
#include "includes/radio86.h"
@ -25,6 +23,7 @@ public:
mikrosha_state(const machine_config &mconfig, device_type type, const char *tag)
: radio86_state(mconfig, type, tag) { }
DECLARE_WRITE_LINE_MEMBER(mikrosha_pit_out2);
I8275_DRAW_CHARACTER_MEMBER(display_pixels);
};
@ -35,10 +34,10 @@ static ADDRESS_MAP_START(mikrosha_mem, AS_PROGRAM, 8, mikrosha_state )
AM_RANGE( 0x8000, 0xbfff ) AM_READ(radio_cpu_state_r) // Not connected
AM_RANGE( 0xc000, 0xc003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x07fc)
AM_RANGE( 0xc800, 0xc803 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x07fc)
AM_RANGE( 0xd000, 0xd001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x07fe) // video
AM_RANGE( 0xd000, 0xd001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x07fe) // video
AM_RANGE( 0xd800, 0xd803 ) AM_DEVREADWRITE("pit8253", pit8253_device, read, write) AM_MIRROR(0x07fc) // Timer
AM_RANGE( 0xe000, 0xf7ff ) AM_READ(radio_cpu_state_r) // Not connected
AM_RANGE( 0xf800, 0xffff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xf800, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf800, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -155,6 +154,28 @@ WRITE_LINE_MEMBER(mikrosha_state::mikrosha_pit_out2)
{
}
I8275_DRAW_CHARACTER_MEMBER(mikrosha_state::display_pixels)
{
int i;
const rgb_t *palette = m_palette->palette()->entry_list_raw();
const UINT8 *charmap = m_charmap + (m_mikrosha_font_page & 1) * 0x400;
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if(linecount == 8)
return;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
}
/* F4 Character Displayer */
static const gfx_layout mikrosha_charlayout =
{
@ -190,7 +211,10 @@ static MACHINE_CONFIG_START( mikrosha, mikrosha_state )
MCFG_DEVICE_ADD("ppi8255_2", I8255, 0)
MCFG_I8255_OUT_PORTB_CB(WRITE8(radio86_state, mikrosha_8255_font_page_w))
MCFG_I8275_ADD("i8275", mikrosha_i8275_interface)
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 9 / 4)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(mikrosha_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
MCFG_DEVICE_ADD("pit8253", PIT8253, 0)
MCFG_PIT8253_CLK0(0)
@ -200,9 +224,8 @@ static MACHINE_CONFIG_START( mikrosha, mikrosha_state )
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -214,11 +237,12 @@ static MACHINE_CONFIG_START( mikrosha, mikrosha_state )
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_DEVICE_ADD("dma8257", I8257, XTAL_16MHz / 9)
MCFG_DEVICE_ADD("dma8257", I8257N, XTAL_16MHz / 9)
MCFG_I8257_OUT_HRQ_CB(WRITELINE(radio86_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", mikrosha_cassette_interface )
MCFG_SOFTWARE_LIST_ADD("cass_list","mikrosha")

View File

@ -11,12 +11,8 @@
#include "cpu/i8085/i8085.h"
#include "sound/wave.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "machine/wd17xx.h"
#include "video/i8275.h"
#include "imagedev/cassette.h"
#include "imagedev/flopdrv.h"
#include "formats/basicdsk.h"
#include "formats/smx_dsk.h"
#include "formats/rk_cas.h"
#include "includes/radio86.h"
#include "machine/ram.h"
@ -34,10 +30,10 @@ static ADDRESS_MAP_START(partner_mem, AS_PROGRAM, 8, partner_state )
AM_RANGE( 0xc000, 0xc7ff ) AM_RAMBANK("bank8")
AM_RANGE( 0xc800, 0xcfff ) AM_RAMBANK("bank9")
AM_RANGE( 0xd000, 0xd7ff ) AM_RAMBANK("bank10")
AM_RANGE( 0xd800, 0xd8ff ) AM_DEVREADWRITE("i8275", i8275_device, read, write) // video
AM_RANGE( 0xd800, 0xd8ff ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) // video
AM_RANGE( 0xd900, 0xd9ff ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write)
AM_RANGE( 0xda00, 0xdaff ) AM_WRITE(partner_mem_page_w)
AM_RANGE( 0xdb00, 0xdbff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xdb00, 0xdbff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xdc00, 0xddff ) AM_RAMBANK("bank11")
AM_RANGE( 0xde00, 0xdeff ) AM_WRITE(partner_win_memory_page_w)
AM_RANGE( 0xe000, 0xe7ff ) AM_RAMBANK("bank12")
@ -147,27 +143,13 @@ static const cassette_interface partner_cassette_interface =
NULL
};
static LEGACY_FLOPPY_OPTIONS_START(partner)
LEGACY_FLOPPY_OPTION(partner, "cpm", "Partner disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([2])
TRACKS([80])
SECTORS([5])
SECTOR_LENGTH([1024])
FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTIONS_END
FLOPPY_FORMATS_MEMBER( partner_state::floppy_formats )
FLOPPY_SMX_FORMAT
FLOPPY_FORMATS_END
static const floppy_interface partner_floppy_interface =
{
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
FLOPPY_STANDARD_5_25_DSHD,
LEGACY_FLOPPY_OPTIONS_NAME(partner),
"floppy_5_25",
NULL
};
static SLOT_INTERFACE_START( partner_floppies )
SLOT_INTERFACE( "525qd", FLOPPY_525_QD )
SLOT_INTERFACE_END
/* F4 Character Displayer */
static const gfx_layout partner_charlayout =
@ -193,7 +175,6 @@ static MACHINE_CONFIG_START( partner, partner_state )
MCFG_CPU_ADD("maincpu", I8080, XTAL_16MHz / 9)
MCFG_CPU_PROGRAM_MAP(partner_mem)
MCFG_MACHINE_START_OVERRIDE(partner_state, partner )
MCFG_MACHINE_RESET_OVERRIDE(partner_state, partner )
MCFG_DEVICE_ADD("ppi8255_1", I8255, 0)
@ -202,12 +183,15 @@ static MACHINE_CONFIG_START( partner, partner_state )
MCFG_I8255_IN_PORTC_CB(READ8(radio86_state, radio86_8255_portc_r2))
MCFG_I8255_OUT_PORTC_CB(WRITE8(radio86_state, radio86_8255_portc_w2))
MCFG_I8275_ADD("i8275", partner_i8275_interface)
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 9 / 4)
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(partner_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
@ -219,20 +203,23 @@ static MACHINE_CONFIG_START( partner, partner_state )
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_DEVICE_ADD("dma8257", I8257, XTAL_16MHz / 9)
MCFG_DEVICE_ADD("dma8257", I8257N, XTAL_16MHz / 9)
MCFG_I8257_OUT_HRQ_CB(WRITELINE(partner_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_IN_IOR_0_CB(READ8(partner_state, partner_fdc_r))
MCFG_I8257_OUT_IOW_0_CB(WRITE8(partner_state, partner_fdc_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_IN_IOR_0_CB(DEVREAD8("wd1793", fd1793_t, data_r))
MCFG_I8257_OUT_IOW_0_CB(DEVWRITE8("wd1793", fd1793_t, data_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", partner_cassette_interface )
MCFG_SOFTWARE_LIST_ADD("cass_list","partner_cass")
MCFG_FD1793_ADD("wd1793", partner_wd17xx_interface )
MCFG_FD1793x_ADD("wd1793", XTAL_16MHz / 16)
MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("dma8257", i8257n_device, dreq0_w))
MCFG_FLOPPY_DRIVE_ADD("wd1793:0", partner_floppies, "525qd", partner_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("wd1793:1", partner_floppies, "525qd", partner_state::floppy_formats)
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(partner_floppy_interface)
MCFG_SOFTWARE_LIST_ADD("flop_list","partner_flop")
/* internal ram */

View File

@ -493,7 +493,6 @@ static MACHINE_CONFIG_START( pc8001, pc8001_state )
/* video hardware */
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DEVICE(UPD3301_TAG, upd3301_device, screen_update)
MCFG_SCREEN_SIZE(640, 220)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
@ -509,9 +508,9 @@ static MACHINE_CONFIG_START( pc8001, pc8001_state )
MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0)
MCFG_DEVICE_ADD(I8257_TAG, I8257N, 4000000)
MCFG_I8257N_OUT_HRQ_CB(WRITELINE(pc8001_state, hrq_w))
MCFG_I8257N_IN_MEMR_CB(READ8(pc8001_state, dma_mem_r))
MCFG_I8257N_OUT_IOW_2_CB(DEVWRITE8(UPD3301_TAG, upd3301_device, dack_w))
MCFG_I8257_OUT_HRQ_CB(WRITELINE(pc8001_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(pc8001_state, dma_mem_r))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8(UPD3301_TAG, upd3301_device, dack_w))
MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)
@ -542,7 +541,6 @@ static MACHINE_CONFIG_START( pc8001mk2, pc8001mk2_state )
/* video hardware */
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_UPDATE_DEVICE(UPD3301_TAG, upd3301_device, screen_update)
MCFG_SCREEN_SIZE(640, 220)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
@ -558,9 +556,9 @@ static MACHINE_CONFIG_START( pc8001mk2, pc8001mk2_state )
MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0)
MCFG_DEVICE_ADD(I8257_TAG, I8257N, 4000000)
MCFG_I8257N_OUT_HRQ_CB(WRITELINE(pc8001_state, hrq_w))
MCFG_I8257N_IN_MEMR_CB(READ8(pc8001_state, dma_mem_r))
MCFG_I8257N_OUT_IOW_2_CB(DEVWRITE8(UPD3301_TAG, upd3301_device, dack_w))
MCFG_I8257_OUT_HRQ_CB(WRITELINE(pc8001_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(pc8001_state, dma_mem_r))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8(UPD3301_TAG, upd3301_device, dack_w))
MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, NULL, NULL)

View File

@ -11,8 +11,6 @@
#include "cpu/i8085/i8085.h"
#include "sound/wave.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "video/i8275.h"
#include "imagedev/cassette.h"
#include "imagedev/cartslot.h"
#include "formats/rk_cas.h"
@ -24,8 +22,8 @@ static ADDRESS_MAP_START(radio86_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
//AM_RANGE( 0xa000, 0xa003 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -44,8 +42,8 @@ static ADDRESS_MAP_START(radio86rom_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xa000, 0xa003 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -55,10 +53,10 @@ static ADDRESS_MAP_START(radio86ram_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0xe000, 0xe7ff ) AM_ROM // System ROM page 2
AM_RANGE( 0xe800, 0xf5ff ) AM_RAM // RAM
AM_RANGE( 0xf700, 0xf703 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write)
AM_RANGE( 0xf780, 0xf7bf ) AM_DEVREADWRITE("i8275", i8275_device, read, write) // video
AM_RANGE( 0xf780, 0xf7bf ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) // video
AM_RANGE( 0xf684, 0xf687 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write)
AM_RANGE( 0xf688, 0xf688 ) AM_WRITE(radio86_pagesel )
AM_RANGE( 0xf800, 0xffff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xf800, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf800, 0xffff ) AM_ROM // System ROM page 1
ADDRESS_MAP_END
@ -69,8 +67,8 @@ static ADDRESS_MAP_START(radio86_16_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x4000, 0x7fff ) AM_READ(radio_cpu_state_r)
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
//AM_RANGE( 0xa000, 0xa003 ) AM_DEVREADWRITE("ppi8255_2", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -80,8 +78,8 @@ static ADDRESS_MAP_START(mikron2_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0xc000, 0xc003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x00fc)
//AM_RANGE( 0xc100, 0xc103 ) AM_DEVREADWRITE_LEGACY("ppi8255_2", i8255a_r, i8255a_w) AM_MIRROR(0x00fc)
AM_RANGE( 0xc200, 0xc201 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xc300, 0xc3ff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xc200, 0xc201 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x00fe) // video
AM_RANGE( 0xc300, 0xc3ff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -90,8 +88,8 @@ static ADDRESS_MAP_START(impuls03_mem, AS_PROGRAM, 8, radio86_state )
AM_RANGE( 0x1000, 0x7fff ) AM_RAM // RAM
AM_RANGE( 0x8000, 0x8003 ) AM_DEVREADWRITE("ppi8255_1", i8255_device, read, write) AM_MIRROR(0x1ffc)
AM_RANGE( 0xa000, 0xbfff ) AM_ROM // Basic ROM
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257_device, i8257_w) // DMA
AM_RANGE( 0xc000, 0xc001 ) AM_DEVREADWRITE("i8275", i8275x_device, read, write) AM_MIRROR(0x1ffe) // video
AM_RANGE( 0xe000, 0xffff ) AM_DEVWRITE("dma8257", i8257n_device, write) // DMA
AM_RANGE( 0xf000, 0xffff ) AM_ROM // System ROM
ADDRESS_MAP_END
@ -360,13 +358,15 @@ static MACHINE_CONFIG_START( radio86, radio86_state )
MCFG_I8255_IN_PORTC_CB(READ8(radio86_state, radio86_8255_portc_r2))
MCFG_I8255_OUT_PORTC_CB(WRITE8(radio86_state, radio86_8255_portc_w2))
MCFG_I8275_ADD("i8275", radio86_i8275_interface)
MCFG_DEVICE_ADD("i8275", I8275x, XTAL_16MHz / 9 / 4) // 1 dma transfer per char clock
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(radio86_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma8257",i8257n_device, dreq2_w))
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("i8275", i8275x_device, screen_update)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
MCFG_SCREEN_SIZE(78*6, 30*10)
MCFG_SCREEN_VISIBLE_AREA(0, 78*6-1, 0, 30*10-1)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", radio86)
@ -377,11 +377,12 @@ static MACHINE_CONFIG_START( radio86, radio86_state )
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MCFG_DEVICE_ADD("dma8257", I8257, XTAL_16MHz / 9)
MCFG_DEVICE_ADD("dma8257", I8257N, XTAL_16MHz / 9)
MCFG_I8257_OUT_HRQ_CB(WRITELINE(radio86_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(radio86_state, memory_read_byte))
MCFG_I8257_OUT_MEMW_CB(WRITE8(radio86_state, memory_write_byte))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275_device, dack_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("i8275", i8275x_device, dack_w))
MCFG_I8257_REVERSE_RW_MODE(1)
MCFG_CASSETTE_ADD( "cassette", radio86_cassette_interface )
MCFG_SOFTWARE_LIST_ADD("cass_list","radio86")

View File

@ -41,8 +41,8 @@ ToDo:
#include "machine/i8251.h"
#include "machine/pit8253.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "video/i8275.h"
#include "machine/i8257.h"
#include "video/i8275x.h"
#include "sound/speaker.h"
@ -69,9 +69,11 @@ public:
DECLARE_READ8_MEMBER(ppi1_c_r);
DECLARE_WRITE8_MEMBER(ppi1_a_w);
DECLARE_WRITE8_MEMBER(ppi1_c_w);
DECLARE_WRITE8_MEMBER(cpu_status_callback);
DECLARE_WRITE_LINE_MEMBER(hrq_w);
DECLARE_PALETTE_INIT(unior);
DECLARE_READ8_MEMBER(dma_r);
I8275_DRAW_CHARACTER_MEMBER(display_pixels);
UINT8 *m_p_vram;
UINT8 *m_p_chargen;
private:
@ -81,7 +83,7 @@ private:
virtual void video_start();
required_device<cpu_device> m_maincpu;
required_device<pit8253_device> m_pit;
required_device<i8257_device> m_dma;
required_device<i8257n_device> m_dma;
required_device<i8251_device> m_uart;
public:
required_device<palette_device> m_palette;
@ -96,11 +98,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( unior_io, AS_IO, 8, unior_state )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x30, 0x38) AM_DEVREADWRITE("dma", i8257_device, i8257_r, i8257_w) // dma data
AM_RANGE(0x30, 0x38) AM_DEVREADWRITE("dma", i8257n_device, read, write) // dma data
AM_RANGE(0x3c, 0x3f) AM_DEVREADWRITE("ppi0", i8255_device, read, write) // cassette player control
AM_RANGE(0x4c, 0x4f) AM_DEVREADWRITE("ppi1", i8255_device, read, write)
AM_RANGE(0x50, 0x50) AM_WRITE(scroll_w)
AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("crtc", i8275_device, read, write)
AM_RANGE(0x60, 0x61) AM_DEVREADWRITE("crtc", i8275x_device, read, write)
AM_RANGE(0xdc, 0xdf) AM_DEVREADWRITE("pit", pit8253_device, read, write )
AM_RANGE(0xec, 0xec) AM_DEVREADWRITE("uart",i8251_device, data_r, data_w)
AM_RANGE(0xed, 0xed) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w)
@ -256,11 +258,14 @@ WRITE8_MEMBER( unior_state::scroll_w )
memcpy(m_p_vram, m_p_vram+80, 24*80);
}
static I8275_DISPLAY_PIXELS(display_pixels)
I8275_DRAW_CHARACTER_MEMBER(unior_state::display_pixels)
{
unior_state *state = device->machine().driver_data<unior_state>();
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
UINT8 gfx = state->m_p_chargen[(linecount & 7) | (charcode << 3)];
const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 gfx = m_p_chargen[(linecount & 7) | (charcode << 3)];
if(linecount == 8)
return;
if (vsp)
gfx = 0;
@ -274,17 +279,6 @@ static I8275_DISPLAY_PIXELS(display_pixels)
bitmap.pix32(y, x + i) = palette[BIT(gfx, 5-i) ? (hlgt ? 2 : 1) : 0];
}
static const i8275_interface crtc_intf =
{
6,
0,
DEVCB_DEVICE_LINE_MEMBER("dma", i8257_device, i8257_drq2_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
display_pixels
};
static const rgb_t unior_palette[3] =
{
rgb_t(0x00, 0x00, 0x00), // black
@ -369,9 +363,10 @@ READ8_MEMBER(unior_state::dma_r)
return m_p_vram[offset & 0x7ff];
}
WRITE8_MEMBER( unior_state::cpu_status_callback )
WRITE_LINE_MEMBER( unior_state::hrq_w )
{
m_dma->i8257_hlda_w(BIT(data, 3));
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
m_dma->hlda_w(state);
}
@ -397,15 +392,13 @@ static MACHINE_CONFIG_START( unior, unior_state )
MCFG_CPU_ADD("maincpu",I8080, XTAL_20MHz / 9) // unknown clock
MCFG_CPU_PROGRAM_MAP(unior_mem)
MCFG_CPU_IO_MAP(unior_io)
MCFG_I8085A_STATUS(WRITE8(unior_state, cpu_status_callback))
/* 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, 200)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275x_device, screen_update)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", unior)
MCFG_PALETTE_ADD("palette", 3)
MCFG_PALETTE_INIT_OWNER(unior_state,unior)
@ -439,12 +432,16 @@ static MACHINE_CONFIG_START( unior, unior_state )
MCFG_I8255_IN_PORTC_CB(READ8(unior_state, ppi1_c_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(unior_state, ppi1_c_w))
MCFG_DEVICE_ADD("dma", I8257, XTAL_20MHz / 9) // unknown clock
MCFG_I8257_OUT_HRQ_CB(INPUTLINE("maincpu", I8085_HALT))
MCFG_I8257_OUT_MEMW_CB(DEVWRITE8("crtc", i8275_device, dack_w))
MCFG_I8257_IN_IOR_2_CB(READ8(unior_state, dma_r))
MCFG_DEVICE_ADD("dma", I8257N, XTAL_20MHz / 9) // unknown clock
MCFG_I8257_OUT_HRQ_CB(WRITELINE(unior_state, hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(unior_state, dma_r))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("crtc", i8275x_device, dack_w))
MCFG_I8275_ADD("crtc", crtc_intf)
MCFG_DEVICE_ADD("crtc", I8275x, XTAL_20MHz / 9 / 4) // unknown clock
MCFG_I8275_CHARACTER_WIDTH(6)
MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(unior_state, display_pixels)
MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma",i8257n_device, dreq2_w))
MCFG_VIDEO_SET_SCREEN("screen")
MACHINE_CONFIG_END
/* ROM definition */

View File

@ -8,8 +8,7 @@
#define partner_H_
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "machine/wd17xx.h"
#include "machine/wd_fdc.h"
#include "machine/ram.h"
class partner_state : public radio86_state
@ -29,24 +28,16 @@ public:
DECLARE_DRIVER_INIT(partner);
DECLARE_MACHINE_START(partner);
DECLARE_MACHINE_RESET(partner);
DECLARE_WRITE_LINE_MEMBER(partner_wd17xx_drq_w);
DECLARE_WRITE_LINE_MEMBER(hrq_w);
//to remove trampoline once it use new wd17xx core
DECLARE_READ8_MEMBER(partner_fdc_r);
DECLARE_WRITE8_MEMBER(partner_fdc_w);
I8275_DRAW_CHARACTER_MEMBER(display_pixels);
void partner_window_1(UINT8 bank_num, UINT16 offset,UINT8 *rom);
void partner_window_2(UINT8 bank_num, UINT16 offset,UINT8 *rom);
void partner_iomap_bank(UINT8 *rom);
void partner_bank_switch();
required_device<ram_device> m_ram;
required_device<fd1793_device> m_fdc;
required_device<fd1793_t> m_fdc;
DECLARE_FLOPPY_FORMATS( floppy_formats );
};
/*----------- defined in machine/partner.c -----------*/
extern const wd17xx_interface partner_wd17xx_interface;
#endif /* partner_H_ */

View File

@ -8,8 +8,8 @@
#define radio86_H_
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "video/i8275.h"
#include "machine/i8257.h"
#include "video/i8275x.h"
#include "imagedev/cassette.h"
@ -79,11 +79,12 @@ public:
DECLARE_WRITE8_MEMBER(mikrosha_8255_font_page_w);
DECLARE_READ8_MEMBER(memory_read_byte);
DECLARE_WRITE8_MEMBER(memory_write_byte);
I8275_DRAW_CHARACTER_MEMBER(display_pixels);
required_device<cpu_device> m_maincpu;
protected:
required_device<cassette_image_device> m_cassette;
optional_device<i8257_device> m_dma8257;
optional_device<i8257n_device> m_dma8257;
required_device<i8255_device> m_ppi8255_1;
optional_device<i8255_device> m_ppi8255_2;
required_memory_region m_region_maincpu;
@ -118,22 +119,4 @@ public:
INPUT_PORTS_EXTERN( radio86 );
INPUT_PORTS_EXTERN( ms7007 );
/*----------- defined in machine/radio86.c -----------*/
extern const i8275_interface radio86_i8275_interface;
extern const i8275_interface partner_i8275_interface;
extern const i8275_interface mikrosha_i8275_interface;
extern const i8275_interface apogee_i8275_interface;
extern void radio86_init_keyboard(running_machine &machine);
/*----------- defined in video/radio86.c -----------*/
extern I8275_DISPLAY_PIXELS(radio86_display_pixels);
extern I8275_DISPLAY_PIXELS(partner_display_pixels);
extern I8275_DISPLAY_PIXELS(mikrosha_display_pixels);
extern I8275_DISPLAY_PIXELS(apogee_display_pixels);
#endif /* radio86_H_ */

View File

@ -10,10 +10,6 @@
#include "emu.h"
#include "cpu/i8085/i8085.h"
#include "imagedev/cassette.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "machine/wd17xx.h"
#include "video/i8275.h"
#include "includes/radio86.h"
#include "includes/partner.h"
#include "imagedev/flopdrv.h"
@ -26,26 +22,6 @@ DRIVER_INIT_MEMBER(partner_state,partner)
m_tape_value = 0x80;
}
WRITE_LINE_MEMBER(partner_state::partner_wd17xx_drq_w)
{
i8257_device *device = machine().device<i8257_device>("dma8257");
if (state)
device->i8257_drq0_w(1);
}
const wd17xx_interface partner_wd17xx_interface =
{
DEVCB_LINE_GND,
DEVCB_NULL,
DEVCB_DRIVER_LINE_MEMBER(partner_state,partner_wd17xx_drq_w),
{FLOPPY_0, FLOPPY_1, NULL, NULL}
};
MACHINE_START_MEMBER(partner_state,partner)
{
m_fdc->set_pause_time(10);
}
void partner_state::partner_window_1(UINT8 bank_num, UINT16 offset,UINT8 *rom)
{
char bank[10];
@ -94,25 +70,30 @@ READ8_MEMBER(partner_state::partner_floppy_r){
WRITE8_MEMBER(partner_state::partner_floppy_w){
if (offset<0x100) {
switch(offset & 3) {
case 0x00 : m_fdc->command_w(space, 0,data); break;
case 0x00 : m_fdc->cmd_w(space, 0,data); break;
case 0x01 : m_fdc->track_w(space, 0,data);break;
case 0x02 : m_fdc->sector_w(space, 0,data);break;
default : m_fdc->data_w(space, 0,data);break;
}
} else {
floppy_get_device(machine(), 0)->floppy_mon_w(1);
floppy_get_device(machine(), 1)->floppy_mon_w(1);
floppy_image_device *floppy0 = m_fdc->subdevice<floppy_connector>("0")->get_device();
floppy_image_device *floppy1 = m_fdc->subdevice<floppy_connector>("1")->get_device();
if (((data >> 6) & 1)==1) {
m_fdc->set_drive(0);
floppy_get_device(machine(), 0)->floppy_mon_w(0);
floppy_get_device(machine(), 0)->floppy_drive_set_ready_state(1, 1);
m_fdc->set_floppy(floppy0);
floppy0->mon_w(0);
floppy0->ss_w(data >> 7);
}
else
floppy0->mon_w(1);
if (((data >> 3) & 1)==1) {
m_fdc->set_drive(1);
floppy_get_device(machine(), 1)->floppy_mon_w(0);
floppy_get_device(machine(), 1)->floppy_drive_set_ready_state(1, 1);
m_fdc->set_floppy(floppy1);
floppy1->mon_w(0);
floppy1->ss_w(data >> 7);
}
m_fdc->set_side(data >> 7);
else
floppy1->mon_w(1);
}
}
@ -349,23 +330,26 @@ WRITE8_MEMBER(partner_state::partner_mem_page_w)
partner_bank_switch();
}
WRITE_LINE_MEMBER(partner_state::hrq_w)
I8275_DRAW_CHARACTER_MEMBER(partner_state::display_pixels)
{
/* HACK - this should be connected to the BUSREQ line of Z80 */
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
/* HACK - this should be connected to the BUSACK line of Z80 */
machine().device<i8257_device>("dma8257")->i8257_hlda_w(state);
}
READ8_MEMBER(partner_state::partner_fdc_r)
{
return m_fdc->data_r(space,offset);
}
WRITE8_MEMBER(partner_state::partner_fdc_w)
{
m_fdc->data_w(space,offset,data);
int i;
const rgb_t *palette = m_palette->palette()->entry_list_raw();
const UINT8 *charmap = m_charmap + 0x400 * (gpa * 2 + hlgt);
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if(linecount == 8)
return;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1];
}
}
MACHINE_RESET_MEMBER(partner_state,partner)

View File

@ -10,8 +10,6 @@
#include "emu.h"
#include "cpu/i8085/i8085.h"
#include "machine/i8255.h"
#include "machine/8257dma.h"
#include "video/i8275.h"
#include "includes/radio86.h"
@ -99,7 +97,7 @@ WRITE_LINE_MEMBER(radio86_state::hrq_w)
m_maincpu->set_input_line(INPUT_LINE_HALT, state);
/* HACK - this should be connected to the BUSACK line of Z80 */
m_dma8257->i8257_hlda_w(state);
m_dma8257->hlda_w(state);
}
READ8_MEMBER(radio86_state::memory_read_byte)
@ -186,42 +184,41 @@ WRITE8_MEMBER(radio86_state::mikrosha_8255_font_page_w)
m_mikrosha_font_page = (data > 7) & 1;
}
const i8275_interface radio86_i8275_interface = {
6,
0,
DEVCB_DEVICE_LINE_MEMBER("dma8257", i8257_device, i8257_drq2_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
radio86_display_pixels
I8275_DRAW_CHARACTER_MEMBER(radio86_state::display_pixels)
{
int i;
const rgb_t *palette = m_palette->palette()->entry_list_raw();
const UINT8 *charmap = m_charmap;
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if(linecount == 8)
return;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
}
static const rgb_t radio86_palette[3] = {
rgb_t(0x00, 0x00, 0x00), // black
rgb_t(0xa0, 0xa0, 0xa0), // white
rgb_t(0xff, 0xff, 0xff) // highlight
};
const i8275_interface mikrosha_i8275_interface = {
6,
0,
DEVCB_DEVICE_LINE_MEMBER("dma8257", i8257_device, i8257_drq2_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
mikrosha_display_pixels
};
PALETTE_INIT_MEMBER(radio86_state,radio86)
{
palette.set_pen_colors(0, radio86_palette, ARRAY_LENGTH(radio86_palette));
}
const i8275_interface apogee_i8275_interface = {
6,
0,
DEVCB_DEVICE_LINE_MEMBER("dma8257", i8257_device, i8257_drq2_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
apogee_display_pixels
};
void radio86_state::video_start()
{
m_charmap = memregion("gfx1")->base();
}
const i8275_interface partner_i8275_interface = {
6,
1,
DEVCB_DEVICE_LINE_MEMBER("dma8257", i8257_device, i8257_drq2_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
partner_display_pixels
};

View File

@ -1628,7 +1628,6 @@ $(MESSOBJ)/psion.a: \
$(MESSOBJ)/radio.a: \
$(MESS_DRIVERS)/radio86.o \
$(MESS_MACHINE)/radio86.o \
$(MESS_VIDEO)/radio86.o \
$(MESS_DRIVERS)/apogee.o \
$(MESS_DRIVERS)/partner.o \
$(MESS_MACHINE)/partner.o \

View File

@ -1,113 +0,0 @@
/***************************************************************************
Radio-86RK video driver by Miodrag Milanovic
06/03/2008 Preliminary driver.
****************************************************************************/
#include "emu.h"
#include "video/i8275.h"
#include "includes/radio86.h"
I8275_DISPLAY_PIXELS(radio86_display_pixels)
{
radio86_state *state = device->machine().driver_data<radio86_state>();
int i;
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const UINT8 *charmap = state->m_charmap;
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
}
I8275_DISPLAY_PIXELS(mikrosha_display_pixels)
{
radio86_state *state = device->machine().driver_data<radio86_state>();
int i;
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const UINT8 *charmap = state->m_charmap + (state->m_mikrosha_font_page & 1) * 0x400;
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
}
I8275_DISPLAY_PIXELS(apogee_display_pixels)
{
radio86_state *state = device->machine().driver_data<radio86_state>();
int i;
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const UINT8 *charmap = state->m_charmap + (gpa & 1) * 0x400;
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1 ? (hlgt ? 2 : 1) : 0];
}
}
I8275_DISPLAY_PIXELS(partner_display_pixels)
{
radio86_state *state = device->machine().driver_data<radio86_state>();
int i;
const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
const UINT8 *charmap = state->m_charmap + 0x400 * (gpa * 2 + hlgt);
UINT8 pixels = charmap[(linecount & 7) + (charcode << 3)] ^ 0xff;
if (vsp) {
pixels = 0;
}
if (lten) {
pixels = 0xff;
}
if (rvv) {
pixels ^= 0xff;
}
for(i=0;i<6;i++) {
bitmap.pix32(y, x + i) = palette[(pixels >> (5-i)) & 1];
}
}
static const rgb_t radio86_palette[3] = {
rgb_t(0x00, 0x00, 0x00), // black
rgb_t(0xa0, 0xa0, 0xa0), // white
rgb_t(0xff, 0xff, 0xff) // highlight
};
PALETTE_INIT_MEMBER(radio86_state,radio86)
{
palette.set_pen_colors(0, radio86_palette, ARRAY_LENGTH(radio86_palette));
}
void radio86_state::video_start()
{
m_charmap = memregion("gfx1")->base();
}