Display【NandGame編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
Displayレベル
Displayレベルのゴールは、ディスプレイに好きなロゴを表示することです。
ロゴは何でもよいですが、幅・高さともに16ピクセル以上でなければなりません。

ディスプレイの仕様は次の通りです。
- 512×256ピクセル
- モノクロ
ディスプレイはアドレス0x4000から0x6000にメモリーマップされています。
モノクロなので1ピクセルに白黒のどちらかしか表現できません。つまり、1ピクセルは1ビットで表現できます。
幅は512ピクセルなので、1行に16ビット値が32個並んでいることになります。言い換えれば、1行にメモリーマップされたアドレスが32個(=0x20)並んでいます。
ディスプレイの1行目の先頭は0x4000であり、2行目の先頭は0x4020(=0x4000+0x0020=0x4000+32d=0x4000+32個)になります。
そして、高さは256ピクセルなので256行存在します。1行に32個のアドレスがあり、それが256行分あるということなので、ディスプレイ全体には0x2000(=8,192d=32個×256行)個のアドレスがあります。最初のアドレス(ディスプレイの左上隅に対応)は0x4000で、アドレスが0x2000個あるということなので、最後のアドレス(ディスプレイの右下隅に対応)は0x6000になります。

Displayレベルを解く
1:解答アプローチを検討する
レベルクリアのために描画するロゴの候補としては、次が挙げられます。
- 候補①:16×16ピクセルの正方形
- 候補②:適当な大きさの長方形
- 候補③:画面全体

候補①16×16ピクセルの正方形がもっともシンプルなので簡単そうに見えますが、ぴったり条件を一致させるには16ビット値の両端が1になることを意識しなければなりません。
適当なビット列(歯抜けでもよい。ただし全桁が0になる0x0000のデータは除く)でロゴを作るのであれば、候補②が簡単です。左上、右上、左下に対応するアドレスに同一ビット列を設定すればよいのです。
候補③は0xFFFFのデータを全アドレスに入力するという戦法です。考え方としてはシンプルですが、ループ処理が必要です。範囲外のアドレスを意識しなければ無限ループでもよいですが、余計なアドレスに書き込まないようにするにはカウンターを用意して、0x2000回(=8,192回=32個×256行)のループ処理になります。
今回は候補②を採用します。なぜなら、Aレジスターに1xxx xxxx xxxx xxxxb(xは0 or 1)のようなデータをセットできなかったからです。
2:プログラムを実装する
アセンブリー言語のプログラムは次のようになりました。
# Assembler code
# 左上の描画.描画用ビット列は任意.
A = 0x7fff
D = A
A = 0x4000
*A = D
# 右上の描画.
A = A + 1
*A = D
# 左下の描画.
A = 0x4200
*A = D
3:テストする
computerの[Run]ボタンを押すと、右上のディスプレイに3本線が表示されます。これはドットが連続して線に見えているのです。

4:成否を確認する
32ビット(厳密には31ビット)×16ビットのロゴに相当するので、レベルクリアになります。
