From 1eb87b7619c6434d2f63954c7f7281305c85168a Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 6 Apr 2020 23:10:12 -0400 Subject: [PATCH] fp1100: Simplify handler signatures and type names; clean up memory usage (nw) --- src/mame/drivers/fp1100.cpp | 167 ++++++++++++++++++------------------ 1 file changed, 83 insertions(+), 84 deletions(-) diff --git a/src/mame/drivers/fp1100.cpp b/src/mame/drivers/fp1100.cpp index 7d12ed2b1e3..dab8f080191 100644 --- a/src/mame/drivers/fp1100.cpp +++ b/src/mame/drivers/fp1100.cpp @@ -50,7 +50,7 @@ #define VERBOSE 0 #include "logmacro.h" -#define MAIN_CLOCK 15974400 +#define MAIN_CLOCK 15.9744_MHz_XTAL class fp1100_state : public driver_device { @@ -61,7 +61,9 @@ public: , m_maincpu(*this, "maincpu") , m_subcpu(*this, "sub") , m_crtc(*this, "crtc") - , m_p_videoram(*this, "videoram") + , m_ipl(*this, "ipl") + , m_wram(*this, "wram") + , m_videoram(*this, "videoram") , m_keyboard(*this, "KEY.%u", 0) , m_beep(*this, "beeper") , m_centronics(*this, "centronics") @@ -70,58 +72,62 @@ public: void fp1100(machine_config &config); - void init_fp1100(); - protected: virtual void machine_reset() override; private: - DECLARE_WRITE8_MEMBER(main_bank_w); - DECLARE_WRITE8_MEMBER(irq_mask_w); - DECLARE_WRITE8_MEMBER(slot_bank_w); - DECLARE_READ8_MEMBER(slot_id_r); - DECLARE_WRITE8_MEMBER(colour_control_w); - DECLARE_WRITE8_MEMBER(kbd_row_w); - DECLARE_WRITE8_MEMBER(porta_w); - DECLARE_READ8_MEMBER(portb_r); - DECLARE_READ8_MEMBER(portc_r); - DECLARE_WRITE8_MEMBER(portc_w); + void main_bank_w(u8 data); + void irq_mask_w(u8 data); + void slot_bank_w(u8 data); + u8 slot_id_r(); + u8 memory_r(offs_t offset); + void colour_control_w(u8 data); + void kbd_row_w(u8 data); + void porta_w(u8 data); + u8 portb_r(); + u8 portc_r(); + void portc_w(u8 data); DECLARE_WRITE_LINE_MEMBER(centronics_busy_w); INTERRUPT_GEN_MEMBER(vblank_irq); MC6845_UPDATE_ROW(crtc_update_row); TIMER_DEVICE_CALLBACK_MEMBER(kansas_w); + required_device m_palette; + void io_map(address_map &map); void main_map(address_map &map); void sub_map(address_map &map); void handle_int_to_main(); - uint8_t m_irq_mask; - uint8_t m_slot_num; - uint8_t m_kbd_row; - uint8_t m_col_border; - uint8_t m_col_cursor; - uint8_t m_col_display; - uint8_t m_centronics_busy; - uint8_t m_cass_data[4]; + u8 m_irq_mask; + u8 m_slot_num; + u8 m_kbd_row; + u8 m_col_border; + u8 m_col_cursor; + u8 m_col_display; + u8 m_centronics_busy; + u8 m_cass_data[4]; + bool m_bank_sel; bool m_main_irq_status; bool m_sub_irq_status; bool m_cassbit; bool m_cassold; struct { - uint8_t id; + u8 id; }m_slot[8]; struct { - uint8_t porta; - uint8_t portb; - uint8_t portc; + u8 porta; + u8 portb; + u8 portc; }m_upd7801; required_device m_maincpu; required_device m_subcpu; required_device m_crtc; - required_shared_ptr m_p_videoram; + required_region_ptr m_ipl; + required_shared_ptr m_wram; + required_shared_ptr m_videoram; required_ioport_array<16> m_keyboard; required_device m_beep; required_device m_centronics; @@ -131,19 +137,17 @@ private: MC6845_UPDATE_ROW( fp1100_state::crtc_update_row ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); - uint8_t r,g,b,col,i; - uint16_t mem,x; - uint32_t *p = &bitmap.pix32(y); + u32 *p = &bitmap.pix32(y); if (BIT(m_upd7801.porta, 4)) { // green screen - for (x = 0; x < x_count; x++) + for (u16 x = 0; x < x_count; x++) { - mem = (((ma+x)<<3) + ra) & 0x3fff; - g = m_p_videoram[mem]; - for (i = 0; i < 8; i++) + u16 mem = (((ma+x)<<3) + ra) & 0x3fff; + u8 g = m_videoram[mem]; + for (u8 i = 0; i < 8; i++) { - col = BIT(g, i); + u8 col = BIT(g, i); if (x == cursor_x) col ^= 1; *p++ = palette[col<<1]; } @@ -151,15 +155,15 @@ MC6845_UPDATE_ROW( fp1100_state::crtc_update_row ) } else { // RGB screen - for (x = 0; x < x_count; x++) + for (u16 x = 0; x < x_count; x++) { - mem = (((ma+x)<<3) + ra) & 0x3fff; - b = m_p_videoram[mem]; - r = m_p_videoram[mem+0x4000]; - g = m_p_videoram[mem+0x8000]; - for (i = 0; i < 8; i++) + u16 mem = (((ma+x)<<3) + ra) & 0x3fff; + u8 b = m_videoram[mem]; + u8 r = m_videoram[mem+0x4000]; + u8 g = m_videoram[mem+0x8000]; + for (u8 i = 0; i < 8; i++) { - col = BIT(r, i) + (BIT(g, i) << 1) + (BIT(b, i) << 2); + u8 col = BIT(r, i) + (BIT(g, i) << 1) + (BIT(b, i) << 2); if (x == cursor_x) col = m_col_cursor; *p++ = palette[col]; } @@ -172,14 +176,14 @@ d0 - Package select d1 - Bank select (at boot time) other bits not used */ -WRITE8_MEMBER( fp1100_state::main_bank_w ) +void fp1100_state::main_bank_w(u8 data) { - membank("bankr0")->set_entry( BIT(data,1)); //(1) RAM (0) ROM + m_bank_sel = BIT(data, 1); m_slot_num = (m_slot_num & 3) | ((data & 1) << 2); //?? } // tell sub that latch has a byte -WRITE8_MEMBER( fp1100_state::irq_mask_w ) +void fp1100_state::irq_mask_w(u8 data) { m_irq_mask = data; handle_int_to_main(); @@ -201,33 +205,41 @@ WRITE8_MEMBER( fp1100_state::irq_mask_w ) LOG("%s: IRQmask=%X\n",machine().describe_context(),data); } -WRITE8_MEMBER( fp1100_state::slot_bank_w ) +void fp1100_state::slot_bank_w(u8 data) { m_slot_num = (data & 3) | (m_slot_num & 4); } -READ8_MEMBER( fp1100_state::slot_id_r ) +u8 fp1100_state::slot_id_r() { //return 0xff; return m_slot[m_slot_num & 7].id; } +u8 fp1100_state::memory_r(offs_t offset) +{ + if (offset < 0x9000 && !m_bank_sel) + return m_ipl[offset]; + else + return m_wram[offset]; +} + void fp1100_state::main_map(address_map &map) { map.unmap_value_high(); - map(0x0000, 0x8fff).bankr("bankr0").bankw("bankw0"); - map(0x9000, 0xffff).ram().region("wram", 0x9000); + map(0x0000, 0xffff).r(FUNC(fp1100_state::memory_r)); + map(0x0000, 0xffff).writeonly().share("wram"); // always write to ram } void fp1100_state::io_map(address_map &map) { map.unmap_value_high(); //map(0x0000, 0xfeff) slot memory area - map(0xff00, 0xff7f).rw(FUNC(fp1100_state::slot_id_r), FUNC(fp1100_state::slot_bank_w)); - map(0xff80, 0xffff).r("sub2main", FUNC(generic_latch_8_device::read)); - map(0xff80, 0xff9f).w(FUNC(fp1100_state::irq_mask_w)); - map(0xffa0, 0xffbf).w(FUNC(fp1100_state::main_bank_w)); - map(0xffc0, 0xffff).w("main2sub", FUNC(generic_latch_8_device::write)); + map(0xff00, 0xff00).mirror(0x7f).rw(FUNC(fp1100_state::slot_id_r), FUNC(fp1100_state::slot_bank_w)); + map(0xff80, 0xff80).mirror(0x7f).r("sub2main", FUNC(generic_latch_8_device::read)); + map(0xff80, 0xff80).mirror(0x1f).w(FUNC(fp1100_state::irq_mask_w)); + map(0xffa0, 0xffa0).mirror(0x1f).w(FUNC(fp1100_state::main_bank_w)); + map(0xffc0, 0xffc0).mirror(0x3f).w("main2sub", FUNC(generic_latch_8_device::write)); } /* @@ -236,7 +248,7 @@ d3 - not used d4,5,6 - colour of cursor; or display area (B,R,G) (see d7) d7 - 1=display area; 0=cursor */ -WRITE8_MEMBER( fp1100_state::colour_control_w ) +void fp1100_state::colour_control_w(u8 data) { data = bitswap<8>(data, 7, 4, 6, 5, 3, 0, 2, 1); // change BRG to RGB @@ -257,7 +269,7 @@ d4 - Beeper d5 - "3state buffer of key data line (1=open, 0=closed)" d6,7 - not used */ -WRITE8_MEMBER( fp1100_state::kbd_row_w ) +void fp1100_state::kbd_row_w(u8 data) { m_kbd_row = data; m_beep->set_state(BIT(data, 4)); @@ -269,11 +281,11 @@ void fp1100_state::sub_map(address_map &map) map(0x2000, 0xdfff).ram().share("videoram"); //vram B/R/G map(0xe000, 0xe000).mirror(0x3fe).rw(m_crtc, FUNC(mc6845_device::status_r), FUNC(mc6845_device::address_w)); map(0xe001, 0xe001).mirror(0x3fe).rw(m_crtc, FUNC(mc6845_device::register_r), FUNC(mc6845_device::register_w)); - map(0xe400, 0xe7ff).portr("DSW").w(FUNC(fp1100_state::kbd_row_w)); - map(0xe800, 0xebff).r("main2sub", FUNC(generic_latch_8_device::read)); - map(0xe800, 0xebff).w("sub2main", FUNC(generic_latch_8_device::write)); - map(0xec00, 0xefff).lw8(NAME([this] (u8 data) { m_subcpu->set_input_line(UPD7810_INTF0, CLEAR_LINE); })); - map(0xf000, 0xf3ff).w(FUNC(fp1100_state::colour_control_w)); + map(0xe400, 0xe400).mirror(0x3ff).portr("DSW").w(FUNC(fp1100_state::kbd_row_w)); + map(0xe800, 0xe800).mirror(0x3ff).r("main2sub", FUNC(generic_latch_8_device::read)); + map(0xe800, 0xe800).mirror(0x3ff).w("sub2main", FUNC(generic_latch_8_device::write)); + map(0xec00, 0xec00).mirror(0x3ff).lw8(NAME([this] (u8 data) { m_subcpu->set_input_line(UPD7810_INTF0, CLEAR_LINE); })); + map(0xf000, 0xf000).mirror(0x3ff).w(FUNC(fp1100_state::colour_control_w)); map(0xf400, 0xff7f).rom().region("sub_ipl", 0x2400); } @@ -286,15 +298,15 @@ d6 - CMT baud rate (1=300; 0=1200) d7 - CMT load clock The SO pin is Serial Output to CMT (1=2400Hz; 0=1200Hz) */ -WRITE8_MEMBER( fp1100_state::porta_w ) +void fp1100_state::porta_w(u8 data) { m_upd7801.porta = data; if (BIT(data, 5)) - memset(m_p_videoram, 0, 0xc000); + memset(m_videoram, 0, 0xc000); } -READ8_MEMBER( fp1100_state::portb_r ) +u8 fp1100_state::portb_r() { u8 data = m_keyboard[m_kbd_row & 15]->read() ^ 0xff; LOG("%s: PortB:%X:%X\n",machine().describe_context(),m_kbd_row,data); @@ -311,7 +323,7 @@ d1 - Centronics error d2 - CMT load input clock d7 - CMT load serial data */ -READ8_MEMBER( fp1100_state::portc_r ) +u8 fp1100_state::portc_r() { return (m_upd7801.portc & 0x78) | m_centronics_busy; } @@ -322,7 +334,7 @@ d4 - Centronics port is used for input or output d5 - CMT relay d6 - Centronics strobe */ -WRITE8_MEMBER( fp1100_state::portc_w ) +void fp1100_state::portc_w(u8 data) { u8 bits = data ^ m_upd7801.portc; m_upd7801.portc = data; @@ -607,8 +619,8 @@ void fp1100_state::machine_reset() m_main_irq_status = false; m_sub_irq_status = false; int i; - uint8_t slot_type; - const uint8_t id_type[4] = { 0xff, 0x00, 0x01, 0x04}; + u8 slot_type; + const u8 id_type[4] = { 0xff, 0x00, 0x01, 0x04}; for(i=0;i<8;i++) { slot_type = (ioport("SLOTS")->read() >> i*2) & 3; @@ -617,8 +629,7 @@ void fp1100_state::machine_reset() m_beep->set_state(0); - membank("bankr0")->set_entry(0); // point at rom - membank("bankw0")->set_entry(0); // always write to ram + m_bank_sel = false; // point at rom m_irq_mask = 0; m_slot_num = 0; @@ -632,16 +643,6 @@ void fp1100_state::machine_reset() m_maincpu->set_input_line_vector(0, 0xF0); } -void fp1100_state::init_fp1100() -{ - uint8_t *main = memregion("ipl")->base(); - uint8_t *wram = memregion("wram")->base(); - - membank("bankr0")->configure_entry(1, &wram[0x0000]); - membank("bankr0")->configure_entry(0, &main[0x0000]); - membank("bankw0")->configure_entry(0, &wram[0x0000]); -} - void fp1100_state::fp1100(machine_config &config) { /* basic machine hardware */ @@ -707,11 +708,9 @@ ROM_START( fp1100 ) ROM_LOAD( "sub1.rom", 0x0000, 0x1000, CRC(8feda489) SHA1(917d5b398b9e7b9a6bfa5e2f88c5b99923c3c2a3)) ROM_LOAD( "sub2.rom", 0x1000, 0x1000, CRC(359f007e) SHA1(0188d5a7b859075cb156ee55318611bd004128d7)) ROM_LOAD( "sub3.rom", 0x2000, 0xf80, BAD_DUMP CRC(fb2b577a) SHA1(a9ae6b03e06ea2f5db30dfd51ebf5aede01d9672)) - - ROM_REGION( 0x10000, "wram", ROMREGION_ERASE00 ) ROM_END /* Driver */ -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1983, fp1100, 0, 0, fp1100, fp1100, fp1100_state, init_fp1100, "Casio", "FP-1100", MACHINE_NOT_WORKING) +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP( 1983, fp1100, 0, 0, fp1100, fp1100, fp1100_state, empty_init, "Casio", "FP-1100", MACHINE_NOT_WORKING)