'===========================================================================
' Subject: PLAIN TEXT EDITOR                  Date: 06-28-96 (08:37)       
'  Author: Edward Blake                       Code: QB, PDS                
'  Origin: eblake2@quebectel.com            Packet: TEXT.ABC
'===========================================================================
'
' 1996 Edward Blake (14 years old), Plain Text Editor v7.0
' maybe its called Editor7.bas, I called it like that because I have a
' Editor1 , Editor2, Editor3... all very limited and bug infested!!
' But this shouldnt have too many bugs, but you might want to use it
' for something.. I modifie it for certain purposes, I made a version
' for my Turbo Assembler, I simply changed the Custom command and rename
' it to "Assemble" (i'm too lazy to type Tasm then Tlink all the time).
' Can serve as a IDE or a not-so-convenient editor.
' used Microsoft QuickBasic 4.5 as Compiler, Minor\Major Change might
' be needed to Interpret\Compile under another Implementation.
' Remember to have the QB library, because I need to make interrupts
' for the mouse.
'
' Declarations of sub routines
DECLARE SUB BCKGND ()                     ' BackGround Routine
DECLARE SUB WIN (X1!, Y1!, X2!, Y2!, A$)  ' Text Windowing routine
DECLARE SUB LOADEDIT ()          ' Procedure called when the editor loads
DECLARE SUB MAINEDIT ()          ' Where most of the stuff goes
DECLARE SUB FILEMENU ()          ' Called when you press the File menu
DECLARE SUB NEW ()               ' The File\New command
DECLARE SUB SAVE ()              ' The File\Save command
DECLARE SUB PRINTF ()            ' The File\Print command
DECLARE SUB SHUTDOWN ()          ' The File\Exit command
DECLARE SUB REPAINT ()           ' Repainting after a dialog box disappears
DECLARE SUB SAVEBEFORE ()        ' Save Before Dialog Box
DECLARE SUB SBHELP ()            ' Save Before Help
DECLARE SUB SBREPAINT ()         ' Save Before Repaint
DECLARE SUB OPENF ()             ' The File\Open command
DECLARE SUB SAVEAS ()            ' Called if no filename
DECLARE SUB OPTIONFL ()          ' The File\(Custom) command
' $INCLUDE: 'QB.BI'
' Custom Settings Hard-Wired at run-time
CONST EDITORNAME$ = "Editor's Title" ' Title appearing in the window
CONST MAXLINES = 2000                    ' Maximum number of lines capable
CONST OPTIONFILE$ = "(Custom)"           ' Custom File Command
CONST OPTIONFLHOT$ = "C"                 ' Custom command 's Letter
CONST OPTIONXHOTPOS = 1                  ' Position of custom letter
DIM FILE$(MAXLINES)                      ' Array for editable text
TITLE$ = COMMAND$                        ' Open a file
IF COMMAND$ <> "" THEN            ' The Guy putted something as a parameter
OPEN TITLE$ FOR INPUT AS #1       ' It must be a file he wants to open
DO UNTIL EOF(1)                   ' Do the loop until The End of the file
LINE INPUT #1, FILE$(I)
I = I + 1
LOOP
CLOSE #1
END IF
LOADEDIT                                 ' Startup
MAINEDIT                                 ' Main program
END

SUB BCKGND
FOR I = 1 TO 24
LOCATE I, 1: PRINT STRING$(80, 177);
NEXT I
LOCATE 25, 1: PRINT STRING$(80, 177);
END SUB

