【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

8086版V6でC言語のハローワールド

8086版V6でC言語のハローワールドが実行できる最低限のlibcを実装しました。OS本体はまだ存在しないためインタプリタ上で実行します。

$ cat hello.c
main(){printf("hello\n");}
$ 8086v6-cc hello.c
"hello.c", line 1: (warning) 'main' old-fashioned function definition
"hello.c", line 1: (warning) implicit declaration of function printf
$ 7run a.out
hello
続きを読む

8086版V6のa.out

8086版V6のa.outはマジックナンバーで識別することにしました。PDP-11のマジックナンバーはブランチ命令に由来します。

0407(0x107) br 020(0x10) .textと.dataは同じセグメントで連続
0410(0x108) br 022(0x12) .textと.dataは別セグメントに分離
0411(0x109) br 024(0x14) .textと.dataは別メモリ空間に分離

8086で相当する命令をマジックナンバーとしました。

0xeb 0x0e jmp short 0x10
0xeb 0x10 jmp short 0x12
0xeb 0x12 jmp short 0x14

ちなみにV7/x86は32bit化されているため、V7(V6と同じ)のヘッダの各項目を単純に32bit化したフォーマットで、マジックナンバーPDP-11と同じです。

続きを読む

インタプリタの動作確認

前回、インタプリタを複数のCPUやOSに対応させる過程を書きました。

実際に動かしてみます。

$ file write-minix write-v6 write-8086v6
write-minix:  Linux-8086 impure executable
write-v6:     PDP-11 executable
write-8086v6: DOS executable (COM)
$ 7run write-minix
hello
$ 7run write-v6
hello
$ 7run write-8086v6
hello
続きを読む

インタプリタのクラス設計

自作インタプリタを少しずつ進化させて、複数のCPUやOSをサポートできるようになりました。クラス設計で試行錯誤した過程を残しておきます。

※ 文中の図はインラインSVGで描いています。(ソース

続きを読む

ACKメモ

8086(16bitのx86)をサポートするコンパイラとしてACKが使えるようになりました。

ACK自体の移植ではなく、MINIX用のバイナリを8086インタプリタ上で動かします。使用方法は以下を参照してください。

ACKに関するメモです。

続きを読む

i8086とPDP-11のインタプリタを統合

i8086インタプリタPDP-11インタプリタを統合しました。1つのプログラムでMINIX 2とUNIX V6の両方のバイナリを動かせます。

UNIX V6のccを動かしてカーネルがビルドできることを確認しました。

V6移植ハッカソンで使うため、2年前に作ったPDP-11のインタプリタi8086インタプリタの構造に合わせて移植しました。MINIX 2とUNIX V6のUNIXとしての共通部分は基底クラスで共用しています。UNIX V6をi8086に移植する際にインタプリタシステムコールのABIを実装すれば、カーネルを移植する前にユーザーバイナリの動作確認を切り離して行えるのではないかという狙いです。

続きを読む