1 // license:BSD-3-Clause 2 // copyright-holders:Curt Coder 3 #ifndef MAME_INCLUDES_PC8401A_H 4 #define MAME_INCLUDES_PC8401A_H 5 6 #pragma once 7 8 9 #include "cpu/z80/z80.h" 10 #include "machine/i8255.h" 11 #include "machine/i8251.h" 12 #include "machine/ram.h" 13 #include "machine/timer.h" 14 #include "machine/upd1990a.h" 15 #include "video/mc6845.h" 16 #include "video/sed1330.h" 17 18 #include "bus/generic/slot.h" 19 #include "bus/generic/carts.h" 20 21 #include "emupal.h" 22 #include "screen.h" 23 24 #define SCREEN_TAG "screen" 25 #define CRT_SCREEN_TAG "screen2" 26 27 #define Z80_TAG "z80" 28 #define I8255A_TAG "i8255a" 29 #define UPD1990A_TAG "upd1990a" 30 #define AY8910_TAG "ay8910" 31 #define SED1330_TAG "sed1330" 32 #define MC6845_TAG "mc6845" 33 #define I8251_TAG "i8251" 34 #define RS232_TAG "rs232" 35 36 #define PC8401A_CRT_VIDEORAM_SIZE 0x2000 37 38 class pc8401a_state : public driver_device 39 { 40 public: pc8401a_state(const machine_config & mconfig,device_type type,const char * tag)41 pc8401a_state(const machine_config &mconfig, device_type type, const char *tag) 42 : driver_device(mconfig, type, tag) 43 , m_maincpu(*this, Z80_TAG) 44 , m_rtc(*this, UPD1990A_TAG) 45 , m_lcdc(*this, SED1330_TAG) 46 , m_crtc(*this, MC6845_TAG) 47 , m_screen_lcd(*this, SCREEN_TAG) 48 , m_cart(*this, "cartslot") 49 , m_io_cart(*this, "io_cart") 50 , m_ram(*this, RAM_TAG) 51 , m_rom(*this, Z80_TAG) 52 , m_crt_ram(*this, "crt_ram") 53 , m_io_y(*this, "Y.%u", 0) 54 { } 55 56 required_device<cpu_device> m_maincpu; 57 required_device<upd1990a_device> m_rtc; 58 required_device<sed1330_device> m_lcdc; 59 optional_device<mc6845_device> m_crtc; 60 required_device<screen_device> m_screen_lcd; 61 required_device<generic_slot_device> m_cart; 62 required_device<generic_slot_device> m_io_cart; 63 required_device<ram_device> m_ram; 64 required_memory_region m_rom; 65 optional_shared_ptr<uint8_t> m_crt_ram; 66 required_ioport_array<10> m_io_y; 67 68 memory_region *m_cart_rom; 69 70 virtual void machine_start() override; 71 virtual void video_start() override; 72 73 void mmr_w(uint8_t data); 74 uint8_t mmr_r(); 75 uint8_t rtc_r(); 76 void rtc_cmd_w(uint8_t data); 77 void rtc_ctrl_w(uint8_t data); 78 uint8_t io_rom_data_r(); 79 void io_rom_addr_w(offs_t offset, uint8_t data); 80 uint8_t port70_r(); 81 uint8_t port71_r(); 82 void port70_w(uint8_t data); 83 void port71_w(uint8_t data); 84 uint8_t ppi_pc_r(); 85 void ppi_pc_w(uint8_t data); 86 void pc8401a_palette(palette_device &palette) const; 87 88 void scan_keyboard(); 89 void bankswitch(uint8_t data); 90 91 // keyboard state 92 int m_key_strobe; // key pressed 93 94 // memory state 95 uint8_t m_mmr; // memory mapping register 96 uint32_t m_io_addr; // I/O ROM address counter 97 98 uint8_t m_key_latch; 99 TIMER_DEVICE_CALLBACK_MEMBER(pc8401a_keyboard_tick); 100 void pc8401a(machine_config &config); 101 void pc8401a_video(machine_config &config); 102 void pc8401a_io(address_map &map); 103 void pc8401a_lcdc(address_map &map); 104 void pc8401a_mem(address_map &map); 105 void pc8500_io(address_map &map); 106 void pc8500_lcdc(address_map &map); 107 }; 108 109 class pc8500_state : public pc8401a_state 110 { 111 public: pc8500_state(const machine_config & mconfig,device_type type,const char * tag)112 pc8500_state(const machine_config &mconfig, device_type type, const char *tag) 113 : pc8401a_state(mconfig, type, tag) 114 { } 115 116 void pc8500(machine_config &config); 117 118 protected: 119 virtual void video_start() override; 120 121 void pc8500_video(machine_config &config); 122 123 private: 124 uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 125 }; 126 127 #endif // MAME_INCLUDES_PC8401A_H 128