;DoubleDOS Technical Information		       1/06/86
PAGE    60,132

;   This information is to help people who write their own software to
;   take advantage of the DoubleDOS dual-tasking environment.
;   Applications and System level programs can make direct calls to
;   DoubleDOS routines to perform the following functions:
;
;       CLEAR THE KEYBOARD BUFFER
;       ADD CHARACTERS TO EITHER KEYBOARD BUFFER
;       SELECTIVELY ENABLE OR DISABLE ALL KEYBOARD FUNCTIONS
;       DETERMINE STATUS OF EITHER MEMORY SECTION
;       GIVE UNNEEDED CPU TIME TO THE OTHER MEMORY SECTION
;       ENSURE ADEQUATE CPU TIME FOR CRITICAL TIMING APPLICATIONS
;       RETURN VIRTUAL SCREEN ADDRESS
;       SUSPEND OR RESUME PROCESSING OF THE OTHER MEMORY SECTION
;       TERMINATE THE TASK RUNNING IN THE OTHER MEMORY SECTION
;
;The following is a list of function calls that DoubleDOS adds to DOS
;These are additional functions available through INT 21H and appear
;as functions E0 hex to EE hex. (calls F0h - FEh are identical)
;If any of these calls to DOS are made when DoubleDOS is NOT running,
;then no function is performed and AL is returned zero by DOS.
;       Note:
;       If your program must run with non PC-DOS Operating Systems
;       then calls E0-EE must be used and not F0-FE. Both ranges
;       are functionally identical.
;
;FUNCTION       -------------------DESCRIPTION----------------------
;
;    E0     DoubleDOS MENU CONTROL FUNCTIONS
;       AL = 1          EXCHANGE VISIBLE & INVISIBLE TASK STATUS
;	AL = 73H	RESUME INVISIBLE JOB IF SUSPENDED
;       AL = 74H        KILL OTHER JOB
;	AL = 75H	SUSPEND INVISIBLE JOB
;
;    E1     CLEAR KEYBOARD BUFFER
;       THIS CALL WILL RESET THE KEYBOARD BUFFER TO EMPTY FOR
;       THE CALLING PROGRAM ONLY.  THIS CALL DOES NOT CLEAR
;       THE STANDARD INPUT BUFFER IF IT IS NOT THE KEYBOARD.
;
;    E2     SEND ASCII CHARACTER IN AL TO OTHER KEYBOARD BUFFER
;       THIS CALL ALLOWS A PROGRAM TO GIVE KEYBOARD INPUT TO
;       ANOTHER PROGRAM, OR TO START ANOTHER PROGRAM IN THE
;       OTHER MEMORY SECTION.  AL RETURNS ZERO IF TRANSFER IS
;       SUCCESSFUL, 1 IF BUFFER IS FULL. KEYBOARD BUFFERS WILL
;       HOLD 128 CHARACTERS MAX
;	NOTE:
;	    IF AL=0FFH THEN THE CHARACTER IN DL AND SCAN CODE
;	IN DH ARE SENT TO THE OTHER TASK
;
;    E3     ADD ASCII CHARACTER IN AL TO KEYBOARD BUFFER
;       THIS CALL ALLOWS A PROGRAM TO ADD CHARACTERS TO ITS
;       OWN KEYBOARD BUFFER.  ERROR RETURN IS SAME AS FOR E2
;       THIS ALLOWS A PROGRAM TO RECIEVE ITS KEYBOARD INPUT
;       FROM BOTH THE KEYBOARD AND ANY OTHER SOURCE(S).
;          PROGRAMMABLE REDIRECTION OF KEYBOARD INPUT CAN
;       BE ACCOMPLISHED BY USING THIS CALL IN CONJUNCTION
;       WITH FUNCTION E8 TO DISABLE THE KEYBOARD (THIS
;       WILL PREVENT UNEXPECTED USER INTERVENTION), AND
;       OPTIONALLY FUNCTION E1 TO FLUSH UNWANTED KEYBOARD
;       INPUT.  WHEN REDIRECTION IS COMPLETED, THE KEYBOARD
;       CAN BE REENABLED WITH FUNCTION E8
;	NOTE:
;	    IF AL=0FFH THEN THE CHARACTER IN DL AND SCAN CODE
;	IN DH ARE ADDED TO THE KEYBOARD BUFFER
;
;    E4     RETURN CURRENT PROGRAM STATUS IN AL:
;       AL = 1  PROGRAM IS VISIBLE
;       AL = 2  PROGRAM IS INVISIBLE
;	AL = ANY OTHER VALUE MEANS DoubleDOS NOT RUNNING
;	AH = TASK NUMBER  (0=TOP; 1=BOTTOM JOB)
;
;    E5     RETURN OTHER PROGRAM STATUS IN AL:
;       AL = 0 NO PROGRAM RUNNING
;       AL = 1 PROGRAM IS RUNNING
;       AL = 2 PROGRAM IS SUSPENDED
;
;    E8     SET KEYBOARD CONTROL FLAGS
;       KEYBOARD CONTROL FLAGS CAN BE RESET BY BITS IN DX
;       AL = 0  TO SET FLAGS FOR THIS PROGRAM
;       AL = 1  TO SET FLAGS FOR OTHER PROGRAM
;
;NOTE:	AL = 2 , 3 AND 4 ARE USED BY OUR CAROUSEL PRODUCT
;
;	AL = 2	SET SPECIAL FUNCTION MODE
;		INPUT:	 DS:SI POINTS TO 8 CHARACTER NAME OF FUNCTION
;	AL = 3	READ SPECIAL FUNCTION MODE
;		OUTPUT:  AL=0 IF NO SPECIAL FUNCTION IS ACTIVE
;			 AL=1 IF SPECIAL MODE IS SET
;			 ES:DI WILL RETURN POINTING TO NAME OF FUNCTION
;	AL=4	CANCEL SPECIAL FUNCTION MODE
;
;	DX =	KEYBOARD CONTROL FLAGS:
;	0001	BIT 0  =  MENU
;	0002	BIT 1  =  EXCHANGE
;	0004	BIT 2  =  ALT/CAPSLOCK (SUSPEND KEY)
;	0008	BIT 3  =  CTRL/C
;	0010	BIT 4  =  CTRL/PRTSC
;	0020	BIT 5  =  ALT/ERASE
;	0040	BIT 6  =  CTRL/BREAK
;	0080	BIT 7  =  CTRL/NUMLOCK
;	0100	BIT 8  =  SHIFT/PRTSC
;	0200	BIT 9  =  CANCEL KEY (CLEAR KEYBOARD BUFFER)
;	0400	BIT 10 =  (UNDEFINED)
;	0800	BIT 11 =  (UNDEFINED)
;	1000	BIT 12 =  (UNDEFINED)
;	2000	BIT 13 =  (UNDEFINED)
;	4000	BIT 14 =  (UNDEFINED)
;	8000	BIT 15 =  ENTIRE KEYBOARD ENABLE/DISABLE
;
;	NOTES:	DISABLING CTRL/PRTSC (BIT 4 = 0) WILL ALLOW THIS
;		KEY SEQUENCE TO BE INTERCEPTED BY APPLICATIONS PROGRAMS.
;		DISABLING ANY OTHER KEY SEQUENCE DISABLES THOSE KEYS
;		COMPLETELY.
;
;               IN ALL CASES A "1" MEANS ENABLE AND A "0" DISABLE
;               BITS 0 & 1 = 0  DISABLE THE KEYBOARD FUNCTIONS ONLY.
;               THEY DO NOT DISABLE FUNCTION F0.
;
;		ON RETURN DX CONTAINS PREVIOUS FLAGS
;
;    E9     SET TIMESHARING PRIORITY
;       AL = 0 VISIBLE PROGRAM GETS 70% INVISIBLE GETS 30% (DEFAULT)
;       AL = 1 VISIBLE PROGRAM GETS 50% INVISIBLE GETS 50% OF TIME
;       AL = 2 VISIBLE PROGRAM GETS 30% INVISIBLE GETS 70% OF TIME
;       AL = 3 TOP PROGRAM GETS 70% BOTTOM PROGRAM GETS 30% OF TIME
;       AL = 4 TOP PROGRAM GETS 30% BOTTOM PROGRAM GETS 70% OF TIME
;	AL = 5 RETURNS CURRENT PRIORITY SETTING IN AL
;
;    EA     THIS CALL PERFORMS INT 0FAH DESCRIBED BELOW
;
;    EB     THIS CALL PERFORMS INT 0FBH DESCRIBED BELOW
;
;    EC     THIS CALL PERFORMS INT 0FCH DESCRIBED BELOW
;
;    ED     RESERVED FOR DoubleDOS
;
;    EE     THIS CALL PERFORMS INT 0FEH DESCRIBED BELOW
;
;  In addition to these DOS function calls, DoubleDOS also reserves
;and defines certain interrupt vectors.

