2017-01-08 4 views
2

画面の場所から別の場所にピクセルの束をコピーしようとしています。これをイメージすると、座標(100,120)上に8x8の緑色の四角形があり、その四角形を座標(150,60)にコピーしたいと思います。ピクセルを(x0、y0)から(x1、y1)にコピーする

私はグラフィックモード13hを使用しています。それは320x200を意味するので、私の広場は38500番地(y * 320 + xを使用)で始まります。

DSは0A0000hを指します。

この広場を他のコーナー(19350)にコピーするにはどうすればよいですか?

私はこのような何かを試してみました:私は間違って

MOV SI,38500 
    MOV DI,19350 
INIT: 
    MOV CX,4   ; loop 4 times 
COPY_BOX: 
    MOV AX,DS:[SI] ; copy two pixels 
    MOV DS:[DI],AX 
    ADD SI,2   ; move to the next two pixels 
    ADD DI,2 
    LOOP COPY_BOX 
    ADD SI,312  ; drop one line and position on the first pixel 
    ADD DI,312 
    JMP INIT   ; copy next row of pixels 

; do this for the 8 rows 

何をしているのですか?

+1

何あなたのコードのISNの一部働いている?どこが間違っていますか?あなたはデバッガでそれをステップアップしようとしましたか? –

+0

@CodyGrayこれは動作しません.Dosboxはフリーズします。私はDosboxでコードを実行していますが、Turboデバッガを使用しようとしましたが、グラフィックスモードでは動作しません:\他の方法でデバッグすることはできますか? – razoes

答えて

2
JMP INIT   ; copy next row of pixels 

プログラムが無限ループに入る場所です。
コード高さ = 8回だけ繰り返す必要があります。
私はCHCLにこれらの小さなカウンターを置くことによってそれを解決:

MOV SI,100+120*320 ;(100,120) 
    MOV DI,150+60*320 ;(150,60) 
    MOV CH,8   ; loop 8 times vertically 
INIT: 
    MOV CL,4   ; loop 4 times horizontally 
COPY_BOX: 
    MOV AX,DS:[SI]  ; copy two pixels 
    MOV DS:[DI],AX 
    ADD SI,2   ; move to the next two pixels 
    ADD DI,2 
    DEC CL 
    JNZ COPY_BOX 
    ADD SI,320-8  ; drop one line and position on the first pixel 
    ADD DI,320-8 
    DEC CH 
    JNZ INIT 

を使用すると、文字列プリミティブを使用するために喜んでいる場合、それは次のようになります。

CLD 
    PUSH DS    ; 0A000h 
    POP ES 
    MOV SI,100+120*320 ;(100,120) 
    MOV DI,150+60*320 ;(150,60) 
    MOV AX,8   ; loop 8 times vertically 
INIT: 
    MOV CX,4   ; 4 x 2 pixels 
    REP MOVSW   ; copy 1 line of pixels 
    ADD SI,320-8  ; drop one line and position on the first pixel 
    ADD DI,320-8 
    DEC AX 
    JNZ INIT 
関連する問題