home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / GUILIB.ZIP / GET_BB.ASM < prev    next >
Assembly Source File  |  1987-09-28  |  4KB  |  157 lines

  1.         TITLE    'Listing 11-3'
  2.         NAME    GetBitBlock10
  3.         PAGE    55,132
  4.  
  5. ;
  6. ; Name:        GetBitBlock10
  7. ;
  8. ; Function:    Copy bit block from video buffer to system RAM
  9. ;         in native EGA and VGA graphics modes
  10. ;
  11. ; Caller:    Microsoft C:
  12. ;
  13. ;            int GetBitBlock10(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.  
  32. BytesPerRow    EQU    80
  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    PixelAddr10:near
  40.  
  41.         PUBLIC    _GetBitBlock10
  42. _GetBitBlock10    PROC    near
  43.  
  44.         push    bp        ; preserve caller registers
  45.         mov    bp,sp
  46.         sub    sp,4        ; 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    PixelAddr10    ; 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.         les    di,ADDRbuf    ; ES:DI -> buffer in system RAM
  85.  
  86. ; build 5-byte bit block header
  87.  
  88.         pop    ax
  89.         mov    VARPixelRows,ax
  90.         stosw            ; byte 0-1 := number of pixel rows
  91.         pop    ax
  92.         mov    VARPixelRowLen,ax
  93.         stosw            ; byte 2-3 := bytes per pixel row
  94.         pop    ax
  95.         mov    ch,al        ; CH := bit mask for last byte in row
  96.         stosb            ; byte 4 := bit mask for last byte
  97.  
  98. ; set up Graphics Controller
  99.  
  100.         mov    dx,3CEh        ; DX := Graphics Controller address port
  101.  
  102.         mov    ax,0005        ; AH := 0 (read mode 0, write mode 0)
  103.                     ; AL := 5 (Mode register number)
  104.         out    dx,ax        ; set up read mode 0
  105.  
  106.         mov    ax,0304h    ; AH := 3 (first bit plane to read)
  107.                     ; AL := 4 (Read Map Select reg number)
  108.  
  109. ; copy from video buffer to system RAM
  110.  
  111. L01:        out    dx,ax        ; select next memory map to read
  112.         push    ax        ; preserve memory map number
  113.         push    VARPixelRows    ; preserve number of pixel rows
  114.         push    si        ; preserve offset of x0,y0
  115.  
  116. L02:        mov    bx,VARPixelRowLen
  117.         push    si        ; preserve SI at start of pixel row
  118.  
  119. L03:        lodsw            ; AL := next byte in video buffer
  120.                     ; AH := (next byte) + 1
  121.         dec    si        ; DS:SI -> (next byte) + 1
  122.         rol    ax,cl        ; AL := next 4 pixels in row
  123.         stosb            ; copy to system RAM
  124.         dec    bx        ; loop across row
  125.         jnz    L03
  126.  
  127.         and    es:[di-1],ch    ; mask last byte in row
  128.         pop    si        ; DS:SI -> start of row
  129.         add    si,BytesPerRow    ; DS:SI -> start of next row
  130.  
  131.         dec    VARPixelRows
  132.         jnz    L02        ; loop down rows
  133.  
  134.         pop    si        ; DS:SI -> start of bit block
  135.         pop    VARPixelRows    ; restore number of pixel rows
  136.         pop    ax        ; AH := last map read
  137.                     ; AL := Read Map Select reg number
  138.         dec    ah
  139.         jns    L01        ; loop across bit planes
  140.  
  141.         mov    ax,di
  142.         sub    ax,ADDRbuf    ; AX := return value (size of bit block
  143.                     ;  in system RAM)
  144.  
  145.         pop    di        ; restore registers and exit
  146.         pop    si
  147.         pop    ds
  148.         mov    sp,bp
  149.         pop    bp
  150.         ret
  151.  
  152. _GetBitBlock10    ENDP
  153.  
  154. _TEXT        ENDS
  155.  
  156.         END
  157.