;THE FOLLOWING INTERRUPTS ARE PROVIDED TIME-SHARING:
;0-7,9,10,13-2E,60-67,80-F3,FF
;Each memory section can have a unique address for these

;THE FOLLOWING INTERRUPTS ARE NOT PROVIDED TIME-SHARING:
;8,A-F,11,12,2F-57,68-7F
;Only one memory section at a time can use these

;THE FOLLOWING INTERRUPTS ARE USED BY DoubleDOS AND CANNOT BE REPLACED:
;(NO MATTER HOW HARD YOU TRY)
;58-5F,F4-FE

;Some of the DoubleDOS reserved interrupts may be used directly by programs
;running under DoubleDOS.  Although DoubleDOS provides access to these
;routines through the DOS INT 21H, Critical timing applications may
;incorporate these interrupts directly by one of the following methods:
;
;       1. Do not perform these interrupts if DoubleDOS is not resident
;               or
;       2. Install a default routine for each of the vectors to be used
;          (If DoubleDOS is resident, you can not actually change the
;           contents of vectors F2-FE.  Therefore the DoubleDOS routines
;           and not the default routines would be called.)
;
;Here is the list of interrupts that DoubleDOS installs:

;	INT	58-5F	USED TO INTERCEPT IRQ0-IRQ7 FROM THE MASTER 8259
;			DO NOT ISSUE THESE INTERRUPTS DIRECTLY

