0

私はアセンブリでテキストベースのアニメーションに取り組んでいます。そこでは、可能な限りスムーズにし、バウンドする物理をシミュレートするために、多数の画面の更新が必要です。呼び出しを使用int 1ahして、画面の更新の遅延を制御し、図形がピークに達するまで減速し、下降するときに速度が上がるように見せます。それぞれの後に画面に表示される個別のバナーもありますCALL CLEAR

動く図形のコードを処理するコードを作成しましたが、期待どおりに機能しました。画面に静止バナーを配置する追加のコードを追加すると、特定の時点の後でdosboxがロックされます。

より大きなループに含まれる次のコードには8つのバリエーションがあります。;PRINT BANNER7番目の内側のループにを追加するまでは正常に動作します。実際にはLEA、バナーなしでテストしたときに存在しなかった以下のループの最初のループで中断します。

  .REPEAT
       LEA     SI,SHAPE
       MOV     DH,ROW
       MOV     DL,COL
       CALL    CLEAR
       CALL    PUTSHAPE
       ;PRINT BANNER
       LEA     SI,BANNER            
       MOV     DH,25
       MOV     DL,39
       CALL    PUTSHAPE
       ;END BANNER
       MOV     TIME, 1
       MOV     AH, 0
       INT     1AH  
       ADD     TIME, DX
       .WHILE    DX < TIME
            MOV       AH, 0
            INT       1AH
       .ENDW                                       
       ADD  COL, 2
       SUB  ROW, 4
       DEC  D7
       MOV  CX, D7
       MOV  TIME, 0
  .UNTILCXZ

私はここであまりにも速く期待しすぎていますか?私はLEA、遅延の後に2番目を呼び出すようにコードを再配置しようとしました。また、テキストベースのアニメーションに正確に関係しない問題に対する他の多くの提案や、私が従うことができない指示を確実に使用しました。私は、カスタムライブラリを利用した本から学ぶ真面目なアセンブリ初心者です。コマンドプロンプトから実行している32ビットWin7Proでプログラムを試してみたところ、NTVDM.EXEエラーが発生しました。コードの明らかな問題に関するアイデアや洞察はありますか?

4

1 に答える 1

1

The problem with my implementation was the looped INT 1AH (clock) calls. Windows complains when you don't allow it some time to do its thing.

The solution to this would be to provide an external procedure that calls INT 1AH returning the ticker value in a register. Then storing it in a value to ensure it does not get clobbered through procedure calls. Finally check it against the returned values from the external procedure calls contained in a loop like so...

       MOV     TIME, 1      ;The value moved into time determines speed
       CALL    DELAY        ;DELAY = INT 1AH call which puts the lower 1/2 
       ADD     TIME, DX     ;of the system clock into DX. Add it to TIME
       .WHILE    DX < TIME
            CALL DELAY      ;Loops call to the DELAY procedure testing DX
       .ENDW                ;against TIME + Original DELAY call   

Adding the loop to another sub procedure in the DELAY.asm works as well.

于 2013-01-06T02:49:36.047 に答える