MC68000エミュレータの開発 その1

f:id:PocketGriffon:20211210215441j:plain

のっけからものすごいタイトルで始まる今回のブログ(^-^)

しかも全く完成していない現状からブログを書く危険も伴う!!

 

まぁこのブログを読んでくださってる皆さんは、私が猛烈に飽きっぽいのはご承知の上だと思う(ご承知だよね?(ToT)) 出来る限り飽きないように、ブログに報告しつつ進めてみようというセコい魂胆だ!

と書きつつも、過去にV20エミュレータは飽きて放置してる前科がある!!

罪を重ねるのか、それとも汚名返上できるのか…(^^;

生暖かく見守ってもらえれば……(がくぶる

 

なお68000CPUと書きつつも、X68000っぽいものを作ろうとしてます。完璧なソレではないため、なんとなくMC68000という書き方をしている…と思ってください(^^;

 

そもそもなんで作るの?

68000CPUのエミュレータを作ってみようと思ったのには理由がある。

まず第一に、昔っから68000エミュレータは書きたいと思っていた。8080、Z80、6800(6301)、6809、8086(V20)、SC61860などなど…いろんなエミュレータを書いてきたけれども、68000だけは一度も書いたことが無いのだ。

避けていたわけではなく、チャンスが無かっただけの話(^^;;

f:id:PocketGriffon:20211211083824j:plain

もうひとつ、最近の私のブログにX68000が登場しているけれど、あれ以降何も進んでいない。実機で開発を進めるのでは無く、出来る限り開発環境をホストマシンで作りたい希望がある。しかし実行するXファイルには中に再配置情報というモノが含まれていて、どうしてもソレを作る事が出来ない…。Zファイル(絶対アドレスファイル)は作れるので問題ないじゃん…と思うが、それじゃあ……なんとなく…面白くない!(^^;;;

 

そしてみっつめの理由。

すでにX68000エミュレータがいくつか存在するけれども、手元のMac/DevTermでどれも動かす事が出来なかった…。なぜ他で動いてるのにウチでは動かないのかー(TOT)

素直にWindowsで動かせばいいじゃんとも思うが、それもちょっと違う気がする(T-T)

 

こんな感じでいくつかの理由が合体して、今回の「作ってみるか」に繋がった!

この機会を逃したら、一生作らない自信がある!!(^^;;

 

何を作ろうとしてる?

勘違いされてしまうと困るので先にお断りをしておくと、完璧なX68000エミュレータを作るつもりはありませぬ(^^;

 

やりたいことは「Xファイルを作れる環境が欲しい」、これだけだ。

理想をいえばgcc、as、lkが動く事…。makeも動いたら嬉しいなぁ…なんて思うと、Human68kが動く必要がある?

今後もおそらくやらないだろうと思ってるのは、市販のゲームを動かそうとする事だ(^^)

f:id:PocketGriffon:20211211084053j:plain

もう少し細かく見ていってみよう。

もしかしたらものすごく甘い事を書いてるかも知れないが、それは無知の為せる技!(^^;

 

ハードウェア部分

メモリマップはX68000そのもの。

サポートするハードはテキストVRAMとRTC(読み出し)くらいだろうか…汗

もしかしたらキーボードの一部もサポートするかも??

それ以外は極力ノーサポート。

 

IOCSコール

DOSCALLまたはHuman68kから呼び出される最低限の部分のみをサポート。ハードウェアをエミュレーションというよりは、C/C++でそれっぽく実装。

 

DOSCALL

基本的にはIOCSコールをするか、内部で処理されるものが大半だと思う。

おそらく多くはMC68000エミュレーションで動いてしまう気がしている。

 

Human68k

大半がMC68000エミュレーションで動く?CUI部分を使うかどうかでサポート範囲が変わってくると考えている。AUTOEXEC.BATをうまく組み合わせる事で、CUIを作らなくても済むのであればそうする。

 

……こんな感じで、X68000の特徴とも言える豪華なグラフィックやサウンドは一切サポートしないという割り切り!標準出力に出てきた文字を処理する事ができれば、実行時のウィンドウすら開かなくていいや…とさえ思っている!

 

ホストマシン上(私の場合はMacだったりDevTermだったり)でXファイルを作ることが出来る事のメリットは(自分の中では)計り知れない。

その後、動くのを確認したのちにあれこれ拡張したって構わないとも思うので、そこはもう気力次第だ(^^)

 

現状の進捗

いま現状では逆アセンブラが完成(と言っても力技で作った情けない版)しているのと、68000の命令が5つほど実行出来る程度だ。

 

エミュレータは最初の動作までがとても大変だ。

ここまでにレジスタの管理、メモリのアクセス、命令のデコード、命令の実行とフラグの反映方法などなど、非常に細かくて面倒な事を検討しておかなければならない。

 

特に68000は命令フォーマットが複雑なため、デコード部分をしっかりと考え抜いたあとで実装しないとひどい目にあう(^^;;

実を言えば1500行くらいコードを書いてから構造が破綻し、作り直してる!(^^;

f:id:PocketGriffon:20211211084248j:plain

エミュレータの作り方は人それぞれだと思うけれど、私はまずは逆アセンブラから作るようにしている。これは命令フォーマットを理解するのにうってつけだからだ。

アセンブラを作る難しさは、エミュレータのデコード部分を作る難しさに直結すると思う。

 

経験した中では、8080やZ80は逆アセンブラを作るのが簡単、6809は中くらいの難易度、難しかったのは8086やHD61700。特にHD61700は投げ出そうと思うほど大変だった!(ToT)

そして68000も結構大変で地味な作業が多かった。

これは…エミュレータを作るのが大変だという事を示唆している!!(T^T)

 

次回以降、さまざまな問題をどのように解決して進んでいこうとしているのかを詳しく書いていってみようと思う(^-^)

その流れで「これ、間違ってるよ?」的なご指摘があればとても嬉しい(^^;;

 

ではまた次回!(^-^)ノ