;	INT	F4	SWITCH TO OTHER TASK FOR REMAINDER OF CURRENT
;			CLOCK CYCLE PLUS ONE CLOCK CYCLE

;	INT	F5	USED BY DoubleDOS

;	INT	F6	RESERVED FOR FUTURE USE BY DoubleDOS

;	INT	F7-F9	USED BY DoubleDOS
;                       DO NOT ISSUE THESE INTERRUPTS DIRECTLY

;       INT     FA      TURN OFF TIMESHARING, CTRL/BREAK, CTRL/NUMLOCK & MENU
;			(ALSO PERFORMED BY FUNCTION CALLS EA & FA)
;INPUT: NONE.
;OUTPUT:        AFTER THIS INTERRUPT IS ISSUED, THE CALLING PROGRAM
;	WILL HAVE FULL-TIME USE OF ALL SYSTEM RESOURCES UNTIL
;       AN INT 0FBH IS ISSUED.  THIS CALL CAN BE USED FOR
;       TIMING SENSITIVE AND NON-INTERRUPTIBLE ROUTINES,
;       SUCH AS COMMUNICATIONS OR DEVICE CONTROLLERS.
;	THE OTHER MEMORY SECTION IS SUSPENDED BY THIS CALL.
;       DoubleDOS MENU FUNCTIONS, CTRL/BREAK AND CTRL/NUMLOCK
;       ARE DISABLED BY THIS CALL.  A REQUEST FOR ANY OF THESE
;       WILL BE SAVED AND PROCESSED AFTER INT 0FBH IS ISSUED.
;       ANY DOS FUNCTION LESS THAN 0DH WILL AUTOMATICALLY
;       TERMINATE THIS MODE AS IF INT 0FBH HAD BEEN ISSUED

;       INT     FB      TURN ON TIMESHARING, ETC.
;			(ALSO PERFORMED BY FUNCTION CALL EB & FB)
;INPUT: NONE.
;OUTPUT:        THIS CALL HAS NO FUNCTION UNLESS AN INT FA HAS OCCURED, THEN
;       NORMAL DoubleDOS TIMESHARING FUNCTIONS ARE RESTORED, THE
;       OTHER MEMORY SECTION IS NO LONGER SUSPENDED, THE DoubleDOS
;       MENU, CTRL/BREAK, CTRL/NUMLOCK WILL BE OPERATIONAL.
;       IF MORE THAN ONE INT FA WAS ISSUED, ALL WILL BE CANCELED
;       BY ONE INT FB

