;COPYRIGHT 1984 BY ABComputing
;
;    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;    ³									 ³
;    ³	 "GRABBAG"  CONTAINS  AN UNANNOUNCED PROGRAM; IT CAN BE IN ANY   ³
;    ³	 LANGUAGE, AND ON ANY SUBJECT.					 ³
;    ³									 ³
;    ³	 $25 AND LAURELS IF YOUR PROGRAM IS SELECTED!			 ³
;    ³									 ³
;    ³	 THIS GRABBAG WAS WRITTEN BY BILL SALKIN  1/5/83		 ³
;    ³									 ³
;    ³	 THE EXECUTABLE VERSION OF THIS CODE IS IN GRABBAG.EXE ON THIS	 ³
;    ³	 DISKETTE.							 ³
;    ³									 ³
;    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;
;    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;    ³									 ³
;    ³	 THIS GRABBAG ALLOWS USERS OF A COLOR MONITOR TO CHANGE EITHER	 ³
;    ³	 THE FOREGROUND OR BACKGROUND COLOR OF THE DISPLAY BY PRESSING	 ³
;    ³	 THE F1 OR F2 FUNCTION KEYS, RESPECTIVELY. THE BORDER COLOR IS	 ³
;    ³	 SET TO EQUAL THE BACKGROUND COLOR.				 ³
;    ³									 ³
;    ³	 F10 IS PRESSED TO EXIT THIS PROGRAM AND RETURN TO DOS. 	 ³
;    ³									 ³
;    ³	 THE  FOREGROUND  AND  BACKGROUND  COLORS  ESTABLISHED IN THIS	 ³
;    ³	 ROUTINE  ARE NOT RESET UPON EXIT TO DOS. THIS ALLOWS THE USER	 ³
;    ³	 TO  DISCOVER  PLEASANT  COLOR COMBINATIONS AND USE THEM UNDER	 ³
;    ³	 DOS.								 ³
;    ³									 ³
;    ³	 THE ROUTINE COLORFUL.EXE, ON  THIS  DISKETTE,	 FEATURES  ONE	 ³
;    ³	 ADDITIONAL  OPTION: PRESSING F3 ALLOWS THE USER TO ADJUST THE	 ³
;    ³	 BORDER  COLOR. (  THAT ROUTINE WAS AN AFTERTHOUGHT - DESIGNED	 ³
;    ³	 FOR THOSE  NOT USING AN  ASSEMBLER  BUT  WANTING  FULL  COLOR	 ³
;    ³	 CONTROL.)							 ³
;    ³									 ³
;    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;
;    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;    ³									 ³
;    ³	 THIS  GRABBAG ACCESSES THE HARDWARE DIRECTLY!			 ³
;    ³									 ³
;    ³	 DESIGN  DOCUMENTATION	EXPLAINING THIS GRABBAG WILL APPEAR IN	 ³
;    ³	 THE NEXT ISSUE OF PCFL.					 ³
;    ³									 ³
;    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;
;		     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;		     ³ File Name:  ÛÛ  grabbag.txt  ÛÛ	³
;		     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;
;------------------------------------------------------------------------------
F1	 EQU   59		   ;SCAN CODE FOR F1 KEY
F2	 EQU   60		   ;SCAN CODE FOR F2 KEY
F10	 EQU   68		   ;SCAN CODE FOR F10 KEY

NO	 EQU   0
YES	 EQU   1

;------------------------------------------------------------------------------
DATA	 SEGMENT PARA

    ATTRIBUTE	    DB	7	   ;COLOR ATTRIBUTE
    BACKGROUND	    DB	0	   ;BACKGROUND COLOR OF SCREEN
    COLOR_CARD	    DB	NO	   ;= "YES" IF COLOR ADAPTER FOUND; ELSE "NO"
    CRT_MODE_SET    DB	0	   ;NEEDED TO TURN CRT BEAM ON
    DISPLAY_ADDRESS DW	0B000H	   ;HOLDS ADDRESS OF DISPLAY RAM
    EXIT	    DB	NO	   ;EXIT = "YES"  MEANS RETURN TO DOS
    EXT_CODE	    DB	NO	   ;= "YES"  IF EXTENDED CODE KEY PRESSED
				   ;= "NO" IF NON-EXTENDED CODE KEY PRESSED
    FOREGROUND	    DB	0	   ;FOREGROUND COLOR OF SCREEN
    KEYIN	    DB	0	   ;HOLDS SCAN CODE OF KEY PRESSED


