FWIW, here's the code I use to test whether or not ANSI.SYS is loaded.
;-------------------------------------------------------------------
;Strings need to test for ANSI.SYS
;-------------------------------------------------------------------
TestMsg:
DB CR ;String to test ANSI.SYS
DB Escape,"[s" ; ANSI "Save Cursor Position"
DB Escape,"[u" ; ANSI "Restore Cursor Position"
DB 0 ; End of string
HideMsg:
DB CR ;String to cover up
DB 6 DUP (" ") ; what we sent to the screen
DB CR ; if ANSI.SYS isn't loaded
DB 0 ; End of string
;---------------------------------------------------------------------
;TEST AND SEE IF ANSI.SYS (OR SOME EQUIVALENT CLONE) IS LOADED
;Inputs:
;Outputs: CF = Clear if ANSI.SYS is loaded
; = Set if not
;Changes:
;NOTES: At least under Windows XP, the data in the BIOS memory is
; incorrect when a DOS Box initially loads. The data
; regarding video pages and cursor information does not match
; what's really there.
; We originally just looked at the BIOS data area (for speed),
; but had to change things to INT 10h calls for this to work
; correctly under XP (and possibly all versions of NT).
;------------------------------------------------------------------------------
TestANSI:
PUSH AX,BX,CX,DX ;Save used registers
MOV DX,TestMsg ;Write the ANSI.SYS test string
CALL WriteZERR ; to the screen
MOV AH,0Fh ;Function 0Fh (Get Video Columns, Mode, & Page)
INT 10h ;Do it (returns AH = Columns, AL = Mode, BH = Page)
MOV AH,03h ;Function 03h (Get Cursor Information)
INT 10h ;Do it (uses BH = Page
; returns CH = Start Scan, CL = End Scan,
; DH = Row, DL = Column)
OR DL,DL ;Did the cursor move?
JZ >A80 ;If not, ANSI is loaded
A70: ;ANSI.SYS is not loaded
MOV DX,HideMsg ;If so, write over the ANSI test string
CALL WriteZERR ; with spaces
STC ;Set the no ANSI.SYS flag
JMP >A90 ;And we're done
A80: ;ANSI.SYS is loaded
CLC ;Set the ANSI.SYS flag
A90: ;We're done
POP DX,CX,BX,AX ;Restore used registers
RET
;---------------------------------------------------------------------
;WRITE ASCIIZ STRING TO CON OR TO ERR
;Inputs: DS:[DX] = Pointer to string
;Outputs: Writes the string to CON or ERR
;Changes:
;---------------------------------------------------------------------
WriteZCon: ;Write to CON
PUSH BX ;Save used register
MOV BX,1 ;Device #1 (CON)
JMP >Z10 ;Jump to do it
WriteZErr: ;Write to ERR
PUSH BX ;Save used register
MOV BX,2 ;Device #2 (ERR)
Z10: ;Write to CON or ERR
PUSH AX,CX ;Save used registers
CALL CalcStrSizeDX ;Calculate the size of the string (returns CX)
JZ >Z80 ;If nothing to write, just quit
MOV AH,40h ;Function 40h (Write to Device)
INT 21h ;Do it
Z80: ;We're done
POP CX,AX ;Restore used registers
POP BX ;Restore used register
Z90: ;We're done
RET
;---------------------------------------------------------------------
;CALCULATE THE LENGTH OF AN ASCIIZ STRING
;Inputs: DS:[DX] = Pointer to the string
;Outputs: CX = Length of the string
; ZF = Set if string is 0 length
; = Clear if not
;Changes:
;---------------------------------------------------------------------
CalcStrSizeDX:
PUSH AX,DI ;Save used registers
PUSH ES ;Save used registers
MOV ES,DS ;Point ES:[DI]
MOV DI,DX ; at the string
XOR AL,AL ;Look for a 0
MOV CX,-1 ;Start with max count for REPNE
REPNE SCASB ;Find the end of the string
NOT CX ;Calculate the size
DEC CX ; of the string (sets ZF)
POP ES ;Restore used registers
POP DI,AX ;Restore used registers
RET
_______________________________________________
Freedos-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freedos-devel