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 のアドレスとその位置に💛を書き込みます。
正しく動作していることが確認できました。
次回は、マシン語の領域にセットしたデータを指定した座標に表示するプログラムを作成します。