投稿

ラベル(プログラミング)が付いた投稿を表示しています

MZ80を起動せよ!画面バッファを利用した高速書き換えプログラム

イメージ
古いPCやゲーム機のプログラミングをしていると、その描画速度の遅さに四苦八苦することが度々あります。今回のMZ80もそうで、BASICで素直に描画するととんでもなく遅く、お話になりません。 そこで、アセンブラで描画処理の部分を描いてしまえばあとはどうにでもなるのでは?というかエミュレーターでテストできるならアセンブラでガリガリ書けば速度なんとかなるのでは? (MZ80のすごいところは、描画中にメモリアクセスのウェイトをかけていないことです。映像は乱れますが、強引かつ高速に描画を繰り返すことが可能です。) そう考えた結果、潤沢?なメモリを搭載しているMZ80のシステムを利用し、フレームバッファを用意して、スプライト画面・背景画面を合成、描画メモリへ転送するシステムを設計してみました。 メモリ転送とアドレス管理の考察 ■|そもそもMZ80はどうやってテキストを描画しているのか 上記の漫画にも記載したように、MZ80にはz80のメモリエリア上に画面に表示するテキストバッファが割り当てられている設計となっております。 そのメモリエリアはD000h~D3E7hまでの1000byteとなっております。 というのも、表示できる文字数が横に40文字、縦に25行となっているためですね。 そのため、疑似ドットグラフィックはこの2倍の(1文字に2ドット分配置されているため)縦50ドットx横80ドットの解像度として絵を表示することができるのです。 そして今のPCのようにラスターフォントで表示しているのではなく、VRAMには画面に表示するフォントのコードを書き込んでおります。そのため、任意のフォントグラフィックに書き換えて表示するといったような機能は搭載されておりません。  VRAMに書き込まれた文字コードがそのままグラフィックを記録しているROMにアドレスとして読み込まれ、フォントデータが出力される仕組みになっております。  そのため、搭載されているフォントグラフィックROMを差し替えれば、任意の文字グラフィックスに差し替えることが可能です。 ■|書き換え速度の問題と、VRAM転送問題  ゲームを作るうえでカギになるのはこの描画速度です。例えば、PRINT文で書き換えた場合は必ず1Fで1回しか処理されないため、描画速度がどうしても遅くなります。 ましてや、スクロール画面などの画面全体を書き...

MZ80を起動せよ!公式BASICを読みこませてみた結果

イメージ
前回、なんかカセットテープの調子が悪いということで終わりました。 MZ80を起動せよ!モニター修理というか交換しました 読み込まないのはなんで?テープ?回路?コンデンサ?ICの故障? とまあさっぱりわからなくなり、ついに秋葉原のBEEPに飛び込んで相談してきました。 んでちょっと怖い整備係のおじさんにカセットの互換性、在庫状況を尋ねたところ… 1)基本、mz80系でmz700系のカセットテーププログラムは動かない。 2)ここ1~2年、店頭でmz80系のソフトは出ていない。本体も入荷していない。 (ガラスケースの上に鎮座していますが、あれは展示用でしょう。そうであってほしい。) という回答を頂いたため、その時よく出回っていたmz700系のテープを使用することは断念。次に試すのは、MZ-80実機で使用できるという「KM-Z80 BASIC」というもの。 こちら、プログラム的には完全互換を達成しているそうなので、あとはテープに焼いて動けば成功、というわけです。 【KM-Z80をカセットテープに焼いてみる】 というわけでさっそくデータをカセットテープに書き込みたいと思ったのですが、まず焼き込むにはこれをwavデータ、つまり音データにしないといけないのです。 カセットテープに焼き込む まあ音データなんだしカセットに書き込めばいいんでしょカセットデッキ使用してやれば簡単じゃんとか雑なこと考えてテープに録音し、起動させ、モニタコマンドにLOADと打ち込みますが…認識しません! 反応すらしません。理由としてはMZやSharp X1に使用された、特殊なカセットデッキが原因であることは容易に想像がつきます。そのため、カセットデッキの裏の回路に直接電極をつないでPCから音声を再生、8255のピンから正しい信号が出ていることを確認しましたが、やはり認識しませんでした… ちなみに、基板に直接電極をつないで入力をしてみましたが反応せず… 【公式BASICを入手し読み込ませることに】 本来、修理を行うのであれば必ず公式のモノが動くか確認する必要があるのですが、まあ今回それをすっ飛ばしてあたふたしていたのでこれではだめだとホンモノを入手しました 。 それがこちら。ジャンク品ということで出品されていましたが、そもそも出回っているかどうかも怪しいレベルで貴重品...