;	INT	FC	RETURN CURRENT DISPLAY BUFFER ADDRESS IN ES
;			(ALSO PERFORMED BY FUNCTION CALL EC & FC)
;INPUT: NONE.
;OUTPUT:	THE SEGMENT ADDRESS OF THE CURRENT DISPLAY BUFFER IS RETURNED
;       IN THE ES REGISTER.  THIS FUNCTION IS USED FOR PROGRAMS
;       WHICH DO DIRECT SCREEN UPDATES, SUCH AS 1-2-3.
;       THE ADDRESSES RETURNED WILL BE:
;               B800H   IF PROGRAM IS VISIBLE ON COLOR ADAPTER
;               B000H   IF PROGRAM IS VISIBLE ON MONOCHROME ADAPTER
;               XXXXH   IF PROGRAM IS INVISIBLE (ADDRESS OF VIRTUAL BUFFER)
;
;	INT	FD	USED BY DoubleDOS
;			DO NOT ISSUE THIS INTERRUPT DIRECTLY
;
;       INT     FE      GIVE TIME TO OTHER TASK
;                       (ALSO PERFORMED BY FUNCTION CALL FE)
;INPUT: AL = 0-0FFH     NUMBER OF 55ms TIME INTERVALS TO GIVE AWAY
;
;OUTPUT:        ON THE NEXT TIMER INTERRUPT FOLLOWING THIS CALL,
;       IF THE OTHER MEMORY SECTION IS ACTIVE, IT WILL RECEIVE
;       AL EXTRA 55ms TIME INTERVALS BEFORE THE CALLING PROGRAM
;       WILL RECEIVE ANOTHER INTERVAL.  A LOOP OF THESE CALLS
;       WILL ALLOW THE CALLING PROGRAM TO GIVE ALL OF ITS
;       WASTED TIME TO THE OTHER MEMORY SECTION.  PROGRAMS
;       WAITING FOR KEYBOARD INPUT COULD DO THE FOLLOWING:
;
;       KEYLOOP:        MOV     AH,1
;                       INT     16H             ;GET KEYBOARD STATUS
;                       JNZ     HAVE_ONE        ;A KEY WAS STUCK
;                       CALL    DO_ANYTHING     ;REST OF PROCESS LOOP
;
;       **** HERES A GOOD PLACE TO GIVE SOME TIME TO THE OTHER TASK
;
;                       MOV     AL,2    ;GIVE EXTRA 110ms TO OTHER TASK
;                       INT     0FEH    ;OTHER TASK ALSO GETS UNUSED PORTION
;                                       ;OF CURRENT CLOCK CYCLE
;                       JMP     KEYLOOP ;OTHER TASK HAS ALREADY RUN
;
;NOTE:	THIS INTERRUPT WILL NOT GUARANTEE THAT THE REQUESTED TIME
;       WILL ACTUALLY BE SPENT BY THE OTHER PROGRAM. IF THE OTHER
;       PROGRAM IS ALSO "GIVING AWAY TIME" DOING KEYBOARD INPUT, PRINTING
;       ETC. THEN YOUR ROUTINE WILL STILL RECEIVE ALL UNUSED PROCESSING
;       TIME, ie WHEN THE OTHER TASK DOES INT 0FEH IT WILL FORCE AN
;       IMMEDIATE RETURN FROM THE INT 0FEH IN YOUR PROGRAM.
;       DoubleDOS USES THIS ROUTINE TO FACILITATE OVERLAPPED
;       PROCESSING WHEN WAITING FOR DEVICES TO RESPOND

;DoubleDOS VIDEO ROUTINES (INT 10H):
;       The BIOS replacement video handler built into DoubleDOS is
;   enhanced to provide all features of the IBM PC-AT video handler
;   including the WRITE STRING function, as well as all INT 10H video
;    features built into the IBM TOPVIEW product.  these features are
;   syntactically identical to their IBM counterparts.

;This is the source code for the "SWITCH.EXE" program supplied on your
;DoubleDOS disk.  This program can be included in batch files to perform
;some of the DoubleDOS menu functions.  It is included as an example of
;how to use the DoubleDOS extended function set.

