1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 Gaelco 3D serial hardware 6 7 ***************************************************************************/ 8 #ifndef MAME_MACHINE_GAELCO3D_H 9 #define MAME_MACHINE_GAELCO3D_H 10 11 #pragma once 12 13 14 /*************************************************************************** 15 DEVICE INTERFACE TYPE 16 ***************************************************************************/ 17 18 /* ----- device interface ----- */ 19 20 class gaelco_serial_device : public device_t 21 { 22 public: 23 static constexpr unsigned EXT_STATUS_MASK = 0x03; 24 25 gaelco_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 26 irq_handler()27 auto irq_handler() { return m_irq_handler.bind(); } 28 29 uint8_t status_r(); 30 void data_w(uint8_t data); 31 uint8_t data_r(); 32 DECLARE_WRITE_LINE_MEMBER(rts_w); 33 /* Set to 1 during transmit, 0 for receive */ 34 DECLARE_WRITE_LINE_MEMBER(tr_w); 35 36 37 /* Big questions marks, related to serial i/o */ 38 39 /* Not used in surfplnt, but in radikalb 40 * Set at beginning of transfer sub, cleared at end 41 */ 42 DECLARE_WRITE_LINE_MEMBER(unknown_w); 43 44 45 /* only used in radikalb, set at beginning of receive isr, cleared at end */ 46 DECLARE_WRITE_LINE_MEMBER(irq_enable); 47 48 protected: 49 // device-level overrides 50 virtual void device_start() override; 51 virtual void device_stop() override; 52 virtual void device_reset() override; 53 54 private: 55 struct buf_t 56 { 57 volatile uint8_t data; 58 volatile uint8_t stat; 59 volatile int cnt; 60 volatile int data_cnt; 61 }; 62 63 struct shmem_t 64 { 65 buf_t buf[2]; 66 }; 67 68 struct osd_shared_mem 69 { 70 char *fn; 71 size_t size; 72 void *ptr; 73 int creator; 74 }; 75 76 static osd_shared_mem *osd_sharedmem_alloc(const char *path, int create, size_t size); 77 static void osd_sharedmem_free(osd_shared_mem *os_shmem); 78 static void *osd_sharedmem_ptr(osd_shared_mem *os_shmem); 79 80 static void buf_reset(buf_t *buf); 81 82 // internal state 83 devcb_write_line m_irq_handler; 84 85 uint8_t m_status; 86 int m_last_in_msg_cnt; 87 int m_slack_cnt; 88 89 emu_timer *m_sync_timer; 90 91 buf_t *m_in_ptr; 92 buf_t *m_out_ptr; 93 osd_shared_mem *m_os_shmem; 94 shmem_t *m_shmem; 95 std::mutex m_mutex; 96 97 TIMER_CALLBACK_MEMBER( set_status_cb ); 98 TIMER_CALLBACK_MEMBER( link_cb ); 99 void set_status(uint8_t mask, uint8_t set, int wait); 100 void process_in(); 101 void sync_link(); 102 }; 103 104 DECLARE_DEVICE_TYPE(GAELCO_SERIAL, gaelco_serial_device) 105 106 #endif // MAME_MACHINE_GAELCO3D_H 107