diff options
author | 2014-04-30 04:13:31 +0000 | |
---|---|---|
committer | 2014-04-30 04:13:31 +0000 | |
commit | 194b93093425ccc6598fe888db4005d651d3d6e1 (patch) | |
tree | fbec0e100e10d4c93de5ff635e3f6f43504c81b6 | |
parent | 3ec0e3224aceb284d630c8e4d5dadd4187970aad (diff) |
(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.
-rw-r--r-- | .gitattributes | 1 | ||||
-rw-r--r-- | src/emu/machine/i8257.c | 83 | ||||
-rw-r--r-- | src/emu/machine/i8257.h | 42 | ||||
-rw-r--r-- | src/emu/video/i8275x.c | 11 | ||||
-rw-r--r-- | src/mess/drivers/apogee.c | 42 | ||||
-rw-r--r-- | src/mess/drivers/fanucspmg.c | 12 | ||||
-rw-r--r-- | src/mess/drivers/mikrosha.c | 42 | ||||
-rw-r--r-- | src/mess/drivers/partner.c | 61 | ||||
-rw-r--r-- | src/mess/drivers/pc8001.c | 14 | ||||
-rw-r--r-- | src/mess/drivers/radio86.c | 39 | ||||
-rw-r--r-- | src/mess/drivers/unior.c | 59 | ||||
-rw-r--r-- | src/mess/includes/partner.h | 17 | ||||
-rw-r--r-- | src/mess/includes/radio86.h | 25 | ||||
-rw-r--r-- | src/mess/machine/partner.c | 84 | ||||
-rw-r--r-- | src/mess/machine/radio86.c | 73 | ||||
-rw-r--r-- | src/mess/mess.mak | 1 | ||||
-rw-r--r-- | src/mess/video/radio86.c | 113 |
17 files changed, 313 insertions, 406 deletions
diff --git a/.gitattributes b/.gitattributes index 8468c261350..059e893bf4c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/src/emu/machine/i8257.c b/src/emu/machine/i8257.c index a6a521de0c4..6de5771afbe 100644 --- a/src/emu/machine/i8257.c +++ b/src/emu/machine/i8257.c @@ -219,22 +219,35 @@ inline void i8257n_device::dma_write() // end_of_process - //------------------------------------------------- -inline void i8257n_device::end_of_process() +inline void i8257n_device::advance() { - m_status |= 1 << m_current_channel; - m_request &= ~(1 << m_current_channel); - set_tc(1); + bool tc = (m_channel[m_current_channel].m_count == 0); + bool al = (MODE_AUTOLOAD && (m_current_channel == 2)); - if (MODE_AUTOLOAD && (m_current_channel == 2)) + if(tc) { - // autoinitialize - m_channel[2].m_address = m_channel[3].m_address; - m_channel[2].m_count = m_channel[3].m_count; - m_channel[2].m_mode = m_channel[3].m_mode; + m_status |= 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(al) + { + // autoinitialize + m_channel[2].m_address = m_channel[3].m_address; + m_channel[2].m_count = m_channel[3].m_count; + m_channel[2].m_mode = m_channel[3].m_mode; + } + 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++; } - else if(MODE_TC_STOP) - // disable channel - m_transfer_mode &= ~(1 << m_current_channel); } @@ -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 diff --git a/src/emu/machine/i8257.h b/src/emu/machine/i8257.h index ad0f4199dd7..8de8bb13ca4 100644 --- a/src/emu/machine/i8257.h +++ b/src/emu/machine/i8257.h @@ -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; diff --git a/src/emu/video/i8275x.c b/src/emu/video/i8275x.c index 625b46584b2..11429583c07 100644 --- a/src/emu/video/i8275x.c +++ b/src/emu/video/i8275x.c @@ -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 diff --git a/src/mess/drivers/apogee.c b/src/mess/drivers/apogee.c index 949ec99a07e..f8d3dac2cc7 100644 --- a/src/mess/drivers/apogee.c +++ b/src/mess/drivers/apogee.c @@ -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") diff --git a/src/mess/drivers/fanucspmg.c b/src/mess/drivers/fanucspmg.c index 910d855de88..4b22fc6cd00 100644 --- a/src/mess/drivers/fanucspmg.c +++ b/src/mess/drivers/fanucspmg.c @@ -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) diff --git a/src/mess/drivers/mikrosha.c b/src/mess/drivers/mikrosha.c index 3f7a6c83d41..74a85ff8e3e 100644 --- a/src/mess/drivers/mikrosha.c +++ b/src/mess/drivers/mikrosha.c @@ -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") diff --git a/src/mess/drivers/partner.c b/src/mess/drivers/partner.c index 0380fb3c06b..e9c3742ce65 100644 --- a/src/mess/drivers/partner.c +++ b/src/mess/drivers/partner.c @@ -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 */ diff --git a/src/mess/drivers/pc8001.c b/src/mess/drivers/pc8001.c index b544c58ca45..a1164ca51a2 100644 --- a/src/mess/drivers/pc8001.c +++ b/src/mess/drivers/pc8001.c @@ -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) diff --git a/src/mess/drivers/radio86.c b/src/mess/drivers/radio86.c index 9b44a76ac1a..9aa27038f7a 100644 --- a/src/mess/drivers/radio86.c +++ b/src/mess/drivers/radio86.c @@ -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") diff --git a/src/mess/drivers/unior.c b/src/mess/drivers/unior.c index 05d65c6ecfb..5eb4c367d7b 100644 --- a/src/mess/drivers/unior.c +++ b/src/mess/drivers/unior.c @@ -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 */ diff --git a/src/mess/includes/partner.h b/src/mess/includes/partner.h index 2efc3c67b57..f4d9e845345 100644 --- a/src/mess/includes/partner.h +++ b/src/mess/includes/partner.h @@ -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_ */ diff --git a/src/mess/includes/radio86.h b/src/mess/includes/radio86.h index 0f797a3f453..5105351e802 100644 --- a/src/mess/includes/radio86.h +++ b/src/mess/includes/radio86.h @@ -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_ */ diff --git a/src/mess/machine/partner.c b/src/mess/machine/partner.c index 6f896573bf0..0ee65a4186c 100644 --- a/src/mess/machine/partner.c +++ b/src/mess/machine/partner.c @@ -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) diff --git a/src/mess/machine/radio86.c b/src/mess/machine/radio86.c index db4b903f230..ff0949490b4 100644 --- a/src/mess/machine/radio86.c +++ b/src/mess/machine/radio86.c @@ -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]; + } +} -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 +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 apogee_i8275_interface = { - 6, - 0, - DEVCB_DEVICE_LINE_MEMBER("dma8257", i8257_device, i8257_drq2_w), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - apogee_display_pixels -}; +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(); +} -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 -}; diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 38b800a8a87..3bac83c732f 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -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 \ diff --git a/src/mess/video/radio86.c b/src/mess/video/radio86.c deleted file mode 100644 index 97a7ddf3e79..00000000000 --- a/src/mess/video/radio86.c +++ /dev/null @@ -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(); -} |