4

DOSBoxを使用していることをテストするために、アセンブリ8086でスペースインベーダーを作成しています。私のコードをお見せしましょう:

;--------------------
;Update hero
;--------------------
update:
call vsync
call update_hero ; method to read keyboard
call set_video
call clear_screen
call draw_hero
jmp update

これで、プロシージャupdate_heroは次のようになります。

update_hero proc
     mov ah, 01h
     int 16h
     cmp al, 97
     je left_pressed
     cmp al, 100
     jne none_pressed
     inc hero_x
     left_pressed:
          dec hero_x
     none_pressed:
     ret
update_hero endp

ご覧のとおり、ムーブメントの「a」または「d」を読み込もうとしていますが、機能していません。理由を理解するのを手伝ってもらえますか?

私がやろうとしているのは、待たずにキーボードから読み取ることです。そのため、サブ機能を使用していah, 01hます。

乾杯。

編集

ここで割り込みをチェックし、コードを変更しましたが、動作しています。

update_hero proc
    mov ah, 01h ; checks if a key is pressed
    int 16h
    jz end_pressed ; zero = no pressed

    mov ah, 00h ; get the keystroke
    int 16h

    begin_pressed:
        cmp al, 65
        je left_pressed
        cmp al, 97
        je left_pressed
        cmp al, 68
        je right_pressed
        cmp al, 100
        je right_pressed
        cmp al, 81
        je quit_pressed
        cmp al, 113
        je quit_pressed
        jmp end_pressed
        left_pressed:
            sub hero_x, 2
            jmp end_pressed
        right_pressed:
            add hero_x, 2
            jmp end_pressed
        quit_pressed:
            jmp exit
    end_pressed:

    ret
update_hero endp
4

3 に答える 3

3

使用可能な文字があるかどうかを確認しているだけですが、実際にはバッファから文字を読み取っていません。したがって、次にチェックするときは、まだそこにあります。

BIOS関数に関するこのページからhttp://webpages.charter.net/danrollins/techhelp/0230.HTM

INT 16H、AH = 1

Info: Checks to see if a key is available in the keyboard buffer, and
      if so, returns its keycode in AX.  It DOES NOT remove the
      keystroke from the buffer.
于 2012-10-30T17:26:57.740 に答える
0

check_key:

mov     ah, 1

int     16h

jz      .ret 

mov     cx, 0

xor     cl, ch

mov     ah, 0

int     16h

.new.key:

「al」は新しいキープレッシュです

.ret:

 ret
于 2013-07-12T12:04:41.110 に答える
0
update_hero proc
 mov ah, 01h
 int 16h
 cmp al, 97
 je left_pressed
 cmp al, 100
 jne none_pressed
 inc hero_x

ret ; without the ret instruction "hero_x" will be decrease after increasing

 left_pressed:
      dec hero_x
 none_pressed:
 ret
update_hero endp
于 2014-02-27T07:08:14.950 に答える