[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 1955] Re: OSASK/TOWNS を直接起動させるには



  こんばんは、川合です。


Koyanagi Masaaki さんは 2001/08/27 19:42:07 の「[OSASK 1953] OSA
SK/TOWNS を直接起動させるには」で書きました:


>	1."0-0-1-2"(C-H-R-N)〜"0-1-18-2"の 512バイト * 36セクタ = 18KBを
>	    0x000800〜0x004fffへ転送する。
>
>	2."1-0-1-2"〜の512Bセクタを0x008000〜へ転送。何バイト転送するかは
>	    DIにセットされた値で決まる。DIの値は1.での転送量を含む。
>
>のように 2回に分けてロードが行われており、セットアップへのジャンプが
>	DB(0xea); DW(0); DW(0x0800); // JMP(0x0800:0x0000);
>と、2. の先頭アドレスに実行を移すように読めます。
>
>base.exe が存在しているのは1.側のはずなので不思議です。

  おお、そういえばそうでした。

  ええと、実はこういうわけです。

  OSASK/ATの直接起動ディスクでは、「ファイル領域」にOSASK.EXEの
イメージ(ロード先を0x0800に固定して.EXEのリロケート情報を削った
もの)をおいています。そして、ファイル領域の該当する部分を何かの
拍子に上書きされては困るので、FATに「不良セクタ」のマークを付け
ているわけです。

  さて上記のローディングですが、2.のロードがOSASK.EXEのロード
に該当します。では1.はなんなのかというと、起動時にはFDDのヘッ
ドが0トラック位置にあるので、ついでにそこを読み込んでおいて、起
動直後のディスクキャッシュとして使おうというためのものです(1.
の領域にはFATやルートディレクトリエントリがあるため、pokon0が起
動直後に要求します)。・・・平たく言えば、起動総時間短縮のための
テクニックです。

  普通のOSでは、OSのイメージなどはディスク上にリザーブ領域を確保
して、そこに書き込むのが普通です。ファイル領域には書きません(DO
Sのように、ファイル領域に置いているものもありますが・・・MSDOS.S
YSやIO.SYSのことです)。

  OSASK/ATがなぜ普通のOSとは異なる方法を採用したのかというと、理
由はくだらないことで、リザーブ領域を設定してしまうとディスク内で
のFAT領域の位置やルートディレクトリエントリ領域の位置が普通のデ
ィスクとは違う位置にずれてしまうからです。今のOSASKのディスク関
係のルーチンは手抜きが多く、FATなどの位置を「きめうち」している
んです。それゆえ、ずれてしまうとうまくアクセスできなくなってしま
うので、こんな仕様になっているんです。

>おおよその動作は
>1. ROM BIOS が 512バイトを 0xB0000 にロード
>2. 自分自身を 0x90000 に転送
>3. セットアップルーチン 1KBを 0x90200 以降に転送
>4. Linuxカーネルイメージを 0x10000 以降に転送
>5. セットアップルーチン 0x90200 にジャンプ
>となっています。

  ソースを読んだところ、詳細も分かりました。せっかくなので書いて
おきます。

・このIPLは、FD/HDの両用になっていて、どちらでも使えるようになっ
  ています。

1.0xb0000からの512バイトを0x90000へ転送
2.FD:0x00000からの1024バイトを0x90000へ転送("It's very Dangero
    us"・・・笑)
3.FD:0x00400からの2048バイトを0x90400へ転送
4.0x90a00からの512バイトを0x10000へ転送
5.FD:0x00c00からの5120バイトを0x10200へ転送
6.FD:0x02000から[img_size]に書かれた分が終わるまで0x11600へ転
    送
7.0x90200にジャンプ

  なお、FD上のどの部分をロードするかはプログラム中ではセクタ番号や
シリンダ番号で書かれていますが、小柳さんの便宜を考えてディスクイメ
ージ内のアドレスで書いています。

  以上7手順のうち本質的な動作をまとめると、こういうことです。

1.FD:0x00000からの3KBを0x90000へ転送(意味があるのは、90200〜90
    bffらしいが)
2.FD:0x00a00からの[img_size] * 512バイトを0x10000へ転送
3.0x90200にジャンプ

>OSASK/TOWNS を起動させるには上の部分を
>3. 18KB を 0x00800 以降にロード
>4. 残りを 0x08000 以降にロード
>5. 0x08000にジャンプ
>という書き換えで合っているでしょうか?

  このIPLはDOSとの互換性を考慮していないので、3.の手順は意味があ
りません。ですから、4.と5.だけでいいわけです。しかし、OSASKにDOS
のディスクとしては「空っぽ」であることを認識させるために、FD:0x0
1400の1バイトを確実に0x00にしておく必要があります。

  プログラムの変更のしやすさから言えば、FD:0x01800以降にOSASK.EX
Eを加工したものをおいて、FD:0x01400を0x00にすればやりやすいと思
います。その他のFD:0x00200〜FD:0x017ffは、何を書いておいてもいい
ですし、どこにロードしてもかまいません(ロードしなくてもいいです
が)。このOSASK.EXEの加工についてですが、

>(2)OSASK/TOWNS の OSASK.EXE の先頭 512バイトを切り捨てる

これだけではうまく行きません。その切り捨てた512バイトの内容にし
たがって、DOSの代わりに512バイト以降を書き換えなければいけません
。具体的には以下の手順で行います。

  512バイトを切り捨てる前のOSASK.EXEがunsigned char osaskexe[128
KB];に読み込まれているとする。

#define getword(p) ((p)[0] | (p)[1] << 8)

    unsigned char *table = osaskexe + getword(osaskexe + 0x18);
    for (;;) {
        int p = getword(table) + getword(table + 2) * 16;
        table += 4;
        if (p == 0)
            break;
        osaskexe[512 + p + 1] += 0x08;
    }

この加工の後、先頭512バイトを切り捨てる。

  なおこの作業は、OSASK/AT ver.1.5ではINIT.ASKの2481〜2496行目で
やっています。

  以上全般について不明な点がありましたら、またメールでご指摘くだ
さい。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/