primo: small cleanup

This commit is contained in:
Robbbert 2020-07-20 03:04:06 +10:00
parent 4088eb80cf
commit 381c38a848
6 changed files with 123 additions and 154 deletions

View File

@ -2833,7 +2833,6 @@ files {
MAME_DIR .. "src/mame/drivers/primo.cpp", MAME_DIR .. "src/mame/drivers/primo.cpp",
MAME_DIR .. "src/mame/includes/primo.h", MAME_DIR .. "src/mame/includes/primo.h",
MAME_DIR .. "src/mame/machine/primo.cpp", MAME_DIR .. "src/mame/machine/primo.cpp",
MAME_DIR .. "src/mame/video/primo.cpp",
} }
createMESSProjects(_target, _subtarget, "microsoft") createMESSProjects(_target, _subtarget, "microsoft")

View File

@ -104,6 +104,10 @@ I/O Ports:
Interrupts: Interrupts:
NMI - 20ms (50HZ), can be disbled/enabled by I/O write NMI - 20ms (50HZ), can be disbled/enabled by I/O write
ToDO:
- primoc64 works, but it seems it should be used with a commodore 64
disk drive. This isn't emulated.
*******************************************************************************/ *******************************************************************************/
#include "emu.h" #include "emu.h"
@ -117,19 +121,19 @@ Interrupts:
#include "formats/primoptp.h" #include "formats/primoptp.h"
void primo_state::primoa_port(address_map &map) void primo_state::primoa_io(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map(0x00, 0x3f).rw(FUNC(primo_state::primo_be_1_r), FUNC(primo_state::primo_ki_1_w)); map(0x00, 0x3f).rw(FUNC(primo_state::be_1_r), FUNC(primo_state::ki_1_w));
map(0xfd, 0xfd).w(FUNC(primo_state::primo_FD_w)); map(0xfd, 0xfd).w(FUNC(primo_state::FD_w));
} }
void primo_state::primob_port(address_map &map) void primo_state::primob_io(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map(0x00, 0x3f).rw(FUNC(primo_state::primo_be_1_r), FUNC(primo_state::primo_ki_1_w)); map(0x00, 0x3f).rw(FUNC(primo_state::be_1_r), FUNC(primo_state::ki_1_w));
map(0x40, 0x7f).rw(FUNC(primo_state::primo_be_2_r), FUNC(primo_state::primo_ki_2_w)); map(0x40, 0x7f).rw(FUNC(primo_state::be_2_r), FUNC(primo_state::ki_2_w));
map(0xfd, 0xfd).w(FUNC(primo_state::primo_FD_w)); map(0xfd, 0xfd).w(FUNC(primo_state::FD_w));
} }
void primo_state::primo32_mem(address_map &map) void primo_state::primo32_mem(address_map &map)
@ -251,7 +255,7 @@ void primo_state::primoa32(machine_config &config)
/* basic machine hardware */ /* basic machine hardware */
Z80(config, m_maincpu, 2500000); Z80(config, m_maincpu, 2500000);
m_maincpu->set_addrmap(AS_PROGRAM, &primo_state::primo32_mem); m_maincpu->set_addrmap(AS_PROGRAM, &primo_state::primo32_mem);
m_maincpu->set_addrmap(AS_IO, &primo_state::primoa_port); m_maincpu->set_addrmap(AS_IO, &primo_state::primoa_io);
/* video hardware */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -259,7 +263,7 @@ void primo_state::primoa32(machine_config &config)
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
m_screen->set_size(256, 192); m_screen->set_size(256, 192);
m_screen->set_visarea(0, 256-1, 0, 192-1); m_screen->set_visarea(0, 256-1, 0, 192-1);
m_screen->set_screen_update(FUNC(primo_state::screen_update_primo)); m_screen->set_screen_update(FUNC(primo_state::screen_update));
m_screen->set_palette("palette"); m_screen->set_palette("palette");
m_screen->screen_vblank().set(FUNC(primo_state::vblank_irq)); m_screen->screen_vblank().set(FUNC(primo_state::vblank_irq));
@ -302,7 +306,7 @@ void primo_state::primoa64(machine_config &config)
void primo_state::primob32(machine_config &config) void primo_state::primob32(machine_config &config)
{ {
primoa32(config); primoa32(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port); m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob) MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
} }
@ -310,7 +314,7 @@ void primo_state::primob32(machine_config &config)
void primo_state::primob48(machine_config &config) void primo_state::primob48(machine_config &config)
{ {
primoa48(config); primoa48(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port); m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob) MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
} }
@ -318,7 +322,7 @@ void primo_state::primob48(machine_config &config)
void primo_state::primob64(machine_config &config) void primo_state::primob64(machine_config &config)
{ {
primoa64(config); primoa64(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port); m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob) MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
} }
@ -326,67 +330,66 @@ void primo_state::primob64(machine_config &config)
void primo_state::primoc64(machine_config &config) void primo_state::primoc64(machine_config &config)
{ {
primoa64(config); primoa64(config);
m_maincpu->set_addrmap(AS_IO, &primo_state::primob_port); m_maincpu->set_addrmap(AS_IO, &primo_state::primob_io);
MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob) MCFG_MACHINE_RESET_OVERRIDE(primo_state, primob)
} }
ROM_START( primoa32 ) ROM_START( primoa32 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "a32_1.rom", 0x10000, 0x1000, CRC(4e91c1a4) SHA1(bf6e41b6b36a2556a50065e9acfd8cd57968f039) ) ROM_LOAD( "a32_1.rom", 0x0000, 0x1000, CRC(4e91c1a4) SHA1(bf6e41b6b36a2556a50065e9acfd8cd57968f039) )
ROM_LOAD( "a32_2.rom", 0x11000, 0x1000, CRC(81a8a0fb) SHA1(df75bd7774969cabb062e50da6004f2efbde489e) ) ROM_LOAD( "a32_2.rom", 0x1000, 0x1000, CRC(81a8a0fb) SHA1(df75bd7774969cabb062e50da6004f2efbde489e) )
ROM_LOAD( "a32_3.rom", 0x12000, 0x1000, CRC(a97de2f5) SHA1(743c76121f5b9e1eab35c8c00797311f58da5243) ) ROM_LOAD( "a32_3.rom", 0x2000, 0x1000, CRC(a97de2f5) SHA1(743c76121f5b9e1eab35c8c00797311f58da5243) )
ROM_LOAD( "a32_4.rom", 0x13000, 0x1000, CRC(70f84bc8) SHA1(9ae1c06531edf20c14ba47e78c0747dd2a92612a) ) ROM_LOAD( "a32_4.rom", 0x3000, 0x1000, CRC(70f84bc8) SHA1(9ae1c06531edf20c14ba47e78c0747dd2a92612a) )
ROM_END ROM_END
ROM_START( primoa48 ) ROM_START( primoa48 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "a48_1.rom", 0x10000, 0x1000, CRC(7de6ad6f) SHA1(f2fd6fac4f9bc57c646efe40281758bb7c3f56e1) ) ROM_LOAD( "a48_1.rom", 0x0000, 0x1000, CRC(7de6ad6f) SHA1(f2fd6fac4f9bc57c646efe40281758bb7c3f56e1) )
ROM_LOAD( "a48_2.rom", 0x11000, 0x1000, CRC(81a8a0fb) SHA1(df75bd7774969cabb062e50da6004f2efbde489e) ) ROM_LOAD( "a48_2.rom", 0x1000, 0x1000, CRC(81a8a0fb) SHA1(df75bd7774969cabb062e50da6004f2efbde489e) )
ROM_LOAD( "a48_3.rom", 0x12000, 0x1000, CRC(a97de2f5) SHA1(743c76121f5b9e1eab35c8c00797311f58da5243) ) ROM_LOAD( "a48_3.rom", 0x2000, 0x1000, CRC(a97de2f5) SHA1(743c76121f5b9e1eab35c8c00797311f58da5243) )
ROM_LOAD( "a48_4.rom", 0x13000, 0x1000, CRC(e4d0c452) SHA1(4a98ff7502f1236445250d6b4e1c34850734350e) ) ROM_LOAD( "a48_4.rom", 0x3000, 0x1000, CRC(e4d0c452) SHA1(4a98ff7502f1236445250d6b4e1c34850734350e) )
ROM_END ROM_END
ROM_START( primoa64 ) ROM_START( primoa64 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_SYSTEM_BIOS(0, "ver1", "ver 1") ROM_LOAD( "a64_1.rom", 0x0000, 0x1000, CRC(6a7a9b9b) SHA1(e9ce16f90d9a799a26a9cef09d9ee6a6d7749484) )
ROM_LOAD( "a64_1.rom", 0x10000, 0x1000, CRC(6a7a9b9b) SHA1(e9ce16f90d9a799a26a9cef09d9ee6a6d7749484) ) ROM_LOAD( "a64_2.rom", 0x1000, 0x1000, CRC(81a8a0fb) SHA1(df75bd7774969cabb062e50da6004f2efbde489e) )
ROM_LOAD( "a64_2.rom", 0x11000, 0x1000, CRC(81a8a0fb) SHA1(df75bd7774969cabb062e50da6004f2efbde489e) ) ROM_LOAD( "a64_3.rom", 0x2000, 0x1000, CRC(a97de2f5) SHA1(743c76121f5b9e1eab35c8c00797311f58da5243) )
ROM_LOAD( "a64_3.rom", 0x12000, 0x1000, CRC(a97de2f5) SHA1(743c76121f5b9e1eab35c8c00797311f58da5243) ) ROM_LOAD( "a64_4.rom", 0x3000, 0x1000, CRC(e4d0c452) SHA1(4a98ff7502f1236445250d6b4e1c34850734350e) )
ROM_LOAD( "a64_4.rom", 0x13000, 0x1000, CRC(e4d0c452) SHA1(4a98ff7502f1236445250d6b4e1c34850734350e) )
ROM_END ROM_END
ROM_START( primob32 ) ROM_START( primob32 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "b32.rom", 0x10000, 0x4000, CRC(f594d2bb) SHA1(b74961dba008a1a6f15a22ddbd1b89acd7e286c2) ) ROM_LOAD( "b32.rom", 0x0000, 0x4000, CRC(f594d2bb) SHA1(b74961dba008a1a6f15a22ddbd1b89acd7e286c2) )
ROM_END ROM_END
ROM_START( primob48 ) ROM_START( primob48 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "b48.rom", 0x10000, 0x4000, CRC(df3d2a57) SHA1(ab9413aa9d7749d30a486da00bc8c6d178a2172c) ) ROM_LOAD( "b48.rom", 0x0000, 0x4000, CRC(df3d2a57) SHA1(ab9413aa9d7749d30a486da00bc8c6d178a2172c) )
ROM_END ROM_END
ROM_START( primob64 ) ROM_START( primob64 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_SYSTEM_BIOS(0, "standard", "Standard") ROM_SYSTEM_BIOS(0, "standard", "Standard")
ROMX_LOAD( "b64.rom", 0x10000, 0x4000, CRC(cea28188) SHA1(a77e42e97402e601b78ab3751eac1e85d0bbb4a0), ROM_BIOS(0) ) ROMX_LOAD( "b64.rom", 0x0000, 0x4000, CRC(cea28188) SHA1(a77e42e97402e601b78ab3751eac1e85d0bbb4a0), ROM_BIOS(0) )
ROM_SYSTEM_BIOS(1, "cdos", "CDOS") ROM_SYSTEM_BIOS(1, "cdos", "CDOS")
ROMX_LOAD( "b64cdos.rom", 0x10000, 0x4000, CRC(73305e4d) SHA1(c090c3430cdf19eed8363377b981e1c21a4ed169), ROM_BIOS(1) ) ROMX_LOAD( "b64cdos.rom", 0x0000, 0x4000, CRC(73305e4d) SHA1(c090c3430cdf19eed8363377b981e1c21a4ed169), ROM_BIOS(1) )
ROM_END ROM_END
ROM_START( primoc64 ) ROM_START( primoc64 )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "c64_1.rom", 0x10000, 0x1000, CRC(c22290ea) SHA1(af5c73f6d0f7a987c4f082a5cb69e3f016127d57) ) ROM_LOAD( "c64_1.rom", 0x0000, 0x1000, CRC(c22290ea) SHA1(af5c73f6d0f7a987c4f082a5cb69e3f016127d57) )
ROM_LOAD( "c64_2.rom", 0x11000, 0x1000, CRC(0756b56e) SHA1(589dbdb7c43ca7ca29ed1e56e080adf8c069e407) ) ROM_LOAD( "c64_2.rom", 0x1000, 0x1000, CRC(0756b56e) SHA1(589dbdb7c43ca7ca29ed1e56e080adf8c069e407) )
ROM_LOAD( "c64_3.rom", 0x12000, 0x1000, CRC(fc56e0af) SHA1(b547fd270d3413400bc800f5b7ea9153b7a59bff) ) ROM_LOAD( "c64_3.rom", 0x2000, 0x1000, CRC(fc56e0af) SHA1(b547fd270d3413400bc800f5b7ea9153b7a59bff) )
ROM_LOAD( "c64_4.rom", 0x13000, 0x1000, CRC(3770e3e6) SHA1(792cc71d8f89eb447f94aded5afc70d626a26030) ) ROM_LOAD( "c64_4.rom", 0x3000, 0x1000, CRC(3770e3e6) SHA1(792cc71d8f89eb447f94aded5afc70d626a26030) )
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( 1984, primoa32, 0, 0, primoa32, primo, primo_state, init_primo, "Microkey", "Primo A-32", 0 ) COMP( 1984, primoa32, 0, 0, primoa32, primo, primo_state, init_primo, "Microkey", "Primo A-32", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa48, primoa32, 0, primoa48, primo, primo_state, init_primo, "Microkey", "Primo A-48", 0 ) COMP( 1984, primoa48, primoa32, 0, primoa48, primo, primo_state, init_primo, "Microkey", "Primo A-48", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoa64, primoa32, 0, primoa64, primo, primo_state, init_primo, "Microkey", "Primo A-64", 0 ) COMP( 1984, primoa64, primoa32, 0, primoa64, primo, primo_state, init_primo, "Microkey", "Primo A-64", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob32, primoa32, 0, primob32, primo, primo_state, init_primo, "Microkey", "Primo B-32", 0 ) COMP( 1984, primob32, primoa32, 0, primob32, primo, primo_state, init_primo, "Microkey", "Primo B-32", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob48, primoa32, 0, primob48, primo, primo_state, init_primo, "Microkey", "Primo B-48", 0 ) COMP( 1984, primob48, primoa32, 0, primob48, primo, primo_state, init_primo, "Microkey", "Primo B-48", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primob64, primoa32, 0, primob64, primo, primo_state, init_primo, "Microkey", "Primo B-64", 0 ) COMP( 1984, primob64, primoa32, 0, primob64, primo, primo_state, init_primo, "Microkey", "Primo B-64", MACHINE_SUPPORTS_SAVE )
COMP( 1984, primoc64, primoa32, 0, primoc64, primo, primo_state, init_primo, "Microkey", "Primo C-64", MACHINE_NOT_WORKING ) COMP( 1984, primoc64, primoa32, 0, primoc64, primo, primo_state, init_primo, "Microkey", "Primo C-64", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )

View File

@ -23,20 +23,20 @@
class primo_state : public driver_device class primo_state : public driver_device
{ {
public: public:
primo_state(const machine_config &mconfig, device_type type, const char *tag) : primo_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_iec(*this, CBM_IEC_TAG), , m_iec(*this, CBM_IEC_TAG)
m_speaker(*this, "speaker"), , m_speaker(*this, "speaker")
m_cassette(*this, "cassette"), , m_cassette(*this, "cassette")
m_cart1(*this, "cartslot1"), , m_cart1(*this, "cartslot1")
m_cart2(*this, "cartslot2"), , m_cart2(*this, "cartslot2")
m_screen(*this, "screen"), , m_screen(*this, "screen")
m_mem_exp_port(*this, "MEMORY_EXPANSION"), , m_mem_exp_port(*this, "MEMORY_EXPANSION")
m_clock_port(*this, "CPU_CLOCK"), , m_clock_port(*this, "CPU_CLOCK")
m_keyboard_port(*this, "IN%u", 0U), , m_keyboard_port(*this, "IN%u", 0U)
m_reset_port(*this, "RESET"), , m_reset_port(*this, "RESET")
m_video_ram(*this, "videoram") , m_vram(*this, "videoram")
{ } { }
void init_primo(); void init_primo();
@ -50,29 +50,28 @@ public:
void primoa48(machine_config &config); void primoa48(machine_config &config);
private: private:
uint8_t primo_be_1_r(offs_t offset); uint8_t be_1_r(offs_t offset);
uint8_t primo_be_2_r(); uint8_t be_2_r();
void primo_ki_1_w(uint8_t data); void ki_1_w(uint8_t data);
void primo_ki_2_w(uint8_t data); void ki_2_w(uint8_t data);
void primo_FD_w(uint8_t data); void FD_w(uint8_t data);
virtual void machine_reset() override; void machine_reset() override;
virtual void machine_start() override; void machine_start() override;
DECLARE_MACHINE_RESET(primob); DECLARE_MACHINE_RESET(primob);
uint32_t screen_update_primo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank_irq); DECLARE_WRITE_LINE_MEMBER(vblank_irq);
void primo_draw_scanline(bitmap_ind16 &bitmap, int primo_scanline); void update_memory();
void primo_update_memory(); void common_machine_init();
void primo_common_machine_init(); void setup_pss(uint8_t* snapshot_data, uint32_t snapshot_size);
void primo_setup_pss(uint8_t* snapshot_data, uint32_t snapshot_size); void setup_pp(uint8_t* quickload_data, uint32_t quickload_size);
void primo_setup_pp(uint8_t* quickload_data, uint32_t quickload_size);
DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb); DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb);
DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb); DECLARE_QUICKLOAD_LOAD_MEMBER(quickload_cb);
void primo32_mem(address_map &map); void primo32_mem(address_map &map);
void primo48_mem(address_map &map); void primo48_mem(address_map &map);
void primo64_mem(address_map &map); void primo64_mem(address_map &map);
void primoa_port(address_map &map); void primoa_io(address_map &map);
void primob_port(address_map &map); void primob_io(address_map &map);
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cbm_iec_device> m_iec; required_device<cbm_iec_device> m_iec;
@ -85,7 +84,7 @@ private:
required_ioport m_clock_port; required_ioport m_clock_port;
required_ioport_array<4> m_keyboard_port; required_ioport_array<4> m_keyboard_port;
required_ioport m_reset_port; required_ioport m_reset_port;
required_shared_ptr<uint8_t> m_video_ram; required_shared_ptr<uint8_t> m_vram;
memory_region *m_cart1_rom; memory_region *m_cart1_rom;
memory_region *m_cart2_rom; memory_region *m_cart2_rom;