SUB FILEMENU
SHARED NOMS
DIM REGS AS RegType
REGS.ax = 2
IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
COLOR 15, 1
LOCATE 1, 2: PRINT " File "
COLOR 0, 7
LOCATE 2, 1: PRINT "  New Document   "
LOCATE 3, 1: PRINT "  Open Document  "
LOCATE 4, 1: PRINT "  Save Document  "
LOCATE 5, 1: PRINT "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
LOCATE 6, 1: PRINT "                 "
LOCATE 7, 1: PRINT "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
LOCATE 8, 1: PRINT "  Print          "
LOCATE 9, 1: PRINT "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ"
LOCATE 10, 1: PRINT "  Exit           "
LOCATE 6, 1: PRINT OPTIONFILE$
COLOR 15, 7
LOCATE 2, 3: PRINT "N"
LOCATE 3, 3: PRINT "O"
LOCATE 4, 3: PRINT "S"
LOCATE 6, 1 + OPTIONXHOTPOS: PRINT OPTIONFLHOT$
LOCATE 8, 3: PRINT "P"
LOCATE 10, 3: PRINT "E"
REGS.ax = 1
IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
SH = 1
DO
I$ = UCASE$(INKEY$)
REGS.ax = 3
IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
PM = REGS.bx
XM = INT((80 / 640) * REGS.cx) + 1: YM = INT((25 / 200) * REGS.dx) + 1
IF I$ <> "" THEN
IF I$ = "N" THEN NEW
IF I$ = "O" THEN OPENF
IF I$ = "S" THEN SAVE
IF I$ = "P" THEN PRINTF
IF I$ = "E" THEN SHUTDOWN
IF I$ = "A" THEN OPTIONFL
IF I$ = CHR$(27) THEN EXIT DO
EXIT DO
END IF
IF SH = 1 AND PM = 0 THEN SH = 0
IF XM > 1 AND XM < 18 AND YM < 11 AND SH = 0 THEN
IF YM = 1 AND PM = 1 THEN EXIT DO
IF YM = 2 AND PM = 1 THEN
NEW
EXIT DO
END IF
IF YM = 3 AND PM = 1 THEN
OPENF
EXIT DO
END IF
IF YM = 4 AND PM = 1 THEN
SAVE
EXIT DO
END IF
IF YM = 6 AND PM = 1 THEN
OPTIONFL
EXIT DO
END IF
IF YM = 8 AND PM = 1 THEN
PRINTF
END IF
IF YM = 10 AND PM = 1 THEN SHUTDOWN
END IF
LOOP
REGS.ax = 2
IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
REPAINT
REGS.ax = 1
IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
END SUB

SUB LOADEDIT
DIM REGS AS RegType
REGS.ax = 0
INTERRUPT 51, REGS, REGS
IF REGS.ax = 0 THEN NOMS = 1
REGS.cx = 0
REGS.dx = 0
COLOR 1
BCKGND
COLOR 7, 1
WIN 1, 2, 80, 24, EDITORNAME$

REGS.ax = 1
IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
COLOR 15, 7
LOCATE 25, 1: PRINT "  Edward Blake, 1996                                                            ";
COLOR 0, 7
LOCATE 1, 1: PRINT "  File                                                                          ";
COLOR 15, 5
END SUB

