UNIXv6のソースコードな話

Lions' Commentary on UNIX 読書会で気になった所があるのでメモ。

型の種類と幅

PDP-11は16bitなコンピュータなのでレジスタ=アドレスは16bit=2byte。
これを前提に型の幅を考えると、

  • char 1byte
  • int 2byte
  • char* 2byte

となるようだ。
short、void、void *、unsignedあたりは見当たらない…。

宣言

関数宣言はしないようだ。
関数コールは型チェック無しに書かれたとおりコンパイルされるのだろう。
返り値の型宣言が無いんだけど…?

int coremap[CMAPSIZ], int swapmap[SMAPSIZ]がsystm.hに書かれているだけで.cに書かれていないのは今のCな感覚だととてもおかしいけど、宣言でなくて実体だという事か?
systm.hをincludeしている.cは本当に一つしかないのか…?

構造体の使い方が変

これはこのソースコードを読むときに一番変に思う所で多分有名だろうから僕がここで指摘するまでも無いと思うんだけど、0177570番地(※注:8進数)にメモリマップされてるハードウェアレジスタを読みに行くには、

#define SW 0177570
struct { int integ; };

って宣言して

val = SW->integ;

って書く。
なんでやねん。

要するに今のCで言う

val = *((int*)0177570);

なのだが、この時にはこういうシンタックスだったという事か。