Annotation of nono/vm/romemu_luna.h, revision 1.1.1.17

1.1       root        1: //
                      2: // nono
1.1.1.2   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
1.1.1.12  root        7: //
                      8: // LUNA シリーズの ROM エミュレーション共通部分
                      9: //
                     10: 
1.1       root       11: #pragma once
                     12: 
1.1.1.15  root       13: #include "romemu.h"
1.1.1.17! root       14: #include "fixedqueue.h"
1.1       root       15: 
1.1.1.13  root       16: class BT45xDevice;
1.1.1.15  root       17: class LanceDevice;
1.1.1.13  root       18: class LunafbDevice;
                     19: class MainRAMDevice;
                     20: class MK48T02Device;
                     21: class SIODevice;
                     22: class SPCDevice;
                     23: 
1.1.1.15  root       24: class LunaPROMEmuDevice : public ROMEmuDevice
1.1       root       25: {
1.1.1.15  root       26:        using inherited = ROMEmuDevice;
1.1       root       27: 
1.1.1.7   root       28:  protected:
1.1       root       29:        // このデバイス先頭アドレス
                     30:        static const uint32 baseaddr            = 0x41000000;
                     31: 
                     32:        // 謎の I/O 空間
1.1.1.2   root       33:        static const uint32 ROMIO_BASE          = 0x41010000;
1.1.1.14  root       34:        static const uint32 ROMIO_INIT          = (ROMIO_BASE + 0x00);
                     35:        static const uint32 ROMIO_LOAD          = (ROMIO_BASE + 0x04);
1.1.1.17! root       36:        static const uint32 ROMIO_SIOINTR       = (ROMIO_BASE + 0x08);
1.1.1.14  root       37:        static const uint32 ROMIO_CLOSE         = (ROMIO_BASE + 0x0c);
                     38:        static const uint32 ROMIO_ENTRY         = (ROMIO_BASE + 0x10);
                     39:        static const uint32 ROMIO_AP1           = (ROMIO_BASE + 0x14);
                     40:        static const uint32 ROMIO_AP2           = (ROMIO_BASE + 0x18);
                     41:        static const uint32 ROMIO_CLKCNT        = (ROMIO_BASE + 0x1c);
1.1.1.16  root       42:        static const uint32 ROMIO_QUITSTOP      = (ROMIO_BASE + 0x20);
1.1       root       43: 
1.1.1.9   root       44:        // 文字コード
                     45:        // 概ね ASCII だが制御コード部分は必要な文字だけを適当に割り当てる。
                     46:        static const char BS            = 0x08;
                     47:        static const char LF            = 0x0a;
1.1.1.14  root       48:        static const char CR            = 0x0d;
1.1.1.9   root       49:        static const char UP            = 0x1c;
                     50:        static const char LEFT          = 0x1d;
                     51:        static const char RIGHT         = 0x1e;
                     52:        static const char DOWN          = 0x1f;
                     53: 
1.1.1.7   root       54:        // ブート情報格納用
                     55:        struct bootinfo_t {
                     56:                int dkunit {};
                     57:                int dkpart {};
                     58:                std::string dkfile {};
                     59:        };
                     60: 
1.1       root       61:  public:
                     62:        LunaPROMEmuDevice();
1.1.1.14  root       63:        ~LunaPROMEmuDevice() override;
1.1       root       64: 
1.1.1.2   root       65:        bool Init() override;
1.1       root       66: 
1.1.1.7   root       67:  protected:
1.1.1.15  root       68:        uint64 ReadROMIO(busaddr addr) override;
                     69:        bool WriteROMIO(busaddr addr, uint32 data) override;
                     70: 
                     71:        void ROM_Init();
1.1.1.14  root       72:        virtual void ROM_InitMD() = 0;
                     73:        uint32 ROM_Load();
                     74:        uint32 ROM_Entry();
1.1.1.7   root       75:        virtual void ROM_Close();
1.1.1.14  root       76:        void ROM_AP1();
                     77:        void ROM_AP2();
                     78:        virtual uint32 LoadFile(const std::string& fname) = 0;
1.1.1.13  root       79:        virtual void ProcessChar(char);
1.1.1.7   root       80:        virtual void Command() = 0;
1.1       root       81: 
1.1.1.12  root       82:        void InitScreen();
1.1.1.14  root       83:        void InitPalette();
                     84:        void PrintTitle();
1.1.1.9   root       85:        void ClearPrompt();
1.1.1.13  root       86:        int Getc();
1.1.1.12  root       87:        void Putc(uint ch);
                     88:        void Print(const std::string& s);
                     89:        void Print(const char *fmt, ...) __printflike(2, 3);
1.1.1.17! root       90:        void PrintDisplay(const char *s);
1.1.1.9   root       91: 
                     92:        // NVRAM
1.1.1.14  root       93:        virtual bool InitNVRAM() = 0;
                     94:        virtual void GetNVRAM(bootinfo_t&) = 0;
1.1.1.9   root       95:        uint8 CalcNVRAMCsum() const;
                     96:        void WriteNVRAMCsum();
                     97:        bool VerifyNVRAM() const;
                     98: 
1.1       root       99:        uint32 LoadHostFile();
1.1.1.7   root      100:        uint32 LoadGuestFile(const bootinfo_t&);
1.1.1.2   root      101: 
1.1.1.14  root      102:        // 読み込んだプログラムのエントリポイント。
                    103:        // エントリポイントがセットされていない時は -1。
                    104:        uint32 entrypoint {};
                    105: 
                    106:        // エントリポイントに実行を移す時には true。
                    107:        // LUNA-I は 'x' コマンドを実行したら。
                    108:        // LUNA-88K では 'b'/'bh' コマンドで。
                    109:        bool execute {};
                    110: 
1.1.1.17! root      111:        // シリアルか。(DIP-SW で決まる)
        !           112:        bool use_serial {};
        !           113: 
1.1.1.14  root      114:        // 機種名 (タイトル表示用)
                    115:        const char *machine_name {};
                    116: 
1.1       root      117:        // エラーメッセージの受け渡し用
                    118:        // 基本的にエラーが起きた時だけ更新するので、ここにエラーメッセージを
                    119:        // 返す可能性がある関数をコールする前に呼び出し側が clear() しておき、
                    120:        // 関数から戻ったら empty() かどうか確認する、errno みたいな使い方。
1.1.1.4   root      121:        std::string errmsg {};
1.1       root      122: 
                    123:        // 入力バッファ
                    124:        std::string inputbuf {};
                    125: 
1.1.1.7   root      126:        // 現在のプロンプト文字列
                    127:        std::string prompt {};
1.1       root      128: 
1.1.1.11  root      129:        // デフォルトプロンプト。
                    130:        const std::string default_prompt = ">";
                    131: 
1.1.1.9   root      132:        // プロンプトのある行(最上行が 0)
                    133:        int prompt_y {};
                    134: 
                    135:        // カーソル位置(入力バッファ先頭が0)
                    136:        int inputpos {};
                    137: 
1.1.1.12  root      138:        int screen_w {};                // テキスト桁数
                    139:        int screen_h {};                // テキスト行数
                    140:        int cursor_x {};                // カーソル位置(桁)
                    141:        int cursor_y {};                // カーソル位置(行)
1.1.1.14  root      142:        bool cursor_on {};              // カーソル表示
                    143:        bool bold {};
1.1.1.12  root      144:        int origin_px {};               // テキスト画面の左上 X 座標(ピクセル)
                    145:        int origin_py {};               // テキスト画面の左上 Y 座標(ピクセル)
                    146: 
1.1.1.13  root      147:        BT45xDevice *bt45x {};
1.1.1.15  root      148:        LanceDevice *lance {};
1.1.1.13  root      149:        LunafbDevice *lunafb {};
                    150:        MainRAMDevice *mainram {};
1.1.1.4   root      151:        MK48T02Device *nvram {};
1.1.1.13  root      152:        SIODevice *sio {};
                    153:        SPCDevice *spc {};
1.1       root      154: 
1.1.1.7   root      155:  private:
1.1.1.17! root      156:        void ROM_SIOIntr();
        !           157:        void PutcSerial(uint);
        !           158:        void PutcDisplay(uint);
        !           159:        void ProcessSerial();
        !           160:        int GetcSerial();
        !           161:        int GetcKeyboard();
1.1.1.7   root      162: 
                    163:        bool is_shift {};                       // SHIFT キー押し下げ中
                    164:        int mousecnt {};                        // マウス入力をスキップするためのカウンタ
                    165: 
1.1.1.17! root      166:        FixedQueue<uint8, 256> sio_txq; // シリアル送信キュー
        !           167: 
1.1.1.14  root      168:        uint32 clkcnt {};                       // クロック割り込みカウンタ
                    169: 
1.1.1.16  root      170:        // luna88k で割り込みからジャンプして戻る時のアドレス。
                    171:        // 0 なら作用しない。
                    172:        uint32 quitstop {};
                    173: 
1.1       root      174:        // LUNA キーコード -> ASCII 変換テーブル
                    175:        static const uint8 lunakey2asciitable[128];
                    176:        static const uint8 lunakey2shifttable[128];
                    177: };

unix.superglobalmegacorp.com

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