;--THE PANEL "MSG" ID DISPLAYED ON THE SCREEN.

    MSG 	    DB	'Grabbag #1. Copyright 1984 by ABComputing'
		    DB	39 DUP(' ')   ;LAZY MAN'S APPROACH TO MOVE
		    DB	80 DUP(' ')   ; THE CURSOR.

		    DB	'     Press F1 to modify the foreground color'
		    DB	36 DUP(' ')   ;LAZY MAN'S APPROACH TO MOVE CURSOR


		    DB	'     Press F2 to modify the background color'
		    DB	36 DUP(' ')   ;LAZY MAN'S APPROACH TO MOVE CURSOR

		    DB	'     Press F10 to exit this program','$'

;--MESSAGE DISPLAYED IF MONOCHROME CARD FOUND.


    FARWELL	    DB	7	      ;BEEP TO ALERT USER
		    DB	'This program needs the color adapter. Sorry!','$'


DATA	 ENDS
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
STACK	 SEGMENT PARA  STACK  'STACK'

	 DB    40H  DUP('STCK')

STACK	 ENDS
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
CODE	 SEGMENT PARA
ASSUME	 CS:CODE, DS:DATA, SS:STACK, ES:NOTHING


;--STANDARD LINKAGE TO DOS

MAIN	 PROC  FAR	       ;STANDARD LINKAGE TO DOS
	 PUSH  DS	       ; DO
	 MOV   AX,0	       ;	  NOT
	 PUSH  AX	       ;		    ALTER!
	 MOV   AX,DATA
	 MOV   DS,AX


;--ROUTINE   INIT  CHECKS  WHICH  DISPLAY  ADAPTER  IS	INSTALLED.  IF
;  MONOCHROME,	THEN COLOR_CARD IS SET = NO. IF COLOR_CARD = YES, THEN
;  DISPLAY_ADDRESS  IS	SET  =	0B800H, AND THE SCREEN MODE IS SET FOR
;  80x25 ALPHANUMERIC COLOR MODE ( NOTE: SETTING THE SCREEN MODE AUTO-
;  MATICALLY CLEARS THE SCREEN AND CAUSES THE CURSOR TO BE DISPLAYED.)

	 CALL  INIT
	 CMP   COLOR_CARD,YES  ;IF COLOR_CARD = YES, THEN CONTINUE
	 JE    MAI1	       ; CONTINUE PROGRAM

	 CALL  GOOD_BYE        ;DISPLAY FARWELL MESSAGE
	 JMP   MAI3	       ; CLEAR SCREEN AND RETURN TO DOS


;--CLEAR THE SCREEN


MAI1:	 CALL  CLEAR


;--ROUTINE  CUR_OFF  TURNS  THE CURSOR DISPLAY OFF. IT IS CALLED AFTER
;  ROUTINE INIT, AS SETTING THE MODE TURNS THE CURSOR DISPLAY ON.


	 CALL  CUR_OFF


;--DISPLAY  THE  PANEL	"MSG"  (  Press  F1  to  modify the foreground
;  color... )


	 CALL  DISPLAY


;--GET_KEY  RETURNS THE SCAN CODE OF THE PRESSED KEY IN KEYIN. ROUTINE
;  KEYS  CALLS	THE SUBROUTINES THAT CHANGE THE FOREGROUND,BACKGROUND,
;  AND BORDER COLORS.


