|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2025 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // HD647180 ASCI (非同期シリアル) ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "device.h" ! 14: #include "event.h" ! 15: #include "message.h" ! 16: #include <array> ! 17: ! 18: class HostCOMDevice; ! 19: class MPU64180Device; ! 20: ! 21: class HD647180ASCIDevice : public Device ! 22: { ! 23: using inherited = Device; ! 24: ! 25: // CNTLA0, CNTLA1 ! 26: static constexpr uint32 CNTL_MPE = 0x80; // Multi Processor Enable ! 27: static constexpr uint32 CNTL_RE = 0x40; // Receive Enable ! 28: static constexpr uint32 CNTL_TE = 0x20; // Transmit Enable ! 29: static constexpr uint32 CNTL_nRTS0 = 0x10; // !RequestToSend ! 30: static constexpr uint32 CNTL_CKA1D = 0x10; // CKA1 Disable ! 31: static constexpr uint32 CNTL_EFR = 0x08; // Error Flag Reset ! 32: static constexpr uint32 CNTL_DATA8 = 0x04; // MODE2 (Data bits) ! 33: static constexpr uint32 CNTL_PAREN = 0x02; // MODE1 (Parity Enable) ! 34: static constexpr uint32 CNTL_STOP2 = 0x01; // MODE0 (Stop bits) ! 35: ! 36: // CNTLB0, CNTLB1 ! 37: static constexpr uint32 CNTL_MPBT = 0x80; // Multi Processor Bit Transmit ! 38: static constexpr uint32 CNTL_MP = 0x40; // Multi Processor ! 39: static constexpr uint32 CNTL_nCTS = 0x20; // R: !CTS ! 40: static constexpr uint32 CNTL_PS = 0x20; // W: PreScaler ! 41: static constexpr uint32 CNTL_PEO = 0x10; // Parity Even or Odd ! 42: static constexpr uint32 CNTL_DR = 0x08; // Divide Ratio ! 43: static constexpr uint32 CNTL_SS = 0x07; // Clock Source and Speed Select ! 44: ! 45: // STAT0, STAT1 ! 46: static constexpr uint32 STAT_RDRF = 0x80; // Receive Data Register Full ! 47: static constexpr uint32 STAT_OVRN = 0x40; // Over Run Error ! 48: static constexpr uint32 STAT_PE = 0x20; // Parity Error ! 49: static constexpr uint32 STAT_FE = 0x10; // Framing Error ! 50: static constexpr uint32 STAT_RIE = 0x08; // Receive Interrupt Enable ! 51: static constexpr uint32 STAT_nDCD0 = 0x04; // R: Data Carrier Detect ! 52: static constexpr uint32 STAT_CTS1E = 0x04; // W: !CTS Enable ! 53: static constexpr uint32 STAT_TDRE = 0x02; // Transmit Data Register Empty ! 54: static constexpr uint32 STAT_TIE = 0x01; // Transmit Interrupt Enable ! 55: ! 56: // 非同期シリアル1個分 ! 57: struct Channel { ! 58: uint id; // 0 or 1 ! 59: ! 60: bool rx_enable; ! 61: bool tx_enable; ! 62: bool rx_intr_enable; ! 63: bool tx_intr_enable; ! 64: bool data8bit; // MOD2 ! 65: bool parity_en; // MOD1 ! 66: bool stop2bit; // MOD0 ! 67: bool parity_odd; ! 68: bool prescale; ! 69: bool divratio; ! 70: uint8 ss; ! 71: bool nCTS; ! 72: bool overrun; ! 73: ! 74: uint8 tdr; ! 75: bool tdr_empty; ! 76: uint8 rdr; ! 77: bool rdr_full; ! 78: int32 tsr; // 負数なら Empty。 ! 79: int32 rsr; // 負数なら Empty。 ! 80: ! 81: uint64 bit12_ns; ! 82: uint32 baudrate; ! 83: }; ! 84: ! 85: public: ! 86: HD647180ASCIDevice(); ! 87: ~HD647180ASCIDevice() override; ! 88: ! 89: bool Create() override; ! 90: bool Init() override; ! 91: void ResetHard(bool poweron) override; ! 92: ! 93: uint32 ReadCNTLA(uint n); ! 94: uint32 ReadCNTLB(uint n); ! 95: uint32 ReadSTAT(uint n); ! 96: uint32 ReadTDR(uint n); ! 97: uint32 ReadRDR(uint n); ! 98: uint32 WriteCNTLA(uint n, uint32 data); ! 99: uint32 WriteCNTLB(uint n, uint32 data); ! 100: uint32 WriteSTAT(uint n, uint32 data); ! 101: uint32 WriteTDR(uint n, uint32 data); ! 102: uint32 WriteRDR(uint n, uint32 data); ! 103: uint32 PeekCNTLA(uint n) const; ! 104: uint32 PeekCNTLB(uint n) const; ! 105: uint32 PeekSTAT(uint n) const; ! 106: uint32 PeekTDR(uint n) const; ! 107: uint32 PeekRDR(uint n) const; ! 108: ! 109: private: ! 110: DECLARE_MONITOR_CALLBACK(MonitorUpdate); ! 111: void MonitorUpdateChan(TextScreen&, int y, int n) const; ! 112: ! 113: void ChangeInterrupt(uint n); ! 114: void ChangeBaudRate(uint n); ! 115: ! 116: void TxCallback(Event&); ! 117: ! 118: // 受信側 ! 119: void HostRxCallback(uint32); ! 120: void RxMessage(MessageID, uint32); ! 121: void RxCallback(Event&); ! 122: bool Rx(uint n, uint32 data); ! 123: ! 124: // 入力クロックを 160分周した基本周波数とでもいうべきもの、 ! 125: // の 12ビット分を [nsec] にしたもの。 ! 126: uint64 xc12_ns {}; ! 127: ! 128: std::array<Channel, 2> channels {}; ! 129: bool cts1_enable {}; ! 130: bool cka1_disable {}; ! 131: ! 132: bool nRTS0 {}; ! 133: bool nDCD0 {}; ! 134: ! 135: std::array<Event, 2> txevent {}; ! 136: std::array<Event, 2> rxevent {}; ! 137: ! 138: std::array<std::unique_ptr<HostCOMDevice>, 2> hostcom /*{}*/; ! 139: ! 140: Monitor *monitor {}; ! 141: ! 142: MPU64180Device *xp {}; ! 143: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.