1 // license:BSD-3-Clause 2 // copyright-holders:Angelo Salese 3 #ifndef MAME_INCLUDES_PC6001_H 4 #define MAME_INCLUDES_PC6001_H 5 6 #pragma once 7 8 9 #include "cpu/z80/z80.h" 10 #include "imagedev/cassette.h" 11 #include "machine/i8251.h" 12 #include "machine/i8255.h" 13 #include "machine/timer.h" 14 #include "sound/ay8910.h" 15 #include "sound/upd7752.h" 16 //#include "sound/2203intf.h" 17 #include "video/mc6847.h" 18 19 #include "bus/generic/slot.h" 20 #include "bus/generic/carts.h" 21 22 #include "emupal.h" 23 #include "speaker.h" 24 #include "screen.h" 25 26 #include "formats/p6001_cas.h" 27 28 class pc6001_state : public driver_device 29 { 30 public: pc6001_state(const machine_config & mconfig,device_type type,const char * tag)31 pc6001_state(const machine_config &mconfig, device_type type, const char *tag) : 32 driver_device(mconfig, type, tag), 33 m_ppi(*this, "ppi8255"), 34 m_ram(*this, "ram"), 35 m_maincpu(*this, "maincpu"), 36 m_screen(*this, "screen"), 37 m_cassette(*this, "cassette"), 38 m_cas_hack(*this, "cas_hack"), 39 m_cart(*this, "cartslot"), 40 m_region_maincpu(*this, "maincpu"), 41 m_region_gfx1(*this, "gfx1"), 42 m_io_mode4_dsw(*this, "MODE4_DSW"), 43 m_io_p1(*this, "P1"), 44 m_io_p2(*this, "P2"), 45 m_io_keys(*this, "key%u", 1U), 46 m_io_key_modifiers(*this, "key_modifiers"), 47 m_bank1(*this, "bank1"), 48 m_palette(*this, "palette") 49 { } 50 51 void system_latch_w(uint8_t data); 52 uint8_t nec_ppi8255_r(offs_t offset); 53 void nec_ppi8255_w(offs_t offset, uint8_t data); 54 55 void pc6001_palette(palette_device &palette) const; 56 57 uint32_t screen_update_pc6001(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 58 59 INTERRUPT_GEN_MEMBER(vrtc_irq); 60 TIMER_CALLBACK_MEMBER(audio_callback); 61 TIMER_DEVICE_CALLBACK_MEMBER(cassette_callback); 62 TIMER_DEVICE_CALLBACK_MEMBER(keyboard_callback); 63 64 uint8_t ppi_porta_r(); 65 void ppi_porta_w(uint8_t data); 66 uint8_t ppi_portb_r(); 67 void ppi_portb_w(uint8_t data); 68 void ppi_portc_w(uint8_t data); 69 uint8_t ppi_portc_r(); 70 71 IRQ_CALLBACK_MEMBER(irq_callback); 72 73 void pc6001(machine_config &config); 74 void pc6001_io(address_map &map); 75 void pc6001_map(address_map &map); 76 protected: 77 required_device<i8255_device> m_ppi; 78 optional_shared_ptr<uint8_t> m_ram; 79 required_device<cpu_device> m_maincpu; 80 required_device<screen_device> m_screen; 81 optional_device<cassette_image_device> m_cassette; 82 optional_device<generic_slot_device> m_cas_hack; 83 required_device<generic_slot_device> m_cart; 84 required_memory_region m_region_maincpu; 85 required_memory_region m_region_gfx1; 86 required_ioport m_io_mode4_dsw; 87 required_ioport m_io_p1; 88 required_ioport m_io_p2; 89 required_ioport_array<3> m_io_keys; 90 required_ioport m_io_key_modifiers; 91 required_memory_bank m_bank1; 92 required_device<palette_device> m_palette; 93 94 memory_region *m_cart_rom; 95 uint8_t m_timer_irq_vector; 96 uint16_t m_timer_hz_div; 97 98 virtual void machine_start() override; 99 virtual void machine_reset() override; 100 virtual void video_start() override; 101 102 // i/o functions 103 uint8_t check_joy_press(); 104 uint8_t check_keyboard_press(); 105 inline void cassette_latch_control(bool new_state); 106 inline void ppi_control_hack_w(uint8_t data); 107 inline void set_timer_divider(uint8_t data); 108 inline void set_videoram_bank(uint32_t offs); 109 inline void set_maincpu_irq_line(uint8_t vector_num); 110 111 // video functions 112 void draw_gfx_mode4(bitmap_ind16 &bitmap,const rectangle &cliprect,int attr); 113 void draw_bitmap_2bpp(bitmap_ind16 &bitmap,const rectangle &cliprect, int attr); 114 void draw_tile_3bpp(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int tile,int attr); 115 void draw_tile_text(bitmap_ind16 &bitmap,const rectangle &cliprect,int x,int y,int tile,int attr,int has_mc6847); 116 void draw_border(bitmap_ind16 &bitmap,const rectangle &cliprect,int attr,int has_mc6847); 117 void pc6001_screen_draw(bitmap_ind16 &bitmap,const rectangle &cliprect, int has_mc6847); 118 119 emu_timer *m_timer_irq_timer; 120 uint8_t *m_video_ram; 121 uint8_t m_irq_vector; 122 uint8_t m_cas_switch; 123 uint8_t m_sys_latch; 124 uint32_t m_cas_offset; 125 uint32_t m_cas_maxsize; 126 uint8_t m_bank_opt; 127 uint8_t m_timer_irq_mask; 128 uint8_t m_timer_irq_mask2; 129 uint8_t m_port_c_8255; 130 uint8_t m_cur_keycode; 131 132 private: 133 uint32_t m_old_key1; 134 uint32_t m_old_key2; 135 uint32_t m_old_key3; 136 137 }; 138 139 140 class pc6001mk2_state : public pc6001_state 141 { 142 public: pc6001mk2_state(const machine_config & mconfig,device_type type,const char * tag)143 pc6001mk2_state(const machine_config &mconfig, device_type type, const char *tag) : 144 pc6001_state(mconfig, type, tag), 145 m_bank2(*this, "bank2"), 146 m_bank3(*this, "bank3"), 147 m_bank4(*this, "bank4"), 148 m_bank5(*this, "bank5"), 149 m_bank6(*this, "bank6"), 150 m_bank7(*this, "bank7"), 151 m_bank8(*this, "bank8") 152 { } 153 154 uint8_t mk2_bank_r0_r(); 155 uint8_t mk2_bank_r1_r(); 156 uint8_t mk2_bank_w0_r(); 157 void mk2_bank_r0_w(uint8_t data); 158 void mk2_bank_r1_w(uint8_t data); 159 void mk2_bank_w0_w(uint8_t data); 160 void mk2_opt_bank_w(uint8_t data); 161 void mk2_work_ram0_w(offs_t offset, uint8_t data); 162 void mk2_work_ram1_w(offs_t offset, uint8_t data); 163 void mk2_work_ram2_w(offs_t offset, uint8_t data); 164 void mk2_work_ram3_w(offs_t offset, uint8_t data); 165 void mk2_work_ram4_w(offs_t offset, uint8_t data); 166 void mk2_work_ram5_w(offs_t offset, uint8_t data); 167 void mk2_work_ram6_w(offs_t offset, uint8_t data); 168 void mk2_work_ram7_w(offs_t offset, uint8_t data); 169 void necmk2_ppi8255_w(offs_t offset, uint8_t data); 170 void mk2_system_latch_w(uint8_t data); 171 void mk2_vram_bank_w(uint8_t data); 172 void mk2_col_bank_w(uint8_t data); 173 void mk2_0xf3_w(uint8_t data); 174 void mk2_timer_adj_w(uint8_t data); 175 void mk2_timer_irqv_w(uint8_t data); 176 177 void pc6001mk2_palette(palette_device &palette) const; 178 void pc6001mk2(machine_config &config); 179 180 uint32_t screen_update_pc6001mk2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 181 182 void pc6001mk2_io(address_map &map); 183 void pc6001mk2_map(address_map &map); 184 protected: 185 uint8_t m_bgcol_bank; 186 uint8_t m_gfx_bank_on; 187 required_memory_bank m_bank2; 188 required_memory_bank m_bank3; 189 required_memory_bank m_bank4; 190 required_memory_bank m_bank5; 191 required_memory_bank m_bank6; 192 required_memory_bank m_bank7; 193 required_memory_bank m_bank8; 194 inline void refresh_crtc_params(); 195 196 virtual void video_start() override; 197 virtual void machine_reset() override; 198 199 private: 200 uint8_t m_bank_r0; 201 uint8_t m_bank_r1; 202 uint8_t m_bank_w; 203 uint8_t m_ex_vram_bank; 204 uint8_t m_exgfx_text_mode; 205 uint32_t m_cgrom_bank_addr; 206 uint8_t m_exgfx_bitmap_mode; 207 uint8_t m_exgfx_2bpp_mode; 208 209 void vram_bank_change(uint8_t vram_bank); 210 }; 211 212 class pc6601_state : public pc6001mk2_state 213 { 214 public: pc6601_state(const machine_config & mconfig,device_type type,const char * tag)215 pc6601_state(const machine_config &mconfig, device_type type, const char *tag) : 216 pc6001mk2_state(mconfig, type, tag) 217 { } 218 219 uint8_t fdc_r(); 220 void fdc_w(uint8_t data); 221 222 void pc6601(machine_config &config); 223 void pc6601_io(address_map &map); 224 }; 225 226 class pc6001sr_state : public pc6601_state 227 { 228 public: pc6001sr_state(const machine_config & mconfig,device_type type,const char * tag)229 pc6001sr_state(const machine_config &mconfig, device_type type, const char *tag) : 230 pc6601_state(mconfig, type, tag), 231 m_sr_irq_vectors(*this, "irq_vectors") 232 { } 233 234 uint8_t hw_rev_r(); 235 uint8_t sr_bank_rn_r(offs_t offset); 236 void sr_bank_rn_w(offs_t offset, uint8_t data); 237 uint8_t sr_bank_wn_r(offs_t offset); 238 void sr_bank_wn_w(offs_t offset, uint8_t data); 239 void sr_work_ram0_w(offs_t offset, uint8_t data); 240 void sr_work_ram1_w(offs_t offset, uint8_t data); 241 void sr_work_ram2_w(offs_t offset, uint8_t data); 242 void sr_work_ram3_w(offs_t offset, uint8_t data); 243 void sr_work_ram4_w(offs_t offset, uint8_t data); 244 void sr_work_ram5_w(offs_t offset, uint8_t data); 245 void sr_work_ram6_w(offs_t offset, uint8_t data); 246 void sr_work_ram7_w(offs_t offset, uint8_t data); 247 void sr_mode_w(uint8_t data); 248 void sr_vram_bank_w(uint8_t data); 249 void sr_system_latch_w(uint8_t data); 250 void necsr_ppi8255_w(offs_t offset, uint8_t data); 251 void sr_bitmap_yoffs_w(uint8_t data); 252 void sr_bitmap_xoffs_w(uint8_t data); 253 254 INTERRUPT_GEN_MEMBER(sr_vrtc_irq); 255 256 uint32_t screen_update_pc6001sr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 257 258 void pc6001sr(machine_config &config); 259 260 void pc6001sr_io(address_map &map); 261 void pc6001sr_map(address_map &map); 262 protected: 263 virtual void video_start() override; 264 virtual void machine_reset() override; 265 266 private: 267 uint8_t m_sr_bank_r[8]; 268 uint8_t m_sr_bank_w[8]; 269 uint8_t m_kludge; 270 bool m_sr_text_mode; 271 uint8_t m_sr_text_rows; 272 uint8_t *m_gvram; 273 uint8_t m_bitmap_yoffs,m_bitmap_xoffs; 274 275 enum{ 276 SUB_CPU_IRQ = 0, 277 JOYSTICK_IRQ, 278 TIMER_IRQ, 279 VOICE_IRQ, 280 VRTC_IRQ, 281 RS232_IRQ, 282 PRINTER_IRQ, 283 EXT_IRQ 284 }; 285 286 required_shared_ptr<uint8_t> m_sr_irq_vectors; 287 }; 288 289 #endif 290