テクハンwiki

Appendix A.3 ビットマップトランスファ

 ビットブロック・トランスファは 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 フラグをリセット
レジスタすべて