Annotation of nono/vm/fdd.h, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2022 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: //
        !             8: // FDD
        !             9: //
        !            10: 
        !            11: #pragma once
        !            12: 
        !            13: #include "device.h"
        !            14: #include "diskimage.h"
        !            15: #include "event.h"
        !            16: #include "message.h"
        !            17: #include "textscreen.h"
        !            18: 
        !            19: // FD マーク
        !            20: #define MARK_IAM       (0xfc)
        !            21: #define MARK_IDAM      (0xfe)
        !            22: #define MARK_DAM       (0xfb)
        !            23: #define MARK_DDAM      (0xf8)
        !            24: 
        !            25: // フロッピーディスクの 1 トラック
        !            26: class FDTrack
        !            27: {
        !            28:  public:
        !            29:        // トラック記録の開始
        !            30:        void Begin();
        !            31:        // トラック記録の終了
        !            32:        void End();
        !            33:        // トラックデータ追加(FDDDevice から呼ばれる)
        !            34:        void Append(uint8 data);
        !            35:        void Append(uint8 data, int count);
        !            36: 
        !            37:        // トラックデータにマーク追加
        !            38:        void AppendMark(uint8 data);
        !            39: 
        !            40:        void Clear();
        !            41: 
        !            42:        // buf[0] はインデックスホールの位置と一致させる
        !            43:        std::vector<uint8> buf;                 // リングアクセスバッファ
        !            44:        std::vector<int> markpos {};    // アドレスマーク位置
        !            45:                                                                        // SYNC の次にあるIAM,IDAM,DAM/DDAM
        !            46:        uint32 lba;             // バッファしているトラックの先頭セクタのLBA
        !            47: };
        !            48: 
        !            49: class FDDDevice : public Device
        !            50: {
        !            51:        using inherited = Device;
        !            52:  public:
        !            53:        // メディアへの書き込みモード
        !            54:        //
        !            55:        // Device       Media   Ignore
        !            56:        // RW           RO              *               WriteProtect
        !            57:        // RW           RW              no              Writeable
        !            58:        // RW           RW              yes             WriteIgnore
        !            59:        enum class RW {
        !            60:                WriteProtect    = 1,    // 書き込み禁止メディア
        !            61:                Writeable               = 0,    // 書き込み可能
        !            62:                WriteIgnore             = -1,   // 書き込み可能メディアで書き込みを無視
        !            63:        };
        !            64: 
        !            65:        // アクセス LED 状態
        !            66:        enum class LED {
        !            67:                OFF = 0,
        !            68:                GREEN,
        !            69:                RED,
        !            70:                BLINK,          // 緑点滅 (内部のみで使用)
        !            71:        };
        !            72: 
        !            73:  public:
        !            74:        FDDDevice(int unit_);
        !            75:        ~FDDDevice() override;
        !            76: 
        !            77:        bool Init() override;
        !            78:        void ResetHard(bool poweron) override;
        !            79: 
        !            80:        // モニタ更新 (FDC の下請け)
        !            81:        void MonitorUpdateFDD(TextScreen&, int hd);
        !            82: 
        !            83:        // ユニット番号を返す
        !            84:        int GetUnitNo() const { return unit; }
        !            85: 
        !            86:        // ドライブコントロールレジスタへの書き込み
        !            87:        void SetDriveCtrl(uint8);
        !            88: 
        !            89:        // ドライブセレクト入力
        !            90:        void SetDriveSelect(uint sel, bool is_2dd_);
        !            91: 
        !            92:        // MOTOR_ON 信号入力
        !            93:        void SetMotorOn(bool);
        !            94: 
        !            95:        bool GetReady() const;
        !            96: 
        !            97:        // TRK00 信号
        !            98:        bool GetTrack0() const;
        !            99: 
        !           100:        // WRITEPROTECT 信号
        !           101:        bool GetWriteProtect() const;
        !           102: 
        !           103:        // 1 step シーク実行
        !           104:        void DoSeek(int dir_);
        !           105: 
        !           106:        // インデックスホール位置なら true
        !           107:        bool IsIndex() const { return pos == 0; }
        !           108: 
        !           109:        // トラックの現在のアクセス位置の 1 バイトを取得
        !           110:        uint8 ReadByte();
        !           111: 
        !           112:        // トラックの現在のアクセス位置に 1 バイト書き込み
        !           113:        void WriteByte(uint8 data);
        !           114: 
        !           115:        // 指定した相対位置のデータを取得
        !           116:        uint8 PeekByte(int) const;
        !           117: 
        !           118:        // 次のマークまたはインデックスホールまでのバイト距離を返す。
        !           119:        int GetDistanceToMark() const;
        !           120: 
        !           121:        // トラックバッファに現在のトラックを読み込む
        !           122:        void ReadTrack(int hd);
        !           123: 
        !           124:        // トラックバッファをイメージに書き出す
        !           125:        void WriteTrack();
        !           126: 
        !           127:        // メディアが入っていれば true
        !           128:        bool IsMediumLoaded() const { return medium_loaded; }
        !           129: 
        !           130:        // メディアの書き込みモードを返す
        !           131:        RW GetWriteMode() const { return write_mode; }
        !           132: 
        !           133:        // メディア(ディスク)イメージを開く/閉じる。(同一スレッドから呼ぶこと)
        !           134:        bool LoadDisk(const std::string& path_);
        !           135:        void UnloadDisk(bool force = false);
        !           136: 
        !           137:        // メディア(ディスク)イメージを開く/閉じる。(UI スレッドから呼ぶ)
        !           138:        void LoadDiskUI(const std::string& path_);
        !           139:        void UnloadDiskUI(bool force);
        !           140: 
        !           141:        // メディアの取り出し可否
        !           142:        bool IsEjectEnable() const { return eject_enable; }
        !           143: 
        !           144:        // イメージファイルのフルパスを返す
        !           145:        const std::string& GetPathName() const { return pathname; }
        !           146: 
        !           147:        // アクセスランプの状態取得。
        !           148:        LED GetAccessLED() const;
        !           149: 
        !           150:        // イジェクトランプの状態取得。点灯なら true
        !           151:        bool GetEjectLED() const;
        !           152: 
        !           153:  private:
        !           154:        // モータ状態変更
        !           155:        void DoMotorOn();
        !           156:        void DoMotorOff();
        !           157: 
        !           158:        // モータ、LED の状態更新
        !           159:        void ChangeStatus();
        !           160: 
        !           161:        // ディスクイメージを閉じる (内部用)
        !           162:        bool UnloadDisk_internal();
        !           163: 
        !           164:        // ディスク状態をクリアする
        !           165:        void Clear();
        !           166: 
        !           167:        // メディア状態変更を UI に通知する
        !           168:        void MediaChanged() const;
        !           169: 
        !           170:        // メディア挿入/排出コールバック
        !           171:        void LoadCallback(MessageID, uint32);
        !           172:        void UnloadCallback(MessageID, uint32);
        !           173: 
        !           174:        // イベントコールバック
        !           175:        void EventCallback(Event &);
        !           176: 
        !           177:        int unit {};                    // ユニット番号(ドライブ番号)
        !           178:        bool selected {};               // FDD SELECT 入力信号で選択されていれば true
        !           179:        enum {
        !           180:                STOPPED = 0,            // モータ停止中
        !           181:                SPIN_DOWN,                      // 停止に向けて慣性回転中
        !           182:                SPIN_UP,                        // モータ始動
        !           183:                READY,                          // 定常回転中
        !           184:        } motor_state {};
        !           185:        bool motor_on {};               // モーターオン入力信号の状態
        !           186:        bool IsMotorActive() const {
        !           187:                return (motor_state == SPIN_UP || motor_state == READY);
        !           188:        }
        !           189:        bool IsReady() const { return (motor_state == READY); }
        !           190:        bool is_blink {};               // LED ブリンク
        !           191:        int cylinder {};                // 現在のシリンダ番号
        !           192:        int pos {};                             // アクセス位置
        !           193: 
        !           194:        // トラックバッファ
        !           195:        FDTrack trackbuf {};
        !           196: 
        !           197:        // メディアフォーマット
        !           198:        uint32 ncyl {};         // シリンダ数 (C)
        !           199:        uint32 nhead {};        // ヘッド数 (H)
        !           200:        uint32 nsect {};        // トラックあたりのセクタ数 (R)
        !           201:        uint8 format_n {};      // セクタ長 (N)
        !           202:        uint32 sectsize {};     // 1セクタあたりのバイト数
        !           203:        uint gap3 {};           // Gap3
        !           204:        uint gap4b {};          // Gap4b
        !           205:        std::string format_name {};     // フォーマット名
        !           206: 
        !           207:        // イメージファイル
        !           208:        DiskImage image {};
        !           209: 
        !           210:        bool write_ignore {};           // 書き込み無視オプション
        !           211:        bool medium_loaded {};          // メディアが挿入されていれば true
        !           212: 
        !           213:        // メディアの書き込みモード
        !           214:        RW write_mode {};
        !           215: 
        !           216:        // メディアの取り出しを許可するなら true。
        !           217:        bool eject_enable {};
        !           218: 
        !           219:        // アクセス LED の状態
        !           220:        LED access_led {};
        !           221:        // アクセス LED の点滅開始時刻
        !           222:        uint64 blink_start {};
        !           223: 
        !           224:        // イメージファイルのフルパス
        !           225:        std::string pathname {};
        !           226:        // 新しいイメージファイルのフルパス (UIから)
        !           227:        std::string new_pathname {};
        !           228: 
        !           229:        Event event { this };
        !           230: };

unix.superglobalmegacorp.com

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