SUB MAINEDIT
SHARED FILE$(), Y, X, Z, NOMS
DIM LINETRCK%(MAXLINES)
DIM REGS AS RegType
REGS.ax = 0
INTERRUPT 51, REGS, REGS
IF REGS.ax = 0 THEN NOMS = 1
DO
    ' Extended Keyboard
    IF I$ = CHR$(0) + CHR$(33) THEN FILEMENU
    IF I$ = CHR$(0) + CHR$(80) THEN Y = Y + 1
    IF I$ = CHR$(0) + CHR$(72) THEN Y = Y - 1
    IF I$ = CHR$(0) + CHR$(75) THEN Z = Z - 1
    IF I$ = CHR$(0) + CHR$(77) THEN Z = Z + 1
    IF I$ = CHR$(0) + CHR$(71) THEN Z = 0
    IF I$ = CHR$(0) + CHR$(79) THEN Z = LINETRCK%(X + Y)
    IF Y < 0 THEN
	Y = 0
	X = X - 1
    END IF
    IF Y > 20 THEN
	Y = 20
	X = X + 1
    END IF

    IF Z < 0 THEN Z = 0
    IF Z > 77 THEN Z = 77

    IF X < 0 THEN X = 0
    IF X > MAXLINES THEN X = MAXLINES

    IF I$ > CHR$(1) AND I$ <= CHR$(255) THEN  ' Non-Extended Keyboard
	LOCATE 25, 1: PRINT "             ";
	LOCATE 25, 1: PRINT ASC(I$); I$;
	IF I$ = CHR$(13) THEN                 ' Enter
	    Y = Y + 1
	    Z = 0
	    I$ = ""
	    IF Y > 20 THEN
		Y = 20
		X = X + 1
	    END IF
	    IF X > MAXLINES THEN X = MAXLINES
	END IF
	IF I$ = CHR$(127) THEN                ' Delete Procedure
	END IF
	IF I$ = CHR$(8) THEN                  ' BackSpace Procedure
	    IF Z > 0 THEN
	    IF FILE$(X + Y) <> "" AND NOT (Z > LEN(FILE$(X + Y))) THEN FILE$(X + Y) = LEFT$(FILE$(X + Y), Z - 1) + RIGHT$(FILE$(X + Y), LEN(FILE$(X + Y)) - Z)
	    IF Z >= 0 THEN Z = Z - 1
	    LINETRCK%(Y + X) = Z
	    END IF
	END IF
	IF I$ >= CHR$(32) AND I$ <= CHR$(255) AND I$ <> CHR$(127) THEN 'Printable Characters
	    IF Z + 1 > LEN(FILE$(X + Y)) THEN FILE$(X + Y) = FILE$(X + Y) + STRING$(ABS(LEN(FILE$(X + Y)) - Z) + 1, 32)
	    MID$(FILE$(Y + X), Z + 1, 1) = I$
	    Z = Z + 1
	    LINETRCK%(Y + X) = Z
	END IF
    END IF

    IF Y < 0 THEN
	Y = 0
	X = X - 1
    END IF
    IF Y > 20 THEN
	Y = 20
	X = X + 1
    END IF

    IF Z < 0 THEN Z = 0
    IF Z > 77 THEN Z = 77

    IF X < 0 THEN X = 0
    IF X > MAXLINES THEN X = MAXLINES

    REGS.ax = 2
    IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
    FOR I = 0 TO 20
	LOCATE I + 3, 2, 0: PRINT FILE$(X + I) + STRING$(78 - LEN(FILE$(X + I)), 32)
    NEXT I
    LOCATE Y + 3, 2 + Z, 1
    REGS.ax = 1
    IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
    DO
	REGS.ax = 1
	IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
	I$ = INKEY$
	IF I$ <> "" THEN EXIT DO
	REGS.ax = 3
	INTERRUPT 51, REGS, REGS
	PM = REGS.bx
	XM = INT((80 / 640) * REGS.cx) + 1: YM = INT((25 / 200) * REGS.dx) + 1
	IF PM = 0 THEN SH = 0
	IF PM = 1 AND SH = 0 THEN
	IF YM = 1 THEN
	IF XM > 2 AND XM < 8 THEN FILEMENU
	END IF
	SH = 1
	END IF
    LOOP
LOOP
END SUB

SUB NEW
SHARED FILE$(), TITLE$
SAVEBEFORE
FOR I = 0 TO MAXLINES
FILE$(I) = ""
NEXT I
TITLE$ = ""
END SUB

