// license:BSD-3-Clause // copyright-holders:Wilbert Pol,Vas Crabb /***************************************************************************** * * includes/osborne1.h * ****************************************************************************/ #ifndef MAME_INCLUDES_OSBORNE1_H #define MAME_INCLUDES_OSBORNE1_H #pragma once #include "bus/ieee488/ieee488.h" #include "cpu/z80/z80.h" #include "imagedev/floppy.h" #include "machine/6821pia.h" #include "machine/6850acia.h" #include "machine/ram.h" #include "machine/wd_fdc.h" #include "sound/spkrdev.h" #include "video/mc6845.h" #include "emupal.h" #include "screen.h" #include "tilemap.h" class osborne1_state : public driver_device { public: osborne1_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_ram(*this, RAM_TAG), m_screen(*this, "screen"), m_maincpu(*this, "maincpu"), m_pia0(*this, "pia_0"), m_pia1(*this, "pia_1"), m_gfxdecode(*this, "gfxdecode"), m_speaker(*this, "speaker"), m_acia(*this, "acia"), m_fdc(*this, "mb8877"), m_ieee(*this, IEEE488_TAG), m_floppy0(*this, "mb8877:0"), m_floppy1(*this, "mb8877:1"), m_keyb_row(*this, { "ROW0", "ROW1", "ROW3", "ROW4", "ROW5", "ROW2", "ROW6", "ROW7" }), m_btn_reset(*this, "RESET"), m_cnf(*this, "CNF"), m_region_maincpu(*this, "maincpu"), m_bank_0xxx(*this, "bank_0xxx"), m_bank_1xxx(*this, "bank_1xxx"), m_bank_fxxx(*this, "bank_fxxx"), m_p_chargen(*this, "chargen"), m_video_timer(nullptr), m_tilemap(nullptr), m_acia_rxc_txc_timer(nullptr), m_mem_cache(nullptr) { } void osborne1(machine_config &config); DECLARE_INPUT_CHANGED_MEMBER(reset_key); protected: virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; void osborne1_base(machine_config &config); void osborne1_mem(address_map &map); void osborne1_op(address_map &map); void osborne1_io(address_map &map); DECLARE_WRITE8_MEMBER(bank_0xxx_w); DECLARE_WRITE8_MEMBER(bank_1xxx_w); DECLARE_READ8_MEMBER(bank_2xxx_3xxx_r); DECLARE_WRITE8_MEMBER(bank_2xxx_3xxx_w); DECLARE_WRITE8_MEMBER(videoram_w); DECLARE_READ8_MEMBER(opcode_r); DECLARE_WRITE8_MEMBER(bankswitch_w); DECLARE_WRITE_LINE_MEMBER(irqack_w); bool rom_mode() const { return 0 != m_rom_mode; } u8 scroll_x() const { return m_scroll_x; } template void draw_rows(uint16_t col, bitmap_ind16 &bitmap, const rectangle &cliprect); required_device m_ram; required_device m_screen; required_device m_maincpu; required_device m_pia0; required_device m_pia1; private: DECLARE_READ8_MEMBER(ieee_pia_pb_r); DECLARE_WRITE8_MEMBER(ieee_pia_pb_w); DECLARE_WRITE_LINE_MEMBER(ieee_pia_irq_a_func); DECLARE_WRITE8_MEMBER(video_pia_port_a_w); DECLARE_WRITE8_MEMBER(video_pia_port_b_w); DECLARE_WRITE_LINE_MEMBER(video_pia_out_cb2_dummy); DECLARE_WRITE_LINE_MEMBER(video_pia_irq_a_func); DECLARE_WRITE_LINE_MEMBER(serial_acia_irq_func); u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); required_device m_gfxdecode; required_device m_speaker; required_device m_acia; required_device m_fdc; required_device m_ieee; required_device m_floppy0; required_device m_floppy1; TIMER_CALLBACK_MEMBER(video_callback); TIMER_CALLBACK_MEMBER(acia_rxc_txc_callback); TILE_GET_INFO_MEMBER(get_tile_info); bool set_rom_mode(u8 value); bool set_bit_9(u8 value); void update_irq(); void update_acia_rxc_txc(); // user inputs required_ioport_array<8> m_keyb_row; required_ioport m_btn_reset; // fake inputs for hardware configuration and things that need rewiring required_ioport m_cnf; // pieces of memory required_memory_region m_region_maincpu; required_memory_bank m_bank_0xxx; required_memory_bank m_bank_1xxx; required_memory_bank m_bank_fxxx; required_region_ptr m_p_chargen; // configuration (reloaded on reset) u8 m_acia_rxc_txc_div; u8 m_acia_rxc_txc_p_low; u8 m_acia_rxc_txc_p_high; // bank switch control bits u8 m_ub4a_q; u8 m_ub6a_q; u8 m_rom_mode; u8 m_bit_9; // onboard video state u8 m_scroll_x; u8 m_scroll_y; u8 m_beep_state; emu_timer *m_video_timer; tilemap_t *m_tilemap; // serial state u8 m_acia_irq_state; u8 m_acia_rxc_txc_state; emu_timer *m_acia_rxc_txc_timer; memory_access_cache<0, 0, ENDIANNESS_LITTLE> *m_mem_cache; }; class osborne1sp_state : public osborne1_state { public: osborne1sp_state(const machine_config &mconfig, device_type type, const char *tag) : osborne1_state(mconfig, type, tag) { } void osborne1sp(machine_config &config); protected: virtual void machine_start() override; virtual void machine_reset() override; void osborne1sp_mem(address_map &map); DECLARE_READ8_MEMBER(bank_2xxx_3xxx_r); DECLARE_WRITE8_MEMBER(bank_2xxx_3xxx_w); private: u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); // SCREEN-PAC registers u8 m_resolution; u8 m_hc_left; }; class osborne1nv_state : public osborne1_state { public: osborne1nv_state(const machine_config &mconfig, device_type type, const char *tag) : osborne1_state(mconfig, type, tag), m_palette(*this, "palette"), m_p_nuevo(*this, "nuevo") { } void osborne1nv(machine_config &config); private: void osborne1nv_io(address_map &map); MC6845_UPDATE_ROW(crtc_update_row); MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr_changed); required_device m_palette; required_region_ptr m_p_nuevo; }; #endif // MAME_INCLUDES_OSBORNE1_H