home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / video / 11 / 11_1.asm next >
Encoding:
Assembly Source File  |  1988-08-11  |  3.2 KB  |  144 lines

  1.         TITLE    'Listing 11-1'
  2.         NAME    GetBitBlock06
  3.         PAGE    55,132
  4.  
  5. ;
  6. ; Name:        GetBitBlock06
  7. ;
  8. ; Function:    Copy bit block from video buffer to system RAM
  9. ;         in 640x200 2-color mode
  10. ;
  11. ; Caller:    Microsoft C:
  12. ;
  13. ;            int GetBitBlock06(x0,y0,x1,y1,buf);
  14. ;
  15. ;                 int x0,y0;    /* upper left corner of bit block */
  16. ;                 int x1,y1;       /* lower right corner */
  17. ;                 char far *buf;   /* buffer */
  18. ;
  19. ; Notes:    Returns size of bit block in system RAM.
  20. ;
  21.  
  22.  
  23. ARGx0        EQU    word ptr [bp+4]
  24. ARGy0        EQU    word ptr [bp+6]
  25. ARGx1        EQU    word ptr [bp+8]
  26. ARGy1        EQU    word ptr [bp+10]
  27. ADDRbuf        EQU             [bp+12]
  28.  
  29. VARPixelRows    EQU    word ptr [bp-2]
  30. VARPixelRowLen    EQU    word ptr [bp-4]
  31. VARincr        EQU    word ptr [bp-6]
  32.  
  33. ByteOffsetShift    EQU    3        ; reflects number of pixels per byte
  34.  
  35.  
  36. _TEXT        SEGMENT    byte public 'CODE'
  37.         ASSUME    cs:_TEXT
  38.  
  39.         EXTRN    PixelAddr06:near
  40.  
  41.         PUBLIC    _GetBitBlock06
  42. _GetBitBlock06    PROC    near
  43.  
  44.         push    bp        ; preserve caller registers
  45.         mov    bp,sp
  46.         sub    sp,6        ; establish stack frame
  47.         push    ds
  48.         push    si
  49.         push    di
  50.  
  51. ; compute dimensions of bit block
  52.  
  53.         mov    ax,ARGx1
  54.         sub    ax,ARGx0
  55.         mov    cx,0FF07h    ; CH := unshifted bit mask
  56.                     ; CL := AND mask for AL
  57.         and    cl,al        ; CL := number of pixels in last
  58.                     ;  byte of row
  59.         xor    cl,7        ; CL := number of bits to shift
  60.         shl    ch,cl        ; CH := bit mask for last byte of row
  61.         mov    cl,ch
  62.         push    cx        ; save on stack
  63.  
  64.         mov    cl,ByteOffsetShift
  65.         shr    ax,cl
  66.         inc    ax        ; AX := number of bytes per row
  67.         push    ax        ; save on stack
  68.  
  69.         mov    ax,ARGy1
  70.         sub    ax,ARGy0
  71.         inc    ax        ; AX := number of pixel rows
  72.         push    ax        ; save on stack
  73.  
  74. ; establish addressing
  75.  
  76.         mov    ax,ARGy0
  77.         mov    bx,ARGx0
  78.         call    PixelAddr06    ; ES:BX -> x0,y0 in video buffer
  79.         xor    cl,7        ; CL := number of bits to shift left
  80.         push    es
  81.         pop    ds
  82.         mov    si,bx        ; DS:SI -> video buffer
  83.  
  84.         mov    bx,2000h    ; BX := increment from 1st to 2nd
  85.                     ;  interleave in CGA video buffer
  86.         test    si,2000h
  87.         jz    L01        ; jump if x0,y0 is in 1st interleave
  88.  
  89.         mov    bx,80-2000h    ; increment from 2nd to 1st interleave
  90.  
  91. L01:        mov    VARincr,bx    ; initialize this variable
  92.  
  93.         les    di,ADDRbuf    ; ES:DI -> buffer in system RAM
  94.  
  95. ; build 5-byte bit block header
  96.  
  97.         pop    ax
  98.         mov    VARPixelRows,ax
  99.         stosw            ; byte 0-1 := number of pixel rows
  100.         pop    ax
  101.         mov    VARPixelRowLen,ax
  102.         stosw            ; byte 2-3 := bytes per pixel row
  103.         pop    ax
  104.         mov    ch,al        ; CH := bit mask for last byte
  105.         stosb            ; byte 4 := bit mask for last byte
  106.  
  107. ; copy from video buffer to system RAM
  108.  
  109. L02:        mov    bx,VARPixelRowLen
  110.         push    si        ; preserve SI at start of pixel row
  111.  
  112. L03:        lodsw            ; AL := next byte in video buffer
  113.                     ; AH := (next byte) + 1
  114.         dec    si        ; DS:SI -> (next byte) + 1
  115.         rol    ax,cl        ; AL := next 4 pixels in row
  116.         stosb            ; copy to system RAM
  117.         dec    bx        ; loop across row
  118.         jnz    L03
  119.  
  120.         and    es:[di-1],ch    ; mask last byte of row        
  121.         pop    si        ; DS:SI -> start of row
  122.         add    si,VARincr    ; DS:SI -> start of next row
  123.         xor    VARincr,2000h XOR (80-2000H)  ; update increment
  124.  
  125.         dec    VARPixelRows
  126.         jnz    L02        ; loop down rows
  127.  
  128.         mov    ax,di
  129.         sub    ax,ADDRbuf    ; AX := return value (size of bit block
  130.                     ;  in system RAM)
  131.  
  132.         pop    di        ; restore registers and exit
  133.         pop    si
  134.         pop    ds
  135.         mov    sp,bp
  136.         pop    bp
  137.         ret
  138.  
  139. _GetBitBlock06    ENDP
  140.  
  141. _TEXT        ENDS
  142.  
  143.         END
  144.