--- nono/vm/upd7201.h 2026/04/29 17:04:45 1.1.1.5 +++ nono/vm/upd7201.h 2026/04/29 17:04:59 1.1.1.8 @@ -7,6 +7,7 @@ #pragma once #include "device.h" +#include "monitor.h" // uPD7201/Z8530 のレジスタ // @@ -24,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; @@ -36,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 @@ -61,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 @@ -74,14 +81,16 @@ 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 // | +-------------------------- Sync Mode // +------------------------------------ Clock Rate - // + // static const int CR4_CLKRATE = 0xc0; static const int CR4_SYNCMODE = 0x30; static const int CR4_STOPBITS = 0x0c; @@ -110,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 @@ -135,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 @@ -155,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 @@ -262,15 +277,14 @@ struct SIO } chan[2]; }; -class uPD7201Device - : public IODevice +class uPD7201Device : public IODevice { using inherited = IODevice; public: - uPD7201Device(); + uPD7201Device(const std::string& objname_); virtual ~uPD7201Device() override; - void MonitorUpdate(TextScreen&) override; + void ResetHard() override; // 受信 bool Rx(int ch, uint32 data); @@ -292,20 +306,23 @@ class uPD7201Device struct SIO cr {}; + Monitor monitor { this }; + 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); void MonitorUpdateCh(TextScreen&, int ch, int xbase, int ybase); void MonitorReg(TextScreen&, int, int, uint32 reg, const char * const *names);