pmd85: cleanup; added sound.

This commit is contained in:
Robbbert 2020-08-07 02:46:28 +10:00
parent aa1ef0b0f4
commit 830c6299a8
4 changed files with 688 additions and 725 deletions

File diff suppressed because it is too large Load Diff

View File

@ -27,18 +27,18 @@ Notes on emulation status and to do list:
----------------------------------------- -----------------------------------------
1. V.24. 1. V.24.
2. Tape emulation for other machines than PMD-85.1. 2. Flash video attribute.
3. Flash video attribute. 3. External interfaces connectors (K2-K5).
4. External interfaces connectors (K2-K5). 4. C2717PMD is marked MNW, but there's nothing to say why.
5. Speaker. 5. Verify PMD-85.2A, PMD-85.3, Didaktik Alfa and Mato monitor roms.
6. Verify PMD-85.2A, PMD-85.3, Didaktik Alfa and Mato monitor roms. 6. Verify all Basic roms.
7. Verify all Basic roms. 7. 8251 in Didaktik Alfa.
8. 8251 in Didaktik Alfa. 8. Colors (if any). Seems most versions supported 4 colours via RGB connector. But, the TV modulator only carried the G line.
9. Colors (if any). The video signals are developed in a forest of gates which may take a while to work out.
10. PMD-85, Didaktik Alfa 2 and Didaktik Beta (ROMs and documentation needed). 9. PMD-85, Didaktik Alfa 2 and Didaktik Beta (ROMs and documentation needed).
11. FDD interface (ROMs and disk images needed). 10. FDD interface (ROMs and disk images needed).
12. "Duch & Pampuch" Mato game displays scores with incorrect characters. 11. "Duch & Pampuch" Mato game displays scores with incorrect characters.
13. Tape save in pmd851 is badly formatted - cannot be loaded.
PMD-85 technical information PMD-85 technical information
============================ ============================
@ -183,47 +183,50 @@ SUB aaaa bb cc dd... - write bytes to memory starting at aaaa with bb,cc,dd...
Cassette Cassette
-------- --------
The systems belong to 3 groups which are not compatible with each other.
- pmd851, alfa
- mato
- pmd852, pmd852a, pmd852b, pmd853, c2717, c2717pmd
Cassettes tested with Basic Cassettes tested with Basic
- pmd852,pmd852a,pmd852b,pmd853,c2717,c2717pmd - these can save and load back their own files - pmd852,pmd852a,pmd852b,pmd853,c2717,c2717pmd - these can save and load back their own files
- pmd851 - won't go into basic - pmd851,mato,alfa - not tested yet.
- mato,alfa - don't come with basic?
Software list items Getting into Basic:
- mato - not compatible - pmd852,pmd852a,pmd852b,pmd853 : In the Machine Configuration, enable Basic and Reset.
- all others - recognise headers of sw-item-tapes, but won't load? Maybe the usage is not understood properly. - pmd851,alfa : type BASIC 00 (or any parameter)
- mato : type BASIC
- c2717,c2717pmd : you're already in Basic.
- How to get out? Unknown.
- Some software items will crash the emulator, for example >mame pmd851 bdash Loading a tape:
- In the monitor : type MGLD <fn>, where <fn> is the file number, usually 00. File numbers will be shown in the
software list usage.
- In Basic : type LOAD <fn>, where <fn> is the same as above.
- The tape can only be loaded into the environment it's meant for. Otherwise, you'll only get header information
followed by a freeze.
Header information from what I can understand Header information from what I can understand: xx/z yyyyyyyy
xx/z yyyyyyyy yyyyyyyy = filename
xx = file number xx = file number
z = status code (guesses below) z = status code (guesses below)
> - only loadable by Basic > - only loadable by Basic
? - only loadable by the monitor - it gives no clue as to the exec address ? - only loadable by the monitor - it gives no clue as to the exec address, but should start by itself if it's
P - protected? I've had no luck getting one to load been saved correctly.
yyyyyyyy = filename x - other codes are added by the user and have program-specific meanings.
Software list items: Some work, some don't, and some only work on certain machines. A test with "bludiste"
(a monitor program) produced the following:
- pmd851,pmd852,pmd852a,pmd852b,alfa - loads and runs
- c2717,c2717pmd - recognises and prints the header, but then doesn't load the tape, because the machine is
stuck in Basic.
- mato,pmd853 - does nothing
Some software items will crash MAME, for example "bdash".
*******************************************************************************************************************/ *******************************************************************************************************************/
#include "emu.h" #include "emu.h"
#include "includes/pmd85.h" #include "includes/pmd85.h"
#include "cpu/i8085/i8085.h" #include "cpu/i8085/i8085.h"
#include "imagedev/cassette.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
#include "machine/pit8253.h"
#include "machine/ram.h"
#include "screen.h" #include "screen.h"
#include "softlist.h"
#include "speaker.h" #include "speaker.h"
#include "formats/pmd_cas.h" #include "formats/pmd_cas.h"
@ -231,7 +234,7 @@ yyyyyyyy = filename
// VIDEO EMULATION // VIDEO EMULATION
//************************************************************************** //**************************************************************************
uint32_t pmd85_state::screen_update_pmd85(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) uint32_t pmd85_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{ {
for (int y = 0; y < 256; y++) for (int y = 0; y < 256; y++)
{ {
@ -258,12 +261,12 @@ uint32_t pmd85_state::screen_update_pmd85(screen_device &screen, bitmap_ind16 &b
/* I/O ports */ /* I/O ports */
void pmd85_state::pmd85_io_map(address_map &map) void pmd85_state::pmd85_io(address_map &map)
{ {
map(0x00, 0xff).rw(FUNC(pmd85_state::pmd85_io_r), FUNC(pmd85_state::pmd85_io_w)); map(0x00, 0xff).rw(FUNC(pmd85_state::io_r), FUNC(pmd85_state::io_w));
} }
void pmd85_state::mato_io_map(address_map &map) void pmd85_state::mato_io(address_map &map)
{ {
map(0x00, 0xff).rw(FUNC(pmd85_state::mato_io_r), FUNC(pmd85_state::mato_io_w)); map(0x00, 0xff).rw(FUNC(pmd85_state::mato_io_r), FUNC(pmd85_state::mato_io_w));
} }
@ -278,9 +281,7 @@ void pmd85_state::pmd85_mem(address_map &map)
map(0x3000, 0x3fff).bankrw("bank4"); map(0x3000, 0x3fff).bankrw("bank4");
map(0x4000, 0x7fff).bankrw("bank5"); map(0x4000, 0x7fff).bankrw("bank5");
map(0x8000, 0x8fff).bankr("bank6"); map(0x8000, 0x8fff).bankr("bank6");
map(0x9000, 0x9fff).noprw();
map(0xa000, 0xafff).bankr("bank7"); map(0xa000, 0xafff).bankr("bank7");
map(0xb000, 0xbfff).noprw();
map(0xc000, 0xffff).bankrw("bank8"); map(0xc000, 0xffff).bankrw("bank8");
} }
@ -318,7 +319,6 @@ void pmd85_state::alfa_mem(address_map &map)
map(0x4000, 0x7fff).bankrw("bank4"); map(0x4000, 0x7fff).bankrw("bank4");
map(0x8000, 0x8fff).bankr("bank5"); map(0x8000, 0x8fff).bankr("bank5");
map(0x9000, 0xb3ff).bankr("bank6"); map(0x9000, 0xb3ff).bankr("bank6");
map(0xb400, 0xbfff).noprw();
map(0xc000, 0xffff).bankrw("bank7"); map(0xc000, 0xffff).bankrw("bank7");
} }
@ -518,7 +518,7 @@ static INPUT_PORTS_START( alfa )
PORT_INCLUDE( pmd85 ) PORT_INCLUDE( pmd85 )
PORT_MODIFY( "DSW0" ) PORT_MODIFY( "DSW0" )
PORT_BIT( 0x01, 0x00, IPT_UNUSED ) PORT_BIT( 0x01, 0x01, IPT_UNUSED )
INPUT_PORTS_END INPUT_PORTS_END
@ -623,7 +623,7 @@ void pmd85_state::pmd85(machine_config &config, bool with_uart)
/* basic machine hardware */ /* basic machine hardware */
I8080(config, m_maincpu, XTAL(18'432'000)/9); I8080(config, m_maincpu, XTAL(18'432'000)/9);
m_maincpu->set_addrmap(AS_PROGRAM, &pmd85_state::pmd85_mem); m_maincpu->set_addrmap(AS_PROGRAM, &pmd85_state::pmd85_mem);
m_maincpu->set_addrmap(AS_IO, &pmd85_state::pmd85_io_map); m_maincpu->set_addrmap(AS_IO, &pmd85_state::pmd85_io);
config.set_maximum_quantum(attotime::from_hz(60)); config.set_maximum_quantum(attotime::from_hz(60));
@ -647,10 +647,10 @@ void pmd85_state::pmd85(machine_config &config, bool with_uart)
*******************************************************************************/ *******************************************************************************/
PIT8253(config, m_pit8253, 0); PIT8253(config, m_pit, 0);
m_pit8253->set_clk<0>(0); m_pit->set_clk<0>(0);
m_pit8253->set_clk<1>(XTAL(18'432'000)/9); m_pit->set_clk<1>(XTAL(18'432'000)/9);
m_pit8253->set_clk<2>(1); m_pit->set_clk<2>(1);
/* video hardware */ /* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@ -659,13 +659,14 @@ void pmd85_state::pmd85(machine_config &config, bool with_uart)
screen.set_vblank_time(0); screen.set_vblank_time(0);
screen.set_size(288, 256); screen.set_size(288, 256);
screen.set_visarea(0, 288-1, 0, 256-1); screen.set_visarea(0, 288-1, 0, 256-1);
screen.set_screen_update(FUNC(pmd85_state::screen_update_pmd85)); screen.set_screen_update(FUNC(pmd85_state::screen_update));
screen.set_palette(m_palette); screen.set_palette(m_palette);
PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT); PALETTE(config, m_palette, palette_device::MONOCHROME_HIGHLIGHT);
/* sound hardware */ /* sound hardware */
SPEAKER(config, "mono").front_center(); SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 0.50);
/* cassette */ /* cassette */
CASSETTE(config, m_cassette); CASSETTE(config, m_cassette);
@ -687,44 +688,44 @@ void pmd85_state::pmd85(machine_config &config, bool with_uart)
} }
/* internal ram */ /* internal ram */
RAM(config, m_ram).set_default_size("64K"); RAM(config, m_ram).set_default_size("64K").set_default_value(0x00);
} }
void pmd85_state::pmd851(machine_config &config) void pmd85_state::pmd851(machine_config &config)
{ {
pmd85(config); pmd85(config);
I8255(config, m_ppi8255_0, 0); I8255(config, m_ppi0, 0);
m_ppi8255_0->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_0_porta_r)); m_ppi0->in_pa_callback().set(FUNC(pmd85_state::ppi0_porta_r));
m_ppi8255_0->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portb_r)); m_ppi0->in_pb_callback().set(FUNC(pmd85_state::ppi0_portb_r));
m_ppi8255_0->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portc_r)); m_ppi0->in_pc_callback().set(FUNC(pmd85_state::ppi0_portc_r));
m_ppi8255_0->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_0_porta_w)); m_ppi0->out_pa_callback().set(FUNC(pmd85_state::ppi0_porta_w));
m_ppi8255_0->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portb_w)); m_ppi0->out_pb_callback().set(FUNC(pmd85_state::ppi0_portb_w));
m_ppi8255_0->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portc_w)); m_ppi0->out_pc_callback().set(FUNC(pmd85_state::ppi0_portc_w));
I8255(config, m_ppi8255_1, 0); I8255(config, m_ppi1, 0);
m_ppi8255_1->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_1_porta_r)); m_ppi1->in_pa_callback().set(FUNC(pmd85_state::ppi1_porta_r));
m_ppi8255_1->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portb_r)); m_ppi1->in_pb_callback().set(FUNC(pmd85_state::ppi1_portb_r));
m_ppi8255_1->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portc_r)); m_ppi1->in_pc_callback().set(FUNC(pmd85_state::ppi1_portc_r));
m_ppi8255_1->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_1_porta_w)); m_ppi1->out_pa_callback().set(FUNC(pmd85_state::ppi1_porta_w));
m_ppi8255_1->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portb_w)); m_ppi1->out_pb_callback().set(FUNC(pmd85_state::ppi1_portb_w));
m_ppi8255_1->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portc_w)); m_ppi1->out_pc_callback().set(FUNC(pmd85_state::ppi1_portc_w));
I8255(config, m_ppi8255_2, 0); I8255(config, m_ppi2, 0);
m_ppi8255_2->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_2_porta_r)); m_ppi2->in_pa_callback().set(FUNC(pmd85_state::ppi2_porta_r));
m_ppi8255_2->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portb_r)); m_ppi2->in_pb_callback().set(FUNC(pmd85_state::ppi2_portb_r));
m_ppi8255_2->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portc_r)); m_ppi2->in_pc_callback().set(FUNC(pmd85_state::ppi2_portc_r));
m_ppi8255_2->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_2_porta_w)); m_ppi2->out_pa_callback().set(FUNC(pmd85_state::ppi2_porta_w));
m_ppi8255_2->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portb_w)); m_ppi2->out_pb_callback().set(FUNC(pmd85_state::ppi2_portb_w));
m_ppi8255_2->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portc_w)); m_ppi2->out_pc_callback().set(FUNC(pmd85_state::ppi2_portc_w));
I8255(config, m_ppi8255_3, 0); I8255(config, m_ppi3, 0);
m_ppi8255_3->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_3_porta_r)); m_ppi3->in_pa_callback().set(FUNC(pmd85_state::ppi3_porta_r));
m_ppi8255_3->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_3_portb_r)); m_ppi3->in_pb_callback().set(FUNC(pmd85_state::ppi3_portb_r));
m_ppi8255_3->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_3_portc_r)); m_ppi3->in_pc_callback().set(FUNC(pmd85_state::ppi3_portc_r));
m_ppi8255_3->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_3_porta_w)); m_ppi3->out_pa_callback().set(FUNC(pmd85_state::ppi3_porta_w));
m_ppi8255_3->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_3_portb_w)); m_ppi3->out_pb_callback().set(FUNC(pmd85_state::ppi3_portb_w));
m_ppi8255_3->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_3_portc_w)); m_ppi3->out_pc_callback().set(FUNC(pmd85_state::ppi3_portc_w));
} }
void pmd85_state::pmd852a(machine_config &config) void pmd85_state::pmd852a(machine_config &config)
@ -744,44 +745,44 @@ void pmd85_state::alfa(machine_config &config)
pmd85(config); pmd85(config);
m_maincpu->set_addrmap(AS_PROGRAM, &pmd85_state::alfa_mem); m_maincpu->set_addrmap(AS_PROGRAM, &pmd85_state::alfa_mem);
I8255(config, m_ppi8255_0, 0); I8255(config, m_ppi0, 0);
m_ppi8255_0->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_0_porta_r)); m_ppi0->in_pa_callback().set(FUNC(pmd85_state::ppi0_porta_r));
m_ppi8255_0->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portb_r)); m_ppi0->in_pb_callback().set(FUNC(pmd85_state::ppi0_portb_r));
m_ppi8255_0->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portc_r)); m_ppi0->in_pc_callback().set(FUNC(pmd85_state::ppi0_portc_r));
m_ppi8255_0->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_0_porta_w)); m_ppi0->out_pa_callback().set(FUNC(pmd85_state::ppi0_porta_w));
m_ppi8255_0->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portb_w)); m_ppi0->out_pb_callback().set(FUNC(pmd85_state::ppi0_portb_w));
m_ppi8255_0->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portc_w)); m_ppi0->out_pc_callback().set(FUNC(pmd85_state::ppi0_portc_w));
I8255(config, m_ppi8255_1, 0); I8255(config, m_ppi1, 0);
m_ppi8255_1->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_1_porta_r)); m_ppi1->in_pa_callback().set(FUNC(pmd85_state::ppi1_porta_r));
m_ppi8255_1->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portb_r)); m_ppi1->in_pb_callback().set(FUNC(pmd85_state::ppi1_portb_r));
m_ppi8255_1->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portc_r)); m_ppi1->in_pc_callback().set(FUNC(pmd85_state::ppi1_portc_r));
m_ppi8255_1->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_1_porta_w)); m_ppi1->out_pa_callback().set(FUNC(pmd85_state::ppi1_porta_w));
m_ppi8255_1->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portb_w)); m_ppi1->out_pb_callback().set(FUNC(pmd85_state::ppi1_portb_w));
m_ppi8255_1->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_1_portc_w)); m_ppi1->out_pc_callback().set(FUNC(pmd85_state::ppi1_portc_w));
I8255(config, m_ppi8255_2, 0); I8255(config, m_ppi2, 0);
m_ppi8255_2->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_2_porta_r)); m_ppi2->in_pa_callback().set(FUNC(pmd85_state::ppi2_porta_r));
m_ppi8255_2->in_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portb_r)); m_ppi2->in_pb_callback().set(FUNC(pmd85_state::ppi2_portb_r));
m_ppi8255_2->in_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portc_r)); m_ppi2->in_pc_callback().set(FUNC(pmd85_state::ppi2_portc_r));
m_ppi8255_2->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_2_porta_w)); m_ppi2->out_pa_callback().set(FUNC(pmd85_state::ppi2_porta_w));
m_ppi8255_2->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portb_w)); m_ppi2->out_pb_callback().set(FUNC(pmd85_state::ppi2_portb_w));
m_ppi8255_2->out_pc_callback().set(FUNC(pmd85_state::pmd85_ppi_2_portc_w)); m_ppi2->out_pc_callback().set(FUNC(pmd85_state::ppi2_portc_w));
} }
void pmd85_state::mato(machine_config &config) void pmd85_state::mato(machine_config &config)
{ {
pmd85(config, false); /* no uart */ pmd85(config, false); /* no uart */
m_maincpu->set_addrmap(AS_PROGRAM, &pmd85_state::mato_mem); m_maincpu->set_addrmap(AS_PROGRAM, &pmd85_state::mato_mem);
m_maincpu->set_addrmap(AS_IO, &pmd85_state::mato_io_map); m_maincpu->set_addrmap(AS_IO, &pmd85_state::mato_io);
I8255(config, m_ppi8255_0, 0); I8255(config, m_ppi0, 0);
m_ppi8255_0->in_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_0_porta_r)); m_ppi0->in_pa_callback().set(FUNC(pmd85_state::ppi0_porta_r));
m_ppi8255_0->out_pa_callback().set(FUNC(pmd85_state::pmd85_ppi_0_porta_w)); m_ppi0->out_pa_callback().set(FUNC(pmd85_state::ppi0_porta_w));
m_ppi8255_0->in_pb_callback().set(FUNC(pmd85_state::mato_ppi_0_portb_r)); m_ppi0->in_pb_callback().set(FUNC(pmd85_state::mato_ppi0_portb_r));
m_ppi8255_0->out_pb_callback().set(FUNC(pmd85_state::pmd85_ppi_0_portb_w)); m_ppi0->out_pb_callback().set(FUNC(pmd85_state::ppi0_portb_w));
m_ppi8255_0->in_pc_callback().set(FUNC(pmd85_state::mato_ppi_0_portc_r)); m_ppi0->in_pc_callback().set(FUNC(pmd85_state::mato_ppi0_portc_r));
m_ppi8255_0->out_pc_callback().set(FUNC(pmd85_state::mato_ppi_0_portc_w)); m_ppi0->out_pc_callback().set(FUNC(pmd85_state::mato_ppi0_portc_w));
} }
void pmd85_state::c2717(machine_config &config) void pmd85_state::c2717(machine_config &config)
@ -792,82 +793,87 @@ void pmd85_state::c2717(machine_config &config)
ROM_START(pmd851) ROM_START(pmd851)
ROM_REGION(0x11000,"maincpu",0) ROM_REGION(0x1000,"maincpu",0)
ROM_LOAD("pmd85-1.bin", 0x10000, 0x1000, CRC(ef50b416) SHA1(afa3ec0d03228adc5287a4cba905ce7ad0497dff)) ROM_LOAD("pmd85-1.bin", 0x0000, 0x1000, CRC(ef50b416) SHA1(afa3ec0d03228adc5287a4cba905ce7ad0497dff))
ROM_REGION(0x2400,"user1",0) ROM_REGION(0x2400,"user1",0)
ROM_LOAD_OPTIONAL("pmd85-1.bas", 0x0000, 0x2400, CRC(4fc37d45) SHA1(3bd0f92f37a3f2ee539916dc75508bda37433a72)) ROM_LOAD("pmd85-1.bas", 0x0000, 0x2400, CRC(4fc37d45) SHA1(3bd0f92f37a3f2ee539916dc75508bda37433a72))
ROM_END ROM_END
ROM_START(pmd852) ROM_START(pmd852)
ROM_REGION(0x11000,"maincpu",0) ROM_REGION(0x1000,"maincpu",0)
ROM_LOAD("pmd85-2.bin", 0x10000, 0x1000, CRC(d4786f63) SHA1(6facdf37bb012714244b012a0c4bd715a956e42b)) ROM_LOAD("pmd85-2.bin", 0x0000, 0x1000, CRC(d4786f63) SHA1(6facdf37bb012714244b012a0c4bd715a956e42b))
ROM_REGION(0x2400,"user1",0) ROM_REGION(0x2400,"user1",0)
ROM_LOAD_OPTIONAL("pmd85-2.bas", 0x0000, 0x2400, CRC(fc4a3ebf) SHA1(3bfc0e9a5cd5187da573b5d539d7246358125a88)) ROM_LOAD("pmd85-2.bas", 0x0000, 0x2400, CRC(fc4a3ebf) SHA1(3bfc0e9a5cd5187da573b5d539d7246358125a88))
ROM_END ROM_END
ROM_START(pmd852a) ROM_START(pmd852a)
ROM_REGION(0x11000,"maincpu",0) ROM_REGION(0x1000,"maincpu",0)
ROM_LOAD("pmd85-2a.bin", 0x10000, 0x1000, CRC(5a9a961b) SHA1(7363341596367d08b9a98767c6585ce18dfd03af)) ROM_LOAD("pmd85-2a.bin", 0x0000, 0x1000, CRC(5a9a961b) SHA1(7363341596367d08b9a98767c6585ce18dfd03af))
ROM_REGION(0x2400,"user1",0) ROM_REGION(0x2400,"user1",0)
ROM_LOAD_OPTIONAL("pmd85-2a.bas", 0x0000, 0x2400, CRC(6ff379ad) SHA1(edcaf2420cac9771596ead5c86c41116b228eca3)) ROM_LOAD("pmd85-2a.bas", 0x0000, 0x2400, CRC(6ff379ad) SHA1(edcaf2420cac9771596ead5c86c41116b228eca3))
ROM_END ROM_END
ROM_START(pmd852b) ROM_START(pmd852b)
ROM_REGION(0x11000,"maincpu",0) ROM_REGION(0x1000,"maincpu",0)
ROM_LOAD("pmd85-2a.bin", 0x10000, 0x1000, CRC(5a9a961b) SHA1(7363341596367d08b9a98767c6585ce18dfd03af)) ROM_LOAD("pmd85-2a.bin", 0x0000, 0x1000, CRC(5a9a961b) SHA1(7363341596367d08b9a98767c6585ce18dfd03af))
ROM_REGION(0x2400,"user1",0) ROM_REGION(0x2400,"user1",0)
ROM_LOAD_OPTIONAL("pmd85-2a.bas", 0x0000, 0x2400, CRC(6ff379ad) SHA1(edcaf2420cac9771596ead5c86c41116b228eca3)) ROM_LOAD("pmd85-2a.bas", 0x0000, 0x2400, CRC(6ff379ad) SHA1(edcaf2420cac9771596ead5c86c41116b228eca3))
ROM_END ROM_END
ROM_START(pmd853) ROM_START(pmd853)
ROM_REGION(0x12000,"maincpu",0) ROM_REGION(0x2000,"maincpu",0)
ROM_LOAD("pmd85-3.bin", 0x10000, 0x2000, CRC(83e22c47) SHA1(5f131e27ae3ec8907adbe5cd228c67d131066084)) ROM_LOAD("pmd85-3.bin", 0x0000, 0x2000, CRC(83e22c47) SHA1(5f131e27ae3ec8907adbe5cd228c67d131066084))
ROM_REGION(0x2800,"user1",0) ROM_REGION(0x2800,"user1",0)
ROM_LOAD_OPTIONAL("pmd85-3.bas", 0x0000, 0x2800, CRC(1e30e91d) SHA1(d086040abf4c0a7e5da8cf4db7d1668a1d9309a4)) ROM_LOAD("pmd85-3.bas", 0x0000, 0x2800, CRC(1e30e91d) SHA1(d086040abf4c0a7e5da8cf4db7d1668a1d9309a4))
ROM_END ROM_END
ROM_START(alfa) ROM_START(alfa)
ROM_REGION(0x13400,"maincpu",0) ROM_REGION(0x3400,"maincpu",0)
ROM_LOAD("alfa.bin", 0x10000, 0x1000, CRC(e425eedb) SHA1(db93b5de1e16b5ae71be08feb083a2ac15759495)) ROM_LOAD("alfa.bin", 0x0000, 0x1000, CRC(e425eedb) SHA1(db93b5de1e16b5ae71be08feb083a2ac15759495))
ROM_LOAD("alfa.bas", 0x11000, 0x2400, CRC(9a73bfd2) SHA1(74314d989846f64e715f64deb84cb177fa62f4a9)) ROM_LOAD("alfa.bas", 0x1000, 0x2400, CRC(9a73bfd2) SHA1(74314d989846f64e715f64deb84cb177fa62f4a9))
ROM_END ROM_END
ROM_START(mato) ROM_START(mato)
ROM_REGION(0x14000,"maincpu",0) ROM_REGION(0x4000,"maincpu",0)
ROM_SYSTEM_BIOS(0, "default", "BASIC") ROM_SYSTEM_BIOS(0, "default", "BASIC")
ROMX_LOAD("mato.bin", 0x10000, 0x4000, CRC(574110a6) SHA1(4ff2cd4b07a1a700c55f92e5b381c04f758fb461), ROM_BIOS(0)) ROMX_LOAD("mato.bin", 0x0000, 0x4000, CRC(574110a6) SHA1(4ff2cd4b07a1a700c55f92e5b381c04f758fb461), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "ru", "Russian") ROM_SYSTEM_BIOS(1, "ru", "Russian")
ROMX_LOAD("mato-ru.rom", 0x10000, 0x4000, CRC(44b68be4) SHA1(0d9ea9a9380e2af011a2f0b64c534dd0eb0a1fac), ROM_BIOS(1)) ROMX_LOAD("mato-ru.rom", 0x0000, 0x4000, CRC(44b68be4) SHA1(0d9ea9a9380e2af011a2f0b64c534dd0eb0a1fac), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "lan", "BASIC LAN") ROM_SYSTEM_BIOS(2, "lan", "BASIC LAN")
ROMX_LOAD("mato-lan.rom", 0x10000, 0x4000, CRC(422cddde) SHA1(2a3dacf8e3e7637109c9d267f589a00881e9a5f4), ROM_BIOS(2)) ROMX_LOAD("mato-lan.rom", 0x0000, 0x4000, CRC(422cddde) SHA1(2a3dacf8e3e7637109c9d267f589a00881e9a5f4), ROM_BIOS(2))
ROM_SYSTEM_BIOS(3, "games", "Games v1") ROM_SYSTEM_BIOS(3, "games", "Games v1")
ROMX_LOAD("matoh.bin", 0x10000, 0x4000, CRC(ca25880d) SHA1(38ce0b6a26d48a09fdf96863c3eaf3705aca2590), ROM_BIOS(3)) ROMX_LOAD("matoh.bin", 0x0000, 0x4000, CRC(ca25880d) SHA1(38ce0b6a26d48a09fdf96863c3eaf3705aca2590), ROM_BIOS(3))
ROM_SYSTEM_BIOS(4, "gamesen", "Games v2 EN") ROM_SYSTEM_BIOS(4, "gamesen", "Games v2 EN")
ROMX_LOAD("matogmen.rom", 0x10000, 0x4000, CRC(47e039c8) SHA1(6cc73a6b58921b33691d2751dee28428456eb222), ROM_BIOS(4)) ROMX_LOAD("matogmen.rom", 0x0000, 0x4000, CRC(47e039c8) SHA1(6cc73a6b58921b33691d2751dee28428456eb222), ROM_BIOS(4))
ROM_SYSTEM_BIOS(5, "gamessk", "Games v2 SK") ROM_SYSTEM_BIOS(5, "gamessk", "Games v2 SK")
ROMX_LOAD("matogmsk.rom", 0x10000, 0x4000, CRC(d0c9b1e7) SHA1(9e7289d971a957bf161c317e5fa76db3289ee23c), ROM_BIOS(5)) ROMX_LOAD("matogmsk.rom", 0x0000, 0x4000, CRC(d0c9b1e7) SHA1(9e7289d971a957bf161c317e5fa76db3289ee23c), ROM_BIOS(5))
ROM_SYSTEM_BIOS(6, "games3", "Games v3") ROM_SYSTEM_BIOS(6, "games3", "Games v3")
ROMX_LOAD("matogm3.rom", 0x10000, 0x4000, CRC(9352f2c1) SHA1(b3e45c56d2800c69a0bb02febda6fa715f1afbc3), ROM_BIOS(6)) ROMX_LOAD("matogm3.rom", 0x0000, 0x4000, CRC(9352f2c1) SHA1(b3e45c56d2800c69a0bb02febda6fa715f1afbc3), ROM_BIOS(6))
ROM_END ROM_END
ROM_START(c2717) ROM_START(c2717)
ROM_REGION(0x14000,"maincpu",0) ROM_REGION(0x4000,"maincpu",0)
ROM_LOAD("c2717.rom", 0x10000, 0x4000, CRC(da1703b1) SHA1(9fb93e6cae8b551064c7175bf3b4e3113429ce73)) ROM_LOAD("c2717.rom", 0x0000, 0x4000, CRC(da1703b1) SHA1(9fb93e6cae8b551064c7175bf3b4e3113429ce73))
ROM_END ROM_END
ROM_START(c2717pmd) ROM_START(c2717pmd)
ROM_REGION(0x14000,"maincpu",0) ROM_REGION(0x4000,"maincpu",0)
ROM_LOAD( "c2717-pmd32.rom", 0x10000, 0x4000, CRC(cbdd323c) SHA1(ee9fea11be8bd4f945c583b0ae5684269906d0ce)) ROM_LOAD( "c2717-pmd32.rom", 0x00000, 0x4000, CRC(cbdd323c) SHA1(ee9fea11be8bd4f945c583b0ae5684269906d0ce))
ROM_END ROM_END
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1985, pmd851, 0, 0, pmd851, pmd85, pmd85_state, init_pmd851, "Tesla", "PMD-85.1", 0 ) COMP( 1985, pmd851, 0, 0, pmd851, alfa, pmd85_state, init_pmd851, "Tesla", "PMD-85.1", MACHINE_SUPPORTS_SAVE )
COMP( 1985, pmd852, pmd851, 0, pmd851, pmd85, pmd85_state, init_pmd852, "Tesla", "PMD-85.2", 0 ) COMP( 1985, pmd852, pmd851, 0, pmd851, pmd85, pmd85_state, init_pmd852, "Tesla", "PMD-85.2", MACHINE_SUPPORTS_SAVE )
COMP( 1985, pmd852a, pmd851, 0, pmd852a, pmd85, pmd85_state, init_pmd852a, "Tesla", "PMD-85.2A", 0 ) COMP( 1985, pmd852a, pmd851, 0, pmd852a, pmd85, pmd85_state, init_pmd852a, "Tesla", "PMD-85.2A", MACHINE_SUPPORTS_SAVE )
COMP( 1985, pmd852b, pmd851, 0, pmd852a, pmd85, pmd85_state, init_pmd852a, "Tesla", "PMD-85.2B", 0 ) COMP( 1985, pmd852b, pmd851, 0, pmd852a, pmd85, pmd85_state, init_pmd852a, "Tesla", "PMD-85.2B", MACHINE_SUPPORTS_SAVE )
COMP( 1988, pmd853, pmd851, 0, pmd853, pmd85, pmd85_state, init_pmd853, "Tesla", "PMD-85.3", 0 ) COMP( 1988, pmd853, pmd851, 0, pmd853, pmd85, pmd85_state, init_pmd853, "Tesla", "PMD-85.3", MACHINE_SUPPORTS_SAVE )
COMP( 1986, alfa, pmd851, 0, alfa, alfa, pmd85_state, init_alfa, "Didaktik Skalica", "Didaktik Alfa", 0 ) COMP( 1986, alfa, pmd851, 0, alfa, alfa, pmd85_state, init_alfa, "Didaktik Skalica", "Didaktik Alfa", MACHINE_SUPPORTS_SAVE )
COMP( 1985, mato, pmd851, 0, mato, mato, pmd85_state, init_mato, "Statny", "Mato", 0 ) COMP( 1985, mato, pmd851, 0, mato, mato, pmd85_state, init_mato, "Statny", "Mato", MACHINE_SUPPORTS_SAVE )
COMP( 1989, c2717, pmd851, 0, c2717, pmd85, pmd85_state, init_c2717, "Zbrojovka Brno", "Consul 2717", 0 ) COMP( 1989, c2717, pmd851, 0, c2717, pmd85, pmd85_state, init_c2717, "Zbrojovka Brno", "Consul 2717", MACHINE_SUPPORTS_SAVE )
COMP( 1989, c2717pmd, pmd851, 0, c2717, pmd85, pmd85_state, init_c2717, "Zbrojovka Brno", "Consul 2717 (with PMD-32)", MACHINE_NOT_WORKING ) COMP( 1989, c2717pmd, pmd851, 0, c2717, pmd85, pmd85_state, init_c2717, "Zbrojovka Brno", "Consul 2717 (with PMD-32)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -14,6 +14,7 @@
#include "machine/pit8253.h" #include "machine/pit8253.h"
#include "machine/i8255.h" #include "machine/i8255.h"
#include "imagedev/cassette.h" #include "imagedev/cassette.h"
#include "sound/spkrdev.h"
#include "machine/ram.h" #include "machine/ram.h"
#include "emupal.h" #include "emupal.h"
@ -21,37 +22,24 @@
class pmd85_state : public driver_device class pmd85_state : public driver_device
{ {
public: public:
pmd85_state(const machine_config &mconfig, device_type type, const char *tag) : pmd85_state(const machine_config &mconfig, device_type type, const char *tag)
driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_maincpu(*this, "maincpu")
m_ram(*this, RAM_TAG), , m_rom(*this, "maincpu")
m_cassette(*this, "cassette"), , m_ram(*this, RAM_TAG)
m_pit8253(*this, "pit8253"), , m_cassette(*this, "cassette")
m_uart(*this, "uart"), , m_speaker(*this, "speaker")
m_ppi8255_0(*this, "ppi8255_0"), , m_pit(*this, "pit")
m_ppi8255_1(*this, "ppi8255_1"), , m_uart(*this, "uart")
m_ppi8255_2(*this, "ppi8255_2"), , m_ppi0(*this, "ppi0")
m_ppi8255_3(*this, "ppi8255_3"), , m_ppi1(*this, "ppi1")
m_region_maincpu(*this, "maincpu"), , m_ppi2(*this, "ppi2")
m_bank1(*this, "bank1"), , m_ppi3(*this, "ppi3")
m_bank2(*this, "bank2"), , m_bank(*this, "bank%d", 0U)
m_bank3(*this, "bank3"), , m_io_dsw0(*this, "DSW0")
m_bank4(*this, "bank4"), , m_palette(*this, "palette")
m_bank5(*this, "bank5"), , m_io_keyboard(*this, "KEY%u", 0U)
m_bank6(*this, "bank6"), , m_leds(*this, "led%u", 0U)
m_bank7(*this, "bank7"),
m_bank8(*this, "bank8"),
m_bank9(*this, "bank9"),
m_bank10(*this, "bank10"),
m_bank11(*this, "bank11"),
m_bank12(*this, "bank12"),
m_bank13(*this, "bank13"),
m_bank14(*this, "bank14"),
m_bank15(*this, "bank15"),
m_bank16(*this, "bank16"),
m_io_dsw0(*this, "DSW0"),
m_palette(*this, "palette"),
m_leds(*this, "led%u", 0U)
{ } { }
void pmd85(machine_config &config, bool with_uart = true); void pmd85(machine_config &config, bool with_uart = true);
@ -78,6 +66,7 @@ private:
TIMER_CASSETTE TIMER_CASSETTE
}; };
bool m_txd, m_rts;
uint8_t m_rom_module_present; uint8_t m_rom_module_present;
uint8_t m_ppi_port_outputs[4][3]; uint8_t m_ppi_port_outputs[4][3];
uint8_t m_startup_mem_map; uint8_t m_startup_mem_map;
@ -88,83 +77,52 @@ private:
uint8_t m_model; uint8_t m_model;
emu_timer * m_cassette_timer; emu_timer * m_cassette_timer;
void (pmd85_state::*update_memory)(); void (pmd85_state::*update_memory)();
uint8_t pmd85_io_r(offs_t offset); uint8_t io_r(offs_t offset);
void pmd85_io_w(offs_t offset, uint8_t data); void io_w(offs_t offset, uint8_t data);
uint8_t mato_io_r(offs_t offset); uint8_t mato_io_r(offs_t offset);
void mato_io_w(offs_t offset, uint8_t data); void mato_io_w(offs_t offset, uint8_t data);
virtual void machine_reset() override; virtual void machine_reset() override;
uint32_t screen_update_pmd85(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(pmd85_cassette_timer_callback); TIMER_CALLBACK_MEMBER(cassette_timer_callback);
uint8_t pmd85_ppi_0_porta_r(); uint8_t ppi0_porta_r();
uint8_t pmd85_ppi_0_portb_r(); uint8_t ppi0_portb_r();
uint8_t pmd85_ppi_0_portc_r(); uint8_t ppi0_portc_r();
void pmd85_ppi_0_porta_w(uint8_t data); void ppi0_porta_w(uint8_t data);
void pmd85_ppi_0_portb_w(uint8_t data); void ppi0_portb_w(uint8_t data);
void pmd85_ppi_0_portc_w(uint8_t data); void ppi0_portc_w(uint8_t data);
uint8_t mato_ppi_0_portb_r(); uint8_t mato_ppi0_portb_r();
uint8_t mato_ppi_0_portc_r(); uint8_t mato_ppi0_portc_r();
void mato_ppi_0_portc_w(uint8_t data); void mato_ppi0_portc_w(uint8_t data);
uint8_t pmd85_ppi_1_porta_r(); uint8_t ppi1_porta_r();
uint8_t pmd85_ppi_1_portb_r(); uint8_t ppi1_portb_r();
uint8_t pmd85_ppi_1_portc_r(); uint8_t ppi1_portc_r();
void pmd85_ppi_1_porta_w(uint8_t data); void ppi1_porta_w(uint8_t data);
void pmd85_ppi_1_portb_w(uint8_t data); void ppi1_portb_w(uint8_t data);
void pmd85_ppi_1_portc_w(uint8_t data); void ppi1_portc_w(uint8_t data);
uint8_t pmd85_ppi_2_porta_r(); uint8_t ppi2_porta_r();
uint8_t pmd85_ppi_2_portb_r(); uint8_t ppi2_portb_r();
uint8_t pmd85_ppi_2_portc_r(); uint8_t ppi2_portc_r();
void pmd85_ppi_2_porta_w(uint8_t data); void ppi2_porta_w(uint8_t data);
void pmd85_ppi_2_portb_w(uint8_t data); void ppi2_portb_w(uint8_t data);
void pmd85_ppi_2_portc_w(uint8_t data); void ppi2_portc_w(uint8_t data);
uint8_t pmd85_ppi_3_porta_r(); uint8_t ppi3_porta_r();
uint8_t pmd85_ppi_3_portb_r(); uint8_t ppi3_portb_r();
uint8_t pmd85_ppi_3_portc_r(); uint8_t ppi3_portc_r();
void pmd85_ppi_3_porta_w(uint8_t data); void ppi3_porta_w(uint8_t data);
void pmd85_ppi_3_portb_w(uint8_t data); void ppi3_portb_w(uint8_t data);
void pmd85_ppi_3_portc_w(uint8_t data); void ppi3_portc_w(uint8_t data);
void alfa_mem(address_map &map); void alfa_mem(address_map &map);
void c2717_mem(address_map &map); void c2717_mem(address_map &map);
void mato_io_map(address_map &map); void mato_io(address_map &map);
void mato_mem(address_map &map); void mato_mem(address_map &map);
void pmd852a_mem(address_map &map); void pmd852a_mem(address_map &map);
void pmd853_mem(address_map &map); void pmd853_mem(address_map &map);
void pmd85_io_map(address_map &map); void pmd85_io(address_map &map);
void pmd85_mem(address_map &map); void pmd85_mem(address_map &map);
virtual void machine_start() override { m_leds.resolve(); } virtual void machine_start() override;
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
required_device<cassette_image_device> m_cassette;
required_device<pit8253_device> m_pit8253;
optional_device<i8251_device> m_uart;
optional_device<i8255_device> m_ppi8255_0;
optional_device<i8255_device> m_ppi8255_1;
optional_device<i8255_device> m_ppi8255_2;
optional_device<i8255_device> m_ppi8255_3;
required_memory_region m_region_maincpu;
required_memory_bank m_bank1;
required_memory_bank m_bank2;
required_memory_bank m_bank3;
required_memory_bank m_bank4;
optional_memory_bank m_bank5;
optional_memory_bank m_bank6;
optional_memory_bank m_bank7;
optional_memory_bank m_bank8;
optional_memory_bank m_bank9;
optional_memory_bank m_bank10;
optional_memory_bank m_bank11;
optional_memory_bank m_bank12;
optional_memory_bank m_bank13;
optional_memory_bank m_bank14;
optional_memory_bank m_bank15;
optional_memory_bank m_bank16;
optional_ioport m_io_dsw0;
ioport_port *m_io_port[16];
required_device<palette_device> m_palette;
output_finder<3> m_leds;
void pmd851_update_memory(); void pmd851_update_memory();
void pmd852a_update_memory(); void pmd852a_update_memory();
@ -172,10 +130,25 @@ private:
void alfa_update_memory(); void alfa_update_memory();
void mato_update_memory(); void mato_update_memory();
void c2717_update_memory(); void c2717_update_memory();
void pmd85_common_driver_init(); void common_driver_init();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
bool m_txd, m_rts; required_device<cpu_device> m_maincpu;
required_region_ptr<u8> m_rom;
required_device<ram_device> m_ram;
required_device<cassette_image_device> m_cassette;
required_device<speaker_sound_device> m_speaker;
required_device<pit8253_device> m_pit;
optional_device<i8251_device> m_uart;
optional_device<i8255_device> m_ppi0;
optional_device<i8255_device> m_ppi1;
optional_device<i8255_device> m_ppi2;
optional_device<i8255_device> m_ppi3;
optional_memory_bank_array<17> m_bank;
optional_ioport m_io_dsw0;
required_device<palette_device> m_palette;
optional_ioport_array<16> m_io_keyboard;
output_finder<3> m_leds;
}; };

