NEXTOR 03 06 11

From Z80 Machines Wiki
Jump to: navigation, search

3.6.11 CALL USRコマンド

CALL USRコマンドを使用すると、BASICコードからアセンブラコードを実行できます。これは標準のMSX-BASIC DEF USRコマンドおよびUSR機能と同等ですが、追加機能があります。コードを実行するためのZ80レジスタの入力値を指定し、実行後に出力値を読み取ることができます。

CALL USRコマンドの構文は次のとおりです。

CALL USR(<コードアドレス> [、<レジスタアドレス>])

<code address>は実行するアセンブラコードのアドレスです。値-1は特別な場合として扱われます:_USR(-1)はなにもしませんがエラーを投げません。この機能をON ERROR GOTOコマンドと一緒に使用して、BASICプログラム内からNextorの存在を検出することができます。

<register address>は、Z80レジスタ値用の12バイトバッファのアドレスです。このパラメータを指定すると、コードが呼び出される前に、レジスタにこの領域の内容がロードされます。コード実行後、逆の処理が実行されます。バッファは、レジスタに保持されている値で更新されます。バッファ内のレジスタの順序は、F、A、C、B、E、D、L、H、IXl、IXh、IY1、IYhです。

これは、CALL USRコマンドをテストするための簡単なBASICプログラムです。 40〜90行目のレジスタの割り当てと100行目で呼び出されるコードのアドレスを適切に変更して、別のコードを呼び出します(MSX BIOS自体が適切なルーチンのソースです)。

10 ON ERROR GOTO 20: _USR(-1): ON ERROR GOTO 0: GOTO 30
20 PRINT "Nextor not found!": END
30 DEFINT R: DIM R(12)
40 R(0)=&H2100 ‘AF
50 R(1)=&H3040 ‘BC
60 R(2)=&H5060 ‘DE
70 R(3)=&H7080 ‘HL
80 R(4)=&H90A0 ‘IX
90 R(5)=&HB0C0 ‘IY
100 CALL USR(&H00A2, VARPTR(R(0))) ‘Prints a "!" (passed in A as &H21) 
110 PRINT "AF=&H";HEX$(R(0))
120 PRINT "BC=&H";HEX$(R(1))
130 PRINT "DE=&H";HEX$(R(2))
140 PRINT "HL=&H";HEX$(R(3))
150 PRINT "IX=&H";HEX$(R(4))
160 PRINT "IY=&H";HEX$(R(5))