Please consider a donation to the Higher Intellect project. See https://preterhuman.net/donate.php or the Donate to Higher Intellect page for more info.

WINTHERE

From Higher Intellect Vintage Wiki
Jump to navigation Jump to search
_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