View File

@ -127,9 +127,5 @@ private:
output_finder<6> m_digits; output_finder<6> m_digits;
}; };
/*----------- defined in video/ut88.c -----------*/
extern const gfx_layout ut88_charlayout;
#endif // MAME_INCLUDES_UT88_H #endif // MAME_INCLUDES_UT88_H

View File

@ -39,14 +39,14 @@ WRITE_LINE_MEMBER(primo_state::vblank_irq)
*******************************************************************************/ *******************************************************************************/
void primo_state::primo_update_memory() void primo_state::update_memory()
{ {
address_space& space = m_maincpu->space(AS_PROGRAM); address_space& space = m_maincpu->space(AS_PROGRAM);
switch (m_port_FD & 0x03) switch (m_port_FD & 0x03)
{ {
case 0x00: /* Original ROM */ case 0x00: /* Original ROM */
space.unmap_write(0x0000, 0x3fff); space.unmap_write(0x0000, 0x3fff);
membank("bank1")->set_base(memregion("maincpu")->base() + 0x10000); membank("bank1")->set_base(memregion("maincpu")->base());
break; break;
case 0x01: /* EPROM extension 1 */ case 0x01: /* EPROM extension 1 */
space.unmap_write(0x0000, 0x3fff); space.unmap_write(0x0000, 0x3fff);
@ -70,7 +70,7 @@ void primo_state::primo_update_memory()
*******************************************************************************/ *******************************************************************************/
uint8_t primo_state::primo_be_1_r(offs_t offset) uint8_t primo_state::be_1_r(offs_t offset)
{ {
uint8_t data = 0x00; uint8_t data = 0x00;
@ -95,7 +95,7 @@ uint8_t primo_state::primo_be_1_r(offs_t offset)
return data; return data;
} }
uint8_t primo_state::primo_be_2_r() uint8_t primo_state::be_2_r()
{ {
uint8_t data = 0xff; uint8_t data = 0xff;
@ -125,7 +125,7 @@ uint8_t primo_state::primo_be_2_r()
return data; return data;
} }
void primo_state::primo_ki_1_w(uint8_t data) void primo_state::ki_1_w(uint8_t data)
{ {
// bit 7 - NMI generator enable/disable // bit 7 - NMI generator enable/disable
m_nmi = BIT(data, 7); m_nmi = BIT(data, 7);
@ -161,7 +161,7 @@ void primo_state::primo_ki_1_w(uint8_t data)
} }
} }
void primo_state::primo_ki_2_w(uint8_t data) void primo_state::ki_2_w(uint8_t data)
{ {
// bit 7, 6 - not used // bit 7, 6 - not used
@ -184,12 +184,12 @@ void primo_state::primo_ki_2_w(uint8_t data)
// logerror ("IOW KI-2 data:%02x\n", data); // logerror ("IOW KI-2 data:%02x\n", data);
} }
void primo_state::primo_FD_w(uint8_t data) void primo_state::FD_w(uint8_t data)
{ {
if (!m_mem_exp_port->read()) if (!m_mem_exp_port->read())
{ {
m_port_FD = data; m_port_FD = data;
primo_update_memory(); update_memory();
} }
} }
@ -211,16 +211,20 @@ void primo_state::init_primo()
*******************************************************************************/ *******************************************************************************/
void primo_state::primo_common_machine_init() void primo_state::common_machine_init()
{ {
if (m_mem_exp_port->read()) if (m_mem_exp_port->read())
m_port_FD = 0x00; m_port_FD = 0x00;
primo_update_memory(); update_memory();
m_maincpu->set_clock_scale(m_clock_port->read() ? 1.5 : 1.0); m_maincpu->set_clock_scale(m_clock_port->read() ? 1.5 : 1.0);
} }
void primo_state::machine_start() void primo_state::machine_start()
{ {
save_item(NAME(m_video_memory_base));
save_item(NAME(m_port_FD));
save_item(NAME(m_nmi));
std::string region_tag; std::string region_tag;
m_cart1_rom = memregion(region_tag.assign(m_cart1->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); m_cart1_rom = memregion(region_tag.assign(m_cart1->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
m_cart2_rom = memregion(region_tag.assign(m_cart2->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); m_cart2_rom = memregion(region_tag.assign(m_cart2->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
@ -228,12 +232,12 @@ void primo_state::machine_start()
void primo_state::machine_reset() void primo_state::machine_reset()
{ {
primo_common_machine_init(); common_machine_init();
} }
MACHINE_RESET_MEMBER(primo_state,primob) MACHINE_RESET_MEMBER(primo_state,primob)
{ {
primo_common_machine_init(); common_machine_init();
//removed cbm_drive_0_config(SERIAL, 8); //removed cbm_drive_0_config(SERIAL, 8);
//removed cbm_drive_1_config(SERIAL, 9); //removed cbm_drive_1_config(SERIAL, 9);
@ -245,7 +249,7 @@ MACHINE_RESET_MEMBER(primo_state,primob)
*******************************************************************************/ *******************************************************************************/
void primo_state::primo_setup_pss (uint8_t* snapshot_data, uint32_t snapshot_size) void primo_state::setup_pss (uint8_t* snapshot_data, uint32_t snapshot_size)
{ {
/* Z80 registers */ /* Z80 registers */
m_maincpu->set_state_int(Z80_BC, snapshot_data[4] + snapshot_data[5]*256); m_maincpu->set_state_int(Z80_BC, snapshot_data[4] + snapshot_data[5]*256);
@ -272,9 +276,8 @@ void primo_state::primo_setup_pss (uint8_t* snapshot_data, uint32_t snapshot_siz
// KI-1 bit 4 - speaker // KI-1 bit 4 - speaker
m_speaker->level_w(BIT(snapshot_data[30], 4)); m_speaker->level_w(BIT(snapshot_data[30], 4));
/* memory */ /* memory */
for (int i = 0; i < 0xc000; i++) for (u16 i = 0; i < 0xc000; i++)
m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, snapshot_data[i + 38]); m_maincpu->space(AS_PROGRAM).write_byte(i + 0x4000, snapshot_data[i + 38]);
} }
@ -292,7 +295,7 @@ SNAPSHOT_LOAD_MEMBER(primo_state::snapshot_cb)
return image_init_result::FAIL; return image_init_result::FAIL;
} }
primo_setup_pss(&snapshot_data[0], snapshot_size); setup_pss(&snapshot_data[0], snapshot_size);
return image_init_result::PASS; return image_init_result::PASS;
} }
@ -304,15 +307,12 @@ SNAPSHOT_LOAD_MEMBER(primo_state::snapshot_cb)
*******************************************************************************/ *******************************************************************************/
void primo_state::primo_setup_pp(uint8_t* quickload_data, uint32_t quickload_size) void primo_state::setup_pp(uint8_t* quickload_data, uint32_t quickload_size)
{ {
uint16_t load_addr; u16 load_addr = quickload_data[0] + quickload_data[1]*256;
uint16_t start_addr; u16 start_addr = quickload_data[2] + quickload_data[3]*256;
load_addr = quickload_data[0] + quickload_data[1]*256; for (u32 i = 4; i < quickload_size; i++)
start_addr = quickload_data[2] + quickload_data[3]*256;
for (int i = 4; i < quickload_size; i++)
m_maincpu->space(AS_PROGRAM).write_byte(start_addr+i-4, quickload_data[i]); m_maincpu->space(AS_PROGRAM).write_byte(start_addr+i-4, quickload_data[i]);
m_maincpu->set_state_int(Z80_PC, start_addr); m_maincpu->set_state_int(Z80_PC, start_addr);
@ -329,7 +329,26 @@ QUICKLOAD_LOAD_MEMBER(primo_state::quickload_cb)
return image_init_result::FAIL; return image_init_result::FAIL;
} }
primo_setup_pp(&quickload_data[0], quickload_size); setup_pp(&quickload_data[0], quickload_size);
return image_init_result::PASS; return image_init_result::PASS;
} }
u32 primo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
u32 ma = m_video_memory_base;
for (u8 y = 0; y < 192; y++)
{
u16 *p = &bitmap.pix16(y);
for (u16 x = 0; x < 32; x++)
{
u8 data = m_vram[ma+x];
for (u8 i = 0; i < 8; i++)
*p++ = BIT(data, i^7);
}
ma += 32;
}
return 0;
}

View File

@ -1,47 +0,0 @@
// license:BSD-3-Clause
// copyright-holders:Krzysztof Strzecha
/***************************************************************************
primo.c
Functions to emulate the video hardware of Primo.
Krzysztof Strzecha
***************************************************************************/
#include "emu.h"
#include "includes/primo.h"
void primo_state::primo_draw_scanline(bitmap_ind16 &bitmap, int primo_scanline)
{
int x, i;
uint8_t data;
/* set up scanline */
uint16_t *scanline = &bitmap.pix16(primo_scanline);
/* address of current line in Primo video memory */
const uint8_t* primo_video_ram_line = &m_video_ram[m_video_memory_base + 32 * primo_scanline];
for (x=0; x<256; x+=8)
{
data = primo_video_ram_line[x/8];
for (i=0; i<8; i++)
scanline[x+i]=(data & (0x80>>i)) ? 1 : 0;
}
}
uint32_t primo_state::screen_update_primo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int primo_scanline;
for (primo_scanline=0; primo_scanline<192; primo_scanline++)
primo_draw_scanline( bitmap, primo_scanline);
return 0;
}