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

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