スタートアップ機能を作ろう!

  • (by K, 2006.09.24)
  • 発展課題のページ(全部読む前にここを読むのは混乱するのでおすすめじゃないです)

  • advance/osselectで「はりぼてOS」にブートセレクタ機能をつけられるようになったら、今度は起動直後に自動でメニューが出たらいいなと思うようになるのは避けられないところです(笑)。
    • 1.HiyOSを起動する
    • 2.rapuOSを起動する
    • 0.ブートローダOSをそのまま使用する
  • こんなメニューを出力し、選択されたOSをapi_osselectするアプリを作るのはそう難しいことではないと思いますが、このメニューアプリがOSのブートローダOSの起動時に自動起動してほしいわけです。
  • こんなのは超簡単で実は春にはこっそりと作って完成していたので、ここで発表しようと思います。

改造ポイント

  • bootpack.cの /* nihongo.fntの読み込み */ の最後の2行
        *((int *) 0x0fe8) = (int) nihongo;
        memman_free_4k(memman, (int) fat, 4 * 2880);
  • を以下の記述に差し替え。
        *((int *) 0x0fe8) = (int) nihongo;
    
        /* startup */
        finfo = file_search("haribote.hsf", (struct FILEINFO *) (ADR_DISKIMG + 0x002600), 224);
        if (finfo != 0) {
            char *ss;
            i = finfo->size;
            ss = file_loadfile2(finfo->clustno, &i, fat);
            for (x = 0; x < i; x++) {
                if (ss[x] != 0x0d) {
                    fifo32_put(&key_win->task->fifo, ss[x] + 256);
                }
            }
            memman_free_4k(memman, (int) ss, i);
        }
    
        memman_free_4k(memman, (int) fat, 4 * 2880);
    
  • "haribote.hsf"のところは、hiyosなら"hiyos.hsf"などのようにしておくと、各OSごとに別々のスタートアップファイルを用意できて便利でしょう。なお、.hsfは「はりぼて・スクリプト・ファイル」の略のつもりです。まあバッチファイルみたいなものなので、.batでもいいかもしれませんね(Windowsとの互換性はないですが)。いっそなつかしの、"AUTOEXEC.BAT"にしますか?(笑)。
  • 原理を特に説明する必要はないかもしれませんが、一応書いておきます。ファイルの内容を文字コード 0x0d を除いてすべてコンソールのキー入力用FIFOバッファに送りつけます。これで入力されたかのようにふるまうというわけです。
  • この機能を使えば、「ncst menu」と書かれたharibote.hsfを用意しておくだけで、起動直後に自動でmenuアプリが起動するというわけです。

コンソールでもスクリプト

  • ここまでできると、起動時スクリプト実行だけではなく、コンソールでもスクリプトファイル(=バッチファイル)を使えるようにしたい!と思っちゃうので、それもついでにやります。
  • と思ったのですが、実は超手抜き(?)をしてFIFOバッファにキー入力データを送り込むAPIを作り、それでバッチファイルもどきをやりました。API番号は31番になっています。

  • console.cのhrb_api()の一部
        } else if (edx == 31) {		/* sendkey */
            for (p = (unsigned char *) ebx + ds_base; *p != 0; p++) {
                if (*p != 0x0d) {
                    io_cli();
                    fifo32_put(&task->fifo, *p + 256);
                    io_sti();
                }
            }
        }

  • api031.nasの一部
    _api_sendkey:       ; int api_sendkey(char *);
            PUSH    EBX
            MOV     EDX,31
            MOV     EBX,[ESP+8]
            INT     0x40
            POP     EBX
            RET

  • サンプルアプリ例(help.c)
    #include "apilib.h"
    
    void HariMain(void)
    {
        api_sendkey("ncst tview -w70 -h20 hlp.txt\n");
        api_end();
    }

  • 結局何がやりたかったのかというと、helpと打ち込むだけで、適切な大きさでhlp.txtが開かれるようにしたかっただけなのです。できればhelp.hsfに「ncst tview -w70 -h20 hlp.txt」と書き込んでおきさえすれば同じことができるようにコンソールを拡張すればよかったのですが・・・。
    • こんなことくらいでAPIを増やしているとそのうちAPI乱発になってよくないOSになってしまうー。

こめんと欄


コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-09-28 (木) 22:54:57 (4934d)