【X68000(Z)アセンブラ講座 第032回 テキストラスタコピー】   こんにちは!! 今回は中級編で紹介し忘れていたテキストラスタコピー機能の使い方です。 それではテキストラスタコピーについて解説します。 テキストラスタコピーとはテキスト画面の指定の複数行を 他の行にDMAを使わずに高速にコピーできる便利機能です。 テキストラスタコピーでは1024x4pxの映像が256行で構成されていて それぞれの行には上から順に0〜255のラスタ番号が割り当てられていて 転送先や転送元の指定にはこのラスタ番号を使います。 破線の内側を'RAS_TXCP.s'と言うファイル名で保存して下さい。 ------------------------------------------------------------------------------------------------ ******************************************************************************** * * アプリ名 : RAS_TXCP.x * * テキスト画面のラスタコピー機能による複数行高速コピー * * Ver1.00 * ******************************************************************************** .cpu 68000 include A:\XC\INCLUDE\DOSCALL.MAC include A:\XC\INCLUDE\IOCSCALL.MAC cg_palette equ $E82000 * CG用パレットデータの先頭アドレス cg_buffer equ $C00000 * CG-VRAMの先頭アドレス cg_scroll_x equ $E80018 * CGスクロール X cg_scroll_y equ $E8001a * CGスクロール Y sp_palette equ $E82200 * スプライト用パレットデータの先頭アドレス sp_pattern equ $EB8000 * スプライトパターンデータの先頭アドレス sp_controll equ $EB0000 * スプライトスクロールレジスターの先頭アドレス vsync equ $E88001 * %00010000でV-Syncチェックする pad1 equ $E9A001 * ゲームパッド1 pad2 equ $E9A003 * ゲームパッド2 gpip equ $E88001 crtc_r21 equ $E8002A * CRTC R21 crtc_r22 equ $E8002C * CRTC R22 crtc_mode equ $E80480 .data .even msg01: dc.b '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',13,10,0 msg02: dc.b '[SPACE]キーを押して下さい。',0 msg03: dc.b 13,10,'[ESC]キーで終了します。',0 .even .bss r21dat: dc.w 0 r22dat: dc.w 0 .text start: * ユーザーモードからスーパーバイザーモードに切り替え moveq.l #_B_SUPER,d0 movea.l #0,a1 trap #15 * 画面モードの設定 moveq.l #_CRTMOD,d0 * 画面モードの設定 move.w #16,d1 * 画面モードの番号 : 16 = 768x512x4bit / 12 = 512x512x16bit trap #15 pea msg01 * コピー元文字列 dc.w _PRINT addq.l #4,sp pea msg02 dc.w _PRINT addq.l #4,sp move.w crtc_r21,r21dat * システム設定のバックアップ move.w crtc_r22,r22dat * システム設定のバックアップ * SPACEキーが押されたら次に進む key_space: moveq.l #_BITSNS,d0 moveq.l #6,d1 trap #15 and.b #%00100000,d0 tst.b d0 beq key_space bsr text_copy * テキストラスタコピー pea msg03 dc.w _PRINT addq.l #4,sp * ESCキーが押されたらアプリを終了する key_esc: moveq.l #_BITSNS,d0 moveq.l #0,d1 trap #15 and.b #%00000010,d0 tst.b d0 beq key_esc * ラスタコピー終了処理 bsr stop_raster_copy move.w r21dat,crtc_r21 move.w r22dat,crtc_r22 moveq.l #_CRTMOD,d0 * 画面モードの設定 move.w #16,d1 * 画面モードの番号 : 16 = 768x512x4bit / 12 = 512x512x16bit trap #15 * プログラム終了 dc.w _EXIT * テキストラスタコピーメイン * テキスト画面先頭の文字列1行を4行目からの空いている行にコピーする text_copy: moveq.l #29-1,d7 moveq.l #12,d6 text_copy_1: moveq.l #0,d0 move.w d6,d1 bsr raster_copy addq.w #1,d6 moveq.l #1,d0 move.w d6,d1 bsr raster_copy addq.w #1,d6 moveq.l #2,d0 move.w d6,d1 bsr raster_copy addq.w #1,d6 moveq.l #3,d0 move.w d6,d1 bsr raster_copy addq.w #1,d6 dblt d7,text_copy_1 rts raster_copy: * d0.l = コピー元テキストラスタ番号 * d1.l = コピー先テキストラスタ番号 movem.l d0-d1,-(sp) and.l #$000000ff,d0 and.l #$000000ff,d1 bsr stop_raster_copy move.w #%0011,crtc_r21 * ラスターコピー対象プレーンの設定 move.b d0,crtc_r22 move.b d1,crtc_r22+1 bsr start_raster_copy movem.l (sp)+,d0-d1 rts * ラスタコピー開始 start_raster_copy: or.w #$0008,crtc_mode rts * ラスタコピー終了 stop_raster_copy: and.w #$0007,crtc_mode rts * [EOF] ------------------------------------------------------------------------------------------------ ファイルの保存が終わったらコマンドプロンプトから、 A>AS RAS_TXCP.s [Enter] A>LK RAS_TXCP.o [Enter} A>RAS_TXCP.x [Enter] 以上(↑)のように入力するとプログラムが起動します。 サンプルプログラム中のmsg01のテスト文字列を 好きな言葉や文章に書き換えると萌えるかもです(^^) 4の倍数ピクセル単位ではありますが RPGゲームのメッセージのスクロール等に使えると思います。 自分でテキストエディターを作りたい方の役にも立つと思います。 今回は以上です(^^) お疲れ様でした!! [EOF]