【问题标题】:EMU 8086 Takes much longer time to printEMU 8086 需要更长的打印时间
【发布时间】:2021-12-20 02:14:48
【问题描述】:

我想在 EMU-8086 编译器中创建一个乒乓球游戏,在这个程序中我刚刚创建了一个球并应用了一个随着时间增加(1/100 毫秒)的函数,球从左到右移动 但是当我模拟程序时,创建一个球需要很长时间,然后从左到右非常缓慢 请告诉我如何加快程序速度

     ;IMP LINKS
 
 ;=======FOR INT 10H FUNCTIONS==========     
 
   ;https://en.wikipedia.org/wiki/INT_10H#:~:text=List%20of%20supported%20functions%20%20%20%20Function,End%20s%20...%20%2017%20more%20rows%20
    ;https://stanislavs.org/helppc/int_10.html 
    
  ;======INT 21H FUNCTIONS==============

     ; http://spike.scu.edu.au/~barry/interrupts.html#ah2c

org 100h

 .MODEL SMALL
 .STACK 100H
 
 .DATA 
 
  BALL_X DW 0AH ;FOR X-AXIS
  BALL_Y DW 0AH ;FOR Y-AXIS   
  BALL_SIZE DW 04h ;size of the ball (width and height)  
  TIME_AUX DB 0   ;VARIABLE USED FOR CHECKING IF THE TIME HAS CHANGED OR NOT
  
 
 .CODE
 
 main proc         
    
       MOV AX,@DATA     
       MOV DS,AX   
       
  
    ;INT 10h commands
      MOV AH,00h ; for configuration to video mode
      MOV AL,13h ; for 320x200 256 color graphics (MCGA,VGA)
      INT 10h ;FOR EXECUTING PROGRAM
      
      ;for background color
      
    ;  MOV AH,0Bh ; SET CONFIGURATION
    ;  MOV BH,00h ; to bg color 
    ;  MOV BL,0Dh  ; dh=pink color
    ;  INT 10h ; executing function
     
     ;========================= 
        ;FOR TIME     
        
        CHECKTIME:         
        
        MOV AH,2CH ;CONFIGURING TIME
        INT 21H    ; CH = hour CL = minute DH = second DL = 1/100 seconds
        CMP DL,TIME_AUX ;IS THE CURRENT TIME EQUAL TO THE PREVIOUS ONE
        
        JE CHECKTIME ;IF IT'S SAME THEN CHECK AGAIN
            
            ;IF ITS DIFFERENT THEN DRAW,MOVE ETC
           
            MOV TIME_AUX,DL
            INC BALL_X
         
          
       CALL DRAWBALL
       
       JMP CHECKTIME ;AFTER EVERYTIHING CHECK TIME AGAIN
    
        
        
  MOV AH,4CH
  INT 21H
 
 
    
    DRAWBALL PROC 
        
        ;BALL LOCATION 
        
      MOV CX,BALL_X ;set X-AXIS LOCATION (X)
      MOV DX,BALL_Y ; set Y-AXIS LOCATION (Y) 
    
      
      DRAWBALL_HORIZONTAL:
      
        
       ;for pixel INFORMATION
      MOV AH,0CH ; for configuring graphic pixel
      MOV AL,0Fh ; for white color pixel
      MOV BH,00h  ; for page number
      INT 10H       
      
      INC CX ;PRINTING PIXEL/DOT UNTIL 4COL IN 1ST ROW 
      MOV AX,CX  ;CX-BALL_X>BALL_SIZE (THEN WO GO TO THE NEXT LINE)
      SUB AX,BALL_X
      CMP AX,BALL_SIZE
      JNG DRAWBALL_HORIZONTAL   
      
        MOV CX,BALL_X ; CX REGISTER GOES BAX TO INITIAL COLUM 
        INC DX ; FOR GOING TO   NEXT LINE
        MOV AX,DX
        SUB AX,BALL_Y 
        CMP AX,BALL_SIZE
        JNG DRAWBALL_HORIZONTAL
        
        
       RET 
       DRAWBALL ENDP
 
 END PROC            
ret

【问题讨论】:

    标签: assembly time x86-16 emu8086 pong


    【解决方案1】:

    ...应用时间增加的函数(1/100 毫秒秒)

    虽然 DOS.GetSystemTime 函数 2Ch 在 DL 寄存器中为您提供 HundredthsOfSecond 的值,但这并不意味着该函数以 1/100 秒的速度滴答(并且当然不是你提到的 1/100 毫秒)。 DOS 时间以 18.2 Hz 的速率变化。换句话说,您可以在 DL 寄存器中期望每秒有 18 次不同的值。
    这些将是那些值(大约):

    0, 5, 11, 16, 22, 27, 33, 38, 44, 50, 56, 61, 67, 72, 78, 83, 89, 94
    

    一个快速的解决方案是每次您当前的代码决定移动一次球时多次移动球。

      ; IF IT'S DIFFERENT THEN DRAW, MOVE ETC
      mov  TIME_AUX, dl
      mov  di, 5
    More:
      inc  BALL_X
      call DRAWBALL
      dec  di
      jnz  More
      jmp  CHECKTIME ;AFTER EVERYTHING CHECK TIME AGAIN
    

    重复 5 次 (mov di, 5),球将在大约 3 秒内穿过屏幕,这对于乒乓球比赛来说是合理的。


    另外,不要忘记 emu8086 有一个程序执行速度设置,而且这个仿真器即使在其“最佳速度模式”下仍然很慢......
    如果您想要高速的游戏性能,您可以在 DOSBox 或真正的实地址模式硬件上运行您的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-07
      • 2022-01-08
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 2022-04-28
      • 2018-07-30
      相关资源
      最近更新 更多