当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Display【NandGame編】

はじめに

いつもブログをご覧いただきありがとうございます。

FIRE生活中のIPUSIRONです😀

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ビットのロゴに相当するので、レベルクリアになります。