1 // license:BSD-3-Clause 2 // copyright-holders:Sandro Ronco 3 /*************************************************************************** 4 5 Psion Organiser II series 6 7 ****************************************************************************/ 8 #ifndef MAME_INCLUDES_PSION_H 9 #define MAME_INCLUDES_PSION_H 10 11 #pragma once 12 13 #include "cpu/m6800/m6801.h" 14 #include "machine/nvram.h" 15 #include "machine/psion_pack.h" 16 #include "machine/timer.h" 17 #include "video/hd44780.h" 18 #include "sound/beep.h" 19 #include "emupal.h" 20 21 22 // ======================> psion_state 23 24 class psion_state : public driver_device 25 { 26 public: psion_state(const machine_config & mconfig,device_type type,const char * tag)27 psion_state(const machine_config &mconfig, device_type type, const char *tag) 28 : driver_device(mconfig, type, tag) 29 , m_maincpu(*this, "maincpu") 30 , m_lcdc(*this, "hd44780") 31 , m_beep(*this, "beeper") 32 , m_pack1(*this, "pack1") 33 , m_pack2(*this, "pack2") 34 , m_nvram1(*this, "nvram1") 35 , m_nvram2(*this, "nvram2") 36 , m_nvram3(*this, "nvram3") 37 , m_sys_register(*this, "sys_register") 38 , m_stby_pwr(1) 39 , m_ram(*this, "ram") 40 , m_kb_lines(*this, "K%u", 1U) 41 { } 42 43 void psion_2lines(machine_config &config); 44 void psion_4lines(machine_config &config); 45 void psionlam(machine_config &config); 46 void psioncm(machine_config &config); 47 void psionlz(machine_config &config); 48 void psionla(machine_config &config); 49 void psionp350(machine_config &config); 50 51 DECLARE_INPUT_CHANGED_MEMBER(psion_on); 52 53 protected: 54 required_device<hd6301x_cpu_device> m_maincpu; 55 required_device<hd44780_device> m_lcdc; 56 required_device<beep_device> m_beep; 57 required_device<datapack_device> m_pack1; 58 required_device<datapack_device> m_pack2; 59 required_device<nvram_device> m_nvram1; 60 required_device<nvram_device> m_nvram2; 61 optional_device<nvram_device> m_nvram3; 62 63 uint16_t m_kb_counter; 64 uint8_t m_enable_nmi; 65 optional_shared_ptr<uint8_t> m_sys_register; 66 uint8_t m_stby_pwr; 67 uint8_t m_pulse; 68 69 // RAM/ROM banks 70 required_shared_ptr<uint8_t> m_ram; 71 std::unique_ptr<uint8_t[]> m_paged_ram; 72 uint8_t m_rom_bank; 73 uint8_t m_ram_bank; 74 uint8_t m_ram_bank_count; 75 uint8_t m_rom_bank_count; 76 77 required_ioport_array<7> m_kb_lines; 78 79 virtual void machine_start() override; 80 virtual void machine_reset() override; 81 void nvram_init(nvram_device &nvram, void *data, size_t size); 82 83 uint8_t kb_read(); 84 void update_banks(); 85 void port2_w(offs_t offset, uint8_t data, uint8_t ddr); 86 uint8_t port2_r(); 87 uint8_t port5_r(); 88 void port6_w(uint8_t data); 89 uint8_t port6_r(); 90 void io_rw(uint16_t offset); 91 void io_w(offs_t offset, uint8_t data); 92 uint8_t io_r(offs_t offset); 93 void psion_palette(palette_device &palette) const; 94 TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer); 95 96 HD44780_PIXEL_UPDATE(lz_pixel_update); 97 void psion_int_reg(address_map &map); 98 void psioncm_mem(address_map &map); 99 void psionla_mem(address_map &map); 100 void psionlam_mem(address_map &map); 101 void psionlz_mem(address_map &map); 102 void psionp350_mem(address_map &map); 103 }; 104 105 106 class psion1_state : public psion_state 107 { 108 public: psion1_state(const machine_config & mconfig,device_type type,const char * tag)109 psion1_state(const machine_config &mconfig, device_type type, const char *tag) 110 : psion_state(mconfig, type, tag) 111 { } 112 113 void psion1(machine_config &config); 114 115 private: 116 virtual void machine_reset() override; 117 118 uint8_t reset_kb_counter_r(); 119 uint8_t inc_kb_counter_r(); 120 uint8_t switchoff_r(); 121 122 HD44780_PIXEL_UPDATE(psion1_pixel_update); 123 void psion1_mem(address_map &map); 124 }; 125 126 #endif // MAME_INCLUDES_PSION_H 127