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