1 // license:LGPL-2.1+ 2 // copyright-holders:Angelo Salese, Barry Rodewald 3 /***************************************************************************** 4 * 5 * includes/x1.h 6 * 7 ****************************************************************************/ 8 9 #ifndef MAME_INCLUDES_X1_H 10 #define MAME_INCLUDES_X1_H 11 12 #pragma once 13 14 #include "bus/generic/carts.h" 15 #include "bus/generic/slot.h" 16 #include "cpu/z80/z80.h" 17 #include "machine/z80daisy.h" 18 #include "imagedev/cassette.h" 19 #include "imagedev/floppy.h" 20 #include "machine/bankdev.h" 21 #include "machine/i8255.h" 22 #include "machine/timer.h" 23 #include "machine/wd_fdc.h" 24 #include "machine/z80ctc.h" 25 #include "machine/z80dma.h" 26 #include "machine/z80sio.h" 27 #include "sound/ay8910.h" 28 #include "sound/ym2151.h" 29 #include "video/mc6845.h" 30 31 #include "formats/x1_tap.h" 32 33 #include "emupal.h" 34 #include "screen.h" 35 36 37 // ======================> x1_keyboard_device 38 39 class x1_keyboard_device : public device_t, 40 public device_z80daisy_interface 41 { 42 public: 43 // construction/destruction 44 x1_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 45 46 private: 47 virtual void device_start() override; 48 // z80daisy_interface overrides 49 virtual int z80daisy_irq_state() override; 50 virtual int z80daisy_irq_ack() override; 51 virtual void z80daisy_irq_reti() override; 52 }; 53 54 class x1_state : public driver_device 55 { 56 public: x1_state(const machine_config & mconfig,device_type type,const char * tag)57 x1_state(const machine_config &mconfig, device_type type, const char *tag) : 58 driver_device(mconfig, type, tag), 59 m_maincpu(*this, "x1_cpu"), 60 m_cassette(*this, "cassette"), 61 m_cart(*this, "cartslot"), 62 m_fdc(*this, "fdc"), 63 m_floppy(*this, "fdc:%u", 0), 64 m_crtc(*this, "crtc"), 65 m_screen(*this, "screen"), 66 m_gfxdecode(*this, "gfxdecode"), 67 m_palette(*this, "palette"), 68 m_dma(*this, "dma"), 69 m_iobank(*this, "iobank"), 70 m_ym(*this, "ym"), 71 m_sound_sw(*this, "SOUND_SW"), 72 m_tvram(*this, "tvram"), 73 m_avram(*this, "avram"), 74 m_kvram(*this, "kvram"), 75 m_bitmapbank(*this, "bitmapbank"), 76 m_ipl_rom(*this, "ipl"), 77 m_cg_rom(*this, "cgrom"), 78 m_kanji_rom(*this, "kanji") 79 { } 80 81 DECLARE_FLOPPY_FORMATS(floppy_formats); 82 83 required_device<z80_device> m_maincpu; 84 required_device<cassette_image_device> m_cassette; 85 required_device<generic_slot_device> m_cart; 86 required_device<mb8877_device> m_fdc; 87 required_device_array<floppy_connector, 4> m_floppy; 88 required_device<mc6845_device> m_crtc; 89 required_device<screen_device> m_screen; 90 91 uint8_t x1_mem_r(offs_t offset); 92 void x1_mem_w(offs_t offset, uint8_t data); 93 uint8_t x1_sub_io_r(); 94 void x1_sub_io_w(uint8_t data); 95 uint8_t x1_rom_r(); 96 void x1_rom_w(offs_t offset, uint8_t data); 97 void x1_rom_bank_0_w(uint8_t data); 98 void x1_rom_bank_1_w(uint8_t data); 99 uint8_t x1_fdc_r(offs_t offset); 100 void x1_fdc_w(offs_t offset, uint8_t data); 101 uint8_t x1_pcg_r(offs_t offset); 102 void x1_pcg_w(offs_t offset, uint8_t data); 103 void x1_pal_r_w(uint8_t data); 104 void x1_pal_g_w(uint8_t data); 105 void x1_pal_b_w(uint8_t data); 106 uint8_t x1_ex_gfxram_r(offs_t offset); 107 void x1_ex_gfxram_w(offs_t offset, uint8_t data); 108 void x1_scrn_w(uint8_t data); 109 void x1_pri_w(uint8_t data); 110 void x1_6845_w(offs_t offset, uint8_t data); 111 uint8_t x1_kanji_r(offs_t offset); 112 void x1_kanji_w(offs_t offset, uint8_t data); 113 uint8_t x1_emm_r(offs_t offset); 114 void x1_emm_w(offs_t offset, uint8_t data); 115 uint8_t x1turbo_pal_r(); 116 uint8_t x1turbo_txpal_r(offs_t offset); 117 uint8_t x1turbo_txdisp_r(); 118 uint8_t x1turbo_gfxpal_r(); 119 void x1turbo_pal_w(uint8_t data); 120 void x1turbo_txpal_w(offs_t offset, uint8_t data); 121 void x1turbo_txdisp_w(uint8_t data); 122 void x1turbo_gfxpal_w(uint8_t data); 123 void x1turbo_blackclip_w(uint8_t data); 124 uint8_t x1turbo_mem_r(offs_t offset); 125 void x1turbo_mem_w(offs_t offset, uint8_t data); 126 void x1turboz_4096_palette_w(offs_t offset, uint8_t data); 127 uint8_t x1turboz_blackclip_r(); 128 uint8_t x1turbo_bank_r(); 129 void x1turbo_bank_w(uint8_t data); 130 uint8_t x1_porta_r(); 131 uint8_t x1_portb_r(); 132 uint8_t x1_portc_r(); 133 void x1_porta_w(uint8_t data); 134 void x1_portb_w(uint8_t data); 135 void x1_portc_w(uint8_t data); 136 void init_x1_kanji(); 137 virtual void machine_start() override; 138 DECLARE_MACHINE_RESET(x1); 139 virtual void video_start() override; 140 DECLARE_MACHINE_RESET(x1turbo); 141 uint32_t screen_update_x1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); 142 DECLARE_INPUT_CHANGED_MEMBER(ipl_reset); 143 DECLARE_INPUT_CHANGED_MEMBER(nmi_reset); 144 TIMER_CALLBACK_MEMBER(x1_rtc_increment); 145 TIMER_DEVICE_CALLBACK_MEMBER(x1_cmt_wind_timer); 146 TIMER_DEVICE_CALLBACK_MEMBER(x1_keyboard_callback); 147 DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); 148 DECLARE_WRITE_LINE_MEMBER(hdl_w); 149 150 uint8_t memory_read_byte(offs_t offset); 151 void memory_write_byte(offs_t offset, uint8_t data); 152 uint8_t io_read_byte(offs_t offset); 153 void io_write_byte(offs_t offset, uint8_t data); 154 required_device<gfxdecode_device> m_gfxdecode; 155 required_device<palette_device> m_palette; 156 optional_device<z80dma_device> m_dma; 157 void x1turbo(machine_config &config); 158 void x1(machine_config &config); 159 160 uint8_t ym_r(offs_t offset); 161 uint8_t color_board_r(address_space &space); 162 void color_board_w(uint8_t data); 163 uint8_t color_board_2_r(address_space &space); 164 void color_board_2_w(uint8_t data); 165 uint8_t stereo_board_r(address_space &space, offs_t offset); 166 void stereo_board_w(offs_t offset, uint8_t data); 167 uint8_t rs232_r(offs_t offset); 168 void rs232_w(offs_t offset, uint8_t data); 169 uint8_t sasi_r(address_space &space, offs_t offset); 170 void sasi_w(offs_t offset, uint8_t data); 171 uint8_t fdd8_r(address_space &space, offs_t offset); 172 void fdd8_w(offs_t offset, uint8_t data); 173 uint8_t ext_sio_ctc_r(address_space &space, offs_t offset); 174 void ext_sio_ctc_w(offs_t offset, uint8_t data); 175 void z_img_cap_w(uint8_t data); 176 void z_mosaic_w(uint8_t data); 177 void z_chroma_key_w(uint8_t data); 178 void z_extra_scroll_w(uint8_t data); 179 180 uint8_t m_key_irq_flag; /**< Keyboard IRQ pending. */ 181 uint8_t m_key_irq_vector; /**< Keyboard IRQ vector. */ 182 183 void x1_io(address_map &map); 184 void x1_io_banks(address_map &map); 185 void x1_io_banks_common(address_map &map); 186 void x1_mem(address_map &map); 187 void x1turbo_io_banks(address_map &map); 188 void x1turbo_mem(address_map &map); 189 protected: 190 struct scrn_reg_t 191 { 192 uint8_t disp_bank; 193 uint8_t pcg_mode; 194 uint8_t v400_mode; 195 uint8_t ank_sel; 196 197 uint8_t pri; 198 uint8_t blackclip; // x1 turbo specific 199 }; 200 201 struct turbo_reg_t 202 { 203 uint8_t pal; 204 uint8_t gfx_pal; 205 uint8_t txt_pal[8]; 206 uint8_t txt_disp; 207 }; 208 209 struct x1_rtc_t 210 { 211 uint8_t sec, min, hour, day, wday, month, year; 212 }; 213 214 void x1_draw_pixel(bitmap_rgb32 &bitmap,int y,int x,uint16_t pen,uint8_t width,uint8_t height); 215 void draw_fgtilemap(bitmap_rgb32 &bitmap,const rectangle &cliprect); 216 void draw_gfxbitmap(bitmap_rgb32 &bitmap,const rectangle &cliprect, int plane,int pri); 217 uint8_t check_prev_height(int x,int y,int x_size); 218 uint8_t check_line_valid_height(int y,int x_size,int height); 219 220 int priority_mixer_pri(int color); 221 void cmt_command( uint8_t cmd ); 222 uint16_t jis_convert(int kanji_addr); 223 224 required_device<address_map_bank_device> m_iobank; 225 optional_device<ym2151_device> m_ym; // turbo-only 226 optional_ioport m_sound_sw; // turbo-only 227 required_shared_ptr<uint8_t> m_tvram; /**< Pointer for Text Video RAM */ 228 required_shared_ptr<uint8_t> m_avram; /**< Pointer for Attribute Video RAM */ 229 optional_shared_ptr<uint8_t> m_kvram; /**< Pointer for Extended Kanji Video RAM (X1 Turbo) */ 230 required_memory_bank m_bitmapbank; 231 required_region_ptr<uint8_t> m_ipl_rom; /**< Pointer for IPL ROM */ 232 std::unique_ptr<uint8_t[]> m_work_ram; /**< Pointer for base work RAM */ 233 std::unique_ptr<uint8_t[]> m_emm_ram; /**< Pointer for EMM RAM */ 234 std::unique_ptr<uint8_t[]> m_pcg_ram; /**< Pointer for PCG GFX RAM */ 235 required_region_ptr<uint8_t> m_cg_rom; /**< Pointer for GFX ROM */ 236 required_region_ptr<uint8_t> m_kanji_rom; /**< Pointer for Kanji ROMs */ 237 int m_xstart, /**< Start X offset for screen drawing. */ 238 m_ystart; /**< Start Y offset for screen drawing. */ 239 uint8_t m_hres_320; /**< Pixel clock divider setting: (1) 48 (0) 24 */ 240 uint8_t m_io_switch; /**< Enable access for special bitmap RMW phase in isolated i/o. */ 241 uint8_t m_io_sys; /**< Read-back for PPI port C */ 242 uint8_t m_vsync; /**< Screen V-Sync bit, active low */ 243 uint8_t m_vdisp; /**< Screen V-Disp bit, active high */ 244 std::unique_ptr<uint8_t[]> m_gfx_bitmap_ram; /**< Pointer for bitmap layer RAM. */ 245 uint8_t m_pcg_reset; /**< @todo Unused variable. */ 246 uint8_t m_sub_obf; /**< MCU side: OBF flag active low, indicates that there are parameters in comm buffer. */ 247 uint8_t m_ctc_irq_flag; /**< @todo Unused variable. */ 248 scrn_reg_t m_scrn_reg; /**< Base Video Registers. */ 249 turbo_reg_t m_turbo_reg; /**< Turbo Z Video Registers. */ 250 x1_rtc_t m_rtc; /**< Struct for RTC related variables */ 251 emu_timer *m_rtc_timer; /**< Pointer for RTC timer. */ 252 uint8_t m_pcg_write_addr; /**< @todo Unused variable. */ 253 uint8_t m_sub_cmd; /**< MCU side: current command issued from Main to Sub. */ 254 uint8_t m_sub_cmd_length; /**< MCU side: number of parameters, in bytes. */ 255 uint8_t m_sub_val[8]; /**< MCU side: parameters buffer. */ 256 int m_sub_val_ptr; /**< MCU side: index for parameter read-back */ 257 int m_key_i; /**< MCU side: index for keyboard read-back during OBF phase. */ 258 uint8_t m_irq_vector; /**< @todo Unused variable. */ 259 uint8_t m_cmt_current_cmd; /**< MCU side: CMT command issued. */ 260 uint8_t m_cmt_test; /**< MCU side: Tape BREAK status bit. */ 261 uint8_t m_rom_index[3]; /**< Current ROM address. */ 262 uint32_t m_kanji_offset; /**< @todo Unused variable. */ 263 uint8_t m_bios_offset; /**< @todo Unused variable. */ 264 uint8_t m_x_b; /**< Palette Register for Blue Gun */ 265 uint8_t m_x_g; /**< Palette Register for Green Gun */ 266 uint8_t m_x_r; /**< Palette Register for Red Gun */ 267 uint16_t m_kanji_addr_latch; /**< Internal Kanji ROM address. */ 268 uint32_t m_kanji_addr; /**< Latched Kanji ROM address. */ 269 uint8_t m_kanji_eksel; /**< Kanji ROM register bit for latch phase. */ 270 uint8_t m_pcg_reset_occurred; /**< @todo Unused variable. */ 271 uint32_t m_old_key1; /**< Keyboard read buffer for i/o port "key1" */ 272 uint32_t m_old_key2; /**< Keyboard read buffer for i/o port "key2" */ 273 uint32_t m_old_key3; /**< Keyboard read buffer for i/o port "key3" */ 274 uint32_t m_old_key4; /**< Keyboard read buffer for i/o port "tenkey" */ 275 uint32_t m_old_fkey; /**< Keyboard read buffer for i/o port "f_keys" */ 276 uint32_t m_emm_addr; /**< EMM RAM current address */ 277 std::unique_ptr<uint8_t[]> m_pal_4096; /**< X1 Turbo Z: pointer for 4096 palette entries */ 278 uint8_t m_crtc_vreg[0x100], /**< CRTC register buffer. */ 279 m_crtc_index; /**< CRTC register index. */ 280 uint8_t m_is_turbo; /**< Machine type: (0) X1 Vanilla, (1) X1 Turbo */ 281 uint8_t m_ex_bank; /**< X1 Turbo Z: RAM bank register */ 282 uint8_t m_ram_bank; /**< Regular RAM bank for 0x0000-0x7fff memory window: (0) ROM/IPL (1) RAM */ 283 /** 284 @brief Refresh current bitmap palette. 285 */ 286 void set_current_palette(); 287 /** 288 @brief Retrieves the current PCG address. 289 290 @param width Number of currently setted up CRTC characters 291 @param y_char_size Number of scanlines per character. 292 @return Destination PCG address. 293 */ 294 uint16_t get_pcg_addr(uint16_t width, uint8_t y_char_size); 295 /** 296 @brief X1 Turbo: Retrieves the current CHR ROM address in Hi-Speed Mode. 297 298 @return Destination CHR address. 299 */ 300 uint16_t check_chr_addr(); 301 /** 302 @brief X1 Turbo: Retrieves the current PCG ROM address in Hi-Speed Mode. 303 304 @return Destination CHR address. 305 */ 306 uint16_t check_pcg_addr(); 307 /** 308 @brief MCU side: retrieve keycode to game key conversion. 309 310 @param port Address to convert. 311 @return The converted game key buffer 312 */ 313 uint8_t get_game_key(uint8_t port); 314 /** 315 @brief MCU side: retrieve keyboard special key register. 316 317 @return 318 x--- ---- TEN: Numpad, Function key, special input key 319 -x-- ---- KIN: Valid key 320 --x- ---- REP: Key repeat 321 ---x ---- GRAPH key ON 322 ---- x--- CAPS lock ON 323 ---- -x-- KANA lock ON 324 ---- --x- SHIFT ON 325 ---- ---x CTRL ON 326 */ 327 uint8_t check_keyboard_shift(); 328 /** 329 @brief convert MAME input to raw scancode for keyboard. 330 331 @return the converted scancode 332 @todo Unoptimized. 333 */ 334 uint16_t check_keyboard_press(); 335 336 uint8_t m_fdc_ctrl; 337 338 }; 339 340 /*----------- defined in machine/x1.c -----------*/ 341 342 DECLARE_DEVICE_TYPE(X1_KEYBOARD, x1_keyboard_device) 343 344 #endif // MAME_INCLUDES_X1_H 345