その昔作った賞味期限切れプログラムの物置小屋です。
N80はNECが1979年より発売していた8bitコンピュータの名機「PC-8001」のエミュレータです。
まだ、パソコンがマイコンと呼ばれていた時代の8bit機で4MHzのZ80(uPD780) CPUを搭載した国産マシンの草分け的存在です。ある世代の方々なら、大抵はご存知のベストセラーマシンです。
Z80 CPU 及び PC-8001の主だったデバイスをエミュレートしています。擬似カセットインターフェースやHAL研究所のPCG-8100にも対応しています。しかしCRTCの属性機能については、完璧に再現されているわけではありません(上線、下線機能が未対応等、その他)。また、仕様頻度の少ない Z80命令も一部未実装で省略されています。DOS版ではPCG-8100のサウンドまで対応していましたが、DirectX版では未対応となっています。
DirectX 7以上のWindows(2000/XP/Vista/7/8.1/10/11)互換機で動作します。Vistaは所有していないので試していません。
動作させるには実機のROMが必要です。PC-8001より何らかの手段で抽出し"PC-8001.ROM"というファイル名で実行ファイルと同じディレクトリに配置してください。又、PC-8801のN-BASIC ROMでも動作します。その場合は"8801-N80.ROM"というファイル名にしてください。
また使用可能なイメージはN80形式とCMT形式です。N80形式は独自のイメージファイル形式で、実機のRAMの内容をそのままダンプしたものです。CMTはカセットテープに出力されているデータの内容そのもので、実際にエミュレータ上でcloadやモニタのLコマンド等で読み込み実行します(詳細はこちらを参照のこと)。
N80は常に全画面モードで動作します。実機のKey以外にアプリケーションの制御用として以下のKeyが割り当てられています:
[F7] 設定画面 [F8] MUTE機能。音声のON/OFFをトグルで切替 [F9] N80/CMTファイルの選択 [F11] PCG切替トグル [F12] リセット [END] エミュレータの終了
また設定画面[F7]では以下の項目が設定可能です:
DMA load・・・・・・・・負荷微調整(数値が少ない程負荷が軽くなる)Wait Interval ・・・・・この項目は現在未使用です(設定を変更しても無視されます)Flip Rate ・・・・・・・画面描画レートを設定しますVolume・・・・・・・・・音量調整(ハード) Amplitude ・・・・・・・音量調整(ソフト)Overtone・・・・・・・・サンプリングを4倍で行って補正します(効果を見る限り意味なかったかも・・・) Sample Equilibrating・・サンプリング平衡化(これも、まぁ、アレですw)Wait Vertical Blank ・・垂直帰線時のバッファ転送(場合によっては遅くなります)
項目の一部はN80.INIファイルの保存されます(多くの項目は結局、不要となって未機能にしてしまいました、、、w)。
そもそもエミュレータを作ろうと思ったのは、1993年暮れに私が初めてPC/AT互換機を購入した際に友人が教えて(見せて)くれたApple][エミュレータがきっかけでした。まだエミュレータというものの存在を知らなかった上に、Apple][j-plusのオーナーでもありファンであった(CALL -151でニヤリとしたあなた、ご同輩ですねw)当方には、その見事な出来栄え、再現性に衝撃を受けたのを覚えています。そこで自分も何かやってみたいという創作意欲にかきたてられ、白羽の矢が当たったのがあの名機「PC-8001」でした。
当時はまだNEC PC-9801シリーズの天下で、OSは(UNIXや汎用機を除くパソコン界では)MS-DOSが主流でWindows 3.1Jも出たばかりといった暗黒の16bit時代でした(8086をいじった方なら誰しも同意して頂けるのではないでしょうかw)。従って、最初に作ったのもMS-DOS用でした。当時、私のマシンは486SX-20MHzを25MHzにオーバークロックにした今にして思えば貧弱この上(下?w)ないスペックで、こんな環境でもまっとうに動くようにとコードの大半はアセンブラで書いていました。1993年暮れよりまずはZ80エミュレータを作成し、翌年の1994年初頭にPC-8001部も含めた初版が出来上がりました。「N80」と命名されたエミュレータは仲間内で大いに盛り上がりましたが、実機のROMを必要とするアングラの極みのような一品をを外部に公開することはありませんでした。
DOS版の開発からしばらくして友人がHPを始め、そこでの話のネタにでもとDOS版のN80を公開してくれていたのですが、一部で好評(?)を得てたくさんのメールを頂いたり、雑誌に掲載されたりしたのに気を良くしてWindows版を作りました(単純ですねw)。又、DOS版でPC-8801(mk2でもSRでもない無印)エミュレータ「N88」を作ったのもこの頃でした(後述)。Windows版は32bit化されたWindows95以降にWinGを使って作成しましたが、とにかく重くてお話になりませんでした。その後DirectXに切り替えて1997年から翌年に掛けて作成しました。DOS版のソースを元にしているので核となるZ80やデバイスのコードはアセンブラのままでお世辞にも奇麗なコードとは言えない代物です(しかも少し不安定です…orz)。それでも私のDOS/Vマシン(Pentium 100MHz?)と私の力量では如何ともし難く満足いくものではありませんでした。その後は個人的に忙しくなり、DirectX版はそのまま中途半端に放置されてしまいました。
森田氏作の"ALPHOS"を(個人的に)後世に残そうと取り組んだのが「N88」でした。鈍足の名を欲しいままにしていた初代8801でパレットを駆使して淀みないスクロールを実現していた"ALPHOS"は衝撃的でした。正直、自分は初期のカセット時代のゲームにしか思い入れがなく、本体より高価だったFDDも後年に中古で購入した身だったのでフロッピー版のゲームが普及した頃にはすっかりゲームに興味が薄れてしまっていました。それでも手持ちのカセットを活かすべく「N88」は「N80」を拡張する形で実装したのでDOS版でした。VGAには4枚のVRAMがありましたが、TEXT-VRAMとの同時使用が出来なかったので、3枚をGVRAMに、残り1枚にグラフィックでTEXT表示するようにしました。従って、文字は単色表示しか出来ませんでした。8001と違って割り込みを使っていたりメモリ構成も複雑でしたが何とか"ALPHOS"が動いたので感無量でした。しかし、この頃にはDOS時代は終焉を迎えていました。
あれから10年以上も経過して何故、今更?ということですが、たまたまディスクの整理をしていたら埋もれていたN80を発見し、久しぶりに起動したらうまく動きません。そこで少し手直しをして何とか動作するように改良したのを機に、ひっそりと公開することにしました(VisualStudio2003にもアセンブラ付いてるんですねw)。あの頃の私は個人でHPを所有しておらず自身の手で公開したことがなかったのです。今となっては、他にもっと優秀なPC-8001/8801系エミュレータが存在していますので実際使うにはそちらを、そして思い出の一品として、コレクションのひとつとして「N80」もいかがでしょうか?w
Windows7が発売されました、個人的にノートPCに入れてみたのですが、そのままではN80が動きませんでした。そこでWindows7でも動作するように少々改良してみました(開発にはVisualC++ 2008 Expressを使用)。又、WinRing0ドライバを利用してBeep音を出すモードを追加しました。DirectSoundやBeep APIより再現度が高いと思います(が、直接I/Oポートを叩くので危険度が増しますw)。お好みに応じてチョイスしてください(Ver1.46として公開)。
※セキュリティーソフトを入れている場合はWinRing0の使用時に"怪しい挙動"として検知されることがあります。
DirectSoundによるBeepやPCGの再現性を向上しました。実機のような高速スイッチング方式では速度的に無理があったのでリアルタイムでPCMを作成して鳴らすよう変更しました。これで最初のDirectX版を作成してからずっと放置していた問題もようやくクリアされたと思います(Ver1.70として公開)。ずっと気にはなってたんですけどね、、、w
何を血迷ったのか本体が既に骨董品レベルのZaurus(SL-C3000)に移植。ZaurusにはFedora 10のARM版を入れているので、ほぼLinuxのプログラムとして作成。SL-C3000はIntelのPXA270が搭載されているので、frame buffer描画にiWMMXt命令など使った遊び心満点な仕上がりになっていますw Z80部分もC言語化しました。
Cocoaの勉強がてら、お題としてN80をMacOS X(10.8)に移植しました。Key入力絡みやら何やらまだ未完成ではありますがAlpha版として公開します。
Zaurusにも移植したN80ですが、昨今(2012年8月現在)ではSHARP絡みのニュースでは良い話を聞きません。このままもし無くなってしまうようなことでもあれば本当に残念ですし、そんなことがないことを祈るばかりです。クリーンコンピューターという名を冠したMZシリーズ、部署違いで出されたX1/X68000。PDAとしてLinuxを採用した意欲的なZaurus。長年研究した液晶技術、、、と過去には個性的な事業を展開していました。日本の製造業に元気がないのは本当に円高だけが原因でしょうか?それとも極度にリスクを恐れる官僚主義が蔓延してしまったからでしょうか?
最初にDOS版を作成してから20年の時が経ちました。NECがLenovoのThinkPadを米沢工場で作るとか、、、時代の移り変わりはまさに諸行無常ですね。個人的には、Apple//e(1984年製)の中古を入手したりと、若干血迷った行動もしていますが相変わらずです。先日、本屋でふと工学社のI/O誌を見かけました、まだ発行してたんですね、驚きです。昔のI/O誌をKindleで復刻版とか銘打って売ってくれれば必ず買うんだけどな、、、w
Xcode7よりiOS開発において実機によるデバッグが登録していなくてもAppleIDさえあれば出来るようになりました。そこで、以前MacOS X用に移植したものをiOS用に再移植してみました。驚くほど親和性が高く、ほんの少しの手直しで動くようになりました。仮想キーボードと仮想JOYPADを実装して、外部KB無しで何とか単体でも動かせるようにはなりましたが、ゲームをするには少々厳しいですね。SMBプロトコルによるイメージファイルの読み込み対応。無駄に努力してしまいましたw
当然ですが、こんな代物Appleの審査に通るわけもないので、お蔵入りです。
今でもたまに思い出したようにN80のメンテナンスをしています。というのも、swift2から始めたiOS用でしたがswiftのバージョンが上がる度にいろいろ言語仕様やCocoaの仕様が変わり手直しが必要となってしまうからですw 困ったものですね、、、現在swift5で動作しています。
とある事をきっかけにHAL研のPCGには後期モデルというものが存在し、3音声出るということを知りました。これは40年も経って初めて知る衝撃の事実でしたw 手持ちのPCGは前期モデルで1音しか出ませんし、初期のHAL研のゲームでも1音しか出てなかったと思います。そこでN80も3音声対応に改良しました。また、拡張ROM領域($6000〜$7FFF)をRAMエリアとして使えるような改良も地味に行いました。
そしてWindows版では全画面表示だけでなく通常のWindowモードを切り替えられるようにしました。N80が何故「全画面モード」しかなかったかというと、1995〜97年当時の(私の)CPUでは、32bit色で画面を描画をするには荷が重過ぎてどうにもならなかったので、8bitパレットを使った256色モードを使っていた為です。DirectXで画面のモードを強制的に切り替えられるのは全画面モードだけでした(私の知る限り)。
DOS版のN88の頃から未解決だったCMT入力での不具合が直りました。"NEW ON 1"でNモードにすると"割り込み式"から"ポーリング式"へと受信が切換えられ、その時の受信バッファのゴミをどうするかがずっと解決できないまま放置していたのをやっと重い腰を上げて対応w 更に、N88ではN80ファイルが読み込めない件も修正しました。原因は余りにも単純な事で何で今の今まで気付かなかったんだろう?と呆れてしまいましたw。
これを機にIDEをVC2008 ExpressからVC2019 Communityに変更しました。各段と使いやすくなったIDEに感謝です。
レトロ界隈ではX68000Zという製品が計画されているそうで、KBやマウスは実際に使えるもののようです。X68000はパワーユーザが多かっただけに今後の動向が気になります。又、PC-8001/8801でも活発に活動されている方々がいらっしゃり、まさか21世紀になって新作ソフトにお目に掛かれるとは感無量です。N80は当時のカセットを保存したいという目的でスタートしていたので新作ゲームが出てくるなど夢にも思いませんでした。三つ子の魂百まで、、、w
気が付けばもう2023年の年の瀬を迎えました。今から丁度30年前の今頃、N80を作り始めました。もうそんなに経ってしまったのか、、、
N80生誕30周年を迎え、ちょっとだけ記念に動画を追加しました。光陰矢のごとしですね。
ここで公開されているいずれのプログラムも、その使用(または使用できないこと)によって発生した如何なる損失や損害に関しても当方は一切責任を負いませんのでご了承ください。各自、自己責任の範疇においてご利用ください。公開しているバイナリは、一応ウィルスチェックを行っておりますが、再度ご自分でチェックされることをお勧めします。
また、ROMの不正な入手方法やイメージの入手方法等に関する一切のお問合せにはお答え出来ませんので悪しからずご了承ください。
DirectX用の最新版は1.82です:N80DX182.zip(VC2019Community用ソース/バイナリ) ※DAA命令の改良(完治したのかは不明)
DirectX用の最新版(N88)は2.09です:N88DX209.zip(VC2019Community用ソース/バイナリ)
DOS用の最新版は1.03です:N80R103.lzh(MS-C+MASM用ソース、バイナリ)
Zaurus(SL-C3000)用の最新版は1.1です:n80zaurus.zip
MacOS X(Sonoma METAL対応)用のN80Xです:N80Xsrc.zip(Xcode 15.2用ソース)
iOS(METAL対応)用のN80iです:N80i.Metal.zip(Xcode 15.2用ソース)
RaspberryPi2(raspbian+SDL2[without X])用のN80piです:n80pi20210814.tar.gz
RaspberryPi2(raspbian+SDL2[without X])用のN88piです:n88pi20210814.tar.gz
PC-8001のROMをパラレルポート経由で読み出す為の方法(難易度:高):80ROM2PC.lzh
PC-8801のROMをシリアルポート経由で読み出す為の方法(難易度:低):88ROM2PC.lzh
ダンプされたHEX文字列ファイルをバイナリファイルに変換する方法:HEX2BIN.lzh
PC-8801上でカセットテープのゲームをCMT形式で吸い出す方法:88CMT.lzh
DOS版ではMS-C 6.1とMASMを使って開発しました。makeにはDOS用にポーティングされたgmakeを使っています。64KBのセグメントの壁と世界一ユーザーフレンドリーなMASM構文と格闘しつつ・・・w。その後MS-CはVisualCと名前を変え現代に至るVisualStudio2005まで進化していますが、今でもしっかりMASMはサポートされています。VS2003ではML ver7.0、VS2005ではML 8.0が付属していますし、無料のVC2005 Express版でも本体には付属していませんが別途MSのサイトよりダウンロードできるようになっています(2009/12/30追記:VC++2008 Express版ではML 9.0が付属しています)。
DirectX版は当初、VC++ 5.0からVC++ 6.0を使用していましたが、今回の手直しの際にはVS2003を使用しています。これはただ単純に手元の開発環境に2003がインストールされていただけの話で、VC++ 6.0のプロジェクトをVS2003で読み込み直しただけですから、VC++6.0でも最新のソースはビルド可能なはずです現在はVisualC++ 2008 ExpressVisualStudio Community 2019を使用していますので古いVCではビルド出来ません。
豆知識:VC++やVSからアセンブラのソースをビルドするにはカスタムビルドを使います。具体的には各アセンブラのソースファイルのカスタムビルド設定でml /c /Zm /Cp /coff /Fo$(OutDir)\$(InputName).obj $(InputPath)を指定し出力には$(OutDir)\$(InputName).objのように指定します(2009/12/30追記:VC++2008 Express版ではカスタムビルドにMASMの選択肢があります)。
最初にエミュレーターが作れそうだと確信したのは、PC/AT互換機で採用されていたグラフィックス装置EGAのお陰でした。CGA/EGA/VGA/SVGAと続く互換機のグラフィックス装置はBIOSレベルで互換性が確保されており、どのマシンでも利用可能でした。EGAのテキストモードにはPC-8001や8801、9801のテキストアトリビュート機能に似た機能を備えていた上、表示するフォントを外部から変更することが可能でした。これならプログラムでPC-8001やPCGのフォントを動的に変更することができ、しかもグラフィックスを使用しない分高速に表示させることができます。そこでDOS版のN80の開発に取り掛かりました。
8080より派生したZ80だけに8086との相性もよく、Z80のエミュレーションも比較的容易に実装出来ました。逆にどっぷり8086に依存しているので他に移植しにくい(使いまわしの効かないw)コードになってしまいました。特に演算後のフラグの変化は8086そのものの命令実行後のフラグ変化を利用しています。前述の通り、当時はプアなマシンで実行することを前提としていましたから、Z80エミュレータ部は全てアセンブラで記述しマクロを多用した難解なコードとなっています。全ての命令を実装したのではなく主だった命令のみを先に実装し、後はN80上のゲームを動かしながら足りない命令を追加していくといった方式で開発を進めた為、今でも未実装の命令が残っています。
Z80の未定義コード(IXHやIXLに関連した命令)についてもFEDORAというゲーム中にどうしてもエラーが出てしまい、友人の助けもあって無事解決されました。またHPでダウンしてくださった方々からも、メールで「こんな命令が動作しなかったよ」とかいろいろとフィードバックして頂きました。
当時、このサイトを知っていればもうちょっとマシなZ80になってたかもしれませんね。
※その後、Z80部もC言語化しました。
PC-8001の特徴の一つに2400Hzで発声するBEEP音があります。PC-8001では、このBEEPを高速にスイッチングすることで音階を作ったり、ゲームの効果音を作ったりしていました。DOS版では互換機のBEEPを直接叩いて流用することができPCGの発声にも利用できましたが、Windows版では直接ポートは叩けません(Windows95ではいけたんですがw)。しかしNTにはBeep APIが用意されていたのでそれを使っています。DirectSoundを使って2400HzのWAVを鳴らすことにも挑戦したのですが、高速なスイッチングが出来ず断念しましたかなり音痴ではありますが一応音が鳴るようにしました(PCG1音も発声します)。これは単に当方が未熟者だということで・・・
一番苦労も多く、今でも完全にエミュレートしきれていないのが、このCRTCです。テキストを属性で修飾し表示するのですが、この仕様が今ひとつ把握しきれずゲームによっては正しい属性で表示されません。ほとんどの手持ちのゲームではそれなりに表示できるようにはしたのですが、未知のゲームまではわかりません。
Windows版ではDirectXのDirectDraw機能を利用していますが、現在のDirectX8や9以降では3Dに特化され2D機能は先細りな様子です。一応、今でも2Dインターフェースは用意されているようですが、以前CマガジンにDirect3D上で2D表示を行うといった記事も掲載されていました。今時のDirectXで2D表示を行うにはどういった手法が正解なのかわかりませんが、N80では昔ながらの2DのDirectDrawインターフェースを使用しています。将来のDirectXではこの機能が省略される可能性もあるのでしょうか?心配です。
実機の速度になるべく近づける為、DOS版や初期のWindows版では空回りのウェイトループを入れてユーザ自身が調整を行えるようにパラメータファイルを読み込ませていました。お世辞にも賢い方法ではありませんでしたが(当時の私の486SX-25ではNo Waitで丁度いい速度で動作していたんですよね、、、ところが!信じられないことに486DX66を所有していた友人に早過ぎて遊べないと言われて慌ててWait入れたんですw 少しでも速く動作させようとアセンブラで書いたのに、、、;;)、Windows最新版ではZ80のステート数からある程度自動的に速度調整を付けるように改良されています。この際、Win32 APIに用意されている高精度タイマーを利用していますが、場合によっては正しく動作しないかもしれません。
PC-8001は4MHzのZ80(uPD780)を搭載していますが実際にはDMACのウェイトの為に実効クロックはもっと低めで動作していました。N80.INIのclk_rateを調整することで全体の動作速度が変更できます、ここにそのまま周波数を設定します(4MHzなら4000000と言った具合)。数値のオーバーフローチェック等していないので常識の範囲で設定してくださいw。
Apple][エミュレータに刺激されて作成したN80ですが、PC-8001は私にとっても思い入れの深いマシンでした。今と違って多くの雑誌にゲームのダンプリストが掲載されており、それを必死で打ち込んでは遊んだものです。そんな苦労の賜物であるテープを何とか今に保存したいという想いも実現出来き、その使命も達成されたことと思います。
もうすっかり旬を過ぎたプログラムですが、70年代、80年代の多くのマイコン少年(少女)達にとってコンピュータが"手段"ではなく"目的"だった時代の8bit名機を少しでも楽しんで頂ければと思います。
もう2009年も師走。ふと、このページを読み返してみると1979年にPC-8001が発売されてから今年でちょうど30年経過してたんですね。すっかり忘れてというか、気付きませんでしたw (2009/12/13追記)
元号も変わった今年2019年は、PC-8001が発売されてから40周年になります。そうですか、40年も経ちましたか、、、(2019/5/19追記)
先日、NECからも40周年記念の企画が発表されました。以前、HAL研からMZ-80Cのミニが発売されましたが、そのPC-8001版。但し、今回はNECのノートPCとの抱合せなので、流石にmini欲しさにノートPCまで買う気にはなりません、、、(2019/8/11追記)
1994年に完成したDOS版のN80から、来年2014年で20周年になります。1993年のZ80エミュレーター作成から始まった記録を回顧録として公開しました。
気が付けばN80を作ってから30年も経ってしまってたんですね、、、もうアクティブには活動していませんが、今でもネットでレトロPCの話題をたまに見ては楽しませて貰っています。
月刊ASCII 1997年10月号 パソコン秘宝館 第18回 PC-8001エミュレーター ASCII p.464
The Emulators -エミュレーター大全- 秀和システム 1998/07/08 p.24
突撃インターネットPC Vol.1 SOFTBANK 1998/12/23 p.69