ファミコンの完全自作ROM&カセットを作ろう!!その3 ~とりあえず動くromカセットができた~

イメージ
以前、 ファミコンカセットを作ろう としてピンアサイン直読み直結で作ったものの、結局動かず悶々としてました。何かが間違っているのは確かで、なにが間違っているのかがよくわからないまま暫く、とある本が出版されそれを元にもう一度作り直したのがこちら。 はい、デカイですね!通常のファミコンカセットの 2 〜 3 倍のサイズです。中身は eprom が 2 つといたってシンプル。しかしながら重要なのはその上のジャンパ線で、ここにはファミコンカセット特有の機能を拡張できるように本来半田付けしてしまうところを外に出してあります。ざっくりいうとスルロールと音ですね。スクロールについては一枚の画面をひたすらループする方向を縦方向が横方向かどっちにするか、音については外部から音を追加で加える(体験してもらうなら、ゲームを起動して 2 コンのマイクに向かって喋ってもらうと、ファミコンを通して音が出ます。それみたいなもんです。)ですかね。もう一つ機能拡張のためピンを出しておいたのですが忘れてしまいました。 そしてこのカセット、実はどのマッパーにも属さない、変なカセットになっているようです。というのが、直繋ぎの場合 PRGROM と呼ばれる 6502 側の ROM は最大 16kbyte だそうですが、今回製作したカセットは 32kbyte が繋がるようになっています。(ドンキーコングやマリオブラザーズ がマッパー 0 らしのですが、いやどんだけ小さいプログラムに詰め込んだのか恐ろしくなります。)たぶんきちんと調べればあるんでしょうね。詳しい方教えてください…  CHRROM と呼ばれるグラフィック ROM は 8kbyte でこれは変わりません。使ってみてわかったのですが、恐ろしく狭いです。背景はもちろん画面を埋められないほどしか画像を入れられません。スプライトも、 msx のように重ね合わせて色を増やすことができるのですがそもそも登録できるスプライト枚数があまりに少ないことと色の指定可能数が実質 12 色とぞっとするほど少ないことです。   これについてはバンク切り替えやカラーパレットの書き換えでトリッキーに増やすことができますが、素直にプログラムしたらザコいゲームしか作れません。それでも、ファミコン実機で動くところを見ると感動もひとしおで...

[68kMacintoshで]ThinkCでゲームを作りたい その2 Stdioライブラリを使ってみる[プログラミング]

イメージ
前回、ResEditを攻略したことにより無事画像の表示に成功しました。 しかし、好きな位置に指定して表示する方法など動的配置については未だ不明な部分が多いのと、そもそもC言語自体ろくに理解していないところがあるので今回こちらの教科書を買ってきました。 もうCは主流じゃないんだろうな・・・ ほんとは「苦しんで覚えるC」と「C言語の絵本」というのを併用してやりたかったんですが、BookOffのセールで200円以下だったので買っちゃいました。問題は今回使うプログラミングソフトはこの本が書かれたはるか前のものであること。ここに書いてあるコードが動かない、なんてことが起こりえるかもしれません。 ・・・ぶっちゃけると、ANSI特有の部分だけ修正すれば余裕で動きました。 というわけでこの教科書片手にMacintoshPlusでC言語入門をしていこうと思います。 ■|stdioを使えるようにする C言語の入門では兎にも角にもこの<Stdio>という、コンピューターの出入力を管理するライブラリを使用していきます。そのライブラリがないとそもそもできないわけなのですがその結果がこちら。 発見、Stdio。なんか他にも結構あります。 ありましたね〜ばっちり。ただし、この単体では動かないみたいです。今回使用しているThinkCは実は今主流(らしい)ANSIⅡという規格のC言語ではありません。なのでANSIライブラリではなくこの MacTraps を読み込むのを忘れないようにします。 そして前回叶わなかった定番の”Hello World”コードを打ち込みます。 文字のフォントなども指定できてけっこうエディタ自体をカスタムできるんですよ。 そしてこの作成したコードファイル、Stdioライブラリを読み込みます。ここで前回ならResEditを使って内容を表示するウインドウのリソース(データファイル)を作らないといけませんでしたが、なんとこのStdioライブラリを利用するとそういったあれこれが一切いらなくなりました。 なんだよできるのかよ そしてコンパイルを無事に通過すると・・・ 左下にちっこく表示されました! ほーんまちっさい このようにHelloWorldが表示されました!!!あーなんて簡単...

