この記事は、IchigoJam Advent Calendar 2020 の 5 日目です。
まだ、Qiita に記事を投稿するのに慣れてないので、いろいろ至らない点があるかと思いますがご容赦ください。
はじめに
かつてのベーマガに掲載されていたプログラムって、大抵は PCG やマシン語などのデータをプログラムの後半にまとめて DATA 文で記述してたじゃないですか。確か、Dr.D がそれを勧めていたような気がするんですけど、実際どうでしたっけ?
プログラムの後半にデータをまとめるべきかの是非はともかく、DATA 文が使えない IchigoJam でも同じような感じでデータをまとめて記述して、FOR 文で順次読み込むことができたらなぁ…って思う事ありませんか?
実現例
早速ですが、こんな感じで実現してみました。
1 '### "KNIGHT" DATA ###
2 Z=#C03:Y=#700:U=0
3 X=0:IF PEEK(Z)!=39 GOTO 9
4 X=X-1:W=PEEK(Z-X)
5 W=W-41-W/32*6:IF W<0 GOTO 8
6 V=V<<6+W:POKE Y,V>>(X*2&7)
7 Y=Y+(X&3<3):U=U^W:GOTO 4
8 IF U LIST PEEK(Z-3):END
9 Z=Z+PEEK(Z-1)+4:W=PEEK(Z-3)
10 IF W GOTO 3 ELSE LRUN 1
11 '//AA3lQj:mw/k227uDHox1wbB
12 '3l/A/k//xCH7122///2zzw2/T
13 'kA///////kA2/zzzzzzAoxTjq
14 ':mzotAg:AwDzzkQ20kwT0zgxB
15 'EA2Uw8XAzjtx2Vc30kUT/:vQR
16 'sC2U3DU//UA62lYnTrzUkC2k9
17 'yC2Tj6ov0kQ610w/jb0M7C/EN
18 'y/0EcpNsCXW2/U//3/EU13//B
19 '///iuevc///I40kQ60k71003d
20 'C9csF0//51EMNdZa////35ksl
21 'T2Vg32nbNhhOEWG0/Es9DaVMG
22 'A7//T6lwT6k//0/ET4FwC2Us9
23 'uWvxTrnse1//TbtyTbty/9eeT
24 'JJKeeZJJ56tyzzxyTVVzzzzzK
25 'zzzzzkD
これは、電子工作マガジン 2020 年夏号付属のマイコン BASIC マガジンに掲載された私の作品 "KNIGHT" のプログラムの一部です。
PCG 16 キャラ分のパターンとパズル 15 面分のデータ、合わせて 256 バイトのデータを、アドレス #700 以降に展開し、プログラムスロット 1 に保存されているゲーム本編のプログラムを LRUN 1
により実行しています。
解説
技術的には以下の記事で紹介されている仕組みを応用したものです。
IchigoJam で円周率をファインマン・ポイントまで計算表示したい
こちらの記事では、カタカナも使用して 1 文字で 7 ビットの情報を表現しているのですが、ベーマガのような紙媒体に載っているリストを写経してもらうことを想定すると、なかなか厳しいものがあると思うので、使用する文字を数字、アルファベット大文字小文字、記号 2 種類に限定し、1 文字で 6 ビットの情報を表現するように改変しています。
また、VIDEO 1 モードでリストを出力させた際に行の折り返しが起きないように、適宜改行を入れています。これはまぁ、自分のちょっとしたこだわりというか、かつてのベーマガのお作法というか、そんなところです。
メモリが少ない IchigoJam においては、(理論上の)行数が多くなると、その分メモリ的に不利なので、あまり褒められたものではありませんが…
追加要素として、簡単な誤り検出機能を入れています。誤りを検出した場合は、その行のリストを表示してプログラムが停止します。PCG データはともかくとして、もしこれがマシン語のデータであるならば、入力が間違っていた場合は暴走する恐れがあるので、写経してもらう想定ならば重要な機能だと考えます。
データ変換ツール
ということで、Web ブラウザで動作するデータ変換ツールを作りました。
「ファイルを選択」で画像ファイルを選択すると、画像の左上から 8×8 ピクセル単位で右方向に白黒二値化した PCG パターンとして抽出・変換し、上記の実現例のような形式のソースコードを出力します。
おまけ機能として、画像以外のファイルを選択した場合は、バイナリデータとしてファイルの内容をそのまま読み込んで変換します。
いずれの場合も、データが 460 バイトを超えた場合は無条件に切り捨ててしまうのでご注意ください。