--- nono/vm/upd7201.h 2026/04/29 17:04:56 1.1.1.7 +++ nono/vm/upd7201.h 2026/04/29 17:05:03 1.1.1.9 @@ -25,8 +25,10 @@ // 用意するほうが楽なので、こうなっている。 struct SIO { - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +---------+--------------+--------------+ // CR0 | CRC | Command | Pointer | + // +---------+--------------+--------------+ static const int CR0_CRC = 0xc0; static const int CR0_CMD = 0x38; static const int CR0_PTR = 0x07; @@ -37,8 +39,10 @@ struct SIO static const int WR0_CMD = CR0_CMD; static const int WR0_PTR = 0x0f; - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +----+----+----+---------+----+----+----+ // CR1 | WE | -- | WR | RX Int | -- | TE | ES | + // +----+----+----+---------+----+----+----+ // | | | | +---- E/S Int Enable // | | | +--------- TX INT/DMA Enable // | | +--------------------- RX Int Mode @@ -62,8 +66,10 @@ struct SIO static const int RXINT_ALL_INC_SPECIAL = 0x10; // All char include special static const int RXINT_ALL_EXC_SPECIAL = 0x18; // All char exclude special - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +---------+----+-------------------+----+ // CR3 | RX bits | AE | -- -- -- -- | RE | + // +---------+----+-------------------+----+ // | | +---- RX Enable // | +----------------------------- Auto Enable // +------------------------------------ RX bits @@ -75,8 +81,10 @@ struct SIO static const int WR3_AUTO_EN = CR3_AUTO_EN; static const int WR3_RX_EN = CR3_RX_EN; - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +---------+---------+---------+----+----+ // CR4 | ClkRate | SyncMode| StopBits| PV | PE | + // +---------+---------+---------+----+----+ // | | | | +---- Parity Enable(%1) // | | | +--------- Parity Even(%1) // | | +---------------- Stop Bits @@ -111,8 +119,10 @@ struct SIO HDLC = 2, }; - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +----+---------+----+----+----+----+----+ // CR5 | DTR| TX bits | SB | TE | CRC| RTS| TC | + // +----+---------+----+----+----+----+----+ // | | | | | | +---- TX CRC Enable // | | | | | +--------- ~RTS // | | | | +-------------- CRC-16/CCITT @@ -136,8 +146,10 @@ struct SIO static const int WR5_RTS = CR5_RTS; static const int WR5_TXCRC_EN = CR5_TXCRC_EN; - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +----+----+----+----+----+----+----+----+ // SR0 | BA | TU | CTS| SY | DCD| TE | IP | RA | + // +----+----+----+----+----+----+----+----+ static const int SR0_BREAK = 0x80; // Break/Abort static const int SR0_TXUNDER = 0x40; // Tx Underrun static const int SR0_CTS = 0x20; // CTS @@ -156,8 +168,10 @@ struct SIO static const int RR0_INTPEND = SR0_INTPEND; static const int RR0_RXAVAIL = SR0_RXAVAIL; - // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // b7 b6 b5 b4 b3 b2 b1 b0 + // +----+----+----+----+--------------+----+ // SR1 | EF | CRC| RO | PE | ResidueCode | AS | + // +----+----+----+----+--------------+----+ static const int SR1_ENDOFFRAME = 0x80; // End of Frame static const int SR1_CRCERROR = 0x40; // CRC/Framing Error static const int SR1_RXOVERRUN = 0x20; // Rx Overrun @@ -276,9 +290,6 @@ class uPD7201Device : public IODevice bool Rx(int ch, uint32 data); protected: - // チップリセット - void Reset(); - void ResetChannel(struct SIO::channel *chan); virtual uint8 ReadCtrl(struct SIO::channel *chan); uint8 ReadData(struct SIO::channel *chan); @@ -296,16 +307,16 @@ class uPD7201Device : public IODevice static const int bits_per_char[4]; - private: void WriteCR0(struct SIO::channel *chan, uint32 data); void WriteCR1(struct SIO::channel *chan, uint32 data); void WriteCR2(struct SIO::channel *chan, uint32 data); void WriteCR3(struct SIO::channel *chan, uint32 data); void WriteCR4(struct SIO::channel *chan, uint32 data); - void WriteCR5(struct SIO::channel *chan, uint32 data); + virtual void WriteCR5(struct SIO::channel *chan, uint32 data); void WriteCR6(struct SIO::channel *chan, uint32 data); void WriteCR7(struct SIO::channel *chan, uint32 data); + private: void ChangeInterrupt(); DECLARE_MONITOR_CALLBACK(MonitorUpdate);