home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG053P.ASM < prev    next >
Assembly Source File  |  1988-04-17  |  2KB  |  61 lines

  1.  
  2. ;************************************************************************
  3. ; Change attributes of character at Row, Column, using the foreground    *
  4. ; Fore and background Back.                        *
  5. ; Entry: The follwing parameters are passed on the stack as words    *
  6. ;     Row, Col, Back, Fore                        *
  7. ;************************************************************************
  8.  
  9. Row    EQU    [BP+12]
  10. Column    EQU    [BP+10]
  11. Back    EQU    [BP+8]
  12. Fore    EQU    [BP+6]
  13.  
  14.     PUBLIC Write_Attribute
  15.  
  16. Write_Attribute PROC FAR
  17.     PUSH    BP
  18.     MOV    BP,SP
  19.     PUSH    DI            ;Preserve registers
  20.     PUSH    ES
  21.  
  22.     ;--- Convert row and column to absolute offset within display buffer
  23.  
  24.     XOR    AX,AX            ;Point ES to segment zero
  25.     MOV    ES,AX
  26.     MOV    AX,Row            ;Fetch row number
  27.     MOV    BX,ES:[BIOS_Columns]    ;Fetch columns per screen
  28.     MUL    BX            ;Compute absolute address as
  29.     ADD    AX,Column        ; Column + Row * Columns)
  30.     SHL    AX,1            ; Account for attributes
  31.     MOV    DI,AX            ;Move address into register DI
  32.     INC    DI            ;Skip character code byte
  33.  
  34.     ;--- Determine and load segement of the display buffer
  35.  
  36.     MOV    AX,0B000H        ;Assume monochrome buffer address
  37.     TEST    BYTE PTR ES:[BIOS_Equipment],2     ;Is mono attached?
  38.     JNZ    Attr_Addr_Ok        ;...Yes, go load segment
  39.     MOV    AX,0B800H        ;...No, change address to color
  40. Attr_Addr_Ok:
  41.     MOV    ES,AX            ;Set segment of display buffer
  42.  
  43.     ;--- Compose attribute into a single byte and save into display buffer
  44.  
  45.     MOV    AH,Back         ;Get the background attribute
  46.     SHL    AH,1            ;Shift 4 lower bits into upper nibble
  47.     SHL    AH,1
  48.     SHL    AH,1
  49.     SHL    AH,1
  50.     MOV    AL,Fore         ;Get the background attribute
  51.     AND    AL,0FH            ;Keep only lower nibble
  52.     OR    AL,AH            ;Combine foreground and background
  53.     STOSB                ;Write it into display buffer
  54.  
  55.     POP    ES            ;Restore registers
  56.     POP    DI
  57.     MOV    SP,BP
  58.     POP    BP
  59.     RET    8
  60. Write_Attribute ENDP
  61.