;PROGRAM OPTIONS:
;
;SWITCH/I               WILL MAKE THIS MEMORY SECTION INVISIBLE
;SWITCH/V               WILL MAKE THIS MEMORY SECTION VISIBLE
;SWITCH                 WILL EXCHANGE THE VISIBLE/INVISIBLE SECTIONS
;
;NOTE:  THE TERM "VISIBLE" MEANS "HAS KEYBOARD ATTACHED"
;       THE TERM "INVISIBLE" MEANS "NO KEYBOARD ATTACHED"

NAME    SWITCH


CODE    SEGMENT

ASSUME  CS:CODE,DS:CODE,SS:STACK

        ORG     100H

START:
        PUSH    ES
        POP     DS              ;LOOK FOR OPTIONS
        MOV     SI,80H          ;AT PSP+80H
        CLD
        LODSB                   ;GET THE COUNT BYTE
        CBW
        MOV     CX,AX           ;NUMBER OF CHARACTERS TO TEST
        JCXZ    EXCHANGE        ;NO OPTION IS UNCONDITIONAL EXCHANGE
LOOKOPT:LODSB                   ;GET NEXT OPTION BYTE
        CMP     AL,60H          ;CONVERT ALL ALPHA CHARS TO UPPER CASE
        JB      UPPER_CASE      ;FOR TEST
        SUB     AL,20H
UPPER_CASE:
        CMP     AL,'I'          ;TEST FOR "MAKE INVISIBLE"
        JE      MAKE_INVISIBLE
        CMP     AL,'V'          ;TEST FOR "MAKE VISIBLE"
        JE      MAKE_VISIBLE
	CMP	AL,'F'		;TEST FOR CTRL/PRTSC "OFF"
	JE	PRTSC_OFF
	CMP	AL,'N'		;TEST FOR CTRL/PRTSC "ON"
	JE	PRTSC_ON
        LOOP    LOOKOPT         ;LOOK AT ALL CHARACTERS ENTERED

EXCHANGE:                       ;EXCHANGE VISIBLE AND INVISIBLE SECTIONS
	MOV	AX,0E001H
        INT     21H             ;CALL DoubleDOS KEYBOARD EXCHANGE
ALL_DONE:
        MOV     AH,4CH          ;TERMINATE
        INT     21H
        JMP     $

MAKE_VISIBLE:
	MOV	AH,0E4H 	;GET KEYBOARD STATUS
        INT     21H             ;FROM DoubleDOS
        CMP     AL,1            ;ARE WE VISIBLE ?
        JNZ     EXCHANGE        ;NO  - EXCHANGE KEYBOARD
        JMP     ALL_DONE        ;YES - NO ACTION REQUIRED

MAKE_INVISIBLE:
	MOV	AH,0E4H 	;GET KEYBOARD STATUS
        INT     21H             ;FROM DoubleDOS
        CMP     AL,2            ;ARE WE INVISIBLE ?
        JNZ     EXCHANGE        ;NO  - EXCHANGE KEYBOARD
        JMP     ALL_DONE        ;YES - NO ACTION REQUIRED

PRTSC_OFF:
	MOV	AX,0E800H	;SET KEYBOARD FLAGS FOR THIS JOB
	MOV	DX,0		;SET ALL KEYBOARD FLAGS OFF
	INT	21H		;FIRST CALL WILL RETURN FLAGS IN DX
	AND	DX,0FFEFH	;TURN OFF BIT FOR CTRL/PRTSC
	INT	21H		;RESET KEYBOARD FLAGS
	JMP	ALL_DONE

PRTSC_ON:
	MOV	AX,0E800H	;SET KEYBOARD FLAGS FOR THIS JOB
	MOV	DX,0		;SET ALL KEYBOARD FLAGS OFF
	INT	21H		;FIRST CALL WILL RETURN FLAGS IN DX
	OR	DL,10H		;ENABLE CTRL/PRTSC BIT
	INT	21H		;RESET KEYBOARD FLAGS
	JMP	ALL_DONE

CODE    ENDS

STACK   SEGMENT STACK
        DB      100H DUP(0)
STACK   ENDS
        END     START



;IF YOU ARE HAVING PROBLEMS, OR WOULD LIKE FURTHER ASSISTANCE:
;CALL 603-644-5555 9:00 - 17:00 est. ask for DoubleDOS technical support
;       or write
;                       SoftLogic Solutions Incorporated
;                       530 Chestnut street
;			Manchester, NH	    03101
