textfiles/computers/winthere.asc

97 lines
3.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

_WINTHERE_
by Ben Myers
[LISTING ONE]
page 58,132
title WINTHERE, A program to test for the presence of Windows 3.0
subttl (C)Copyright 1990 Spirit of Performance, Inc.
; All Rights Reserved.
.list
; You may use any portion of this program for any purpose whatsoever, but
; you must include the above copyright in any program into which portions of
; this program are incorporated.
; Use Microsoft MASM 5.1 or later and Borland TLINK to build WINTHERE.COM.
; masm %1,%1.obj;
; tlink /x /t %1.obj,%1.com
; You may also use LINK and EXE2BIN to build WINTHERE.COM. MASM local
; reference operators @f, @b, and @@ are not handled correctly by Borland TASM.
; Equates used in this program
Multiplexor equ 2Fh ; DOS multiplexor interrupt
KbdIO equ 16h ; BIOS Keyboard interrupt
DOS equ 21h ; DOS function call interrupt
Terminate equ 4Ch ; DOS terminate function
PrintString equ 09h ; DOS print string function
CR equ 0dh ; Carriage Return.
LF equ 0ah ; Line Feed.
; Simple macro to display a text string with the DOS print string function
Display macro message
local amsg,around
mov dx,offset amsg ; Load offset of message
mov ah,PrintString ; DOS function code
int DOS
jmp short around ; jump around message text
amsg:
.errb <message> ; generate assembler error if no message
irp y,<message> ; repeat for each of y args in message list
db y
endm
db '$' ; terminate message with '$' as required
around:
endm
cseg segment public 'code'
assume cs:cseg
org 100h
Begin:
Display <"WINTHERE - (C)Copyright 1990 Spirit of Performance, Inc.",CR,LF>
; See if being executed from Windows 3.0 in enhanced mode.
mov ax,1600h ; Enhanced Windows multiplex signature.
int Multiplexor
test al,7fh ; Windows 386?
jnz Win_Enhanced ; Yes.
; See if being executed from Windows 3.0 in real or standard mode.
mov ax,4680h ; Multiplex signature...
int Multiplexor ; apparently when Win3 is not enhanced.
or ax,ax ; Windows 3.0 /r or /s?
jz @f ; Yes.
jmp Not_Enhanced_Win ; No.
@@:
Display <"WINTHERE has been run from Windows real or standard mode.",CR,LF>
jmp WrapUp
Win_Enhanced:
Display <"WINTHERE has been run from within Windows in enhanced mode.",CR,LF>
WrapUp:
Display <"Press any key to continue. . .",CR,LF>
xor ah,ah ; Read a keystroke.
int KbdIO
or ah,ah ; Extended scan code?
jnz @f ; No.
int KbdIO ; Read second half of extended character.
@@:
mov ah,Terminate ; Quit.
mov al,1 ; DOS exit code 1 to indicate error.
int DOS
Not_Enhanced_Win:
Display <"WINTHERE has not been run from within MS Windows.",CR,LF>
mov ah,Terminate ; Quit.
xor al,al ; Exit code 0, no error.
int DOS
; The interrupt mux call with ax=4680h is the one that Microsoft refuses to
; acknowledge, but it sure is there every time Windows is run in real or
; standard mode, and the mux interrupt vector points dead square in the middle
; of the Windows kernel, which then chains the mux interrupt elsewhere.
cseg ends
end Begin