PC-8001でマシン語 : VRAMアドレス取得のテストコード

PC-8001でマシン語 : VRAMアドレス取得のテストコード

Z80 でのコーディング ウォーミングアップとして、指定したXY座標に対する VRAM アドレスを取得して表示して、そこに💛を表示してみることにしましょう。

先日確認した VRAMアドレスを取得する内部ルーチンコール (CALL 03F3H)です。

以下についてハンドアセンブル

                               ORG E800H
 E800    5E          START   LD  E,(HL)
 E801    23                  INC HL
 E802    56                  LD  D,(HL)
 E803    EB                  EX  DE,HL
 E804    24                  INC H
 E805    2C                  INC L
 E806    CD  F3  03          CALL 03F3H
 E809    22  10  E8          LD (E810),HL
 E80C    C9                  RET 

BASIC 側から USR(x) でマシン語のルーチンをコールすると、値x をどこかのアドレスにセットするのですが、どの番地かはHLレジスタに アドレスがセットされるので、そのアドレスにある値を DEレジスタに読み込みます。

そのあと、DE レジスタと HL レジスタの内容を交換することで、BASICから送った値が HLにセットされます。

HレジスタとLレジスタのそれぞれに +1 して、ルーチンコール。これで、HLにVRAMアドレスがセットされます。

何故 +1 かというと、BASICのLOCATE で指定する座標は、 左上が (0,0) ですが、呼び出す 内部ルーチンは 左上を (1,1) として計算する仕様になっているからです。

最後に HLの値を アドレス E810 と E811 に書き出して、RET で呼び出し元に戻ります。

次に正しくアドレスが取得できるか、テスト用のBASICプログラムを作成します。

10 CLEAR ,&HE800
20 DEFINT A-Z
30 DEF USR=&HE800
40 INPUT "X=";X
50 INPUT "Y=";Y
60 A=USR(X*256+Y)
70 P$=HEX$(PEEK(&HE811))+HEX$(PEEK(&HE810))
80 POKE VAL("&H"+P$),&HE9
90 PRINT P$

実行して、XとYに値を入力すると VRAM のアドレスとその位置に💛を書き込みます。

正しく動作していることが確認できました。

次回は、マシン語の領域にセットしたデータを指定した座標に表示するプログラムを作成します。

コメントを残す

CAPTCHA