MAI2:	 CALL  GET_KEY

	 CALL  KEYS	       ;HANDLE F1, F2, F10 KEY PRESSES


	 CALL  CLEAR	       ;SET BACKGROUND OF SCREEN TO DESIRED
			       ; COLOR


	 CALL  DISPLAY	       ;DISPLAYS THE PANEL "MSG"


	 ;--PRESSING  F10  IN  KEYS  SETS  EXIT  = YES INDICATING THAT
	 ;  PROGRAM TERMINATION IS WANTED.

	 CMP   EXIT,YES

	 JNE   MAI2	       ;IF EXIT = NO, THEN WAIT FOR NEXT KEY


;--RETURN  TO  DOS.  PURPOSELY	DO NOT RESET COLOR ATTRIBUTE. MAINTAIN
;  COLORS USED FOR DOS.

	 CALL  CUR_ON

	 CALL  CLEAR	       ;CLEAR THE SCREEN

MAI3:	 RET
;------------------------------------------------------------------------------
;
;    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;    ³									 ³
;    ³		 FROM THIS PORTION ONWARD ALL ROUTINES ARE		 ³
;    ³		 LISTED ALPHABETICALLY BY NAME. 			 ³
;    ³									 ³
;    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
;
;------------------------------------------------------------------------------
;ROUTINE BACK_GROUND
;
;   BRIEF:
;	 INCREMENTS  `BACKGROUND'  BY ONE. IF BACKGROUND IS NOT IN THE
;	 RANGE 0 <= BACKGROUND <= 7 , THEN BACKGROUND IS SET = 0.
;
;   INPUT:
;	 VALUE OF BACKGROUND
;
;   OUTPUT:
;	 ATTRIBUTE CORRESPONDING TO INCREMENTED VALUE OF BACKGROUND
;------------------------------------------------------------------------------

BACK_GROUND PROC  NEAR

	 INC   BACKGROUND
	 CMP   BACKGROUND,7    ;7 IS MAX ALLOWED BACKGROUND COLOR
	 JBE   BAC1

	 ;--BACKGROUND IS > 7. RESET IT TO 0.

	 MOV   BACKGROUND,0

BAC1:	 CALL  SET_COLOR       ;DETERMINES "ATTRIBUTE"  VALUE FOR OLD
			       ; FOREGROUND NEW BACKGROUND SETTINGS.

	 RET

BACK_GROUND ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE CLEAR
;
;   BRIEF:
;	 CLEARS THE SCREEN
;
;   INPUT:
;	 ATTRIBUTE
;------------------------------------------------------------------------------

CLEAR	 PROC  NEAR

	 MOV   AH,6	       ;REQUEST SCROLL SCREEN SERVICE
	 MOV   AL,0	       ;SCROLL ENTIRE SCREEN
	 MOV   BH,ATTRIBUTE    ;BACKGROUND ATTRIBUTE
	 MOV   CX,0000H        ;UPPER  LEFT CORNER OF SCREEN (0,0 )
	 MOV   DX,184FH        ;LOWER RIGHT CORNER OF ( 24,79 )
	 INT   10H	       ;INVOKE SCROLL SCREEN SERVICE

	 RET

CLEAR	 ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE CUR_OFF
;
;   BRIEF:
;	 TURNS THE CURSOR DISPLAY OFF
;
;------------------------------------------------------------------------------
CUR_OFF  PROC  NEAR

	 PUSH  AX
	 PUSH  CX

;--SETTING BIT 5 TO 0 TURNS IN CH TURNS THE CURSOR OFF.

	 MOV   CH,00100000B    ;SET BIT 5 IN CURSOR START REGISTER TO 1

	 MOV   AH,1	       ;REQUEST "NON DISPLAY" SERVICE
	 INT   10H	       ;INVOKE "NON DISPLAY" SERVICE

	 POP   CX
	 POP   AX

	 RET

CUR_OFF  ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE CUR_ON
;
;   BRIEF:
;	 TURNS THE CURSOR DISPLAY ON FOR COLOR MONITORS
;
;------------------------------------------------------------------------------
CUR_ON	 PROC  NEAR

	 PUSH  AX
	 PUSH  CX

	 MOV   AH,1	       ;REQUEST "SET CURSOR TYPE" SERVICE
	 MOV   CL,7	       ;END SCAN LINE = 7 DECIMAL FOR COLOR
	 MOV   CH,6	       ;START SCAN LINE = 6 DECIMAL COLOR
	 INT   10H	       ;INVOKE "SET CURSOR TYPE" SERVICE

	 POP   CX
	 POP   AX

	 RET

CUR_ON	 ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE DISPLAY
;
;   BRIEF:
;	 DISPLAYS  THE	PANEL  POINTED TO BY MSG ( `Press F1 to modify
;	 foreground color...Press F2....' ).
;
;   INPUT:
;	 ATTRIBUTE, DISPLAY_ADDRESS
;
;   OUTPUT:
;	 THE  PANEL  POINTED TO BY MSG IS DISPLAYED WITH THE FOREGROUND
;	 AND BACKGROUND GIVEN IN ATTRIBUTE.
;------------------------------------------------------------------------------

