1 // license:GPL-2.0+ 2 // copyright-holders:Kevin Thacker 3 /***************************************************************************** 4 * 5 * includes/pcw.h 6 * 7 ****************************************************************************/ 8 #ifndef MAME_INCLUDES_PCW_H 9 #define MAME_INCLUDES_PCW_H 10 11 #pragma once 12 13 #include "cpu/mcs48/mcs48.h" 14 #include "imagedev/floppy.h" 15 #include "machine/upd765.h" 16 #include "machine/ram.h" 17 #include "machine/timer.h" 18 #include "sound/beep.h" 19 #include "emupal.h" 20 #include "screen.h" 21 22 #define PCW_BORDER_HEIGHT 8 23 #define PCW_BORDER_WIDTH 8 24 #define PCW_NUM_COLOURS 2 25 #define PCW_DISPLAY_WIDTH 720 26 #define PCW_DISPLAY_HEIGHT 256 27 28 #define PCW_SCREEN_WIDTH (PCW_DISPLAY_WIDTH + (PCW_BORDER_WIDTH<<1)) 29 #define PCW_SCREEN_HEIGHT (PCW_DISPLAY_HEIGHT + (PCW_BORDER_HEIGHT<<1)) 30 #define PCW_PRINTER_WIDTH (80*16) 31 #define PCW_PRINTER_HEIGHT (20*16) 32 33 34 class pcw_state : public driver_device 35 { 36 public: pcw_state(const machine_config & mconfig,device_type type,const char * tag)37 pcw_state(const machine_config &mconfig, device_type type, const char *tag) 38 : driver_device(mconfig, type, tag) 39 , m_maincpu(*this, "maincpu") 40 , m_printer_mcu(*this, "printer_mcu") 41 , m_keyboard_mcu(*this, "keyboard_mcu") 42 , m_fdc(*this, "upd765") 43 , m_floppy(*this, "upd765:%u", 0U) 44 , m_ram(*this, RAM_TAG) 45 , m_beeper(*this, "beeper") 46 , m_screen(*this, "screen") 47 , m_palette(*this, "palette") 48 , m_ppalette(*this, "ppalette") 49 , m_rdbanks(*this, "bank%u", 1U) 50 , m_wrbanks(*this, "bank%u", 5U) 51 , m_iptlines(*this, "LINE%u", 0U) 52 { } 53 54 int m_boot; 55 int m_system_status; 56 int m_fdc_interrupt_code; 57 int m_interrupt_counter; 58 uint8_t m_banks[4]; 59 unsigned char m_bank_force; 60 uint8_t m_timer_irq_flag; 61 uint8_t m_nmi_flag; 62 int16_t m_printer_headpos; 63 uint16_t m_kb_scan_row; 64 uint8_t m_mcu_keyboard_data[16]; 65 uint8_t m_mcu_transmit_reset_seq; 66 uint8_t m_mcu_transmit_count; 67 uint8_t m_mcu_selected; 68 uint8_t m_mcu_buffer; 69 uint8_t m_mcu_prev; 70 unsigned int m_roller_ram_addr; 71 unsigned short m_roller_ram_offset; 72 unsigned char m_vdu_video_control_register; 73 uint8_t m_printer_serial; // value if shift/store data pin 74 uint8_t m_printer_shift; // state of shift register 75 uint8_t m_printer_shift_output; // output presented to the paper feed motor and print head motor 76 uint8_t m_head_motor_state; 77 uint8_t m_linefeed_motor_state; 78 uint16_t m_printer_pins; 79 uint8_t m_printer_p2; // MCU port P2 state 80 uint32_t m_paper_feed; // amount of paper fed through printer, by n/360 inches. One line feed is 61/360in (from the linefeed command in CP/M;s ptr menu) 81 std::unique_ptr<bitmap_ind16> m_prn_output; 82 uint8_t m_printer_p2_prev; 83 emu_timer *m_prn_stepper; 84 emu_timer *m_prn_pins; 85 emu_timer *m_pulse_timer; 86 emu_timer *m_beep_setup_timer; 87 uint8_t pcw_keyboard_r(offs_t offset); 88 uint8_t pcw_keyboard_data_r(offs_t offset); 89 uint8_t pcw_interrupt_counter_r(); 90 void pcw_bank_select_w(offs_t offset, uint8_t data); 91 void pcw_bank_force_selection_w(uint8_t data); 92 void pcw_roller_ram_addr_w(uint8_t data); 93 void pcw_pointer_table_top_scan_w(uint8_t data); 94 void pcw_vdu_video_control_register_w(uint8_t data); 95 void pcw_system_control_w(uint8_t data); 96 uint8_t pcw_system_status_r(); 97 uint8_t pcw_expansion_r(offs_t offset); 98 void pcw_expansion_w(offs_t offset, uint8_t data); 99 uint8_t mcu_printer_p1_r(); 100 void mcu_printer_p1_w(uint8_t data); 101 uint8_t mcu_printer_p2_r(); 102 void mcu_printer_p2_w(uint8_t data); 103 DECLARE_READ_LINE_MEMBER(mcu_printer_t1_r); 104 DECLARE_READ_LINE_MEMBER(mcu_printer_t0_r); 105 uint8_t mcu_kb_scan_r(); 106 void mcu_kb_scan_w(uint8_t data); 107 uint8_t mcu_kb_scan_high_r(); 108 void mcu_kb_scan_high_w(uint8_t data); 109 uint8_t mcu_kb_data_r(); 110 DECLARE_READ_LINE_MEMBER(mcu_kb_t1_r); 111 DECLARE_READ_LINE_MEMBER(mcu_kb_t0_r); 112 uint8_t pcw9512_parallel_r(offs_t offset); 113 void pcw9512_parallel_w(offs_t offset, uint8_t data); 114 void mcu_transmit_serial(uint8_t bit); 115 void init_pcw(); 116 virtual void machine_start() override; 117 virtual void machine_reset() override; 118 virtual void video_start() override; 119 void set_8xxx_palette(palette_device &palette) const; 120 void set_9xxx_palette(palette_device &palette) const; 121 void set_printer_palette(palette_device &palette) const; 122 uint32_t screen_update_pcw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 123 uint32_t screen_update_pcw_printer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); 124 TIMER_CALLBACK_MEMBER(pcw_timer_pulse); 125 TIMER_CALLBACK_MEMBER(pcw_stepper_callback); 126 TIMER_CALLBACK_MEMBER(pcw_pins_callback); 127 TIMER_CALLBACK_MEMBER(setup_beep); 128 TIMER_DEVICE_CALLBACK_MEMBER(pcw_timer_interrupt); 129 130 DECLARE_FLOPPY_FORMATS( floppy_formats ); 131 132 DECLARE_WRITE_LINE_MEMBER( pcw_fdc_interrupt ); 133 required_device<cpu_device> m_maincpu; 134 required_device<upi41_cpu_device> m_printer_mcu; 135 required_device<i8048_device> m_keyboard_mcu; 136 required_device<upd765a_device> m_fdc; 137 required_device_array<floppy_connector, 2> m_floppy; 138 required_device<ram_device> m_ram; 139 required_device<beep_device> m_beeper; 140 required_device<screen_device> m_screen; 141 required_device<palette_device> m_palette; 142 required_device<palette_device> m_ppalette; 143 required_memory_bank_array<4> m_rdbanks, m_wrbanks; 144 required_ioport_array<16> m_iptlines; 145 146 inline void pcw_plot_pixel(bitmap_ind16 &bitmap, int x, int y, uint32_t color); 147 void pcw_update_interrupt_counter(); 148 void pcw_update_irqs(); 149 void pcw_update_read_memory_block(int block, int bank); 150 void pcw_update_write_memory_block(int block, int bank); 151 void pcw_update_mem(int block, int data); 152 int pcw_get_sys_status(); 153 void pcw_printer_fire_pins(uint16_t pins); 154 void pcw(machine_config &config); 155 void pcw8256(machine_config &config); 156 void pcw8512(machine_config &config); 157 void pcw9512(machine_config &config); 158 void pcw9256(machine_config &config); 159 void pcw9512p(machine_config &config); 160 void pcw10(machine_config &config); 161 void pcw9512_io(address_map &map); 162 void pcw_io(address_map &map); 163 void pcw_map(address_map &map); 164 }; 165 166 #endif // MAME_INCLUDES_PCW_H 167