SUB OPENF
SHARED FILE$(), TITLE$, NOMS
DIM REGS AS RegType
REGS.ax = 2: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
WIN 4, 3, 76, 8, "  Open  "
WIN 6, 4, 74, 6, ""
COLOR 15, 1
LOCATE 5, 7: PRINT SPACE$(67)
LOCATE 7, 14: PRINT "    OK    "
LOCATE 7, 34: PRINT "  CANCEL  "
REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
DO
    IF Z < 0 THEN Z = 0
    IF I$ > CHR$(1) AND I$ <= CHR$(255) THEN
	IF I$ = CHR$(8) THEN
	    IF Z > 0 THEN
	    IF VTITLE$ <> "" AND NOT (Z > LEN(VTITLE$)) THEN VTITLE$ = LEFT$(VTITLE$, Z - 1) + RIGHT$(VTITLE$, LEN(VTITLE$) - Z)
	    IF Z >= 0 THEN Z = Z - 1
	    END IF
	END IF
	IF I$ >= CHR$(32) AND I$ <= CHR$(255) THEN
	    IF Z + 1 > LEN(VTITLE$) THEN VTITLE$ = VTITLE$ + STRING$(ABS(LEN(VTITLE$) - Z) + 1, 32)
	    MID$(VTITLE$, Z + 1, 1) = I$
	    Z = Z + 1
	END IF
    END IF
    IF Z < 0 THEN Z = 0
    LOCATE 5, 7: PRINT RIGHT$(VTITLE$, 66) + " "
    DO
	REGS.ax = 1
	IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
	I$ = INKEY$
	IF I$ = CHR$(27) THEN CANCEL = 1
	IF I$ = CHR$(13) THEN OK = 1
	IF I$ <> "" THEN EXIT DO
	REGS.ax = 3
	INTERRUPT 51, REGS, REGS
	PM = REGS.bx
	XM = INT((80 / 640) * REGS.cx) + 1: YM = INT((25 / 200) * REGS.dx) + 1
	IF PM = 1 AND YM = 7 THEN
	IF XM > 13 AND XM < 25 THEN OK = 1
	IF XM > 33 AND XM < 45 THEN CANCEL = 1
	IF OK = 1 OR CANCEL = 1 THEN EXIT DO
	END IF
    LOOP
IF OK = 1 OR CANCEL = 1 THEN EXIT DO
LOOP

REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
IF OK = 1 THEN TITLE$ = VTITLE$
IF CANCEL = 1 THEN EXIT SUB
I = 0
OPEN TITLE$ FOR INPUT AS #1
DO UNTIL EOF(1)
LINE INPUT #1, FILE$(I)
I = I + 1
LOOP
CLOSE #1
END SUB

'
' Custom File Command Pushed
'
SUB OPTIONFL
END SUB

SUB PRINTF
SHARED FILE$()
FOR I = 0 TO MAXLINES
IF FILE$(I) <> "" THEN MXFILE = I + 1
NEXT I
I = 0
OPEN "LPT1:" FOR OUTPUT AS #1
DO UNTIL I = MXFILE
PRINT #1, FILE$(I)
I = I + 1
LOOP
CLOSE #1
END SUB

SUB REPAINT
SHARED FILE$(), Y, Z
COLOR 7, 1
WIN 1, 2, 80, 24, EDITORNAME$
COLOR 15, 7
LOCATE 25, 1: PRINT "  Edward Blake, 1996                                                            ";
COLOR 0, 7
LOCATE 1, 1: PRINT "  File                                                                          ";
COLOR 15, 5
    FOR I = 0 TO 20
	LOCATE I + 3, 2, 0: PRINT FILE$(X + I) + STRING$(78 - LEN(FILE$(X + I)), 32)
    NEXT I
    LOCATE Y + 3, 2 + Z, 1
END SUB

SUB SAVE
SHARED TITLE$, FILE$()
DIM REGS AS RegType
IF TITLE$ <> "" THEN
FOR I = 0 TO MAXLINES
IF FILE$(I) <> "" THEN MXFILE = I + 1
NEXT I
I = 0
OPEN TITLE$ FOR OUTPUT AS #1
DO UNTIL I = MXFILE
PRINT #1, FILE$(I)
I = I + 1
LOOP
CLOSE #1
END IF
IF TITLE$ = "" THEN SAVEAS
REGS.ax = 2: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
REPAINT
REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
END SUB

