PC-9801がIPリーチャブルになったのでなにか作ってみようと思います。
FreeBSDで使えるようにしたOpen Watcom v2を使います。
当時はTEENのアプリケーションはLSI CかTurbo Cで作られるケースが多かったようです。
TEENは常駐型のプログラムでアプリケーションとはソフトウエア割り込み(INT)でやり取りをします。
下のコードは割り込みの番号を探して、TEENが常駐している場合はソフトウエア割り込みを使ってTEENのバージョンを取得しています。
tver.c
# include <dos.h>
# include <stdio.h>
# include <string.h>
void teen_version(int vect)
{
union REGS regs;
regs.h.ah = 0x01;
int86(vect, ®s, ®s);
printf("TEEN Vector %x Version %d.%d", vect, regs.h.al, regs.h.ah);
}
int main()
{
int vect;
char far *addr;
vect = 0x22;
while ( vect < 0x100){
addr = (char *far)_dos_getvect(vect);
addr -= 9L;
if (_fstrcmp(addr, "%TEENAPI") == 0) {
teen_version(vect);
return 1;
}
++vect;
}
printf("NG");
return 0;
}
ラージモデル(-ml)でビルドする必要がありました。
FreeBSDでコンパイルしてTFTPでPC-9801に転送して確認しました。
A>TVER
TEEN Vector 70 Version 0.39
TEENではアセンブラで書かれたライブラリが用意してありました。スモールモデル用とラージモデル用があり、
ライブラリはTurbo Cの呼出し手順で作られていて、Open Watcomで使うためには引数のレジスタの変更が必要です。返り値はAX,DXで同じようです。