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

  1.         TITLE    'Listing 5-15'
  2.         NAME    SetPixelInC
  3.         PAGE    55,132
  4.  
  5. ;
  6. ; Name:        SetPixelInC
  7. ;
  8. ; Function:    Set the value of a pixel in 720x348 16-color mode
  9. ;
  10. ; Caller:    Microsoft C:
  11. ;
  12. ;            void SetPixel(x,y,n);
  13. ;
  14. ;            int x,y;        /* pixel coordinates */
  15. ;
  16. ;            int n;            /* pixel value */
  17. ;
  18.  
  19. ARGx        EQU    word ptr [bp+4]    ; stack frame addressing
  20. ARGy        EQU    word ptr [bp+6]
  21. ARGn        EQU    byte ptr [bp+8]
  22.  
  23. DefaultRWColor    EQU    0Fh        ; default value for R/W Color Register
  24.  
  25.  
  26. DGROUP        GROUP    _DATA
  27.  
  28. _TEXT        SEGMENT    byte public 'CODE'
  29.         ASSUME    cs:_TEXT,ds:DGROUP
  30.  
  31.         EXTRN    PixelAddrHGC:near
  32.  
  33.         PUBLIC    _SetPixelInC
  34. _SetPixelInC    PROC    near
  35.  
  36.         push    bp        ; preserve caller registers
  37.         mov    bp,sp
  38.  
  39.         mov    ax,ARGy        ; AX := y
  40.         mov    bx,ARGx        ; BX := x
  41.         call    PixelAddrHGC    ; AH := bit mask
  42.                     ; ES:BX -> buffer
  43.                     ; CL := # bits to shift left
  44.  
  45.         shl    ah,cl        ; AH := bit mask in proper position
  46.  
  47.         mov    dx,3B4h        ; DX := CRTC port
  48.  
  49.         jmp    word ptr SetPixelOpInC    ; jump to Replace, AND,
  50.                         ;  OR or XOR routine
  51.  
  52.  
  53. ReplacePixelInC:            ; routine to Replace pixel value
  54.  
  55.         mov    ch,ah        ; CH := bit mask for pixel
  56.         mov    ax,1F19h    ; AH bit 6 := 0 (Mask Polarity)
  57.                     ; AH bits 5-4 := 1 (Write Mode)
  58.                     ; AH bits 3-0 := "don't care" bits
  59.                     ; AL := R/W Control Register number
  60.         out    dx,ax        ; set R/W Control Register
  61.  
  62.         inc    ax        ; AL := 1Ah (R/W Color Reg number)
  63.         mov    ah,ARGn        ; AH := foreground value
  64.         out    dx,ax        ; set R/W color register
  65.  
  66.         and    es:[bx],ch    ; update bit planes
  67.         jmp    short L01
  68.  
  69. ANDPixelInC:                ; routine to AND pixel value
  70.  
  71.         mov    ch,ah        ; CH := bit mask for pixel
  72.         mov    ax,1F19h    ; AH bit 6 := 0 (Mask Polarity)
  73.                     ; AH bits 5-4 := 1 (Write Mode)
  74.                     ; AH bits 3-0 := "don't care" bits
  75.                     ; AL := R/W Control Register number
  76.         out    dx,ax        ; set R/W Control Register
  77.  
  78.         dec    ax        ; AL := 18h (Plane Mask Register number)
  79.         mov    ah,ARGn        ; AH := pixel value
  80.         mov    cl,4
  81.         shl    ah,cl        ; AH bits 7-4 := writeable plane mask
  82.         or    ah,0Fh        ; AH bits 3-0 := visible plane mask
  83.         out    dx,ax        ; set Plane Mask Register
  84.  
  85.         mov    ax,001Ah    ; AH := 0 (foreground value)
  86.                     ; AL := 1Ah (R/W Color reg)
  87.         out    dx,ax        ; set R/W Color Register
  88.  
  89.         and    es:[bx],ch    ; update bit planes
  90.         jmp    short L01
  91.  
  92.                     ; routine to OR pixel value
  93. ORPixelInC:    
  94.         mov    ch,ah        ; CH := bit mask for pixel
  95.         mov    ax,1F19h    ; AH bit 6 := 0 (Mask Polarity)
  96.                     ; AH bits 5-4 := 1 (Write Mode)
  97.                     ; AH bits 3-0 := "don't care" bits
  98.                     ; AL := R/W Control Register number
  99.         out    dx,ax        ; set R/W Control Register
  100.  
  101.         dec    ax        ; AL := 18h (Plane Mask Register number)
  102.         mov    ah,ARGn        ; AH := pixel value
  103.         not    ah        ; AH := complement of pixel value
  104.         mov    cl,4
  105.         shl    ah,cl        ; AH bits 7-4 := writeable plane mask
  106.         or    ah,0Fh        ; AH bits 3-0 := visible plane mask
  107.         out    dx,ax        ; set Plane Mask Register
  108.  
  109.         mov    ax,0F1Ah    ; AH := 0 (foreground value)
  110.                     ; AL := 1Ah (R/W Color reg)
  111.         out    dx,ax        ; set R/W Color Register
  112.  
  113.         and    es:[bx],ch    ; update bit planes
  114.         jmp    short L01
  115.  
  116. XORPixelInC:                ; routine to XOR pixel value
  117.         mov    ch,ah        ; CH := bit mask for pixel
  118.         mov    ax,3F19h    ; AH bit 6 := 0 (Mask Polarity)
  119.                     ; AH bits 5-4 := 3 (Write Mode)
  120.                     ; AH bits 3-0 := "don't care" bits
  121.                     ; AL := R/W Control Register number
  122.         out    dx,ax        ; set R/W Control Register
  123.  
  124.         dec    ax        ; AL := 18h (Plane Mask Register number)
  125.         mov    ah,ARGn        ; AH := pixel value
  126.         not    ah        ; AH := complement of pixel value
  127.         mov    cl,4
  128.         shl    ah,cl        ; AH bits 7-4 := writeable plane mask
  129.         or    ah,0Fh        ; AH bits 3-0 := visible plane mask
  130.         out    dx,ax        ; set Plane Mask Register
  131.  
  132.         xor    es:[bx],ch    ; update bit planes
  133.  
  134. L01:        mov    ax,0F18h
  135.         out    dx,ax        ; restore default Plane Mask value
  136.  
  137.         mov    ax,4019h    ; restore default R/W Control value
  138.         out    dx,ax
  139.  
  140.         inc    ax        ; restore default R/W Color value
  141.         mov    ah,DefaultRWColor
  142.         out    dx,ax
  143.  
  144.         mov    sp,bp        ; restore caller registers and return
  145.         pop    bp
  146.         ret
  147.  
  148. _SetPixelInC    ENDP
  149.  
  150. _TEXT        ENDS
  151.  
  152.  
  153. _DATA        SEGMENT    word public 'DATA'
  154.  
  155. SetPixelOpInC   DW      ReplacePixelInc ; contains addr of pixel operation
  156.  
  157. _DATA        ENDS
  158.  
  159.         END
  160.