home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBOPAS / TP-UTIL.ARK / SCRNBLT.ASM < prev    next >
Assembly Source File  |  1986-01-06  |  7KB  |  190 lines

  1. ;===========================================================================
  2. ;
  3. ;    S C R N B L T  -  Graphics Screen Block Transfer for Turbo Pascal
  4. ;
  5. ;===========================================================================
  6. ;
  7. ;     by Larry Stone      21-Jul-84
  8. ;
  9. ; SCRNBLT is written to be called from Turbo Pascal V2.0 using the
  10. ; EXTERNAL procedure convention.  It will copy the contents of the
  11. ; video graphics display buffer (either low or high resolution) to
  12. ; a designated memory location on a virtual "pad" of set dimensions.
  13. ; To use SCRNBLT, the following lines must be included in your Turbo
  14. ; Pascal program.  The type "padtype" demonstrates how a PAD data type
  15. ; may be declared. When the PAD type is declared, the dimensions of
  16. ; the array must be as shown here.  It should also be specified ABSOLUTE
  17. ; with the initial offset 0, so that all of a 64K segment is available
  18. ; to it.
  19. ;
  20. ;  PROCEDURE SCRNBLT( MOVDIR, PADX, PADY : INTEGER; VAR PAD : PADARRAY );
  21. ;      EXTERN 'SCRNBLT';
  22. ;
  23. ;  TYPE
  24. ;    padtype = ARRAY [0..159, 0..399] OF BYTE;
  25. ;  VAR
  26. ;       pad : padtype ABSOLUTE $BA00 : $0000;    (* sample declaration *)
  27. ;
  28. ;  SCRNBLT(0, x, y, pad);   (* sample call; saves screen on pad(x,y) *)
  29. ;
  30. ; The parameters PADX and PAXY are specified as absolute coordinates
  31. ; on the pad, exactly as screen coordinates would be specified.  The
  32. ; X-coordinates correspond to the bits on the pad, not the bytes.
  33. ;
  34. ; The first parameter, "MOVDIR", determines the direction of the transfer.
  35. ; If 0 is specified, the contents of the screen are transferred to the
  36. ; designated area of the pad; if a nonzero number is specified, 
  37. ; the designated area of the pad is transferred to the screen buffer.
  38. ;
  39. ; SCRNBLT transfers the contents of the screen as a rectangular block,
  40. ; 80 bytes wide by 200 bytes high, to a rectangular area of the pad
  41. ; at the designated x,y coordinates.  The pad area is not organized
  42. ; exactly like the display buffer; odd and even lines are interleaved
  43. ; in a more straightforward fashion to allow the offset of an x,y location
  44. ; in the pad to be calculated as  (y * padwidth) + x.  
  45. ;
  46. ; To use SCRNBLT with a Turbo Program:
  47. ;-------------------------------------
  48. ; 1. Assemble this file with MASM.  "A> MASM SCRNBLT;"
  49. ; 2. Link it into a .EXE file.      "A> LINK SCRNBLT;"
  50. ; 3. Use EXE2BIN to make a .COM file. "A> EXE2BIN SCRNBLT.EXE SCRNBLT.COM"
  51. ; 4. Declare as shown in your Turbo Pascal program.
  52. ; 5. Ignore any minor diagnostic messages that may be generated when
  53. ;    this file is assembled and linked.  EXE2BIN is supplied with the
  54. ;    supplemental programs for PC-DOS; see the DOS manual.
  55. ;
  56.  
  57. ; EQUATES TO DEFINE GRAPHICS CONSTANTS
  58. ;
  59. PADWD    EQU    160            ; WIDTH OF VIRTUAL PAD, BYTES
  60. SCRNWD    EQU    80            ; WIDTH OF REAL SCREEN
  61. SCRNWD2    EQU    40            ; HALF OF SCREEN WIDTH
  62. HALFSC    EQU    100            ; LINES FOR HALF OF SCREEN
  63. EVENSC    EQU    0B800H            ; ADDRESS OF EVEN HALF OF SCREEN
  64. ODDSC    EQU    02000H            ; OFFSET OF ODD HALF OF SCREEN
  65.  
  66. CODE    SEGMENT PUBLIC
  67.     ASSUME  CS:CODE
  68.     PUBLIC  SCRNBLT
  69. ;
  70. ; EQUATES FOR ARGUMENTS TO SCRNBLT
  71. ;
  72. PADOFS    EQU    4[BP]            ; OFFSET OF PAD ORIGIN
  73. PADSEG    EQU    6[BP]            ; SEGMENT OF PAD 
  74. PADY    EQU    8[BP]            ; Y-COORD IN PAD
  75. PADX    EQU    10[BP]            ; X-COORD IN PAD
  76. MOVDIR  EQU     12[BP]            ; MOVE DIRECTION (0 = TO SCREEN) 
  77.  
  78. SCRNBLT    PROC    NEAR
  79.     PUSH    BP
  80.     MOV    BP,SP            ; CALLING CONVENTION
  81.     PUSH    DS            ; SAVE DS
  82. ;
  83. ; COMPUTE THE ADDRESS OF THE ORIGIN OF THE PAD AREA DESIGNATED BY
  84. ; PADX, PADY.  LOC = PAD_OFFSET + (PADY * PADWD) + (PADX / 8)
  85. ;
  86.     MOV    AX,PADY            ; PREPARE PADY * PADX
  87.     MOV    BX,PADWD    
  88.     MUL    BX            ; AX = PADY * PADX (DX TRASHED)
  89.     MOV    BX,PADX            ; ADD IN X COMPONENT:
  90.     MOV    CL,3            ; (PREPARE TO SHIFT BY 3)
  91.     SHR    BX,CL            ;  DIV BY 8 SO WE MOVE BY BYTE
  92.     ADD    AX,BX            ;  ADD IT IN.
  93.     ADD     AX,PADOFS    
  94.     CMP    WORD PTR MOVDIR,0    ; IS MOVDIR 0?
  95.     JE    BACKWRD            ; IF SO, DO BACKWARDS MOVE.
  96. ;----------------------------------------------------
  97. ; MOVE "FORWARD" : FROM PAD TO REAL SCREEN
  98. ;----------------------------------------------------
  99. ;  MOVE THE EVEN LINES OF THE SCREEN. THE LOOP IS CONTROLLED BY
  100. ;  THE HALFSC VALUE IN DX; A REP MOVSW IS USED TO MOVE THE SCREEN
  101. ;  LINES A WORD AT A TIME (PROBABLY NO MORE EFFICIENT ON AN 8088..)
  102. ;
  103.     CLD                ; BE SURE DIR. FLAG IS 0
  104.     MOV    BX,PADSEG        ; SOURCE IS PAD, SO SET DS TO
  105.     MOV    DS,BX            ;  PAD SEGMENT
  106.     MOV     SI,AX            ;  AND DI TO OFFSET IN PAD
  107.     MOV    BX,EVENSC        ; DEST IS SCREEN, SET ES TO SCREEN
  108.     MOV    ES,BX            ;  SEGMENT.
  109.     MOV    DI,0            ;  AND INDEX OF 0
  110. ;
  111. ; LOOP TO COPY EVEN LINES
  112. ;
  113.     MOV     CX,HALFSC        ; PREPARE LOOP COUNTER
  114. EVEN:    MOV    DX,CX            ; RECORD LOOP COUNTER
  115.     MOV    CX,SCRNWD2        ; SET UP COUNTER
  116.     REP    MOVSW            ; DO THE MOVE
  117.     ADD    SI,PADWD+PADWD-SCRNWD    ; MOVE SI TO NEXT SCREEN LINE
  118.     MOV    CX,DX
  119.     LOOP     EVEN
  120. ;
  121. ; NOW SET UP FOR ODD LINES AND COPY THOSE
  122. ;
  123.     MOV    DI,ODDSC        ; SET DI TO ODD SCREEN OFFSET
  124.     MOV    SI,AX
  125.     ADD    SI,PADWD        ; SET SI TO FIRST ODD LINE
  126. ;
  127. ; COPY ODD LINES
  128.     MOV    CX,HALFSC        ; LOAD COUNTER
  129. ODD:    MOV    DX,CX            ; SAVE COUNTER
  130.     MOV    CX,SCRNWD2        ; SET UP LINE COUNTER
  131.     REP    MOVSW
  132.     ADD    SI,PADWD+PADWD-SCRNWD    ; MOVE SI TO NEXT SCREEN LINE
  133.     MOV    CX,DX            ; GET LOOP COUNTER
  134.     LOOP    ODD
  135.     JMP    BYE            ; LEAVE
  136. ;----------------------------------------------------
  137. ; MOVE "BACKWARD" : FROM REAL SCREEN TO PAD
  138. ;----------------------------------------------------
  139. ;  THIS IS ALMOST EXACTLY LIKE THE CODE ABOVE THAT MOVES
  140. ;  FROM THE VIRTUAL SCREEN TO THE DISPLAY BUFFER
  141. ;
  142. BACKWRD:
  143.     CLD                ; BE SURE DIR. FLAG IS 0
  144.     MOV    BX,PADSEG        ; DEST IS PAD, SO SET ES TO
  145.     MOV    ES,BX            ;  PAD SEGMENT
  146.     MOV    DI,AX            ; SET UP SOURCE INDEX
  147.     MOV    BX,EVENSC        ; SET DS TO SCREEN SEGMENT
  148.     MOV    DS,BX            ;  FOR EVEN LINES OF SCREEN
  149.     MOV    SI,0            ;  AND SOURCE INDEX
  150. ;
  151. ; LOOP TO COPY EVEN LINES
  152. ;
  153.     MOV     CX,HALFSC        ; PREPARE LOOP COUNTER
  154. BEVEN:    MOV    DX,CX            ; RECORD LOOP COUNTER
  155.     MOV    CX,SCRNWD2        ; SET UP COUNTER
  156.     REP    MOVSW            ; DO THE MOVE
  157.     ADD    DI,PADWD+PADWD-SCRNWD    ; MOVE SI TO NEXT SCREEN LINE
  158.     MOV    CX,DX
  159.     LOOP     BEVEN
  160. ;
  161. ; NOW SET UP FOR ODD LINES AND COPY THOSE
  162. ;
  163.     MOV    SI,ODDSC        ; SET DI TO ODD SCREEN OFFSET
  164.     MOV    DI,AX
  165.     ADD    DI,PADWD        ; SET SI TO FIRST ODD LINE
  166. ;
  167. ; COPY ODD LINES
  168.     MOV    CX,HALFSC        ; LOAD COUNTER
  169. BODD:    MOV    DX,CX            ; SAVE COUNTER
  170.     MOV    CX,SCRNWD2        ; SET UP LINE COUNTER
  171.     REP    MOVSW
  172.     ADD    DI,PADWD+PADWD-SCRNWD    ; MOVE SI TO NEXT SCREEN LINE
  173.     MOV    CX,DX            ; GET LOOP COUNTER
  174.     LOOP    BODD
  175. ;
  176. ; DONE.. CLEAN UP THE STACK AND LEAVE
  177. ;
  178. BYE:    POP    DS            ; RESTORE DS
  179.     MOV    SP,BP
  180.     POP    BP            ; CONVENTIONAL RETURN
  181.     RET     10            ; TRASH 10 BYTES FOR PARMS
  182.  
  183. SCRNBLT    ENDP
  184. CODE    ENDS
  185.     END
  186.