* スタートアップ機能を作ろう!
 -(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 *);
  _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になってしまうー。
 
 * こめんと欄
 #comment

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS