home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TP_ADV.ZIP / LIST0903.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-11-20  |  5.8 KB  |  159 lines

  1. DATA   SEGMENT   WORD PUBLIC
  2.        EXTRN     VidWidth:WORD,BaseAddr:WORD,CheckSnow:BYTE
  3. DATA   ENDS
  4.  
  5. CODE   SEGMENT   BYTE PUBLIC
  6.        ASSUME    CS:CODE, DS:DATA
  7.        PUBLIC    MoveNoSnow
  8.        PUBLIC    MoveFast
  9.        PUBLIC    MovWindow
  10.  
  11.  
  12. ToAddr   EQU     DWORD PTR [BP+6]  ; Target parameter
  13. FromAddr EQU     DWORD PTR [BP+10] ; Source parameter
  14. Count    EQU     WORD  PTR [BP+14] ; Number of words to move
  15.  
  16. ; MoveNoSnow ( Count : Word;FromAddr, ToAddr : Pointer );
  17. MoveNoSnow     PROC FAR
  18.   push    bp             ; Standard Turbo Pascal entry code
  19.   mov     bp,sp          ; "
  20.  
  21.   push    ds             ; Save DS
  22.   les     di,FromAddr    ; Move source address into ES:DI
  23.   lds     si,ToAddr      ; Move target address into DS:SI
  24.   cld                    ; Clear direction flag
  25.   mov     cx,Count       ; Put number of words to be moved into CX
  26.   jcxz    MoveNSDone     ; If no words to move, then exit now
  27.  
  28.   mov     dx,3DAh        ; Put CGA status port value in DX
  29.  
  30. AnotherChar:
  31.   cli                    ; Stop interrupts, timing critical
  32.  
  33. VerticleSync:
  34.   in      al,dx          ;*   Get CGA status byte
  35.   test    al,8           ;**  Test verticle sync bit
  36.   jnz     DisplayChar    ;**  If bit not set: jump to display the char
  37.   rcr     al,1           ;*   Else: rotate bit 0 to the carry flag
  38.   jc      VerticleSync   ;*   If carry flag set, loop again
  39.  
  40. DisplayEnable:
  41.   in      al,dx          ; Get CGA status byte
  42.   rcr     al,1           ; Rotate bit 0 to the carry flag
  43.   jnc     DisplayEnable  ; Loop until carry flag not set
  44.  
  45. DisplayChar:
  46.   lodsw                  ; Get word from string into AX
  47.   sti                    ; Okay to do interrupts again
  48.   stosw                  ; Move word from AX to destination address
  49.   loop    AnotherChar    ; Loop until no more words to display
  50.  
  51. MoveNSDone:
  52.   pop     ds             ; Restore DS
  53.   pop     bp             ; Restore BP
  54.   retf    10             ; Far return, 10 bytes of parameters
  55. MoveNoSnow     ENDP
  56.  
  57.  
  58. ; Procedure MoveFast ( Count : Word; FromAddr, ToAddr : Pointer );
  59. MoveFast       PROC FAR
  60.   push    bp             ; Standard Turbo Pascal entry code
  61.   mov     bp,sp          ; "
  62.   les     di,FromAddr    ; Move source address into ES:DI
  63.  
  64.   mov     cx,Count       ; Move number of words to be moved to CX
  65.   push    ds             ; Save DS
  66.   lds     si,ToAddr      ; Move target address into DS:SI
  67.   rep     movsw          ; Move CX words from ES:DI to DS:SI
  68.  
  69.   pop     ds             ; Restore DS
  70.   pop     bp             ; Restore BP
  71.   retf    10             ; Far return, 10 bytes of parameters
  72. MoveFast       ENDP
  73.  
  74.  
  75. ; Procedure MovWindow ( ToScreen : Boolean; X1, Y1, X2, Y2 : Word;
  76. ;                       Buff : Pointer );
  77. MovWindow      PROC FAR  ; Begin Procedure MovWindow
  78.   push    bp             ; Standard Turbo Pascal Entry code
  79.   mov     bp,sp          ;
  80.  
  81.                          ; Calculate number of word to move per line
  82.   mov     ax,[bp+12]     ; move X2 to AX
  83.   sub     ax,[bp+16]     ; AX = X2 - X1
  84.   inc     ax             ; AX = X2 - X1 + 1
  85.   push    ax             ; [BP-2] = X2 - X1 + 1
  86.  
  87.                          ; Calculate number of lines to move
  88.   mov     ax,[bp+10]     ; move Y2 to AX
  89.   sub     ax,[bp+14]     ; AX = Y2 - Y1
  90.   inc     ax             ; AX = Y2 - Y1 + 1
  91.   push    ax             ; [BP-4] = Y2 - Y1 + 1
  92.  
  93.                          ; Calculate number of bytes per line on screen
  94.   mov     ax,VidWidth    ;
  95.   shl     ax,1           ; AX = VidWidth * 2
  96.   push    ax             ; [BP-6] = VidWidth * 2
  97.  
  98.                          ; Calculate Offset of window
  99.   mov     ax,[bp+14]     ; AX = Y1
  100.   dec     ax             ; AX = Y1 - 1
  101.   mul     WORD PTR [BP-06]; AX = (Y1 - 1) * (VidWidth * 2)
  102.   mov     dx,[bp+16]     ; DX = X1
  103.   dec     dx             ; DX = X1 - 1
  104.   shl     dx,1           ; DX = (X1 - 1) * 2
  105.   add     ax,dx          ; AX = ((Y1 - 1) * (VidWidth * 2)) + ((X1 - 1) *2)
  106.   push    ax             ; [BP-8] = above formula
  107.  
  108. AnotherLine:
  109.   mov     al,[bp+18]     ;
  110.   cmp     al,0           ; See if we copy to screen
  111.   jne     CopyFromScr    ;
  112.  
  113.   push    [bp-2]         ; Put number of words to move onto stack
  114.   push    [bp+8]         ; Move buffer to stack
  115.   push    [bp+6]         ; Move buffer to stack
  116.   push    BaseAddr       ; Move video segment to stack
  117.   push    [bp-8]         ; Move video offset to stack
  118.   jmp     Check4SnowCheck;
  119.  
  120. CopyFromScr:
  121.   push    [bp-2]         ; Put number of words to move onto stack
  122.   push    BaseAddr       ; Move video segment to stack
  123.   push    [bp-8]         ; Move video offset to stack
  124.   push    [bp+8]         ; Move buffer to stack
  125.   push    [bp+6]         ; Move buffer to stack
  126.  
  127. Check4SnowCheck:
  128.   mov     al,CheckSnow   ;
  129.   cmp     al,0           ; Check the boolean variable CheckSnow
  130.   jne     SnowChecking   ;
  131.   call    MoveFast       ; If CheckSnow = FALSE then use MoveFast
  132.   jmp     SkipSnow       ;
  133. SnowChecking:
  134.   call    MoveNoSnow     ; If CheckSnow = TRUE then use MoveNoSnow
  135.  
  136. SkipSnow:
  137.   mov     ax,[bp-8]      ; AX := Video Offset
  138.   add     ax,[bp-6]      ; AX := Video Offset + ScreenWidth
  139.   mov     [bp-8],ax      ; Video Offset := Video Offset + ScreenWidth
  140.  
  141.   mov     ax,[bp-2]      ; AX := Words to move
  142.   shl     ax,1           ; AX := AX * 2
  143.   add     ax,[bp+6]      ; AX := AX + Buffer Offset
  144.   mov     [bp+6],ax      ; Buffer Offset := Buffer Offset + bytes to move
  145.  
  146.   mov     ax,[bp-4]      ;
  147.   dec     ax             ;
  148.   mov     [bp-4],ax      ; Lines := Lines - 1
  149.   cmp     ax,0           ; If Lines <> 0 then
  150.   jnz     AnotherLine    ;   Goto display another line
  151.  
  152.   mov     sp,bp          ; Standard Turbo Pascal Exit Code
  153.   pop     bp             ;
  154.   retf    14             ;
  155. MovWindow      ENDP      ; End of Procedure MovWindow
  156.  
  157. CODE   ENDS
  158. END
  159.