SUB SAVEAS
SHARED FILE$(), TITLE$, NOMS
DIM REGS AS RegType
REGS.ax = 2: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
WIN 4, 3, 76, 8, "  Save as  "
WIN 6, 4, 74, 6, ""
COLOR 15, 1
LOCATE 5, 7: PRINT SPACE$(67)
LOCATE 7, 14: PRINT "    OK    "
LOCATE 7, 34: PRINT "  CANCEL  "
REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
DO
    IF Z < 0 THEN Z = 0
    IF I$ > CHR$(1) AND I$ <= CHR$(255) THEN
	IF I$ = CHR$(8) THEN
	    IF Z > 0 THEN
	    IF VTITLE$ <> "" AND NOT (Z > LEN(VTITLE$)) THEN VTITLE$ = LEFT$(VTITLE$, Z - 1) + RIGHT$(VTITLE$, LEN(VTITLE$) - Z)
	    IF Z >= 0 THEN Z = Z - 1
	    END IF
	END IF
	IF I$ >= CHR$(32) AND I$ <= CHR$(255) THEN
	    IF Z + 1 > LEN(VTITLE$) THEN VTITLE$ = VTITLE$ + STRING$(ABS(LEN(VTITLE$) - Z) + 1, 32)
	    MID$(VTITLE$, Z + 1, 1) = I$
	    Z = Z + 1
	END IF
    END IF
    IF Z < 0 THEN Z = 0
    LOCATE 5, 7: PRINT RIGHT$(VTITLE$, 66) + " "
    DO
	REGS.ax = 1
	IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
	I$ = INKEY$
	IF I$ = CHR$(27) THEN CANCEL = 1
	IF I$ = CHR$(13) THEN OK = 1
	IF I$ <> "" THEN EXIT DO
	REGS.ax = 3
	INTERRUPT 51, REGS, REGS
	PM = REGS.bx
	XM = INT((80 / 640) * REGS.cx) + 1: YM = INT((25 / 200) * REGS.dx) + 1
	IF PM = 1 AND YM = 7 THEN
	IF XM > 13 AND XM < 25 THEN OK = 1
	IF XM > 33 AND XM < 45 THEN CANCEL = 1
	IF OK = 1 OR CANCEL = 1 THEN EXIT DO
	END IF
    LOOP
IF OK = 1 OR CANCEL = 1 THEN EXIT DO
LOOP

REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
IF OK = 1 THEN
TITLE$ = VTITLE$
FOR I = 0 TO MAXLINES
IF FILE$(I) <> "" THEN MXFILE = I + 1
NEXT I
I = 0
IF INSTR(TITLE$, ".") = 0 THEN TITLE$ = TITLE$ + ".ASM"
OPEN TITLE$ FOR OUTPUT AS #1
DO UNTIL I = MXFILE
PRINT #1, FILE$(I)
I = I + 1
LOOP
CLOSE #1
END IF
END SUB

SUB SAVEBEFORE
SHARED NOMS
DIM REGS AS RegType
REGS.ax = 2: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
COLOR 7, 1
WIN 10, 11, 70, 14, ""
LOCATE 12, 11: PRINT "               Do you want to save before?                 "
LOCATE 13, 11: PRINT "                                                           "
COLOR 0, 7
LOCATE 13, 19: PRINT "   YES    "
LOCATE 13, 35: PRINT "    NO    "
LOCATE 13, 51: PRINT "   HELP   "
COLOR 15, 7
LOCATE 13, 22: PRINT "Y"
LOCATE 13, 39: PRINT "N"
LOCATE 13, 54: PRINT "H"
REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
DO
I$ = UCASE$(INKEY$)
REGS.ax = 3: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
PM = REGS.bx
XM = INT((80 / 640) * REGS.cx) + 1: YM = INT((25 / 200) * REGS.dx) + 1
IF I$ = "Y" THEN OK = 1
IF I$ = "N" THEN CANCEL = 1
IF I$ = "H" THEN SBHELP
IF PM = 1 AND YM = 13 THEN
IF XM > 18 AND XM < 30 THEN OK = 1
IF XM > 34 AND XM < 45 THEN CANCEL = 1
IF XM > 51 AND XM < 62 THEN SBHELP
END IF
IF OK = 1 OR CANCEL = 1 THEN EXIT DO
LOOP
IF OK = 1 THEN SAVE
END SUB

