1 // license:GPL-2.0+
2 // copyright-holders:Wilbert Pol, Kevin Thacker
3 /*****************************************************************************
4  *
5  * includes/nc.h
6  *
7  ****************************************************************************/
8 #ifndef MAME_INCLUDES_NC_H
9 #define MAME_INCLUDES_NC_H
10 
11 #pragma once
12 
13 #include "bus/centronics/ctronics.h"
14 #include "machine/upd765.h"     // for NC200 disk drive interface
15 #include "machine/i8251.h"
16 #include "machine/clock.h"
17 #include "machine/ram.h"
18 #include "machine/nvram.h"
19 #include "machine/timer.h"
20 #include "sound/beep.h"
21 #include "emupal.h"
22 
23 #include "bus/generic/slot.h"
24 #include "bus/generic/carts.h"
25 
26 #define NC_NUM_COLOURS 4
27 
28 #define NC_SCREEN_WIDTH        480
29 #define NC_SCREEN_HEIGHT       64
30 
31 #define NC200_SCREEN_WIDTH      480
32 #define NC200_SCREEN_HEIGHT     128
33 
34 #define NC200_NUM_COLOURS 4
35 
36 class nc_state : public driver_device
37 {
38 public:
39 	enum nc_type
40 	{
41 		NC_TYPE_1xx, // nc100/nc150
42 		NC_TYPE_200  // nc200
43 	};
44 
nc_state(const machine_config & mconfig,device_type type,const char * tag,nc_type variant)45 	nc_state(const machine_config &mconfig, device_type type, const char *tag, nc_type variant) :
46 		driver_device(mconfig, type, tag),
47 		m_maincpu(*this, "maincpu"),
48 		m_ram(*this, RAM_TAG),
49 		m_beeper1(*this, "beep.1"),
50 		m_beeper2(*this, "beep.2"),
51 		m_centronics(*this, "centronics"),
52 		m_card(*this, "cardslot"),
53 		m_uart(*this, "uart"),
54 		m_uart_clock(*this, "uart_clock"),
55 		m_nvram(*this, "nvram"),
56 		m_fdc(*this, "upd765"),
57 		m_nc_type(variant)
58 	{
59 	}
60 
61 	void nc_base(machine_config &config);
62 
63 	void init_nc();
64 
65 protected:
66 	uint8_t nc_memory_management_r(offs_t offset);
67 	void nc_memory_management_w(offs_t offset, uint8_t data);
68 	void nc_irq_mask_w(uint8_t data);
69 	void nc_irq_status_w(uint8_t data);
70 	uint8_t nc_irq_status_r();
71 	uint8_t nc_key_data_in_r(offs_t offset);
72 	void nc_sound_w(offs_t offset, uint8_t data);
73 	void nc_uart_control_w(uint8_t data);
74 	void nc100_display_memory_start_w(uint8_t data);
75 
76 	void nc_colours(palette_device &palette) const;
77 	TIMER_CALLBACK_MEMBER(nc_keyboard_timer_callback);
78 	TIMER_DEVICE_CALLBACK_MEMBER(dummy_timer_callback);
79 	DECLARE_WRITE_LINE_MEMBER(write_uart_clock);
80 	DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
81 
82 	DECLARE_DEVICE_IMAGE_LOAD_MEMBER( load_pcmcia_card );
83 	DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( unload_pcmcia_card );
84 
85 	virtual void machine_start() override;
86 	virtual void machine_reset() override;
87 	virtual void video_start() override;
88 
89 	void nc_map(address_map &map);
90 
91 	uint32_t screen_update_nc(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int height, int width, int const (&pens)[2]);
92 	void nc_update_interrupts();
93 
94 private:
95 	int card_calculate_mask(int size);
96 	void set_card_present_state(int state);
97 	void nc_refresh_memory_bank_config(int bank);
98 	void nc_refresh_memory_config();
99 	void nc_sound_update(int channel);
100 
101 protected: // HACK FOR MC6845
102 	required_device<cpu_device> m_maincpu;
103 	required_device<ram_device> m_ram;
104 	required_device<beep_device> m_beeper1;
105 	required_device<beep_device> m_beeper2;
106 	required_device<centronics_device> m_centronics;
107 	required_device<generic_slot_device> m_card;
108 	required_device<i8251_device> m_uart;
109 	required_device<clock_device> m_uart_clock;
110 	required_device<nvram_device> m_nvram;
111 	optional_device<upd765a_device> m_fdc;
112 
113 	char m_memory_config[4];
114 	emu_timer *m_keyboard_timer;
115 	int m_membank_rom_mask;
116 	int m_membank_internal_ram_mask;
117 	uint8_t m_poweroff_control;
118 	int m_card_status;
119 	unsigned char m_uart_control;
120 	int m_irq_mask;
121 	int m_irq_status;
122 	int m_irq_latch;
123 	int m_irq_latch_mask;
124 	int m_sound_channel_periods[2];
125 	int m_previous_inputport_10_state;
126 	int m_previous_alarm_state;
127 	memory_region *m_card_ram;
128 	int m_membank_card_ram_mask;
129 	int m_card_size;
130 	unsigned long m_display_memory_start;
131 	const nc_type m_nc_type;
132 
133 	int m_centronics_ack;
134 	int m_centronics_busy;
135 };
136 
137 
138 class nc100_state : public nc_state
139 {
140 public:
nc100_state(const machine_config & mconfig,device_type type,const char * tag)141 	nc100_state(const machine_config &mconfig, device_type type, const char *tag) :
142 		nc_state(mconfig, type, tag, NC_TYPE_1xx)
143 	{
144 	}
145 
146 	void nc100(machine_config &config);
147 
148 protected:
149 	void nc100_uart_control_w(uint8_t data);
150 	void nc100_poweroff_control_w(uint8_t data);
151 	uint8_t nc100_card_battery_status_r();
152 	void nc100_memory_card_wait_state_w(uint8_t data);
153 
154 	DECLARE_WRITE_LINE_MEMBER(nc100_tc8521_alarm_callback);
155 	DECLARE_WRITE_LINE_MEMBER(nc100_txrdy_callback);
156 	DECLARE_WRITE_LINE_MEMBER(nc100_rxrdy_callback);
157 	DECLARE_WRITE_LINE_MEMBER(write_nc100_centronics_ack);
158 
159 	virtual void machine_reset() override;
160 
161 	void nc100_io(address_map &map);
162 
163 	uint32_t screen_update_nc100(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
164 };
165 
166 
167 
168 class nc200_state : public nc_state
169 {
170 public:
nc200_state(const machine_config & mconfig,device_type type,const char * tag)171 	nc200_state(const machine_config &mconfig, device_type type, const char *tag) :
172 		nc_state(mconfig, type, tag, NC_TYPE_200)
173 	{
174 	}
175 
176 	void nc200(machine_config &config);
177 
178 protected:
179 	void nc200_irq_status_w(uint8_t data);
180 	uint8_t nc200_card_battery_status_r();
181 	uint8_t nc200_printer_status_r();
182 	void nc200_uart_control_w(uint8_t data);
183 	void nc200_memory_card_wait_state_w(uint8_t data);
184 	void nc200_poweroff_control_w(uint8_t data);
185 
186 	DECLARE_WRITE_LINE_MEMBER(write_nc200_centronics_ack);
187 	DECLARE_WRITE_LINE_MEMBER(nc200_txrdy_callback);
188 	DECLARE_WRITE_LINE_MEMBER(nc200_rxrdy_callback);
189 	DECLARE_WRITE_LINE_MEMBER(nc200_fdc_interrupt);
190 
191 	virtual void machine_reset() override;
192 
193 	uint32_t screen_update_nc200(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
194 
195 	void nc200_io(address_map &map);
196 
197 private:
198 	void nc200_video_set_backlight(int state);
199 	void nc200_refresh_uart_interrupt();
200 
201 	uint8_t m_nc200_uart_interrupt_irq;
202 	int m_nc200_backlight;
203 };
204 
205 
206 #endif // MAME_INCLUDES_NC_H
207