[68kMacintoshで]ThinkCでゲームを作りたい その1 ~まずは動かす~[プログラミング]

イメージ
以前、ふるいMacintoshソフトがないなら自分で作るという記事を書きました。 んでもって、英語の本を片手にBASICで作ろうとしました。 あれから、ぜーんぜん更新していないんですが、理由は簡単 ただでさえわからないことだらけなのに指導書が英語は自殺行為。 まあ、要するに解読不能になって詰んでました。ちなみに、この本の日本語版は見つかって(ない)です。奥多摩の図書館行けばあるのかな? そんなことが原因で心が砕けた私にもう一度Macintoshでゲームを作らせようと思い至らせる作品が最近出ました。それがこちら。 Return of the Obra Dinn リンク切れてたらごめんなさい。とにもかくにもこのゲーム、なんとこのMacintoshPlus時代のゲームをイメージして作られたらしいのです。デザインとか世界観とか最高だし、こういうゲームを実際にうちのMacで作れたら最高では?と思いまして。あと、この時代用のMac向け3D探索ゲームって作られてないんですよ。特にmc68000で動くものがない。(かの有名なアローンインザダークもse30以降でないと動かない。) なので作る理由と目標ができたので今回再チャレンジしようと至ったわけです。 ■|説明は日本語でお願いします それでもう一つプログラムソフトあったんですね。ThinkCっていう高級言語使ってプログラミングできるってもの。セットが割と大変で、おまけにこれも英語のテキストとはいかない。BASICの何倍も難しいですから・・・専用変数多すぎ問題。 そんなこんなで困っていた時にふとAmazonでThinkCってけんさくしたらこちらの本がありまして。 ぶあつーい本にびっしり書いてあります。でもこれでも入門書なのだ! 今でも売ってました。日本語版ThinkCの教科書。インストール方法から載ってるめちゃめちゃイけてる本。ほしかったのはこれだよ!!速攻ぽちりました。普段購入まで1週間ぐらい考えるのに初めて即購入ボタン使いました。ダメ人間の鏡ですねはい。 というわけでこれからこの本を使ってThinkCでゲームを作れないか試してみようと思いたったわけでございます。 だって日本語だよ?きっとはかどるに違いない。これで私も真の68kMacintoshユーザーになれる・・・...

こどもパソコンIchigoJamに挑んでみた(組み立て編)

