1 // license:BSD-3-Clause 2 // copyright-holders:Angelo Salese 3 /******************************************************************************************************************************** 4 5 Sharp MZ-2500 (c) 1985 Sharp Corporation 6 7 ********************************************************************************************************************************/ 8 #ifndef MAME_INCLUDES_MZ2500_H 9 #define MAME_INCLUDES_MZ2500_H 10 11 #pragma once 12 13 14 #include "cpu/z80/z80.h" 15 #include "machine/i8255.h" 16 #include "machine/pit8253.h" 17 #include "machine/rp5c15.h" 18 #include "machine/wd_fdc.h" 19 #include "machine/z80sio.h" 20 #include "machine/z80pio.h" 21 #include "sound/2203intf.h" 22 #include "sound/beep.h" 23 #include "machine/bankdev.h" 24 #include "emupal.h" 25 #include "screen.h" 26 #include "softlist.h" 27 #include "speaker.h" 28 29 //#include "imagedev/cassette.h" 30 #include "imagedev/floppy.h" 31 32 #define RP5C15_TAG "rp5c15" 33 34 class mz2500_state : public driver_device 35 { 36 public: mz2500_state(const machine_config & mconfig,device_type type,const char * tag)37 mz2500_state(const machine_config &mconfig, device_type type, const char *tag) : 38 driver_device(mconfig, type, tag), 39 m_maincpu(*this, "maincpu"), 40 m_screen(*this, "screen"), 41 m_rtc(*this, RP5C15_TAG), 42 m_pit(*this, "pit"), 43 m_beeper(*this, "beeper"), 44 m_gfxdecode(*this, "gfxdecode"), 45 m_fdc(*this, "mb8877a"), 46 m_floppy0(*this, "mb8877a:0"), 47 m_floppy1(*this, "mb8877a:1"), 48 m_floppy2(*this, "mb8877a:2"), 49 m_floppy3(*this, "mb8877a:3"), 50 m_floppy(nullptr), 51 m_palette(*this, "palette"), 52 m_rambank(*this, "rambank%u", 0), 53 m_tvram(*this, "tvram"), 54 m_cgram(*this, "cgram"), 55 m_wram(*this, "wram") 56 { } 57 58 void mz2500(machine_config &config); 59 60 private: 61 required_device<cpu_device> m_maincpu; 62 required_device<screen_device> m_screen; 63 required_device<rp5c15_device> m_rtc; 64 required_device<pit8253_device> m_pit; 65 required_device<beep_device> m_beeper; 66 required_device<gfxdecode_device> m_gfxdecode; 67 required_device<mb8877_device> m_fdc; 68 required_device<floppy_connector> m_floppy0; 69 required_device<floppy_connector> m_floppy1; 70 required_device<floppy_connector> m_floppy2; 71 required_device<floppy_connector> m_floppy3; 72 floppy_image_device *m_floppy; 73 required_device<palette_device> m_palette; 74 required_device_array<address_map_bank_device, 8> m_rambank; 75 required_shared_ptr<uint8_t> m_tvram; 76 required_shared_ptr<uint8_t> m_cgram; 77 required_shared_ptr<uint8_t> m_wram; 78 79 uint8_t *m_ipl_rom; 80 uint8_t *m_kanji_rom; 81 uint8_t *m_kanji2_rom; 82 std::unique_ptr<uint8_t[]> m_pcg_ram; 83 std::unique_ptr<uint8_t[]> m_emm_ram; 84 uint8_t *m_dic_rom; 85 uint8_t *m_phone_rom; 86 uint8_t *m_iplpro_rom; 87 88 uint8_t m_bank_val[8]; 89 uint8_t m_bank_addr; 90 uint8_t m_irq_sel; 91 uint8_t m_irq_vector[4]; 92 uint8_t m_irq_mask[4]; 93 uint8_t m_irq_pending[4]; 94 uint8_t m_kanji_bank; 95 uint8_t m_dic_bank; 96 uint8_t m_fdc_reverse; 97 uint8_t m_key_mux; 98 uint8_t m_monitor_type; 99 uint8_t m_text_reg[0x100]; 100 uint8_t m_text_reg_index; 101 uint8_t m_text_col_size; 102 uint8_t m_text_font_reg; 103 uint8_t m_pal_select; 104 uint16_t m_cg_vs; 105 uint16_t m_cg_ve; 106 uint16_t m_cg_hs; 107 uint16_t m_cg_he; 108 int16_t m_tv_vs; 109 int16_t m_tv_ve; 110 int16_t m_tv_hs; 111 int16_t m_tv_he; 112 uint8_t m_cg_latch[4]; 113 uint8_t m_cg_reg_index; 114 uint8_t m_cg_reg[0x20]; 115 uint8_t m_clut16[0x10]; 116 uint16_t m_clut256[0x100]; 117 uint8_t m_cg_mask; 118 int m_scr_x_size; 119 int m_scr_y_size; 120 uint8_t m_cg_clear_flag; 121 uint32_t m_rom_index; 122 uint8_t m_hrom_index; 123 uint8_t m_lrom_index; 124 struct { uint8_t r,g,b; } m_pal[16]; 125 uint8_t m_joy_mode; 126 uint16_t m_kanji_index; 127 uint32_t m_emm_offset; 128 uint8_t m_old_portc; 129 uint8_t m_prev_col_val; 130 uint8_t m_pio_latchb; 131 uint8_t m_ym_porta; 132 uint8_t m_screen_enable; 133 uint8_t mz2500_bank_addr_r(); 134 void mz2500_bank_addr_w(uint8_t data); 135 uint8_t mz2500_bank_data_r(); 136 void mz2500_bank_data_w(uint8_t data); 137 void mz2500_kanji_bank_w(uint8_t data); 138 void mz2500_dictionary_bank_w(uint8_t data); 139 uint8_t mz2500_crtc_hvblank_r(); 140 void mz2500_tv_crtc_w(offs_t offset, uint8_t data); 141 void mz2500_irq_sel_w(uint8_t data); 142 void mz2500_irq_data_w(uint8_t data); 143 uint8_t mz2500_rom_r(); 144 void mz2500_rom_w(uint8_t data); 145 void palette4096_io_w(uint8_t data); 146 uint8_t mz2500_bplane_latch_r(); 147 uint8_t mz2500_rplane_latch_r(); 148 uint8_t mz2500_gplane_latch_r(); 149 uint8_t mz2500_iplane_latch_r(); 150 void mz2500_cg_addr_w(uint8_t data); 151 void mz2500_cg_data_w(uint8_t data); 152 void timer_w(uint8_t data); 153 uint8_t mz2500_joystick_r(); 154 void mz2500_joystick_w(uint8_t data); 155 uint8_t mz2500_kanji_r(offs_t offset); 156 void mz2500_kanji_w(offs_t offset, uint8_t data); 157 uint8_t rp5c15_8_r(); 158 void rp5c15_8_w(uint8_t data); 159 uint8_t mz2500_emm_data_r(); 160 void mz2500_emm_addr_w(uint8_t data); 161 void mz2500_emm_data_w(uint8_t data); 162 163 uint8_t rmw_r(offs_t offset); 164 void rmw_w(offs_t offset, uint8_t data); 165 uint8_t kanji_pcg_r(offs_t offset); 166 void kanji_pcg_w(offs_t offset, uint8_t data); 167 uint8_t dict_rom_r(offs_t offset); 168 169 uint8_t mz2500_cg_latch_compare(); 170 virtual void machine_start() override; 171 virtual void machine_reset() override; 172 virtual void video_start() override; 173 void mz2500_palette(palette_device &palette) const; 174 uint32_t screen_update_mz2500(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 175 INTERRUPT_GEN_MEMBER(mz2500_vbl); 176 177 uint8_t fdc_r(offs_t offset); 178 void fdc_w(offs_t offset, uint8_t data); 179 void floppy_select_w(uint8_t data); 180 void floppy_side_w(uint8_t data); 181 182 uint8_t mz2500_porta_r(); 183 uint8_t mz2500_portb_r(); 184 uint8_t mz2500_portc_r(); 185 void mz2500_porta_w(uint8_t data); 186 void mz2500_portb_w(uint8_t data); 187 void mz2500_portc_w(uint8_t data); 188 void mz2500_pio1_porta_w(uint8_t data); 189 uint8_t mz2500_pio1_porta_r(); 190 uint8_t opn_porta_r(); 191 void opn_porta_w(uint8_t data); 192 DECLARE_WRITE_LINE_MEMBER(pit8253_clk0_irq); 193 DECLARE_WRITE_LINE_MEMBER(mz2500_rtc_alarm_irq); 194 IRQ_CALLBACK_MEMBER( mz2500_irq_ack ); 195 196 void draw_80x25(bitmap_ind16 &bitmap,const rectangle &cliprect,uint16_t map_addr); 197 void draw_40x25(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,uint16_t map_addr); 198 void draw_cg4_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int pri); 199 void draw_cg16_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,int x_size,int pri); 200 void draw_cg256_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,int pri); 201 void draw_tv_screen(bitmap_ind16 &bitmap,const rectangle &cliprect); 202 void draw_cg_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int pri); 203 204 void mz2500_draw_pixel(bitmap_ind16 &bitmap,int x,int y,uint16_t pen,uint8_t width,uint8_t height); 205 void mz2500_reconfigure_screen(); 206 static uint8_t pal_256_param(int index, int param); 207 void reset_banks(uint8_t type); 208 209 void mz2500_io(address_map &map); 210 void mz2500_map(address_map &map); 211 void mz2500_bank_window_map(address_map &map); 212 }; 213 214 #endif // MAME_INCLUDES_MZ2500_H 215