Annotation of nono/vm/spc.h, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2017 [email protected]
                      4: //
                      5: 
                      6: #pragma once
                      7: 
                      8: #include "device.h"
                      9: #include "scsi.h"
                     10: #include "scheduler.h"
                     11: #include "fixedqueue.h"
                     12: 
                     13: struct SPC
                     14: {
                     15:        static const int BDID = 0x0;    // $E96021 RW  $E100_0000
                     16:        static const int SCTL = 0x1;    // $E96023 RW  $E100_0004
                     17:        static const int SCMD = 0x2;    // $E96025 RW  $E100_0008
                     18:        static const int TMOD = 0x3;    // (MB89352 にはない)
                     19:        static const int INTS = 0x4;    // $E96029 RW  $E100_0010
                     20:        static const int PSNS = 0x5;    // $E9602B R-  $E100_0014
                     21:        static const int SDGC = 0x5;    // $E9602B -W  $E100_0014
                     22:        static const int SSTS = 0x6;    // $E9602D R-  $E100_0018
                     23:        static const int SERR = 0x7;    // $E9602F R-  $E100_001C
                     24:        static const int PCTL = 0x8;    // $E96031 RW  $E100_0020
                     25:        static const int MBC  = 0x9;    // $E96033 R-  $E100_0024
                     26:        static const int DREG = 0xa;    // $E96035 RW  $E100_0028
                     27:        static const int TEMP = 0xb;    // $E96037 RW  $E100_002C
                     28:        static const int TCH  = 0xc;    // $E96039 RW  $E100_0030
                     29:        static const int TCM  = 0xd;    // $E9603B RW  $E100_0034
                     30:        static const int TCL  = 0xe;    // $E9603D RW  $E100_0038
                     31:        static const int EXBF = 0xf;    // (MB89352 にはない)
                     32: 
                     33: 
                     34:        // SCTL レジスタ
                     35:        // 全ビットを保持。
                     36:        uint8 sctl;
                     37:        static const int SCTL_RESET                     = 0x80; // Reset & Disable
                     38:        static const int SCTL_CTL_RESET         = 0x40; // Control Reset
                     39:        static const int SCTL_DIAG_MODE         = 0x20; // Diag Mode
                     40:        static const int SCTL_ARBIT_EN          = 0x10; // Arbitration Enable
                     41:        static const int SCTL_PARITY_EN         = 0x08; // Parity Enable
                     42:        static const int SCTL_SEL_EN            = 0x04; // Select Enable
                     43:        static const int SCTL_RESEL_EN          = 0x02; // Reselect Enable
                     44:        static const int SCTL_INTR_EN           = 0x01; // Interrupt Enable
                     45: 
                     46:        // SCMD レジスタ
                     47:        // RST は読み出し時に GetRST() から生成。
                     48:        uint8 scmd;
                     49:        static const int SCMD_CMD_MASK          = 0xe0; // Command code
                     50:        static const int SCMD_RST_OUT           = 0x10; // RST Out
                     51:        static const int SCMD_INTERCEPT         = 0x08; // Intersept Transfer
                     52:        static const int SCMD_PROGRAM           = 0x04; // Program Transfer
                     53:        static const int SCMD_TERM_MODE         = 0x01; // Termination Mode
                     54: 
                     55:        // INTS レジスタ
                     56:        // 全ビットを保持。
                     57:        uint8 ints;
                     58:        static const int INTS_SELECTED          = 0x80; // Selected
                     59:        static const int INTS_RESELECTED        = 0x40; // Reselected
                     60:        static const int INTS_DISCONNECTED      = 0x20; // Disconnected
                     61:        static const int INTS_COMPLETE          = 0x10; // Command Complete
                     62:        static const int INTS_SERV_REQ          = 0x08; // Service Required
                     63:        static const int INTS_TIMEOUT           = 0x04; // Time Out
                     64:        static const int INTS_HARD_ERR          = 0x02; // SPC Hard Error
                     65:        static const int INTS_RESET_COND        = 0x01; // Reset Condition
                     66: 
                     67:        // PSNS レジスタ
                     68:        // REQ, ACK, ATN は今のところ保持?
                     69:        uint8 psns;
                     70:        static const int PSNS_REQ                       = 0x80;
                     71:        static const int PSNS_ACK                       = 0x40;
                     72:        static const int PSNS_ATN                       = 0x20;
                     73:        static const int PSNS_SEL                       = 0x10;
                     74:        static const int PSNS_BSY                       = 0x08;
                     75:        static const int PSNS_MSG                       = 0x04;
                     76:        static const int PSNS_CD                        = 0x02;
                     77:        static const int PSNS_IO                        = 0x01;
                     78: 
                     79:        // SDGC レジスタ
                     80:        uint8 sdgc;
                     81:        static const int SDGC_XFER_ENABLE       = 0x20;
                     82: 
                     83:        // SSTS レジスタ
                     84:        // 上位4ビットを保持。下位4ビットは読み出し時に生成。
                     85:        uint8 ssts;
                     86:        static const int SSTS_CONN_INIT         = 0x80; // Connected (Initiator)
                     87:        static const int SSTS_CONN_TARG         = 0x40; // Connected (Target)
                     88:        static const int SSTS_SPC_BUSY          = 0x20; // SPC Busy
                     89:        static const int SSTS_IN_PROGRESS       = 0x10; // Transfer in Progress
                     90:        static const int SSTS_RST_IN            = 0x08; // SCSI RST In
                     91:        static const int SSTS_TC_ZERO           = 0x04; // TC=0
                     92:        static const int SSTS_DREG_FULL         = 0x02; // DREG Status (Full)
                     93:        static const int SSTS_DREG_EMPTY        = 0x01; // DREG Status (Empty)
                     94: 
                     95:        // SERR レジスタ
                     96:        uint8 serr;
                     97:        static const int SERR_DATAERR_SCSI      = 0x80; // Data Error: SCSI
                     98:        static const int SERR_DATAERR_SPC       = 0x40; // Data Error: SPC
                     99:        static const int SERR_XFER_OUT          = 0x20; // Xfer Out
                    100:        static const int SERR_TC_PARITY_ERR     = 0x08; // TC Parity Error
                    101:        static const int SERR_SHORT_XFER        = 0x02; // Short Transfer Period
                    102: 
                    103:        // PCTL レジスタ
                    104:        // ここでは BusFree INT Enable ビットだけを保持。
                    105:        // 残りの MSG, C/D, I/O は親クラスの信号線フラグから生成。
                    106:        bool busfree_intr_enable;
                    107:        static const int PCTL_MASK                      = 0x87; // 書き込みマスク
                    108:        static const int PCTL_BFINT_EN          = 0x80; // BusFree INT Enable
                    109:        static const int PCTL_MSG                       = 0x04;
                    110:        static const int PCTL_CD                        = 0x02;
                    111:        static const int PCTL_IO                        = 0x01;
                    112: 
                    113:        FixedQueue<uint8, 8> dreg;      // DREG レジスタ
                    114: 
                    115:        uint8 temp_in;  // TEMP レジスタ (SCSI -> MPU)
                    116:        uint8 temp_out; // TEMP レジスタ (MPU -> SCSI)
                    117:        uint32 tc;              // TC
                    118: 
                    119:        uint32 GetTCL() const { return tc & 0x0000ff; } // TCL
                    120: 
                    121:        // MBC (内部の読み込み専用レジスタ)
                    122:        // TC の下位4ビットが読めるらしい
                    123:        uint8 mbc() const {
                    124:                return tc & 15;
                    125:        }
                    126: 
                    127:        // Set/Reset ACK/REQ 内部状態
                    128:        bool ackreq;
                    129: };
                    130: 
                    131: class SPCDevice : public SCSIHostDevice
                    132: {
                    133:        typedef SCSIHostDevice inherited;
                    134:  private:
                    135:        // X680x0 では $E96000〜
                    136:        // LUNA では $E100_0000〜
                    137: 
                    138:  public:
                    139:        SPCDevice(uint32);
                    140:        virtual ~SPCDevice();
                    141: 
                    142:        virtual bool Init();
                    143:        virtual void ResetHard();
                    144:        virtual void ResetSoft();
                    145:        void Reset();
                    146: 
                    147:        virtual uint64 Read8(uint32 addr);
                    148:        virtual uint64 Read16(uint32 addr);
                    149:        virtual uint64 Write8(uint32 addr, uint32 data);
                    150:        virtual uint64 Write16(uint32 addr, uint32 data);
                    151:        virtual uint64 Peek8(uint32 addr);
                    152:        virtual bool MonitorUpdate();
                    153: 
                    154:        // イベントコールバック
                    155:        void BusFreeCallback(int);
                    156:        void SelectionCompleteCallback(int);
                    157:        void SelectionFailedCallback(int);
                    158: 
                    159:        // ターゲットがバスフリーフェーズに移行した
                    160:        virtual void BusRelease();
                    161: 
                    162:  private:
                    163:        void MonitorReg(int x, int y, uint32 reg, const char * const *names);
                    164: 
                    165:        // SCTL レジスタへの書き込み
                    166:        void WriteSCTL(uint32);
                    167: 
                    168:        // SCMD レジスタ値の取得
                    169:        uint32 GetSCMD() const;
                    170: 
                    171:        // SCMD レジスタへの書き込み
                    172:        void WriteSCMD(uint32);
                    173: 
                    174:        // INTS レジスタへの書き込み
                    175:        void WriteINTS(uint32);
                    176: 
                    177:        // INTS 設定
                    178:        void SetINTS(uint32);
                    179: 
                    180:        // PSNS レジスタ値の取得
                    181:        uint32 GetPSNS() const;
                    182: 
                    183:        // SSTS レジスタ値の取得
                    184:        uint32 GetSSTS() const;
                    185: 
                    186:        // PCTL レジスタ値の取得
                    187:        uint32 GetPCTL() const;
                    188: 
                    189:        // バスフリーフェーズに移行する
                    190:        void BusFree();
                    191: 
                    192:        // Select コマンド実行
                    193:        void SelectCommand();
                    194: 
                    195:        // Transfer コマンド実行
                    196:        void TransferCommand();
                    197: 
                    198:        // DREG へのデータの充填
                    199:        void EnqueueToDREG();
                    200: 
                    201:        // SCSI コマンド
                    202:        void ExecCommand();
                    203: 
                    204:        // レジスタ
                    205:        struct SPC spc {};
                    206: 
                    207:        uint32 regbase = 0;             // レジスタの先頭アドレス
                    208:        int    regstride = 0;   // レジスタ間の距離
                    209: 
                    210:        // SPC に入力されるクロック周期 [nsec]
                    211:        int t_CLF = 0;
                    212: 
                    213:        // 現在のフェーズ
                    214:        uint phase = 0;
                    215: 
                    216:        // Command フェーズで受け取ったコマンド列
                    217:        std::vector<uint8> cmds {};
                    218: 
                    219:        // Data{In,Out} フェーズのバッファ
                    220:        uint8 *dataptr = NULL;
                    221:        uint datalen = 0;
                    222: 
                    223:        // イベント
                    224:        Event event {};
                    225: };
                    226: 
                    227: extern SPCDevice *gSPC;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.