まず、vgs8リポジトリでは当初、VGS8エミュレータのコアプログラムしか無い状態だったので、テストするにはHALを作成する必要があります。そこで、リポジトリ内にmacOS用アプリ(CocoaApp)としてHALを実装。
https://github.com/suzukiplan/vgs8/tree/master/hal/mac
そして、6502でHello, World!を出力するプログラムを作成。
https://github.com/suzukiplan/vgs8/tree/master/examples/hello
ソースコード本体は20行ちょっと(こんな感じです)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.setcpu "6502" | |
.autoimport on | |
.segment "STARTUP" | |
; init CMAP register | |
lda #%00000000 | |
sta $5404 | |
; draw "Hello, VGS8 World!" on the BG nametable | |
ldx #$00 | |
draw_loop: | |
lda string_hello_world, x | |
sta $63C7, x ; write on (7 + x, 15) = ($007 + x, $3C0 = 15 * 64) | |
inx | |
cpx #18 ; text length | |
bne draw_loop | |
mainloop: | |
lda $5BFF ; Wait for VSYNC | |
jmp mainloop | |
string_hello_world: | |
.byte "Hello, VGS8 World!" |
すごくシンプルですね。
ファミコンでHello, World!を作る場合との違いとしては、
・iNESヘッダーとか要らない
・RESET割り込み不要(VGS8の場合、RESET割り込みはプログラム側で検知できない仕様)
・必要な初期化処理はCMAPレジスタの設定ぐらいなので楽(実のところ、このコードであればCMAPレジスタの設定自体が不要だったりする)
・nametableのアドレス計算が異なる
ぐらいなので、ファミコンのプログラムが書ける人なら、「あぁ、なるほど」と簡単に理解できるかと思います。
上記を作成したCocoaAppで動かしてみた結果が下図です。
VGS8でHello, World!が動きました。
良かった良かった。
こうやって書いてみると非常にアッサリと動いたように勘違いされてしまうとアレなので、念の為補足するとかなり大変でした。
absoluteのエンディアンを間違えていたり、branchの加算時の起点を間違えたり、Windows Bitmapのパレットの仕様を間違えていたり、あとはプログラムを作ればほぼ必然的に発生するケアレスミス群。
一番キツかったのが、自作MOS6502エミュレータのバグ取りですね。
最終的にXCODEのデバッガでexecuteにbreak pointを仕掛けて、1ステップづつ6502コードを実行してレジスタやRAMが想定通りに更新されるかチェックする形でデバッグしました。
コマンドラインで動くデバッガ作らないとなぁ...
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。