home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / grafik / dbvga / asmsourc / vac.asm < prev    next >
Encoding:
Assembly Source File  |  1992-01-25  |  3.4 KB  |  118 lines

  1. ; Attribute Controller register operations
  2. ;
  3. ; int char ACread_reg(int register_number);
  4. ; void ACset_reg(int register_number, int value);
  5. ; void ACset_regm(int reg_num, int value, 
  6. ;                 int mask);
  7. ;      reg(reg_num)= (!mask & reg(reg_num)) | (mask & value);
  8. ;
  9. BMASK   EQU     [BP+0ah]
  10. VALUE   EQU     [BP+8]
  11. REGNO   EQU     [BP+6]
  12. ;
  13. AC_TEXT   SEGMENT word public 'CODE'
  14.         ASSUME  cs:AC_TEXT, ds:NOTHING
  15.         PUBLIC  _ACread_reg
  16.         PUBLIC  _ACset_reg
  17.         PUBLIC  _ACset_regm
  18. _ACread_reg     PROC    far
  19.         push    bp
  20.         mov     bp,sp
  21.  
  22.         mov     ax,40h
  23.         mov     es,ax
  24.         mov     dx,es:[63h]
  25.         add     dl,6            ; get register address
  26.  
  27.         cli
  28.  
  29.         in      al,dx   ;reset 3c0 flip/flop
  30.         push    dx
  31.         mov     dl,0c0h
  32.         mov     al,REGNO    ; palette register number
  33.         or      al,20h      ; don't disable display, we're just looking
  34.         out     dx,al
  35.  
  36.         xor     ax,ax
  37.         inc     dx
  38.         jmp     $+2         ; waste a little more time
  39.  
  40.         in      al,dx
  41.         mov     bl,al       ; save return in bl for a moment
  42.  
  43.         pop     dx
  44.         in      al,dx   ;reset 3c0 flip/flop
  45.         mov     dl,0c0h
  46.         mov     al,20h
  47.         out     dx,al   ; return 3c0 to the way we left it
  48.  
  49.         sti
  50.  
  51.         xor     ah,ah
  52.         mov     al,bl   ; place return value in al
  53.         pop     bp
  54.         ret             ; return to C
  55.  
  56. _ACread_reg     ENDP
  57. _ACset_reg      PROC    far
  58.         push    bp
  59.         mov     bp,sp
  60.         mov     ax,40h
  61.         mov     es,ax
  62.         mov     dx,es:[63h]
  63.         add     dl,6                  ;dx=0x03da (color) 0x03ba (mono)
  64.         mov     bl,VALUE              ; save value in a register
  65.         push    dx                    ; save flip/flop reset location
  66.         cli
  67.         in      al,dx                 ;reset 3c0 flip/flop
  68.         mov     dl,0c0h               ; dx=0x03c0
  69.         mov     al,REGNO
  70.         cmp     al,10h                
  71.         jb      outind                ; if a palette register, 
  72.                                       ; disable display
  73.         or      al,20h                ; else don't disable display
  74. outind: out     dx,al                 ; output index to 0x3c0
  75.         mov     al,bl
  76.         jmp     $+2         ; waste a little more time
  77.         out     dx,al                 ; out(0x3c0,VALUE)
  78.  
  79.         pop     dx
  80.         in      al,dx                 ;reset 3c0 flip/flop
  81.         mov     dl,0c0h
  82.         mov     al,20h
  83.         out     dx,al          ; reenable screen
  84.         sti
  85.         xor     ax,ax
  86.         pop     bp
  87.         ret             ; return to C
  88. _ACset_reg      ENDP
  89. _ACset_regm     PROC  far
  90.         push    bp
  91.         mov     bp,sp
  92.         mov     dl,REGNO
  93.         push    dx
  94.         call    _ACread_reg    ; returns al=reg(reg_num);
  95.         add     sp,2
  96.  
  97.         mov     bl,BMASK
  98.         not     bl        ; !mask
  99.         and     al,bl     ; al=(!mask®(reg_num));
  100.         mov     cl,al     ; save for a microsecond
  101.         mov     al,VALUE
  102.         mov     bl,BMASK
  103.         and     al,bl
  104.         or      al,cl     
  105.         push    ax
  106.         mov     al,REGNO
  107.         push    ax
  108.         call    _ACset_reg
  109.         add     sp,4
  110.  
  111.         xor     ax,ax
  112.         pop     bp
  113.         ret
  114. _ACset_regm     ENDP
  115. AC_TEXT   ENDS
  116.         END
  117.  
  118.