View File

@ -12,9 +12,8 @@
***************************************************************************/ ***************************************************************************/
#include "emu.h" #include "emu.h"
#include "cpu/i8085/i8085.h"
#include "includes/pmd85.h" #include "includes/pmd85.h"
#include "machine/pit8253.h"
enum {PMD85_LED_1 = 0, PMD85_LED_2, PMD85_LED_3}; enum {PMD85_LED_1 = 0, PMD85_LED_2, PMD85_LED_3};
@ -29,8 +28,6 @@ void pmd85_state::pmd851_update_memory()
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
uint8_t *mem = m_region_maincpu->base();
space.unmap_write(0x0000, 0x0fff); space.unmap_write(0x0000, 0x0fff);
space.nop_write(0x1000, 0x1fff); space.nop_write(0x1000, 0x1fff);
space.unmap_write(0x2000, 0x2fff); space.unmap_write(0x2000, 0x2fff);
@ -39,13 +36,13 @@ void pmd85_state::pmd851_update_memory()
space.nop_read(0x1000, 0x1fff); space.nop_read(0x1000, 0x1fff);
space.nop_read(0x3000, 0x3fff); space.nop_read(0x3000, 0x3fff);
m_bank1->set_base(mem + 0x010000); m_bank[1]->set_base(m_rom);
m_bank3->set_base(mem + 0x010000); m_bank[3]->set_base(m_rom);
m_bank5->set_base(ram + 0xc000); m_bank[5]->set_base(ram + 0xc000);
m_bank6->set_base(mem + 0x010000); m_bank[6]->set_base(m_rom);
m_bank7->set_base(mem + 0x010000); m_bank[7]->set_base(m_rom);
m_bank8->set_base(ram + 0xc000); m_bank[8]->set_base(ram + 0xc000);
} }
else else
{ {
@ -58,11 +55,11 @@ void pmd85_state::pmd851_update_memory()
space.install_read_bank(0x1000, 0x1fff, "bank2"); space.install_read_bank(0x1000, 0x1fff, "bank2");
space.install_read_bank(0x3000, 0x3fff, "bank4"); space.install_read_bank(0x3000, 0x3fff, "bank4");
m_bank1->set_base(ram); m_bank[1]->set_base(ram);
m_bank2->set_base(ram + 0x1000); m_bank[2]->set_base(ram + 0x1000);
m_bank3->set_base(ram + 0x2000); m_bank[3]->set_base(ram + 0x2000);
m_bank4->set_base(ram + 0x3000); m_bank[4]->set_base(ram + 0x3000);
m_bank5->set_base(ram + 0x4000); m_bank[5]->set_base(ram + 0x4000);
} }
} }
@ -73,21 +70,19 @@ void pmd85_state::pmd852a_update_memory()
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
uint8_t *mem = m_region_maincpu->base();
space.unmap_write(0x0000, 0x0fff); space.unmap_write(0x0000, 0x0fff);
space.unmap_write(0x2000, 0x2fff); space.unmap_write(0x2000, 0x2fff);
m_bank1->set_base(mem + 0x010000); m_bank[1]->set_base(m_rom);
m_bank2->set_base(ram + 0x9000); m_bank[2]->set_base(ram + 0x9000);
m_bank3->set_base(mem + 0x010000); m_bank[3]->set_base(m_rom);
m_bank4->set_base(ram + 0xb000); m_bank[4]->set_base(ram + 0xb000);
m_bank5->set_base(ram + 0xc000); m_bank[5]->set_base(ram + 0xc000);
m_bank6->set_base(mem + 0x010000); m_bank[6]->set_base(m_rom);
m_bank7->set_base(ram + 0x9000); m_bank[7]->set_base(ram + 0x9000);
m_bank8->set_base(mem + 0x010000); m_bank[8]->set_base(m_rom);
m_bank9->set_base(ram + 0xb000); m_bank[9]->set_base(ram + 0xb000);
m_bank10->set_base(ram + 0xc000); m_bank[10]->set_base(ram + 0xc000);
} }
else else
@ -95,48 +90,47 @@ void pmd85_state::pmd852a_update_memory()
space.install_write_bank(0x0000, 0x0fff, "bank1"); space.install_write_bank(0x0000, 0x0fff, "bank1");
space.install_write_bank(0x2000, 0x2fff, "bank3"); space.install_write_bank(0x2000, 0x2fff, "bank3");
m_bank1->set_base(ram); m_bank[1]->set_base(ram);
m_bank2->set_base(ram + 0x1000); m_bank[2]->set_base(ram + 0x1000);
m_bank3->set_base(ram + 0x2000); m_bank[3]->set_base(ram + 0x2000);
m_bank4->set_base(ram + 0x5000); m_bank[4]->set_base(ram + 0x5000);
m_bank5->set_base(ram + 0x4000); m_bank[5]->set_base(ram + 0x4000);
} }
} }
void pmd85_state::pmd853_update_memory() void pmd85_state::pmd853_update_memory()
{ {
uint8_t *mem = m_region_maincpu->base();
uint8_t *ram = m_ram->pointer(); uint8_t *ram = m_ram->pointer();
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
m_bank1->set_base(mem + 0x010000); m_bank[1]->set_base(m_rom);
m_bank2->set_base(mem + 0x010000); m_bank[2]->set_base(m_rom);
m_bank3->set_base(mem + 0x010000); m_bank[3]->set_base(m_rom);
m_bank4->set_base(mem + 0x010000); m_bank[4]->set_base(m_rom);
m_bank5->set_base(mem + 0x010000); m_bank[5]->set_base(m_rom);
m_bank6->set_base(mem + 0x010000); m_bank[6]->set_base(m_rom);
m_bank7->set_base(mem + 0x010000); m_bank[7]->set_base(m_rom);
m_bank8->set_base(mem + 0x010000); m_bank[8]->set_base(m_rom);
m_bank9->set_base(ram); m_bank[9]->set_base(ram);
m_bank10->set_base(ram + 0x2000); m_bank[10]->set_base(ram + 0x2000);
m_bank11->set_base(ram + 0x4000); m_bank[11]->set_base(ram + 0x4000);
m_bank12->set_base(ram + 0x6000); m_bank[12]->set_base(ram + 0x6000);
m_bank13->set_base(ram + 0x8000); m_bank[13]->set_base(ram + 0x8000);
m_bank14->set_base(ram + 0xa000); m_bank[14]->set_base(ram + 0xa000);
m_bank15->set_base(ram + 0xc000); m_bank[15]->set_base(ram + 0xc000);
m_bank16->set_base(ram + 0xe000); m_bank[16]->set_base(ram + 0xe000);
} }
else else
{ {
m_bank1->set_base(ram); m_bank[1]->set_base(ram);
m_bank2->set_base(ram + 0x2000); m_bank[2]->set_base(ram + 0x2000);
m_bank3->set_base(ram + 0x4000); m_bank[3]->set_base(ram + 0x4000);
m_bank4->set_base(ram + 0x6000); m_bank[4]->set_base(ram + 0x6000);
m_bank5->set_base(ram + 0x8000); m_bank[5]->set_base(ram + 0x8000);
m_bank6->set_base(ram + 0xa000); m_bank[6]->set_base(ram + 0xa000);
m_bank7->set_base(ram + 0xc000); m_bank[7]->set_base(ram + 0xc000);
m_bank8->set_base(m_pmd853_memory_mapping ? mem + 0x010000 : ram + 0xe000); m_bank[8]->set_base(m_pmd853_memory_mapping ? m_rom : ram + 0xe000);
} }
} }
@ -147,18 +141,16 @@ void pmd85_state::alfa_update_memory()
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
uint8_t *mem = m_region_maincpu->base();
space.unmap_write(0x0000, 0x0fff); space.unmap_write(0x0000, 0x0fff);
space.unmap_write(0x1000, 0x33ff); space.unmap_write(0x1000, 0x33ff);
space.nop_write(0x3400, 0x3fff); space.nop_write(0x3400, 0x3fff);
m_bank1->set_base(mem + 0x010000); m_bank[1]->set_base(m_rom);
m_bank2->set_base(mem + 0x011000); m_bank[2]->set_base(m_rom + 0x1000);
m_bank4->set_base(ram + 0xc000); m_bank[4]->set_base(ram + 0xc000);
m_bank5->set_base(mem + 0x010000); m_bank[5]->set_base(m_rom);
m_bank6->set_base(mem + 0x011000); m_bank[6]->set_base(m_rom + 0x1000);
m_bank7->set_base(ram + 0xc000); m_bank[7]->set_base(ram + 0xc000);
} }
else else
{ {
@ -166,10 +158,10 @@ void pmd85_state::alfa_update_memory()
space.install_write_bank(0x1000, 0x33ff, "bank2"); space.install_write_bank(0x1000, 0x33ff, "bank2");
space.install_write_bank(0x3400, 0x3fff, "bank3"); space.install_write_bank(0x3400, 0x3fff, "bank3");
m_bank1->set_base(ram); m_bank[1]->set_base(ram);
m_bank2->set_base(ram + 0x1000); m_bank[2]->set_base(ram + 0x1000);
m_bank3->set_base(ram + 0x3400); m_bank[3]->set_base(ram + 0x3400);
m_bank4->set_base(ram + 0x4000); m_bank[4]->set_base(ram + 0x4000);
} }
} }
@ -180,44 +172,41 @@ void pmd85_state::mato_update_memory()
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
uint8_t *mem = m_region_maincpu->base();
space.unmap_write(0x0000, 0x3fff); space.unmap_write(0x0000, 0x3fff);
m_bank1->set_base(mem + 0x010000); m_bank[1]->set_base(m_rom);
m_bank2->set_base(ram + 0xc000); m_bank[2]->set_base(ram + 0xc000);
m_bank3->set_base(mem + 0x010000); m_bank[3]->set_base(m_rom);
m_bank4->set_base(ram + 0xc000); m_bank[4]->set_base(ram + 0xc000);
} }
else else
{ {
space.install_write_bank(0x0000, 0x3fff, "bank1"); space.install_write_bank(0x0000, 0x3fff, "bank1");
m_bank1->set_base(ram); m_bank[1]->set_base(ram);
m_bank2->set_base(ram + 0x4000); m_bank[2]->set_base(ram + 0x4000);
} }
} }
void pmd85_state::c2717_update_memory() void pmd85_state::c2717_update_memory()
{ {
address_space& space = m_maincpu->space(AS_PROGRAM); address_space& space = m_maincpu->space(AS_PROGRAM);
uint8_t *mem = m_region_maincpu->base();
uint8_t *ram = m_ram->pointer(); uint8_t *ram = m_ram->pointer();
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
space.unmap_write(0x0000, 0x3fff); space.unmap_write(0x0000, 0x3fff);
m_bank1->set_base(mem + 0x010000); m_bank[1]->set_base(m_rom);
m_bank2->set_base(ram + 0x4000); m_bank[2]->set_base(ram + 0x4000);
m_bank3->set_base(mem + 0x010000); m_bank[3]->set_base(m_rom);
m_bank4->set_base(ram + 0xc000); m_bank[4]->set_base(ram + 0xc000);
} }
else else
{ {
space.install_write_bank(0x0000, 0x3fff, "bank1"); space.install_write_bank(0x0000, 0x3fff, "bank1");
m_bank1->set_base(ram); m_bank[1]->set_base(ram);
m_bank2->set_base(ram + 0x4000); m_bank[2]->set_base(ram + 0x4000);
} }
} }
@ -229,36 +218,37 @@ void pmd85_state::c2717_update_memory()
*******************************************************************************/ *******************************************************************************/
uint8_t pmd85_state::pmd85_ppi_0_porta_r() uint8_t pmd85_state::ppi0_porta_r()
{ {
return 0xff; return 0xff;
} }
uint8_t pmd85_state::pmd85_ppi_0_portb_r() uint8_t pmd85_state::ppi0_portb_r()
{ {
return m_io_port[(m_ppi_port_outputs[0][0] & 0x0f)]->read() & m_io_port[15]->read(); return m_io_keyboard[(m_ppi_port_outputs[0][0] & 0x0f)]->read() & m_io_keyboard[15]->read();
} }
uint8_t pmd85_state::pmd85_ppi_0_portc_r() uint8_t pmd85_state::ppi0_portc_r()
{ {
return 0xff; return 0xff;
} }
void pmd85_state::pmd85_ppi_0_porta_w(uint8_t data) void pmd85_state::ppi0_porta_w(uint8_t data)
{ {
m_ppi_port_outputs[0][0] = data; m_ppi_port_outputs[0][0] = data;
} }
void pmd85_state::pmd85_ppi_0_portb_w(uint8_t data) void pmd85_state::ppi0_portb_w(uint8_t data)
{ {
m_ppi_port_outputs[0][1] = data; m_ppi_port_outputs[0][1] = data;
} }
void pmd85_state::pmd85_ppi_0_portc_w(uint8_t data) void pmd85_state::ppi0_portc_w(uint8_t data)
{ {
m_ppi_port_outputs[0][2] = data; m_ppi_port_outputs[0][2] = data;
m_leds[PMD85_LED_2] = BIT(data, 3); m_leds[PMD85_LED_2] = BIT(data, 3);
m_leds[PMD85_LED_3] = BIT(data, 2); //m_leds[PMD85_LED_3] = BIT(data, 2);
m_speaker->level_w(BIT(data, 2));
} }
/******************************************************************************* /*******************************************************************************
@ -269,31 +259,30 @@ void pmd85_state::pmd85_ppi_0_portc_w(uint8_t data)
*******************************************************************************/ *******************************************************************************/
uint8_t pmd85_state::mato_ppi_0_portb_r() uint8_t pmd85_state::mato_ppi0_portb_r()
{ {
int i; u8 i,data = 0xff;
uint8_t data = 0xff;
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{
if (!BIT(m_ppi_port_outputs[0][0], i)) if (!BIT(m_ppi_port_outputs[0][0], i))
data &= m_io_port[i]->read(); data &= m_io_keyboard[i]->read();
}
return data; return data;
} }
uint8_t pmd85_state::mato_ppi_0_portc_r() uint8_t pmd85_state::mato_ppi0_portc_r()
{ {
u8 data = m_io_port[8]->read() & 0x7f; u8 data = m_io_keyboard[8]->read() & 0x7f;
data |= (m_cassette->input() > 0.038) ? 0x80 : 0; data |= (m_cassette->input() > 0.038) ? 0x80 : 0;
return data; return data;
} }
void pmd85_state::mato_ppi_0_portc_w(uint8_t data) void pmd85_state::mato_ppi0_portc_w(uint8_t data)
{ {
m_ppi_port_outputs[0][2] = data; m_ppi_port_outputs[0][2] = data;
m_leds[PMD85_LED_2] = BIT(data, 3); m_leds[PMD85_LED_2] = BIT(data, 3);
m_leds[PMD85_LED_3] = BIT(data, 2); m_leds[PMD85_LED_3] = BIT(data, 2);
m_speaker->level_w(BIT(data, 1));
m_cassette->output(BIT(data, 0) ? 1 : -1); m_cassette->output(BIT(data, 0) ? 1 : -1);
} }
@ -305,32 +294,32 @@ void pmd85_state::mato_ppi_0_portc_w(uint8_t data)
*******************************************************************************/ *******************************************************************************/
uint8_t pmd85_state::pmd85_ppi_1_porta_r() uint8_t pmd85_state::ppi1_porta_r()
{ {
return 0xff; return 0xff;
} }
uint8_t pmd85_state::pmd85_ppi_1_portb_r() uint8_t pmd85_state::ppi1_portb_r()
{ {
return 0xff; return 0xff;
} }
uint8_t pmd85_state::pmd85_ppi_1_portc_r() uint8_t pmd85_state::ppi1_portc_r()
{ {
return 0xff; return 0xff;
} }
void pmd85_state::pmd85_ppi_1_porta_w(uint8_t data) void pmd85_state::ppi1_porta_w(uint8_t data)
{ {
m_ppi_port_outputs[1][0] = data; m_ppi_port_outputs[1][0] = data;
} }
void pmd85_state::pmd85_ppi_1_portb_w(uint8_t data) void pmd85_state::ppi1_portb_w(uint8_t data)
{ {
m_ppi_port_outputs[1][1] = data; m_ppi_port_outputs[1][1] = data;
} }
void pmd85_state::pmd85_ppi_1_portc_w(uint8_t data) void pmd85_state::ppi1_portc_w(uint8_t data)
{ {
m_ppi_port_outputs[1][2] = data; m_ppi_port_outputs[1][2] = data;
} }
@ -347,32 +336,32 @@ void pmd85_state::pmd85_ppi_1_portc_w(uint8_t data)
*******************************************************************************/ *******************************************************************************/
uint8_t pmd85_state::pmd85_ppi_2_porta_r() uint8_t pmd85_state::ppi2_porta_r()
{ {
return 0xff; return 0xff;
} }
uint8_t pmd85_state::pmd85_ppi_2_portb_r() uint8_t pmd85_state::ppi2_portb_r()
{ {
return 0xff; return 0xff;
} }
uint8_t pmd85_state::pmd85_ppi_2_portc_r() uint8_t pmd85_state::ppi2_portc_r()
{ {
return 0xff; return 0xff;
} }
void pmd85_state::pmd85_ppi_2_porta_w(uint8_t data) void pmd85_state::ppi2_porta_w(uint8_t data)
{ {
m_ppi_port_outputs[2][0] = data; m_ppi_port_outputs[2][0] = data;
} }
void pmd85_state::pmd85_ppi_2_portb_w(uint8_t data) void pmd85_state::ppi2_portb_w(uint8_t data)
{ {
m_ppi_port_outputs[2][1] = data; m_ppi_port_outputs[2][1] = data;
} }
void pmd85_state::pmd85_ppi_2_portc_w(uint8_t data) void pmd85_state::ppi2_portc_w(uint8_t data)
{ {
m_ppi_port_outputs[2][2] = data; m_ppi_port_outputs[2][2] = data;
} }
@ -403,35 +392,35 @@ void pmd85_state::pmd85_ppi_2_portc_w(uint8_t data)
*******************************************************************************/ *******************************************************************************/
uint8_t pmd85_state::pmd85_ppi_3_porta_r() uint8_t pmd85_state::ppi3_porta_r()
{ {
if (memregion("user1")->base() != nullptr) if (memregion("user1")->base())
return memregion("user1")->base()[m_ppi_port_outputs[3][1] | (m_ppi_port_outputs[3][2] << 8)]; return memregion("user1")->base()[m_ppi_port_outputs[3][1] | (m_ppi_port_outputs[3][2] << 8)];
else else
return 0; return 0;
} }
uint8_t pmd85_state::pmd85_ppi_3_portb_r() uint8_t pmd85_state::ppi3_portb_r()
{ {
return 0xff; return 0xff;
} }
uint8_t pmd85_state::pmd85_ppi_3_portc_r() uint8_t pmd85_state::ppi3_portc_r()
{ {
return 0xff; return 0xff;
} }
void pmd85_state::pmd85_ppi_3_porta_w(uint8_t data) void pmd85_state::ppi3_porta_w(uint8_t data)
{ {
m_ppi_port_outputs[3][0] = data; m_ppi_port_outputs[3][0] = data;
} }
void pmd85_state::pmd85_ppi_3_portb_w(uint8_t data) void pmd85_state::ppi3_portb_w(uint8_t data)
{ {
m_ppi_port_outputs[3][1] = data; m_ppi_port_outputs[3][1] = data;
} }
void pmd85_state::pmd85_ppi_3_portc_w(uint8_t data) void pmd85_state::ppi3_portc_w(uint8_t data)
{ {
m_ppi_port_outputs[3][2] = data; m_ppi_port_outputs[3][2] = data;
} }
@ -459,7 +448,7 @@ void pmd85_state::pmd85_ppi_3_portc_w(uint8_t data)
*******************************************************************************/ *******************************************************************************/
uint8_t pmd85_state::pmd85_io_r(offs_t offset) uint8_t pmd85_state::io_r(offs_t offset)
{ {
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
@ -472,7 +461,7 @@ uint8_t pmd85_state::pmd85_io_r(offs_t offset)
switch (offset & 0x80) switch (offset & 0x80)
{ {
case 0x80: /* Motherboard 8255 */ case 0x80: /* Motherboard 8255 */
return m_ppi8255_0->read(offset & 0x03); return m_ppi0->read(offset & 0x03);
} }
break; break;
case 0x08: /* ROM module connector */ case 0x08: /* ROM module connector */
@ -481,7 +470,7 @@ uint8_t pmd85_state::pmd85_io_r(offs_t offset)
switch (offset & 0x80) switch (offset & 0x80)
{ {
case 0x80: /* ROM module 8255 */ case 0x80: /* ROM module 8255 */
return m_ppi8255_3->read(offset & 0x03); return m_ppi3->read(offset & 0x03);
} }
} }
break; break;
@ -494,11 +483,11 @@ uint8_t pmd85_state::pmd85_io_r(offs_t offset)
case 0x10: /* 8251 (cassette recorder, V24) */ case 0x10: /* 8251 (cassette recorder, V24) */
return m_uart->read(offset & 0x01); return m_uart->read(offset & 0x01);
case 0x40: /* 8255 (GPIO/0, GPIO/1) */ case 0x40: /* 8255 (GPIO/0, GPIO/1) */
return m_ppi8255_1->read(offset & 0x03); return m_ppi1->read(offset & 0x03);
case 0x50: /* 8253 */ case 0x50: /* 8253 */
return m_pit8253->read(offset & 0x03); return m_pit->read(offset & 0x03);
case 0x70: /* 8255 (IMS-2) */ case 0x70: /* 8255 (IMS-2) */
return m_ppi8255_2->read(offset & 0x03); return m_ppi2->read(offset & 0x03);
} }
break; break;
case 0x80: /* external interfaces */ case 0x80: /* external interfaces */
@ -513,7 +502,7 @@ uint8_t pmd85_state::pmd85_io_r(offs_t offset)
return 0xff; return 0xff;
} }
void pmd85_state::pmd85_io_w(offs_t offset, uint8_t data) void pmd85_state::io_w(offs_t offset, uint8_t data)
{ {
if (m_startup_mem_map) if (m_startup_mem_map)
{ {
@ -527,7 +516,7 @@ void pmd85_state::pmd85_io_w(offs_t offset, uint8_t data)
switch (offset & 0x80) switch (offset & 0x80)
{ {
case 0x80: /* Motherboard 8255 */ case 0x80: /* Motherboard 8255 */
m_ppi8255_0->write(offset & 0x03, data); m_ppi0->write(offset & 0x03, data);
/* PMD-85.3 memory banking */ /* PMD-85.3 memory banking */
if ((offset & 0x03) == 0x03) if ((offset & 0x03) == 0x03)
{ {
@ -543,7 +532,7 @@ void pmd85_state::pmd85_io_w(offs_t offset, uint8_t data)
switch (offset & 0x80) switch (offset & 0x80)
{ {
case 0x80: /* ROM module 8255 */ case 0x80: /* ROM module 8255 */
m_ppi8255_3->write(offset & 0x03, data); m_ppi3->write(offset & 0x03, data);
break; break;
} }
} }
@ -558,14 +547,14 @@ void pmd85_state::pmd85_io_w(offs_t offset, uint8_t data)
m_uart->write(offset & 0x01, data); m_uart->write(offset & 0x01, data);
break; break;
case 0x40: /* 8255 (GPIO/0, GPIO/0) */ case 0x40: /* 8255 (GPIO/0, GPIO/0) */
m_ppi8255_1->write(offset & 0x03, data); m_ppi1->write(offset & 0x03, data);
break; break;
case 0x50: /* 8253 */ case 0x50: /* 8253 */
m_pit8253->write(offset & 0x03, data); m_pit->write(offset & 0x03, data);
logerror ("8253 writing. Address: %02x, Data: %02x\n", offset, data); logerror ("8253 writing. Address: %02x, Data: %02x\n", offset, data);
break; break;
case 0x70: /* 8255 (IMS-2) */ case 0x70: /* 8255 (IMS-2) */
m_ppi8255_2->write(offset & 0x03, data); m_ppi2->write(offset & 0x03, data);
break; break;
} }
break; break;
@ -602,7 +591,7 @@ uint8_t pmd85_state::mato_io_r(offs_t offset)
switch (offset & 0x80) switch (offset & 0x80)
{ {
case 0x80: /* Motherboard 8255 */ case 0x80: /* Motherboard 8255 */
return m_ppi8255_0->read(offset & 0x03); return m_ppi0->read(offset & 0x03);
} }
break; break;
} }
@ -625,7 +614,7 @@ void pmd85_state::mato_io_w(offs_t offset, uint8_t data)
switch (offset & 0x80) switch (offset & 0x80)
{ {
case 0x80: /* Motherboard 8255 */ case 0x80: /* Motherboard 8255 */
return m_ppi8255_0->write(offset & 0x03, data); return m_ppi0->write(offset & 0x03, data);
} }
break; break;
} }
@ -636,19 +625,19 @@ void pmd85_state::device_timer(emu_timer &timer, device_timer_id id, int param,
switch (id) switch (id)
{ {
case TIMER_CASSETTE: case TIMER_CASSETTE:
pmd85_cassette_timer_callback(ptr, param); cassette_timer_callback(ptr, param);
break; break;
default: default:
throw emu_fatalerror("Unknown id in pmd85_state::device_timer"); throw emu_fatalerror("Unknown id in pmd85_state::device_timer");
} }
} }
TIMER_CALLBACK_MEMBER(pmd85_state::pmd85_cassette_timer_callback) TIMER_CALLBACK_MEMBER(pmd85_state::cassette_timer_callback)
{ {
bool data; bool data;
bool current_level; bool current_level;
if (!(m_io_dsw0->read() & 0x02)) /* V.24 / Tape Switch */ if (!BIT(m_io_dsw0->read(), 1)) /* V.24 / Tape Switch */
{ {
/* tape reading */ /* tape reading */
if (m_cassette->get_state()&CASSETTE_PLAY) if (m_cassette->get_state()&CASSETTE_PLAY)
@ -711,18 +700,8 @@ INPUT_CHANGED_MEMBER(pmd85_state::pmd85_reset)
machine().schedule_soft_reset(); machine().schedule_soft_reset();
} }
void pmd85_state::pmd85_common_driver_init() void pmd85_state::common_driver_init()
{ {
static const char *const keynames[] = {
"KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7",
"KEY8", "KEY9", "KEY10", "KEY11", "KEY12", "KEY13", "KEY14", "KEY15"
};
for ( int i = 0; i < 16; i++ )
{
m_io_port[i] = ioport( keynames[i] );
}
m_previous_level = 0; m_previous_level = 0;
m_clk_level = m_clk_level_tape = 1; m_clk_level = m_clk_level_tape = 1;
m_cassette_timer = timer_alloc(TIMER_CASSETTE); m_cassette_timer = timer_alloc(TIMER_CASSETTE);
@ -733,67 +712,52 @@ void pmd85_state::init_pmd851()
{ {
m_model = PMD85_1; m_model = PMD85_1;
update_memory = &pmd85_state::pmd851_update_memory; update_memory = &pmd85_state::pmd851_update_memory;
pmd85_common_driver_init(); common_driver_init();
} }
void pmd85_state::init_pmd852() void pmd85_state::init_pmd852()
{ {
m_model = PMD85_2; m_model = PMD85_2;
update_memory = &pmd85_state::pmd851_update_memory; update_memory = &pmd85_state::pmd851_update_memory;
pmd85_common_driver_init(); common_driver_init();
} }
void pmd85_state::init_pmd852a() void pmd85_state::init_pmd852a()
{ {
m_model = PMD85_2A; m_model = PMD85_2A;
update_memory = &pmd85_state::pmd852a_update_memory; update_memory = &pmd85_state::pmd852a_update_memory;
pmd85_common_driver_init(); common_driver_init();
} }
void pmd85_state::init_pmd853() void pmd85_state::init_pmd853()
{ {
m_model = PMD85_3; m_model = PMD85_3;
update_memory = &pmd85_state::pmd853_update_memory; update_memory = &pmd85_state::pmd853_update_memory;
pmd85_common_driver_init(); common_driver_init();
} }
void pmd85_state::init_alfa() void pmd85_state::init_alfa()
{ {
m_model = ALFA; m_model = ALFA;
update_memory = &pmd85_state::alfa_update_memory; update_memory = &pmd85_state::alfa_update_memory;
pmd85_common_driver_init(); common_driver_init();
} }
void pmd85_state::init_mato() void pmd85_state::init_mato()
{ {
m_model = MATO; m_model = MATO;
update_memory = &pmd85_state::mato_update_memory; update_memory = &pmd85_state::mato_update_memory;
static const char *const keynames[] = {
"KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7", "KEY8"
};
for ( int i = 0; i < 9; i++ )
{
m_io_port[i] = ioport( keynames[i] );
}
for ( int i = 9; i < 16; i++ )
{
m_io_port[i] = nullptr;
}
} }
void pmd85_state::init_c2717() void pmd85_state::init_c2717()
{ {
m_model = C2717; m_model = C2717;
update_memory = &pmd85_state::c2717_update_memory; update_memory = &pmd85_state::c2717_update_memory;
pmd85_common_driver_init(); common_driver_init();
} }
void pmd85_state::machine_reset() void pmd85_state::machine_reset()
{ {
int i, j;
/* checking for Rom Module */ /* checking for Rom Module */
m_rom_module_present = 0; m_rom_module_present = 0;
switch (m_model) switch (m_model)
@ -810,13 +774,28 @@ void pmd85_state::machine_reset()
break; break;
} }
for (i = 0; i < 4; i++) for (u8 i = 0; i < 4; i++)
for (j = 0; j < 3; j++) for (u8 j = 0; j < 3; j++)
m_ppi_port_outputs[i][j] = 0; m_ppi_port_outputs[i][j] = 0;
/* memory initialization */ /* memory initialization */
memset(m_ram->pointer(), 0, sizeof(unsigned char)*0x10000);
m_pmd853_memory_mapping = 1; m_pmd853_memory_mapping = 1;
m_startup_mem_map = 1; m_startup_mem_map = 1;
(this->*update_memory)(); (this->*update_memory)();
} }
void pmd85_state::machine_start()
{
m_leds.resolve();
save_item(NAME(m_txd));
save_item(NAME(m_rts));
save_item(NAME(m_rom_module_present));
save_item(NAME(m_ppi_port_outputs));
save_item(NAME(m_startup_mem_map));
save_item(NAME(m_pmd853_memory_mapping));
save_item(NAME(m_previous_level));
save_item(NAME(m_clk_level));
save_item(NAME(m_clk_level_tape));
save_item(NAME(m_model));
}