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

  1.  
  2. ;************************************************************************
  3. ; Display text at specified row and column                              *
  4. ; Entry:        Row             - Starting row of the text              *
  5. ;               Column  - Starting column of the text                   *
  6. ;               String  - Pointer to a null terminated string of text   *
  7. ;************************************************************************
  8.  
  9. Row     EQU     [BP+4]
  10. Column  EQU     [BP+6]
  11. String  EQU     [BP+8]
  12.  
  13.         PUBLIC  _Write_String
  14.  
  15. _Write_String   PROC NEAR
  16.         PUSH    BP
  17.         MOV     BP,SP
  18.         PUSH    DI                      ;Preserve registers
  19.         PUSH    SI
  20.         PUSH    ES
  21.  
  22.         ;--- Fetch number of rows and columns on the screen and
  23.         ;    compute absolute address in display buffer
  24.  
  25.         XOR     AX,AX                   ;Point ES to segment zero
  26.         MOV     ES,AX
  27.         MOV     AX,Row                  ;Fetch row number
  28.         MOV     BX,ES:[BIOS_Columns]    ;Fetch columns per screen
  29.         MUL     BX                      ;Compute absolute address
  30.         ADD     AX,Column               ;in the display buffer as
  31.         SHL     AX,1                    ;((Row*Col_per_row)+Column)*2
  32.         MOV     DI,AX                   ;Move address into register DI
  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     Str_Address_Ok          ;...Yes, go load segment
  39.         MOV     AX,0B800H               ;...No, change address to color
  40. Str_Address_Ok:
  41.         MOV     ES,AX                   ;Set segment of display buffer
  42.  
  43.         ;--- Fetch address of the text
  44.  
  45.         MOV     SI,String               ;Get pointer to the string
  46. Next_String:
  47.         LODSB                           ;Fetch next character
  48.         OR      AL,AL                   ;Is character the terminating zero?
  49.         JZ      String_Done             ;...Yes, we are done
  50.         STOSB                           ;...No, put it into display buffer
  51.         INC     DI                      ;Skip attribute byte
  52.         JMP     Next_String             ;Go examine next character
  53.  
  54. String_Done:
  55.         POP     ES                      ;Restore registers
  56.         POP     SI
  57.         POP     DI
  58.         POP     BP
  59.         RET
  60. _Write_String   ENDP
  61.