summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/tlcs900/tmp94c241_serial.cpp
Commit message (Collapse)AuthorAgeFilesLines
* cpu/tlcs900/tmp94c241_serial.cpp: Let's not break encapsulation and add ↵ Vas Crabb2026-03-301-25/+27
| | | | | | gratuitous circular dependencies. Also cleaned up some other stuff.
* tmp94c241: Add serial port sub-device with I/O interface mode (#15015) Felipe Corrêa da Silva Sanches2026-03-171-0/+361
* tmp94c241: Add serial port sub-device with I/O interface mode Replace the inline serial stubs (which just instantly set TX-complete) with a proper sub-device implementation supporting: - I/O interface mode (mode 0): Synchronous clocked serial using SCLK pin. Supports both internal (baud rate generator) and external (IOC=1) clock sources. TX double buffering with auto-load from buffer to shift register. Pre-outputs bit 0 on TXD before first clock edge so receiver can sample it on the rising edge. - Baud rate generator: Configurable via BRxCR register with divisor and clock source selection. Timer drives SCLK at the configured rate. Clock frequency derived from CPU clock. - TX/RX data callbacks: txd(), rxd(), sclk_out(), sclk_in() for connecting external devices to the serial ports. - tx_start callback: Signals the start of each byte transmission with the current PFFC pin function state, allowing connected devices to distinguish real transmissions from phantom ones. The serial registers (SC0BUF/SC1BUF, SC0CR/SC1CR, SC0MOD/SC1MOD, BR0CR/BR1CR) are now delegated to the sub-devices in the internal memory map. TX-complete flags (INTES0/INTES1 bit 7) are set at device_reset to indicate empty TX buffers at power-on. UART modes (7/8/9-bit) are recognized but not yet implemented. Also moves interrupt register indices from a file-scope enum to public static constexpr members of tmp94c241_device. * tmp94c241: move irq vector map to static const class member Per galibert's review suggestion: defining the IRQ vector table as a static const member of tmp94c241_device and providing the out-of-class definition in class scope allows the INTE* constants to be referenced without tmp94c241_device:: qualifiers in the initializer. The nested struct is named irq_vector_entry. NUM_MASKABLE_IRQS is replaced by std::size(irq_vector_map) directly at each use site inside member functions. * tmp94c241: use enum for public interrupt index constants * tmp94c241: use required_device for serial sub-device parent access Replace dynamic_cast with required_device<tmp94c241_device> using DEVICE_SELF_OWNER to access the parent CPU from the serial sub-device. This provides automatic type checking during MAME's -valid pass. Break the circular header dependency by replacing the #include of tmp94c241_serial.h in tmp94c241.h with a forward declaration, and having tmp94c241_serial.h include tmp94c241.h instead. The .cpp files include what they need directly. Addresses review feedback from galibert on PR #15015.