DISPLAY  PROC  NEAR

	 PUSH  AX
	 PUSH  BX
	 PUSH  CX
	 PUSH  DI
	 PUSH  ES
	 PUSH  SI

;--SET	UP  ES,  DI, SI, AND AL FOR STOSB OPERATION TO MOVE "MSG" INTO
;  THE VIDEO RAM AREA.

	 ;--MAKE ES:DI ->DISPLAY_ADDRESS

	 MOV   BX,DISPLAY_ADDRESS
	 MOV   ES,BX

	 MOV   DI,0

	 ;--SET SI, SO DS:SI -> MSG

	 MOV   SI,OFFSET MSG


	 MOV   AL,ATTRIBUTE


	 ;--SET  DIRECTION  FLAG  TO  AUTO  INCREMENT  SI,DI IN STRING
	 ;  OPERATIONS

	 CLD


;--TURN  THE  CRT  BEAM  OFF  DURING  VERTICAL RETRACE PERIOD TO AVOID
;  "SNOW" ON COLOR MONITOR.

	 CALL  VIDEO_OFF


;--MOVE `MSG' INTO VIDEO RAM.

DIS1:	 MOVSB		       ;MOVES DS:SI -> ES:DI ( MSG  TO SCREEN)
			       ; INCREMENTS SI AND DI BY ONE

	 STOSB		       ;MOVES AL ( ATTRIBUTE BYTE ) TO ES:DI
			       ; AND INCREMENTS DI ONLY

	 CMP   BYTE PTR[SI],'$' ;'$' IS STRING TERMINATOR.IF [SI] -> $,
	 JNE   DIS1		; THEN MSG HAS BEEN DISPLAYED.

;--TURN THE BEAM ON

	 CALL  VIDEO_ON

	 POP   SI
	 POP   ES
	 POP   DI
	 POP   CX
	 POP   BX
	 POP   AX

	 RET

DISPLAY  ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE  FORE_GROUND
;
;   BRIEF:
;	 INCREMENTS  "FOREGROUND"  BY ONE. IF FOREGROUND IS NOT IN THE
;	 RANGE 0 <= FOREGROUND <= 15 THEN FOREGROUND IS SET = 0.
;
;   INPUT:
;	 FOREGROUND
;
;   OUTPUT:
;	 ATTRIBUTE CORRESPONDING TO NEW VALUE OF FOREGROUND
;------------------------------------------------------------------------------

FORE_GROUND  PROC  NEAR

	 INC   FOREGROUND
	 CMP   FOREGROUND,15	;15 IS MAX ALLOWED FOREGROUND COLOR
	 JBE   FOR1

	 ;--FOREGROUND > 15, SO RESET IT TO 0.

	 MOV   FOREGROUND,0

FOR1:	 CALL  SET_COLOR       ;DETERMINE "ATTRIBUTE" VALUE FOR OLD
			       ; BACKGROUND, NEW FOREGROUND VALUES.

	 RET

FORE_GROUND  ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE GET_KEY
;
;   BRIEF:
;	 RETURNS SCAN CODE OF KEY PRESSED. KEY NOT ECHOES ON SCREEN.
;
;   INPUT:
;	 NONE. WAITS FOR A KEY TO BE PRESSED,
;
;   OUTPUT:
;	 EXT_CODE     SET TO "YES" IF AN EXTENDED CODE KEY PRESSED;
;		      ELSE "NO".
;
;	 KEYIN	      CONTAINS THE SCAN CODE OF THE KEY PRESSED.
;------------------------------------------------------------------------------

GET_KEY  PROC  NEAR

	 PUSH  AX

	 MOV   EXT_CODE,NO     ;ASSUME NON EXTENDED CODE KEY PRESSED

	 MOV   AH,0	       ;INTERRUPT FOR KEYBOARD INPUT
	 INT   16H

	 CMP   AL,0	       ;AL = 0 MEANS AN EXTENDED CODE
	 JE    GET1

;-- A NON-EXTENDED KEY WAS STRUCK

	 MOV   KEYIN,AL        ;MOVE SCAN CODE # INTO KEYIN
	 POP   AX
	 RET

;-- AN EXTENDED KEY WAS STRUCK

GET1:	 MOV   EXT_CODE,YES    ;SET EXTENDED CODE INDICATOR
	 MOV   KEYIN,AH        ;MOVE SCAN CODE INTO `KEYIN'
	 POP   AX
	 RET