イメージ
工作レベルは子供向けじゃない。 というわけで今回のテーマは巷でじわじわ話題のIchigoJamです。プログラム領域がなんと4kbというファミリーベーシックと同じ容量しかないということで飛びつきました。視点がおかしいとかそこは気にしない。 あと、バージョンアップしたことによりPCG領域が解放されたそうで、これでエッt・・・ゲフンゲフン豊かな表現のゲームが作れるということで今回挑んでみることにしました。 ■|仕様変更多すぎて何が何だかわからない。 これがメインボード・・・ってあれ?何かがおかしいぞ? はい。気がついた方もいらっしゃると思います。そう、メインのCPUが異様に小さいんです。というのも初代のあのごついCPUだとメインメモリが小さく、4kbになった最新版ではこのサイズになるんだとか。納得できない。ビジュアルと容量が一致しないなんて・・・(たかが3KB、されど3KB。) また、さらに重要な点で大幅な変更が加えられていました。 ここには外部出力・入力端子が一通り入っているのだが・・・ お気づきになられましたでしょうか。一度触ったことがある、店頭で見たという方ならあるものがないことに気がつかれたと思います。ではヒントというかほぼ答えを次の写真にポイ。 これなーんだ めっちゃボケてて何が何だか分かりづらいのでもう一枚。 部品入れから引っ張り出してきましたが・・・ そう、PS/2コネクターです。 IchigoJam やその他性能の低いマイクロプロセッサーでは、USBの仕様は実は非常にきついそうで、シンプルな機能を求める装置や個人の自作装置などでは今でもこのPS/2コネクターがよく用いられます。今回もそうなのですが、なんとその差し込み口が USB になっているのです。 頭おかしいんじゃねえのか なので今回わざわざ用意したPS/2キーボードを直接挿すことはできません。どうするのかって?別途USB-PS/2変換コネクタ(しかもPS/2からさせるタイプ)を購入する必要があります。前はこんな必要なかったのですが、何をどう考えてこんな仕様変更したんですかね・・・ちなみに USBキーボードはさせても使えません。 きちんとPS/2出力にも対応しているものを使えば使えるようです。しかしその説...

[MSX1で]Panasonic CF2000[ゲームを作ろう]

イメージ
MSX。レトロパソコンになじみのある方、多少マニアックなレトロゲーマーの方なら聞いたことがあると思います。ファミコンより少し前ごろから登場し、シリーズ展開した結構出回ったはずなのに中古ショップとかあまり見かけないというマシンです。 そこで今回はこのマシンでプログラミングをしてみようというのが今回の企画。しかも使用するのは上位機種のMSX2やturboではなく、初代MSX1です。 ■今回使用するメカたち 今回使用するのはいわゆる1chipMSXではなく、MSX1実機を用います。これはできるだけ当時の環境で制作してみたかったのとそもそもMSXを思う存分触りたかったというのがあります。 というわけで使う機種はこちら。 状態もいいし箱付きなのに、この安さなのはMSX1ゆえなのか・・・ CF-2000 この機種、割とマイナーなようでかなりネットでも情報の少ない機種になっているようです。ちなみにヤフオクで1000円で落札しましたが、何分ジャンクなので修理から始めます。キーの反応が妙に悪い部分があるのと、もうコンデンサが寿命ですから全とっかえからですね。ひぃい。 ちょっとボロい。 データレコーダー「QR-8030」 まあ驚くほど情報のないデータレコーダことQR-8030。取扱説明書なんて上がっているはずもなく、手探りでなんとか使っていきますがその前にこの子も修理から始めます。先人の方が見事な修理の記事を公開してくださっていますのでそれを参考にしようと思います。 ■まず初めに修理から プログラミングでゲームを作ろうって話なのになんで修理から始まるのかはさておきましてまず保存ができるようにデータレコーダの修理から。こちらのサイトを参考にしまして、中のゴムを交換。プーリーから回転軸へ力を伝達するゴムはドロドロに溶けてました。モーターからプーリーへ伝達するほうは少し伸びてるかな程度でしたが、買ってきておいたので交換します。そしてスイッチを入れますが・・・・ ゴムを交換。とにかく回るかチェック。 まともに動きません。めっちゃゆっくりねっとり回転します。電圧を図ってみましたがモーターには6Vとあるのに対し供給電圧は8V。電圧は十分すぎるほどです。しかし以前私はarduinoにモーターを直結するというあほをやらかしまして、電圧が足りてよ...

ファミコンの完全自作ROM&カセット作ろう!〜cc65で起動ROMをつくる〜

