ビットブロック・トランスファは BASIC の COPY 命令に相当し、RAM、VRAM、ディスク間でデータを転送するものです。これは拡張 ROM 内のルーチンによって実行され、マシン語からも簡単に使うことができます。拡張 ROM 内にあるため、このルーチンを利用する場合には、BIOS の SUBROM あるいは EXTROM を使ってください。
1. VRAM 間の転送
●BLTVV (0191H/SUB) | ||
機 能 | VRAM 領域で転送を行う | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・SX (F562H,2) | ; ソースの X 座標 | |
・SY (F564H,2) | ; ソースの Y 座標 | |
・DX (F566H,2) | ; デスティネーションの X 座標 | |
・DY (F568H,2) | ; デスティネーションの Y 座標 | |
・NX (F56AH,2) | ; X 方向のドット数 | |
・NY (F56CH,2) | ; Y 方向のドット数 | |
・CDUMMY (F56EH,1) | ; ダミー (セットする必要はない) | |
・ARG (F56FH,1) | ; 方向と拡張 RAM の選択 (VDP の R#45 と同じ) | |
・LOGOP (F570H,1) | ; ロジカルオペレーション・コード (VDP のロジカルオペレーション・コードと同じ) | |
出 力 | CY フラグをリセット | |
レジスタ | すべて |
2. RAM と VRAM 間のデータ転送
以下のルーチンを使う場合、グラフィックスのデータ領域として、スクリーンモードによって次のような大きさの領域を確保しておく必要があります
- スクリーンモード 6
X 方向のドット数 * Y 方向のドット数 / 4 + 4
- スクリーンモード 5 または 7
X 方向のドット数 * Y 方向のドット数 / 2 + 4
- スクリーンモード 8
X 方向のドット数 * Y 方向のドット数 + 4
ただし、割り算の端数を切り上げてください。なお、ディスクや RAM では配列データと同様にサイズを示すデータが付加されます。このデータは先頭から 2 バイトが X 方向のドット数、次の 2 バイトが Y 方向のドット数を示しています。
●BLTVM (0195H/SUB) | ||
機 能 | 配列を VRAM に転送する | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・DPTR (F562H,2) | ; メモリのソース・アドレス | |
・DUMMY (F564H,2) | ; ダミー (セットする必要はない) | |
・DX (F566H,2) | ; デスティネーションの X 座標 | |
・DY (F568H,2) | ; デスティネーションの Y 座標 | |
・NX (F56AH,2) | ; X 方向のドット数 (セットする必要はない。これは転送するデータの先頭にすでに持っている) | |
・NY (F56CH,2) | ; Y 方向のドット数(セットする必要はない。これは転送するデータの先頭にすでに持っている) | |
・CDUMMY (F56EH,1) | ; ダミー (セットする必要はない) | |
・ARG (F56FH,1) | ; 方向と拡張 RAM の選択 (VDP の R#45 と同じ) | |
・LOGOP (F570H,1) | ; ロジカルオペレーション・コード (VDP のロジカルオペレーション・コードと同じ) | |
出 力 | 転送するデータの個数がおかしければ CY フラグをセット | |
レジスタ | すべて |
●BLTMV (0199H/SUB) | ||
機 能 | VRAM から配列に転送する | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・SX (F562H,2) | ; ソースの X 座標 | |
・SY (F564H,2) | ; ソースの Y 座標 | |
・DPTR (F566H,2) | ; メモリのデスティネーション・アドレス | |
・DUMMY (F568H,2) | ; ダミー (セットする必要はない) | |
・NX (F56AH,2) | ; X 方向のドット数 | |
・NY (F56CH,2) | ; Y 方向のドット数 | |
・CDUMMY (F56EH,1) | ; ダミー (セットする必要はない) | |
・ARG (F56FH,1) | ; 方向と拡張 RAM の選択 (VDP の R#45 と同じ) | |
出 力 | CY フラグをリセット | |
レジスタ | すべて |
3. ディスクと RAM、VRAM 間の転送
ディスクを使う場合、まずファイル名を設定する必要があります (ファイル名は BASIC と同様に指定)。例を次に示します。
: LD HL,FNAME ; Get pointer to file name LD (FNPTR), HL ; Set it to parameter area : FNAME: DB 22H, 'B:TEST,PIC',22H,0 ; "TEST.PIC", end mark
ここで、何かエラーが起きれば、BASIC インタープリタのエラーハンドラへジャンプします。そのため、自分のプログラム内でエラーをハンドリングしたい場合や MSX-DOS、ROM カートリッジでこのルーチンを呼ぶ場合、フックをセットする必要があります。このフックは H.ERROR (FFB1H) です。
●BLTVD (019DH/SUB) | ||
機 能 | ディスクから VRAM へ転送する | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・FNPTR (F562H,2) | ; ファイル名のあるアドレス | |
・DUMMY (F564H,2) | ; ダミー (セットする必要はない) | |
・DX (F566H,2) | ; デスティネーションの X 座標 | |
・DY (F568H,2) | ; デスティネーションの Y 座標 | |
・NX (F56AH,2) | ; X 方向のドット数 (セットする必要はない。これは転送するデータの先頭にすでに持っている) | |
・NY (F56CH,2) | ; Y 方向のドット数(セットする必要はない。これは転送するデータの先頭にすでに持っている) | |
・CDUMMY (F56EH,1) | ; ダミー (セットする必要はない) | |
・ARG (F56FH,1) | ; 方向と拡張 RAM の選択 (VDP の R#45 と同じ) | |
・LOGOP (F570H,1) | ; ロジカルオペレーション・コード (VDP のロジカルオペレーション・コードと同じ) | |
出 力 | パラメータにエラーがあれば CY フラグをセット | |
レジスタ | すべて |
●BLTDV (01A1H/SUB) | ||
機 能 | VRAM からディスクへ転送する | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・SX (F562H,2) | ; ソースの X 座標 | |
・SY (F564H,2) | ; ソースの Y 座標 | |
・FNPTR (F566H,2) | ; ファイル名のあるアドレス | |
・DUMMY (F568H,2) | ; ダミー (セットする必要はない) | |
・NX (F56AH,2) | ; X 方向のドット数 | |
・NY (F56CH,2) | ; Y 方向のドット数 | |
・CDUMMY (F56EH,1) | ; ダミー (セットする必要はない) | |
・ARG (F56FH,1) | ; 方向と拡張 RAM の選択 (VDP の R#45 と同じ) | |
出 力 | CY フラグをリセット | |
レジスタ | すべて |
●BLTMD (01A5H/SUB) | ||
機 能 | ディスクから配列データをロードする | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・FNPTR (F562H,2) | ; ファイル名のあるアドレス | |
・SY (F564H,2) | ; ダミー (セットする必要はない) | |
・SPTR (F566H,2) | ; ロードする先頭アドレス | |
・EPTR (F568H,2) | ; ロードする最終アドレス | |
出 力 | CY フラグをリセット | |
レジスタ | すべて |
●BLTDM (01A9H/SUB) | ||
機 能 | ディスクへ配列データをセーブする | |
入 力 | HL レジスタ ← F562H | |
さらに以下のパラメータを設定する | ||
・SPTR (F562H,2) | ; セーブする先頭アドレス | |
・EPTR (F564H,2) | ; セーブする最終アドレス | |
・FNPTR (F566H,2) | ; ファイル名のあるアドレス | |
出 力 | CY フラグをリセット | |
レジスタ | すべて |