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

  1.  
  2. ;************************************************************************
  3. ; Display character Char at position Row, Column (using attributes      *
  4. ; already in display buffer)                                            *
  5. ; Entry: The follwing parameters are passed on the stack as words       *
  6. ;               Char, Row, Col                                          *
  7. ;************************************************************************
  8.  
  9. Char    EQU     [BP+4]
  10. Row     EQU     [BP+6]
  11. Column  EQU     [BP+8]
  12.  
  13.         PUBLIC _Write_Char
  14.  
  15. _Write_Char     PROC NEAR
  16.         PUSH    BP
  17.         MOV     BP,SP
  18.         PUSH    DI                      ;Preserve registers
  19.         PUSH    ES
  20.  
  21.         ;--- Convert row and column to absolute offset within display buffer
  22.  
  23.         XOR     AX,AX                   ;Point ES to segment zero
  24.         MOV     ES,AX
  25.         MOV     AX,Row                  ;Fetch row number
  26.         MOV     BX,ES:[BIOS_Columns]    ;Fetch columns per screen
  27.         MUL     BX                      ;Compute absolute address as
  28.         ADD     AX,Column               ; Column + Row * Columns)
  29.         SHL     AX,1                    ; Account for attributes
  30.         MOV     DI,AX                   ;Move address into register DI
  31.  
  32.         ;--- Determine and load segement of the display buffer
  33.  
  34.         MOV     AX,0B000H               ;Assume monochrome buffer address
  35.         TEST    BYTE PTR ES:[BIOS_Equipment],2   ;Is mono attached?
  36.         JNZ     Address_Ok              ;...Yes, go load segment
  37.         MOV     AX,0B800H               ;...No, change address to color
  38. Address_Ok:
  39.         MOV     ES,AX                   ;Set segment of display buffer
  40.  
  41.         ;--- Save the character
  42.  
  43.         MOV     AL,Char                 ;Get character
  44.         STOSB                           ;Write it into display buffer
  45.  
  46.         POP     ES                      ;Restore registers
  47.         POP     DI
  48.         MOV     SP,BP
  49.         POP     BP
  50.         RET
  51. _Write_Char     ENDP
  52.