home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / GLEN / LQM11.ZIP / REVID.ASM < prev    next >
Assembly Source File  |  1990-04-15  |  6KB  |  127 lines

  1. ;=============================================================================
  2. ; FUNCTION:  REVID
  3. ; PURPOSE:  Reverses the video attribute for a specified number of characters
  4. ;           beginning at coordinates x,y.  Written to interface with a small
  5. ;           memory model C program.  The function call is:
  6. ;
  7. ;                      REVID(unsigned int col, row, no_chars);
  8. ;
  9. ;           Note: col and row are numbered from 1 to upper limit.
  10. ;
  11. ; ARGUMENTS:  SP+4 = column number of first character to reverse attribute
  12. ;             SP+6 = row number of first character to reverse attribute
  13. ;             SP+8 = number of characters to reverse video attribute
  14. ; RETURNS: None
  15. ;=============================================================================
  16.  
  17. _TEXT   SEGMENT BYTE PUBLIC 'CODE'
  18.  
  19.         ASSUME  CS:_TEXT
  20.  
  21. MAX_COL         DB      ?       ;WIDTH OF SCREEN IN COLUMNS
  22. OLD_CX          DW      ?       ;OLD CX VALUE
  23. PAGE_NUM        DB      ?       ;PAGE NUMBER
  24. POSITION        LABEL   WORD    ;CURSOR POSITION
  25. COL             DB      ?       ;COLUMN NUMBER
  26. ROW             DB      ?       ;ROW NUMBER
  27. START_POS       LABEL   WORD    ;CURSOR POSITION AT START OF ROUTINE
  28. START_COL       DB      ?       ;COLUMN NUMBER AT START OF ROUTINE
  29. START_ROW       DB      ?       ;ROW NUMBER AT START OF ROUTINE
  30.  
  31.         PUBLIC  _REVID
  32. _REVID      PROC    NEAR
  33.         PUSH    BP              ;SAVE BP
  34.         MOV     BP,SP           ;MAKE BP SAME AS SP
  35.         MOV     OLD_CX,CX       ;SAVE OLD CX VALUE
  36.         MOV     CX,[BP+4]       ;RETRIEVE COLUMN NUMBER ARGUMENT
  37.         DEC     CX              ;SUBTRACT ONE FOR DOS REPRESENTATION OF COLUMN
  38.         MOV     COL,CL
  39.         MOV     CX,[BP+6]       ;RETRIEVE ROW NUMBER ARGUMENT
  40.         DEC     CX              ;SUBTRACT ONE FOR DOS REPRESENTATION OF ROW
  41.         MOV     ROW,CL
  42.         MOV     CX,[BP+8]       ;RETRIEVE LENGTH ARGUMENT
  43.         PUSH    AX              ;SAVE REGISTERS
  44.         PUSH    BX
  45.         PUSH    DX
  46.         PUSH    DS
  47.         PUSH    CS              ;MAKE CODE & DATA SEGMENTS SAME
  48.         POP     DS
  49.         PUSH    CX              ;SAVE LENGTH
  50.                         ;GET SCREEN WIDTH & CURRENT PAGE NUMBER
  51.         MOV     AH,0Fh          ;SERVICE OFh, GET CURRENT VIDEO STATE
  52.         INT     10h             ;CALL BIOS INTERRUPT 10h
  53.         MOV     MAX_COL,AH      ;SAVE SCREEN COLUMN WIDTH
  54.         MOV     PAGE_NUM,BH     ;SAVE PAGE NUMBER
  55.                         ;GET CURRENT CURSOR POSITION AND SAVE IT
  56.         MOV     AH,03h          ;SERVICE 03h, GET CURSOR POSITION AND SIZE
  57.         INT     10h             ;CALL BIOS INTERRUPT 10h
  58.         MOV     START_COL,DL    ;SAVE STARTING COLUMN NUMBER
  59.         MOV     START_ROW,DH    ;SAVE STARTING ROW NUMBER
  60.                         ;MOVE CURSOR TO START OF STRING
  61.         MOV     DX,POSITION     ;SET CURSOR POSITION
  62.         MOV     AH,2            ;SERVICE 2, SET CURSOR POSITON
  63.         INT     10h             ;CALL BIOS INTERRUPT 10h
  64.         POP     CX              ;RETRIEVE COUNTER
  65. DOIT:   PUSH    CX              ;SAVE COUNTER
  66.                         ;READ CURRENT CHARACTER & ATTRIBUTE
  67.         MOV     BH,PAGE_NUM     ;PAGE NUMBER
  68.         MOV     AH,8            ;SERVICE 8, READ CHARACTER & ATTRIBUTE
  69.         INT     10h             ;CALL BIOS INTERRUPT 10h
  70.                         ;REVERSE VIDEO ATTRIBUTE
  71.         MOV     BL,AH           ;MOVE ATTRIBUTE TO BL
  72.         MOV     BH,AH           ;MOVE ATTRIBUTE TO BH
  73.         MOV     CL,4            ;NUMBER OF BITS TO SHIFT
  74.         SHR     BX,CL           ;BL NOW HAS REVERSED ATTRIBUTE BYTES
  75.                         ;WRITE CHARACTER & REVERSED ATTRIBUTE BACK TO SCREEN
  76.         MOV     BH,PAGE_NUM     ;PAGE NUMBER
  77.         MOV     CX,1            ;PRINT ONE CHARACTER
  78.         MOV     AH,9            ;SERVICE 9, WRITE CHARACTER & ATTRIBUTE
  79.         INT     10h             ;CALL BIOS INTERRUPT 10h
  80.         CALL    CUR_RIGHT       ;MOVE CURSOR RIGHT
  81.         POP     CX              ;RESTORE COUNTER
  82.         LOOP    DOIT            ;DEC CL & LOOP IF NOT ZERO
  83.  
  84.         MOV     BH,PAGE_NUM     ;GET PAGE NUMBER
  85.         MOV     DX,START_POS    ;SET STARTING CURSOR POSITION
  86.         MOV     AH,2            ;SERVICE 2, SET CURSOR POSITON
  87.         INT     10h             ;CALL BIOS INTERRUPT 10h
  88.  
  89.         POP     DS              ;RESTORE REGISTERS
  90.         POP     DX
  91.         POP     BX
  92.         POP     AX
  93.         POP     BP
  94.         MOV     CX,OLD_CX
  95.         RET                     ;RETURN TO CALLING ROUTINE
  96. _REVID       ENDP
  97.  
  98.         PUBLIC  CUR_RIGHT
  99. CUR_RIGHT   PROC  NEAR
  100.         PUSH    AX              ;SAVE REGISTGERS USED
  101.         PUSH    BX
  102.         PUSH    DX
  103.         MOV     DL,COL          ;RETREIVE CURRENT COLUMN
  104.         INC     DL              ;INCREMENT COLUMN POSITION
  105.         CMP     DL,MAX_COL      ;CHECK IF CURSOR AT LAST COLUMN
  106.         JGE     NEWLINE         ;YES, SET COL TO ZERO AND ROW+1
  107.         JMP     SHORT UPDATE
  108. NEWLINE:
  109.         XOR     DL,DL           ;ZERO COLUMN
  110.         INC     ROW             ;MOVE DOWN ONE ROW
  111. UPDATE:
  112.         MOV     COL,DL          ;SAVE NEW COLUMN POSITION
  113.         MOV     DH,ROW          ;GET ROW NUMBER
  114.         MOV     BH,PAGE_NUM     ;PAGE NUMBER
  115.         MOV     AH,2            ;SERVICE 2, POSITION CURSOR
  116.         INT     10h             ;CALL BIOS INTERRUPT 10h
  117. EXIT:
  118.         POP     DX              ;RESTORE REGISTERS
  119.         POP     BX
  120.         POP     AX
  121.         RET                     ;RETURN TO CALLING ROUTINE
  122. CUR_RIGHT   ENDP
  123.  
  124. _TEXT   ENDS
  125.  
  126.         END
  127.