home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / basic / library / qb_pds / asmmod / pstr.asm < prev    next >
Encoding:
Assembly Source File  |  1986-07-19  |  4.2 KB  |  86 lines

  1. ;pstr will write a string to the screen.  It is passed the string and
  2. ;reads the foreground/background color, determines the kind of monitor
  3. ;used and the current cursor location, and prints the string by
  4. ;directly inserting the bytes into the appropriate memory locations by
  5. ;using the ES register.  Written for use with Quick BASIC version 1.01.
  6. ;Written by Bruce W. Tonkin on 12-30-85.  Copyright, Bruce W. Tonkin, 1985.
  7. ;This routine may be used with or without attribution.
  8. ;
  9. ;calling syntax is: CALL PSTR(A$,X)
  10. ;where A$ is the string to print, and X is an integer variable which
  11. ;contains the foreground and background colors, in the following
  12. ;scheme: X=16*(background color)+foreground color.
  13.  
  14. MONOCHROME    EQU  0B000H    ;SEGMENT ADDRESS FOR MONOCHROME ADAPTOR
  15. GRAPHICS      EQU  0B800H    ;SEGMENT ADDRESS FOR GRAPHICS ADAPTOR
  16. DATA     SEGMENT WORD PUBLIC 'DATA'
  17. STORAGE  DW   0
  18. DATA     ENDS
  19. DGROUP   GROUP     DATA
  20. CODE     SEGMENT BYTE PUBLIC 'CODE'
  21.          ASSUME CS:CODE, DS:DGROUP
  22.          PUBLIC PSTR
  23. PSTR     PROC FAR
  24.          PUSH BP             ;SAVE BASE POINTER
  25.          MOV  BP,SP          ;SET UP TO ADDRESS OFF OF BP
  26.          MOV  BX,[BP]+6      ;GET FOREGROUND/BACKGROUND COLOR
  27.          MOV  AX,[BX]        ;INTO AX REGISTER AND
  28.          MOV  AH,AL          ;PUT ATTRIBUTE BYTE INTO BOTH LOCATIONS
  29.          MOV  BX,[BP]+8      ;GET THE ADDRESS OF THE STRING DESCRIPTOR
  30.          MOV  CX,[BX]        ;LENGTH OF STRING IN CX
  31.          MOV  DX,[BX]+2      ;LOCATION OF STRING IN DX
  32.          PUSH DI
  33.          PUSH SI
  34.          PUSH AX             ;SAVE ATTRIBUTE BYTE
  35.          PUSH CX             ;SAVE STRING LENGTH
  36.          PUSH DX             ;SAVE STRING LOCATION
  37.          MOV  AX,0           ;CLEAR AX
  38.          MOV  AH,15          ;VIDEO MODE BIOS CALL
  39.          INT  010H           ;DO THE BIOS CALL
  40.          CMP  AL,07H         ;SEE IF IT'S MONOCHROME
  41.          JZ   ISMONO         ;YES
  42.          MOV  AX,GRAPHICS    ;SET IT UP FOR GRAPHICS
  43.          PUSH AX             ;AND SAVE RESULT
  44.          JMP  DOLOC          ;READY FOR LOCATION
  45. ISMONO:  MOV  AX,MONOCHROME  ;SET IT FOR MONOCHROME
  46.          PUSH AX             ;AND SAVE RESULT
  47. DOLOC:   MOV  BX,00H         ;READY FOR LOCATION. SET CURRENT VIDEO PAGE
  48.          MOV  AX,00H         ;CLEAR AX
  49.          MOV  AH,03H         ;BIOS CALL FOR FINDING CURSOR LOCATION
  50.          INT  010H           ;PERFORM BIOS CALL
  51.                              ;DH IS ROW, DL IS COLUMN ON RETURN
  52.          MOV  AX,050H        ;NUMBER OF COLUMNS=80
  53.          MOV  BX,0           ;CLEAR BX
  54.          MOV  BL,DH          ;BL=NUMBER OF ROWS
  55.          MUL  BX             ;80 COLUMNS TIMES ROW LOCATION INTO AX
  56.          MOV  CX,0           ;CLEAR CX
  57.          MOV  CL,DL          ;MOVE COLUMN ADDRESS INTO CL
  58.          ADD  AX,CX          ;NOW HAVE ADDRESS TO OFFSET INTO BUFFER
  59.          SHL  AX,1           ;WITH TWO BYTES PER CHARACTER (1=ATTRIBUTE)
  60.          MOV  DI,AX          ;RESULT GOES INTO DI
  61.                              ;ATTRIBUTE, LENGTH, LOCATION, MONITOR TYPE
  62.                              ;ARE NOW ON THE STACK
  63.          POP  AX             ;THAT GETS MONITOR TYPE START ADDRESS TO AX
  64.          POP  DX             ;STRING LOCATION RESTORED TO DX
  65.          POP  CX             ;STRING LENGTH IS IN CX
  66.          POP  BX             ;AND ATTRIBUTE INTO BX
  67.          MOV  SI,DX          ;STORE STRING LOCATION IN SI
  68.          PUSH ES             ;SAVE EXTRA SEGMENT, WE'LL USE IT
  69.          MOV  ES,AX          ;MONITOR START INTO THE ES SEGMENT REGISTER
  70. QUERY:   CMP  CX,0           ;ARE WE DONE?
  71.          JZ   DONE           ;YES, EXIT
  72.          MOV  BL,BYTE PTR [SI]         ;PUT CHARACTER INTO BL
  73.          MOV  ES:WORD PTR [DI],BX      ;SEND CHARACTER TO SCREEN
  74.          ADD  DI,2H          ;BUMP SCREEN MEMORY INDEX BY TWO
  75.          ADD  SI,1H          ;AND STRING POINTER BY ONE
  76.          DEC  CX             ;ONE LESS BYTE TO MOVE
  77.          JMP  QUERY          ;LOOP UNTIL DONE
  78. DONE:    POP  ES             ;RESTORE EXTRA SEGMENT
  79.          POP  SI
  80.          POP  DI
  81.          POP  BP             ;RESTORE BASE POINTER
  82.          RET  4              ;RETURN AND REMOVE 2 PARAMETERS FROM STACK
  83. PSTR     ENDP
  84. CODE     ENDS
  85.          END
  86.