先日、ファミコンに直差しできるROMカセットを作るというお話をしました。しかし、いくらハードウェアができたとしてもプログラムがないと動かないただの鉄の塊です。 ■cc65は、僕らに新規の6502コンピューターを作らせてくれない  そこでプログラムを作って書き込もうとしましたが、問題はcc65でROMに書き込める普通のプログラムデータを作成することが非常に困難であるという点でした。  つまりどういうことかというと、cc65というコンパイラソフトは「新規の」6502ハードウェア開発向けには作られておらず、コモドール64やファミコンのエミュレーター向けの開発を考えられているのです。それがわかる仕様として、アセンブラで書いたプログラムをcc65で書き出す際に、どのハードウェア向けに書き出すかという旨を指定する必要があるのです。  もし指定しなければ自動的にコモドール64向けに書き出されます。そして、プログラムの内容がそれに沿っていなければエラーとして判断され、かきだされることもありません。 ■使いやすさの視点の違いから生まれた仕様  もうひとつ、cc65が抱える問題として ORG命令 が本来の動きとして働かないという点です。   ORG命令 とは、そのプログラムがメモリのどの位置から開始されるのかをしていする重要な命令です。これによってジャンプ命令やラベルがまともに使用できるし、6502においてはリセット割り込み(ゲームを開始する際に読み込まれるメモリ)の情報を書き込むメモリの位置を指定しなくてはいけないので、非常に重要な命令なのですがなんとcc65ではほぼ封印されています。ジャンプ先としては読み込まれきちんとコンパイルされますが プログラムをコンパイルした際に指定した場所にプログラムが書き込まれていないのです。非常にバカバカしくなります。 ではcc65にはORG命令の代わりに何が使われているのかというとSEGMENT命令が利用されています。プログラムをSEGMENTで切り分け、その段階ではまだどこからそのプログラムを配置するのかを指定しません。指定はコンフィグファイルという別のファイルにて指定します。つまり、 アセンブラファイルだけではプログラムを作成することができない のです。また、コンパイルした際にこのコン...

ファミコンの完全自作ROM&カセットを作ろう!!その1~立ちはだかるコンパイラの壁~

イメージ
ファミコンのソフトを自作する。まさにファミコン少年なら一度は考えたことのある 暴挙 夢の企画なのですが、古今東西にて公開されている方法といえばそれはもう 「既存のカセットのロム改造」 なわけです。 違うんです。確かにROM焼いて書き込めばできるでしょう。しかしその前に覚えなきゃいけないことがあまりにもガラパゴスすぎます。Mapper1とかいうファミコンのカセットの規格(しかもナムコは例外&プラスチック封印されてたらできない)。おまけに容量が大ききくて改造がしやすいものとなると結構貴重なカセットをぶっ壊すスタイルになります。正直コレクター癖のある私としては「 外道 」に他なりません。やりましたけど。ドラクエ2のカセット犠牲にしました。失敗しましたよチクショーメ!!! なので今回はそんなカセットの端子から基板までALL手作りをしてしまおうというのが規格内容なのです。これならもうカセットを壊す必要はありません。貴重で高いカセットが守られるし場合によっては新しい規格のカセットを作ることもできます。 ⬛︎とりあえずプログラムROMオンリー基板を作ってみる ファミコンのカセットは独特な仕様になっておりまして画像用のROMは別の回路でつながっており、基本的にCPUのROMとは共用しておりません。なので、極端な話普通のパソコンと同じ回路設計であるのならばCPU側のROMだけを組み立ててつないでも問題ないわけです。そしてその回路の一つの部分とか拡張ポートに向かって何らかの信号を送るプログラムを組めば、わざわざキャラクターROMの作成をしなくてもいいわけです。 そこで今回はとりあえずカセットの端子とROMをつなぐ回路を作成しました。 千石電商の地下で入手。前から気になってたけどついに使うときが・・・ 今回使用したこの端子は2.52ピッチのもので、本来のファミコンのカセットよりもピン数が多いです。なので 鉄定規登場。 カッターでごり押しします。ないものは作る。 両側から切り続けて10分後・・・ 無事に切れました。もうなんか紙フェノールの基板とは比べ物にならないくらい堅かったです。なにこれ。 L字型のものを用意すると基板が後でつけやすいです。 それでもってそこに同じピンピッチの二列ピンヘッダーをつなぎます。...