Sunday, 22 July 2018

OS9 level 2 vrbf 完了

os9 側から Unix file system を直接見れる仮想RBFを書いたので、これで os9 disk image 抜きで上げられるように。ついでに dir -e も。

RBFにはdir -e用のundocumented system call (FDINF)てのがあって、それでfile descriptor(Unixのとは関係ない os9 のファイルの情報を格納するセクタ)にアクセスしてきます。なので、そのセクタを stat とかから作ってやれば良い。なのだが、LSN(logical sector number)でアクセスされる。さらに、os9 はcurrent directory (work/execの二つ)をLSNで管理してる。つまり、

  directoryのLSN(24bit)を仮想RBF側で覚えておいてやらないとだめ

inode番号使えば良いのだが、最近のinode番号って無駄に長いのね。でも下位3byteで良いらしい。ちゃんと管理するとあれなんだけど、でも、shell とか dir commadが動いている間だけつじつまが合えば良いと考えて、FIFOな辞書でいいや的な感じですませました。 まぁ、だめな方法なんだけど。

これで、level2 のcommandも一通り動かせました。mfree が変だったけど。Coco は512kbyte memoryかと思っていたんだが、実は2MBあるらしく、そこをなんとかするべきらしい。まあ、別にいいかな。

最後は、clock moduleをdebugして、ちゃんと時刻が表示できたり、時分割で並列実行できたりするのを確認しました。無駄にloopするコマンド作って裏で動かしました。

Sysgo から os9 F$STime すると clock module がリンクされるので、そこで timer start してやれば良いらしい。タイマー割り込み IRQ/FIRQからは自分のos9 system mode で動かすルーチンを登録、ルーチン側では最後に os9 の time slice routine である D.Clock を呼び出してやる方式。

  L00AE  leax ClockIRQ1,pcr
       stx  <D.SvcIRQ
       jmp  [D.XIRQ]  Chain through Kernel to continue IRQ handling
  ClockIRQ1
       jmp  [>D.Clock]

この方法だと、割り込み内で処理するものは少なくてすむわけね。これを発見するのには少し時間がかかったが...

これでだいたい終了かな。実機持っていた81年ぐらいにやるべきだったとは思うけど、あの頃は他にやることたくさんあったからなぁ。(いまでもそうですが..)

  OS9:loop & loop & loop & loop & loop &
  &003
  &004
  &005
  &006
  &007

  OS9:proc

   ID Prnt User Pty Age Tsk Status Signal  Module  I/O Paths
  ___ ____ ____ ___ ___ ___ _______ __ __ _________ __________________
   1  0  0 255 255  00 s    0 00 System  <TERM >TERM >>TERM
   2  1  0 128 134  00 s    0 00 Shell   <TERM >TERM >>TERM
   3  2  0 128 132  02      0 00 Loop   <TERM >TERM >>TERM
   4  2  0 128 131  03      0 00 Loop   <TERM >TERM >>TERM
   5  2  0 128 130  04      0 00 Loop   <TERM >TERM >>TERM
   6  2  0 128 129  05      0 00 Loop   <TERM >TERM >>TERM
   7  2  0 128 128  06      0 00 Loop   <TERM >TERM >>TERM
   8  2  0 128 133  07 s    0 00 Proc   <TERM >TERM >>TERM

  OS9:proc

   ID Prnt User Pty Age Tsk Status Signal  Module  I/O Paths
  ___ ____ ____ ___ ___ ___ _______ __ __ _________ __________________
   1  0  0 255 255  00 s    0 00 System  <TERM >TERM >>TERM
   2  1  0 128 134  00 s    0 00 Shell   <TERM >TERM >>TERM
   3  2  0 128 132  02      0 00 Loop   <TERM >TERM >>TERM
   4  2  0 128 131  03      0 00 Loop   <TERM >TERM >>TERM
   5  2  0 128 130  04      0 00 Loop   <TERM >TERM >>TERM
   6  2  0 128 129  05      0 00 Loop   <TERM >TERM >>TERM
   7  2  0 128 128  06      0 00 Loop   <TERM >TERM >>TERM
   8  2  0 128 133  07 s    0 00 Proc   <TERM >TERM >>TERM

  OS9:proc

   ID Prnt User Pty Age Tsk Status Signal  Module  I/O Paths
  ___ ____ ____ ___ ___ ___ _______ __ __ _________ __________________
   1  0  0 255 255  00 s    0 00 System  <TERM >TERM >>TERM
   2  1  0 128 128  00 s    0 00 Shell   <TERM >TERM >>TERM
   8  2  0 128 128  02 s    0 00 Proc   <TERM >TERM >>TERM

No comments: