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