SUB SBHELP
SHARED NOMS
DIM REGS AS RegType
REGS.ax = 2: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
COLOR 15, 0
WIN 3, 2, 78, 24, "  Help On Before Save  "
COLOR 7, 0
LOCATE 3, 4: PRINT " This prompt appears about anywhere when your file can get destroyed      ";
LOCATE 4, 4: PRINT " like using the new or exit command.                                      ";
LOCATE 5, 4: PRINT " This prompt will open anyway even after you saved your file.             ";
LOCATE 6, 4: PRINT " If you press YES, then either:                                           ";
LOCATE 7, 4: PRINT "      -You see the Save as command box if it is untitled                  ";
LOCATE 8, 4: PRINT "      -It will be saved automatically if it already as a name             ";
LOCATE 9, 4: PRINT " If you press NO, then changes to your file after its last save is        ";
LOCATE 10, 4: PRINT " destroyed                                                                ";
LOCATE 11, 4: PRINT "                                                                          ";
LOCATE 12, 4: PRINT "                                                                          ";
LOCATE 13, 4: PRINT "                                                                          ";
LOCATE 14, 4: PRINT "                                                                          ";
LOCATE 15, 4: PRINT "                                                                          ";
LOCATE 16, 4: PRINT "                                                                          ";
LOCATE 17, 4: PRINT "                                                                          ";
LOCATE 18, 4: PRINT "                                                                          ";
LOCATE 19, 4: PRINT "                                                                          ";
LOCATE 20, 4: PRINT "                                                                          ";
'LOCATE 21, 4: PRINT "                                                                          ";
'LOCATE 22, 4: PRINT "                                                                          ";
'LOCATE 23, 4: PRINT "                                                                          ";
COLOR 15, 7
LOCATE 21, 4: PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿";
LOCATE 22, 4: PRINT "³       R            ";
COLOR 0, 7
PRINT "³";
LOCATE 23, 4: PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ";
COLOR 0, 7
LOCATE 22, 13: PRINT "eturn";
REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
DO
I$ = UCASE$(INKEY$)
REGS.ax = 3: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
PM = REGS.bx
XM = INT((80 / 640) * REGS.cx) + 1: YM = INT((25 / 200) * REGS.dx) + 1
IF YM > 20 AND YM < 24 AND PM = 1 AND XM > 3 AND XM < 26 THEN EXIT DO
IF I$ = "R" THEN EXIT DO
LOOP
REGS.ax = 2: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
REPAINT
SBREPAINT
REGS.ax = 1: IF NOMS = 0 THEN INTERRUPT 51, REGS, REGS
END SUB

SUB SBREPAINT
COLOR 15, 1
WIN 10, 11, 70, 14, ""
LOCATE 12, 11: PRINT "               Do you want to save before?                 "
LOCATE 13, 11: PRINT "                                                           "
COLOR 0, 7
LOCATE 13, 19: PRINT "   YES    "
LOCATE 13, 35: PRINT "    NO    "
LOCATE 13, 51: PRINT "   HELP   "
COLOR 15, 7
LOCATE 13, 22: PRINT "Y"
LOCATE 13, 39: PRINT "N"
LOCATE 13, 54: PRINT "H"
END SUB

SUB SHUTDOWN
DIM REGS AS RegType
COLOR 15, 1
LOCATE 10, 1: PRINT "  Exit           "
SAVEBEFORE
REGS.ax = 0: INTERRUPT 51, REGS, REGS
COLOR 7, 0
CLS
SYSTEM
END SUB

SUB WIN (X1, Y1, X2, Y2, A$)
FOR I = Y1 TO Y2
LOCATE I, X1: PRINT STRING$(X2 - X1, 32);
NEXT I
LOCATE Y1, X1 + 1: PRINT STRING$(X2 - X1 - 1, 196);
LOCATE Y2, X1 + 1: PRINT STRING$(X2 - X1 - 1, 196);
FOR I = Y1 + 1 TO Y2 - 1
LOCATE I, X1: PRINT CHR$(179);
LOCATE I, X2: PRINT CHR$(179);
NEXT I
LOCATE Y1, X1: PRINT CHR$(218);
LOCATE Y1, X2: PRINT CHR$(191);
LOCATE Y2, X1: PRINT CHR$(192);
LOCATE Y2, X2: PRINT CHR$(217);
IF A$ <> "" THEN
LOCATE Y1, ((X2 + X1) / 2) - ((LEN(A$) + 2) / 2): PRINT CHR$(180) + A$ + CHR$(195)
END IF
END SUB
