Wednesday, 8 August 2018

Position Independent Code

技術的にはまだ生きていて、macOS はPICが採用されてます。PICの方が10%-20%遅いとか言われた時期もあるのだが、どうなのかな。macOSだと、

  関数の先頭でPIC用のアドレスをPCから取得するコード(x86はPC offsetできない)
  リンクするshared libraryをlinkするためのstab

みたいなのが入っていて結構重い印象。64bit時代なんだから、もっとましな技術ないのかな。Linuxの絶対番地なリンクもクソではあるんだが。

MC6809とOS9は同時に開発されたのでPIC関係の連携は素晴らしい。

  1byte addressなDP(direct page)がDP registerで移動可能
  定数はPC相対で取れる
  大域変数はU registerで要求した分用意される(DPと同じ)

となっているので、

  STA <$20

みたいなコードがそのままでPICになります。なので、

  LDB $FF80
  LDX #$FF09

みたいな絶対アドレス参照なものは、

  LDB <$80
  LEAX 9,U

とかで置き換えれば良いだけ。むしろコードは小さくなるので速度的なペナルティもない。

つまり、MC6809でPICでないのは「MC6800/8080からの移植でさぼっている」だけってことね。GAME09もbuffer関係の数ヶ所だった。
buffer end の一つあとみたいなのが入っていたので、それを考えるのがめんどくさかったのだろうな。

  CMPX #buffer-1

みたいなコードだと CMPX Y とかないので面倒。いやだから、

  LEAX buffer-1,U
STX <buff_1

とかしておけば、

  CMPX <buf_1

とできる。でも、あの頃はメモリの1 byteは血の一滴だったからな。DP領域256byteしかないし。その辺を嫌がったのかも。

UをUser stackに使うとかするからいけなくて、Uを大域変数用に使えば楽勝だったはずです。(が、LISP09は、それだとレジスタが足りなくなるのかも)

と言いながら、os9 自体のoverheadが結構大きくて、8/16bitな real-time OSでは遅い方らしいです。

No comments: