home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / C-ASM_VI.ARJ / PROGASM.ZIP / PROG053.ASM < prev    next >
Assembly Source File  |  1988-04-10  |  3KB  |  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+4]
  10. Column  EQU     [BP+6]
  11. Back    EQU     [BP+8]
  12. Fore    EQU     [BP+10]
  13.  
  14.         PUBLIC _Write_Attribute
  15.  
  16. _Write_Attribute PROC NEAR
  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
  60. _Write_Attribute ENDP
  61.