我正在组装基于文本的动画,其中需要大量的屏幕刷新以使其尽可能平滑并模拟弹跳物理。我使用int 1ah
调用来控制屏幕刷新延迟,并使形状看起来好像它减慢到达其峰值并在其下降时加速。每个CALL CLEAR
之后还会有一个单独的横幅放到屏幕上。
我编写了处理移动形状代码的代码,它按预期工作。当我添加了在屏幕上放置固定横幅的附加代码时,它会在某个点之后锁定dosbox。
更大的循环中包含以下代码的八种变体。它运行正常,直到我将;PRINT BANNER
添加到第七个内循环。实际上,它打破了下面循环中的第一个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
,并提出一系列其他建议,解决与基于文本的动画不完全相关的问题,并且明确使用我无法遵循的说明。我是一个认真的集会初学者,从一本利用自定义库的书中学习。我在命令提示符下运行的32位Win 7 Pro上尝试了该程序,并出现了NTVDM.EXE错误。关于代码明显问题的任何想法或见解?
答案 0 :(得分:1)
我的实现问题是循环INT 1AH
(时钟)调用。当你不允许它做一些事情时,Windows会抱怨。
此的解决方案是提供一个外部过程,调用INT 1AH
返回寄存器中的自动收报机值。然后将其存储在一个值中,以确保它不会通过过程调用被破坏。最后根据循环中包含的外部过程调用的返回值进行检查,如此...
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
将循环添加到DELAY.asm中的另一个子过程也可以。