GET_KEY  ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE GOOD_BYE
;
;   BRIEF:
;	 DISPLAYS  MESSAGE  `This  program  needs  the	color adapter.
;	 Sorry!'
;
;   INPUT:
;	 FARWELL ( DEFINED IN OUR DATA SEGMENT )
;
;   OUTPUT:
;	 FARWELL MESSAGE IS DISPLAYED.
;------------------------------------------------------------------------------

GOOD_BYE PROC  NEAR

	 PUSH  AX
	 PUSH  DX

	 ;--BEEP USER AND DISPLAY FARWELL MESSAGE

	 MOV   AH,9	       ;REQUEST "PRINT STRING" SERVICE
	 MOV   DX,OFFSET FARWELL  ;DX POINTS TO FARWELL
	 INT   21H	       ;INVOKE "PRINT STRING" SERVICE

	 POP   DX
	 POP   AX

	 RET

GOOD_BYE ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE INIT
;
;   BRIEF:
;	 CHECKS  FOR COLOR ADAPTER. IF FOUND THEN SETS DISPLAY_ADDRESS
;	 =  B800H,  COLOR  =  1,  FOREGROUND = WHITE, AND BACKGROUND =
;	 BLACK. ATTRIBUTE IS ALSO SET.
;
;   INPUT:
;	 NONE
;
;   OUTPUT:
;	 ATTRIBUTE,  BACKGROUND, COLOR, CRT_MODE_SET, DISPLAY_ADDRESS,
;	 FOREGROUND
;------------------------------------------------------------------------------

INIT	 PROC  NEAR

	 PUSH  AX
	 PUSH  DI
	 PUSH  ES
	 PUSH  SI

;--INT11   IS	THE   EQUIPMENT   DETERMINATION   INTERRUPT.  EQUIPMENT
;  INFORMATION	IS  RETURNED IN THE AX REGISTER. BITS 4 AND 5 = 1 FOR A
;  MONOCHROME CARD.

	 ;--ASSUME B&W EQUIPMENT

	 MOV   DISPLAY_ADDRESS,0B000H
	 MOV   COLOR_CARD,NO

	 INT   11H
	 AND   AX,0000000000110000B	;BITS 4 AND 5 ARE ON
	 CMP   AX,00110000B
	 JE    INI1	       ;EQUALITY MEANS B&W CARD.


;--POINT DISLAY_ADDRESS TO COLOR VIDEO RAM

	 MOV   COLOR_CARD,YES  ;COLOR ADAPTER PRESENT
	 MOV   DISPLAY_ADDRESS,0B800H

	 ;--TECH. REF.MANUAL SUGGESTS TURNING VIDEO OFF WHEN CHANGING
	 ;  MODE ( THIS REDUCES BOUNCING OF PANEL ON SCREEN ).

	 CALL  VIDEO_OFF

	 ;--SET MODE TO 80x25 ALPHA COLOR MODE.

	 MOV   AH,0	       ;REQUEST SET MODE SERVICE
	 MOV   AL,3	       ;80x25 ALPHA COLOR MODE SPECIFIED
	 INT   10H	       ;INVOKE SET MODE SERVICE


	 ;--MODE SET ACCOMPLISHED. TURN BEAM ON.

	 CALL  VIDEO_ON

	 ;--SET  FOREGROUND  AND  BACKGROUND COLORS TO WHITE ( 15) AND
	 ;  BLACK (0) RESPECTIVELY.

	 MOV   FOREGROUND,15
	 MOV   BACKGROUND,0
	 CALL  SET_COLOR       ;RETURNS THE VALUE ATTRIBUTE


;--GET VALUE OF CRT_MODE_SET VALUE

	 ;--MAKE ES:DI -> CRT_MODE_SET IN OUR DATA SEGMENT

	 MOV   AX,SEG CRT_MODE_SET
	 MOV   ES,AX			;ES = SEGMENT OF CRT_MODE_SET
	 MOV   DI,OFFSET CRT_MODE_SET	;ES:DI ->CRT_MODE_SET


	 ;--MAKE DS:SI -> CRT_MODE_SET AS DETERMINED BY SET MODE ENTRY
	 ;  POINT  OF  VIDEO_IO  ).  CRT_MODE_SET  RESIDES AS ABSOLUTE
	 ;  ADDRESS 465H = 40:65.

	 PUSH  DS
	 MOV   AX,40H
	 MOV   DS,AX	       ;DS = 40H

	 MOV   SI,65H	       ;DS:SI = 40:65 = CRT_MODE_SET IN LOW RAM
	 MOVSB		       ;MOVE DS:SI  -> CRT_MODE_SET IN OUR DATA SEG.
	 POP   DS

INI1:	 POP   SI
	 POP   ES
	 POP   DI
	 POP   AX


	 RET

INIT	 ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE KEYS
;
;   BRIEF:
;	 CALLS ROUTINES TO ADJUST THE FOREGROUND, OR BACKGROUND COLOR
;
;   INPUT:
;	 KEYIN -  THE SCAN CODE OF THE KEY STRUCK
;
;   OUTPUT:
;	 FOREGROUND OR BACKGROUND COLOR IS ADJUSTED. SETS EXIT = "YES"
;	 IF F10 PRESSED.
;------------------------------------------------------------------------------

KEYS	 PROC  NEAR

	 CMP   KEYIN,F1        ;F1 KEY( FOREGROUND )
	 JNE   KEY1
	 CALL  FORE_GROUND
	 RET

KEY1:	 CMP   KEYIN,F2        ;F2 KEY (BACKGROUND )
	 JNE   KEY2
	 CALL  BACK_GROUND
	 RET

KEY2:	 CMP   KEYIN,F10       ;F10 HIT?
	 JNE   KEY3
	 MOV   EXIT,YES        ;YES! INDICATE RETURN TO DOS WANTED

KEY3:	 RET

KEYS	 ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE  SET_COLOR
;
;   BRIEF:
;	 DETERMINES   VALUE  OF  ATTRIBUTE  BASED  ON  FOREGROUND  AND
;	 BACKGROUND. SET_COLOR SETS BORDER COLOR = BACKGROUND COLOR.
;
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
;	 SEE TECH REFERNCE MANUAL FOR DETAILED EXPLANATION.
;
;	 2 BYTE CHARACTER DESCRIPTOR FOR COLOR DISPLAY IN ALPHANUMERIC
;	 MODE.
;
;    -----------------------------------------------------------------
;    |< -------- CHARACTER --------->| X | R | G | B | I | R | G | B |
;    -----------------------------------------------------------------
;				      <--------- ATTRIBUTE ---------->
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
;	 ATTRIBUTE
;
;	 BACKGROUND.........   ................... FOREGROUND
;			   V   V	   V
;	     ---------------------------------
;	     | X | R | G | B | I | R | G | B |
;	     ---------------------------------
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
;
;	 COLOR	SELECT REGISTER ( WRITE ONLY - HAS ADDRESS 3D9H ) USED
;	 TO ADJUST BORDER COLOR
;
;	 BACKGROUND INTENSITY.....    .................. SCREEN BORDER
;				 V    V 	  V
;		     ---------------------------------
;		    | X | X | X |BI | I | R | G | B |
;		     ---------------------------------
;
;------------------------------------------------------------------------------

SET_COLOR  PROC  NEAR

	 PUSH  AX
	 PUSH  CX
	 PUSH  DX

;--DETERMINE VALUE OF ATTRIBUTE FROM FOREGROUND AND BACKGROUND.

	 ;--SHIFT BACKGROUND INTO UPPER NIBBLE OF AL REGISTER

	 MOV   AL,BACKGROUND
	 MOV   CL,4	       ;SHIFT BACKGROUND 4 BITS TO LEFT
	 SHL   AL,CL

	 ;--PUT FOREGROUND IN LOWER NIBBLE, AND SAVE IN  ATTRIBUTE

	 ADD   AL,FOREGROUND
	 MOV   ATTRIBUTE,AL

;--SET THE BORDER COLOR TO THAT OF THE BACKGROUND.

	 MOV   DX,3D9H	       ;3D9 = COLOR SELECT REGISTER
	 MOV   AL,BACKGROUND   ;BORDER COLOR = BACKGROUND
	 OUT   DX,AL

	 POP   DX
	 POP   CX
	 POP   AX

	 RET

SET_COLOR  ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE VIDEO_OFF
;
;   BRIEF:
;	 TURNS	THE  VIDEO BEAM OFF DURING VERTICAL RETRACE PERIOD. IF
;	 THIS  IS  NOT	DONE  WHILE  WRITING  TO VIDEO RAM THEN "SNOW"
;	 RESULTS.
;
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
;   STATUS REGISTER   ( 4 BIT READ ONLY  - 3DAH )
;
;	     ---------------------------------
;	     | X | X | X | X | 1 | X | X | X |
;	     ---------------------------------
;	 A  ONE  IN  THE POSITON SHOWN => VIDEO RAM ACCESS CAN BE MADE
;	 WITHOUT INTERFERING WITH THE DISPLAY.
;
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
;	 MODE SELECT REGISTER ( 6 BIT WRITE ONLY. ADDRESS: 3D8H )
;
;			   .. DISABLES VIDEO WHEN 0
;			   V
;	     ---------------------------------
;	     | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |	 = 25H
;	     ---------------------------------
;	 25H  => 80x25 COLOR ALPHA MODE, BEAM OFF
;
;------------------------------------------------------------------------------

VIDEO_OFF PROC	NEAR

	 PUSH  AX
	 PUSH  DX

;--WAIT FOR VERTICAL RETRACE

	 MOV   DX,3DAH

VID1:	 IN    AL,DX
	 TEST  AL,8
	 JZ    VID1

;--VERTICAL RETRACE HAS BEGUN, SO TURN VIDEO OFF

	 MOV   AL,00100101B
	 MOV   DX,3D8H
	 OUT   DX,AL

	 POP   DX
	 POP   AX

	 RET

VIDEO_OFF ENDP
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
;ROUTINE  VIDEO_ON
;
;   BRIEF:
;	 TURNS THE VIDEO BEAM ON TO REDISPLAY THE SCREEN.
;
;	 SEE ROUTINE VIDEO_OFF FOR REGISTER VALUES
;
;   INPUT:
;	 CRT_MODE_SET
;------------------------------------------------------------------------------

VIDEO_ON PROC  NEAR

	 PUSH  AX
	 PUSH  DX

	 MOV   AL,CRT_MODE_SET
	 MOV   DX,3D8H
	 OUT   DX,AL

	 POP   DX
	 POP   AX

	 RET

VIDEO_ON ENDP
;------------------------------------------------------------------------------

MAIN	 ENDP		       ;END of Procedure MAIN

CODE	 ENDS		       ;END of CODE segment

END	 MAIN		       ;END of routine MAIN
w word of timer ticks				      ³
³    ³	   note: the clock