'=========================================================================== ' 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