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

  1.         TITLE    'Listing 11-2'
  2.         NAME    StoreBitBlock06
  3.         PAGE    55,132
  4.  
  5. ;
  6. ; Name:        StoreBitBlock06
  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. ;            void StoreBitBlock06(buf,x,y);
  14. ;
  15. ;                 char far *buf;   /* buffer */
  16. ;                 int x,y;    /* upper left corner of bit block */
  17. ;
  18.  
  19.  
  20. ADDRbuf        EQU    dword ptr [bp+4]
  21. ARGx        EQU    word ptr [bp+8]
  22. ARGy        EQU    word ptr [bp+10]
  23.  
  24. VARPixelRows    EQU    word ptr [bp-2]
  25. VARPixelRowLen    EQU    word ptr [bp-4]
  26. VARincr        EQU    word ptr [bp-6]
  27.  
  28.  
  29. DGROUP        GROUP    _DATA
  30.  
  31. _TEXT        SEGMENT    byte public 'CODE'
  32.         ASSUME    cs:_TEXT,ds:DGROUP
  33.  
  34.         EXTRN    PixelAddr06:near
  35.  
  36.         PUBLIC    _StoreBitBlock06
  37. _StoreBitBlock06 PROC    near
  38.  
  39.         push    bp        ; preserve caller registers
  40.         mov    bp,sp
  41.         sub    sp,6        ; establish stack frame
  42.         push    ds
  43.         push    si
  44.         push    di
  45.  
  46. ; establish addressing
  47.  
  48.         mov    ax,ARGy
  49.         mov    bx,ARGx
  50.         call    PixelAddr06    ; ES:BX -> byte offset of x,y
  51.         xor    cl,7        ; CL := number of bits to shift right
  52.  
  53.         mov    di,bx        ; ES:DI -> x,y in video buffer
  54.         
  55.         mov    bx,2000h    ; BX := increment from 1st to 2nd
  56.                     ;  interleave in CGA video buffer
  57.         test    di,2000h
  58.         jz    L01        ; jump if x,y is in 1st interleave
  59.  
  60.         mov    bx,80-2000h    ; increment from 2nd to 1st interleave
  61.  
  62. L01:        mov    VARincr,bx    ; initialize this variable
  63.  
  64.         mov    bx,StoreBitBlockOp  ; BX := subroutine address
  65.  
  66.         lds    si,ADDRbuf    ; ES:DI -> buffer in system RAM
  67.  
  68. ; obtain dimensions of bit block from header
  69.  
  70.         lodsw            ; AX := number of pixel rows
  71.         mov    VARPixelRows,ax
  72.         lodsw            ; AX := bytes per pixel row
  73.         mov    VARPixelRowLen,ax
  74.         lodsb            ; AL := bit mask for last byte in row
  75.         mov    ch,al
  76.  
  77.         jmp    bx        ; jump to subroutine
  78.  
  79.  
  80. ReplaceBitBlock:
  81.         cmp    cx,0FF00h    ; if mask <> 0FFH or bits to shift <> 0
  82.         jne    L15        ;  jump if not byte-aligned
  83.  
  84. ; routine for byte-aligned bit blocks
  85.  
  86.         mov    cx,VARPixelRowLen
  87.  
  88. L10:        push    di        ; preserve DI and CX
  89.         push    cx
  90.         rep    movsb        ; copy one pixel row into video buffer
  91.         pop    cx        ; restore DI and CX
  92.         pop    di    
  93.         add    di,VARincr    ; ES:DI -> next pixel row in buffer
  94.         xor    VARincr,2000h XOR (80-2000h) ; update increment
  95.         dec    VARPixelRows
  96.         jnz    L10        ; loop down pixel rows
  97.  
  98.         jmp    Lexit
  99.  
  100. ; routine for all other bit blocks
  101.  
  102. L15:        not    ch        ; CH := mask for end of row
  103.         mov    dx,0FF00h
  104.         ror    dx,cl        ; DX := rotated mask for each byte
  105.  
  106.         mov    bx,VARPixelRowLen
  107.         dec    bx        ; BX := bytes per row - 1
  108.  
  109. L16:        push    di
  110.         test    bx,bx
  111.         jz    L18        ; jump if only one byte per row
  112.  
  113.         push    bx
  114.  
  115. L17:        and    es:[di],dx    ; mask next 8 pixels in video buffer
  116.         lodsb            ; AL := pixels in bit block
  117.         xor    ah,ah
  118.         ror    ax,cl        ; AX := pixels rotated into position
  119.         or    es:[di],ax    ; set pixels in video buffer
  120.         inc    di        ; ES:DI -> next byte in bit block
  121.         dec    bx
  122.         jnz    L17
  123.  
  124.         pop    bx
  125.  
  126. L18:        mov    al,ch
  127.         mov    ah,0FFh        ; AX := mask for last pixels in row
  128.         ror    ax,cl        ; AX := mask rotated into position
  129.         and    es:[di],ax    ; mask last pixels in video buffer
  130.         lodsb            ; AL := last byte in row
  131.         xor    ah,ah
  132.         ror    ax,cl        ; AX := pixels rotated into position
  133.         or    es:[di],ax    ; set pixels in video buffer
  134.  
  135.         pop    di
  136.         add    di,VARincr    ; ES:DI -> next pixel row in buffer
  137.         xor    VARincr,2000h XOR (80-2000h)
  138.         dec    VARPixelRows
  139.         jnz    L16        ; loop down pixel rows
  140.  
  141.         jmp    Lexit
  142.  
  143.  
  144. XORBitBlock:
  145.         mov    bx,VARPixelRowLen
  146.  
  147. L20:        push    di
  148.         push    bx
  149.  
  150. L21:        lodsb            ; AL := pixels in bit block
  151.         xor    ah,ah
  152.         ror    ax,cl        ; AX := pixels rotated into position
  153.         xor    es:[di],ax    ; XOR pixels into video buffer
  154.         inc    di        ; ES:DI -> next byte in bit block
  155.         dec    bx
  156.         jnz    L21
  157.  
  158.         pop    bx
  159.         pop    di
  160.         add    di,VARincr    ; ES:DI -> next pixel row in buffer
  161.         xor    VARincr,2000h XOR (80-2000h)
  162.         dec    VARPixelRows
  163.         jnz    L20        ; loop down pixel rows
  164.  
  165.         jmp    Lexit
  166.  
  167. ANDBitBlock:
  168.         not    ch        ; CH := mask for end of row
  169.  
  170.         mov    bx,VARPixelRowLen
  171.         dec    bx        ; BX := bytes per row - 1
  172.  
  173. L30:        push    di
  174.         test    bx,bx
  175.         jz    L32        ; jump if only one byte per row
  176.  
  177.         push    bx
  178.  
  179. L31:        lodsb            ; AL := pixels in bit block
  180.         mov    ah,0FFh
  181.         ror    ax,cl        ; AX := pixels rotated into position
  182.         and    es:[di],ax    ; AND pixels into video buffer
  183.         inc    di        ; ES:DI -> next byte in bit block
  184.         dec    bx
  185.         jnz    L31
  186.  
  187.         pop    bx
  188.  
  189. L32:        lodsb            ; AL := last byte in row
  190.         or    al,ch        ; mask last pixels in row
  191.         mov    ah,0FFh
  192.         ror    ax,cl        ; AX := pixels rotated into position
  193.         and    es:[di],ax    ; AND pixels into video buffer
  194.  
  195.         pop    di
  196.         add    di,VARincr    ; ES:DI -> next pixel row in buffer
  197.         xor    VARincr,2000h XOR (80-2000h)
  198.         dec    VARPixelRows
  199.         jnz    L30        ; loop down pixel rows
  200.  
  201.         jmp    Lexit
  202.  
  203.  
  204. ORBitBlock:
  205.         mov    bx,VARPixelRowLen
  206.  
  207. L40:        push    di
  208.         push    bx
  209.  
  210. L41:        lodsb            ; AL := pixels in bit block
  211.         xor    ah,ah
  212.         ror    ax,cl        ; AX := pixels rotated into position
  213.         or    es:[di],ax    ; OR pixels into video buffer
  214.         inc    di        ; ES:DI -> next byte in bit block
  215.         dec    bx
  216.         jnz    L41
  217.  
  218.         pop    bx
  219.         pop    di
  220.         add    di,VARincr    ; ES:DI -> next pixel row in buffer
  221.         xor    VARincr,2000h XOR (80-2000h)
  222.         dec    VARPixelRows
  223.         jnz    L40        ; loop down pixel rows
  224.  
  225.  
  226. Lexit:        pop    di        ; restore registers and exit
  227.         pop    si
  228.         pop    ds
  229.         mov    sp,bp
  230.         pop    bp
  231.         ret
  232.  
  233. _StoreBitBlock06 ENDP
  234.  
  235. _TEXT        ENDS
  236.  
  237.  
  238. _DATA        SEGMENT    word public 'DATA'
  239.  
  240. StoreBitBlockOp    DW    ReplaceBitBlock    ; address of selected subroutine
  241.                     ;  (Replace, XOR, AND, OR)
  242.  
  243. _DATA        ENDS
  244.  
  245.         END
  246.