home *** CD-ROM | disk | FTP | other *** search
- ' TITLE: TYPER
- 'FUNCTION: An electronic typewriter simulator
- ' BY: Jim Woodruff
-
- DEFINT A-Z
- RM = 70: LM = 10: Row = 18: Col = LM
- OldCol = Col: MaxCol = LM: Final = -1
-
- FormatLine$ = STRING$(80, 250)
- Word$ = " <>,;.()[]{}!@$%^&*-_+=?"
-
- 'The printer set-up strings below are for IBM- Epson-compatible
- 'printers. The replacement strings for Okidata 192 in IBM mode
- 'are added as comments. If you have an Okidata 192 in IBM mode
- 'remove the apostrophes from the beginning of the Okidata lines.
- 'For other printers, you can change the strings to your printer
- 'set-up strings or null them by assigning the string a "" value.
-
- PQ$ = CHR$(27) + "+" + CHR$(1) 'near letter quality mode
- 'PQ$ = CHR$(27) + CHR$(73) + CHR$(3) 'NLQ ==OKIDATA 192==
- WIDTH LPRINT 255
-
- ON ERROR GOTO PrinterError
- CLS : LOCATE , , 0, 7, 7
- GOSUB MainScreen
-
- MainLoop:
- IF Col > MaxCol THEN MaxCol = Col
- GOSUB Status
- k$ = "": WHILE k$ = "": k$ = INKEY$: WEND
- IF ASC(k$) < 32 THEN GOTO EditKey
- IF k$ = " " AND LChar THEN GOTO Enter
- IF LChar THEN GOTO Wordwrap
- IF Insert THEN GOTO Insert
- LOCATE Row, Col: PRINT k$;
- OldCol = Col: Col = Col + 1: IF Col > RM THEN Col = RM: LChar = -1
- IF Col > MaxCol THEN MaxCol = Col
- GOSUB HighLight
- GOTO MainLoop
-
- EditKey:
- k = ASC(RIGHT$(k$, 1))
- IF k = 8 THEN GOTO Backspace
- IF k = 9 THEN GOTO TabPos
- IF k = 13 THEN GOTO Enter
- IF k = 59 THEN GOTO SetMargin
- IF k = 60 THEN GOTO SetTab
- IF k = 61 THEN GOTO ClearTab
- IF k = 62 THEN GOTO PrintQuality
- IF k = 63 THEN GOTO FormFeed
- IF k = 68 THEN GOTO Quit
- IF k = 71 THEN GOTO Home
- IF k = 75 THEN GOTO LeftArrow
- IF k = 77 THEN GOTO RightArrow
- IF k = 79 THEN GOTO EndOfLine
- IF k = 82 THEN GOTO Mode
- IF k = 83 THEN GOTO DeleteChar
- IF k = 115 THEN GOTO WordLeft
- IF k = 116 THEN GOTO WordRight
- SOUND 550, .5: GOTO MainLoop
-
- LeftArrow:
- IF Col = LM THEN SOUND 550, .5: GOTO MainLoop
- OldCol = Col: Col = Col - 1: LChar = 0: GOSUB HighLight
- LOCATE Row, Col: GOTO MainLoop
-
- RightArrow:
- IF Col = RM THEN SOUND 550, .5: GOTO MainLoop
- OldCol = Col: Col = Col + 1: GOSUB HighLight
- LOCATE Row, Col: GOTO MainLoop
-
- Home:
- OldCol = Col: Col = LM: LChar = 0: GOSUB HighLight
- LOCATE Row, Col: GOTO MainLoop
-
- WordRight:
- IF Col = RM THEN GOTO MainLoop
- FOR i = Col TO MaxCol
- IF INSTR(Word$, CHR$(SCREEN(Row, i))) > 0 THEN
- FOR x = i + 1 TO MaxCol
- IF INSTR(Word$, CHR$(SCREEN(Row, x))) = 0 THEN
- OldCol = Col: Col = x
- GOSUB HighLight: GOTO MainLoop
- END IF
- NEXT
- END IF
- NEXT: GOTO MainLoop
-
- WordLeft:
- IF Col = LM THEN GOTO MainLoop
- FOR i = Col TO LM STEP -1
- IF INSTR(Word$, CHR$(SCREEN(Row, i))) > 0 THEN
- FOR x = i - 1 TO LM STEP -1
- IF INSTR(Word$, CHR$(SCREEN(Row, x))) = 0 THEN
- FOR z = x - 1 TO LM STEP -1
- IF INSTR(Word$, CHR$(SCREEN(Row, z))) > 0 THEN
- OldCol = Col: Col = z + 1
- GOSUB HighLight: GOTO MainLoop
- END IF
- NEXT
- END IF
- NEXT
- END IF
- NEXT
- OldCol = Col: Col = LM: GOSUB HighLight: GOTO MainLoop
-
- DeleteChar:
- IF Col = RM THEN
- LOCATE Row, Col: PRINT " ";
- LOCATE Row, Col: GOTO MainLoop
- END IF
- Temp$ = "": LOCATE , , 0
- FOR i = Col TO MaxCol - 1
- Temp$ = Temp$ + CHR$(SCREEN(Row, i + 1))
- NEXT
- Temp$ = Temp$ + " "
- LOCATE Row, Col: PRINT Temp$;
- MaxCol = MaxCol - 1: IF MaxCol < LM THEN MaxCol = LM
- LOCATE Row, Col: GOTO MainLoop
-
- EndOfLine:
- OldCol = Col: Col = MaxCol: GOSUB HighLight
- LOCATE Row, Col: GOTO MainLoop
-
- Backspace:
- Temp$ = ""
- IF Col = LM THEN SOUND 550, .5: GOTO MainLoop
- IF Col < MaxCol THEN
- LOCATE , , 0
- FOR i = Col - 1 TO MaxCol - 1
- Temp$ = Temp$ + CHR$(SCREEN(Row, i + 1))
- NEXT
- OldCol = Col: Col = Col - 1: GOSUB HighLight
- Temp$ = Temp$ + " "
- LOCATE Row, Col: PRINT Temp$; : MaxCol = MaxCol - 1
- LOCATE Row, Col: GOTO MainLoop
- END IF
-
- IF LChar THEN Col = Col + 1: LChar = 0
- OldCol = Col: Col = Col - 1: GOSUB HighLight
- MaxCol = Col
- LOCATE Row, Col: PRINT " ";
- LOCATE Row, Col: COLOR 7, 0
- GOTO MainLoop
-
- Enter:
- LOCATE Row + 2, Col, 0: COLOR 7, 0
- OldCol = Col: Col = LM: GOSUB HighLight
- GOSUB PrintOut
- GOSUB Scroll: LOCATE Row, Col, 1: LChar = 0: MaxCol = LM
- GOTO MainLoop
-
- HighLight:
- LOCATE Row + 2, OldCol, 0
- COLOR 7, 0: PRINT CHR$(SCREEN(Row + 2, OldCol));
- LOCATE Row + 2, Col
- COLOR 0, 7: PRINT CHR$(SCREEN(Row + 2, Col));
- LOCATE Row, Col
- COLOR 7, 0
- RETURN
-
- Wordwrap:
- IF SCREEN(Row, RM) = 32 OR SCREEN(Row, RM) = 45 THEN
- GOSUB PrintOut: GOSUB Scroll
- LOCATE Row, LM: PRINT k$; : OldCol = Col
- Col = POS(44): GOSUB HighLight: LChar = 0
- LOCATE Row, Col: MaxCol = Col: GOTO MainLoop
- END IF
-
- FOR i = RM - 1 TO LM STEP -1
- char = SCREEN(Row, i)
- IF char = 32 THEN
- Text$ = ""
- FOR x = i + 1 TO RM: Text$ = Text$ + CHR$(SCREEN(Row, x)): NEXT
- Text$ = Text$ + k$: LOCATE Row, i + 1
- PRINT STRING$(RM - i, 32);
- GOSUB PrintOut
- GOSUB Scroll
- LOCATE Row, LM: PRINT Text$; : OldCol = Col
- Col = POS(44): GOSUB HighLight: LChar = 0
- LOCATE Row, Col: MaxCol = Col: GOTO MainLoop
- END IF
- NEXT
- GOSUB Scroll: Col = LM: LOCATE Row, LM
- GOTO MainLoop
-
- PrintOut:
- ON ERROR GOTO PrinterError
- LOCATE , , 0: LPRINT STRING$(LM - 1, 32);
- LPRINT PQ$;
- FOR i = LM TO MaxCol
- LPRINT CHR$(SCREEN(Row, i));
- NEXT: LPRINT : LOCATE , , 1
- ON ERROR GOTO 0
- RETURN
-
- Scroll:
- VIEW PRINT 3 TO 18: LOCATE 18, 80: PRINT
- VIEW PRINT: RETURN
-
- Insert:
- Temp$ = "": LOCATE , , 0
- IF Col < MaxCol THEN
- FOR i = Col TO MaxCol - 1
- Temp$ = Temp$ + CHR$(SCREEN(Row, i))
- NEXT
- LOCATE Row, Col: PRINT k$; Temp$;
- OldCol = Col: Col = Col + 1: GOSUB HighLight
- MaxCol = MaxCol + 1: IF MaxCol > RM THEN MaxCol = RM
- LOCATE Row, Col: GOTO MainLoop
- END IF
- LOCATE Row, Col: PRINT k$;
- OldCol = Col: Col = Col + 1
- IF Col > RM THEN Col = RM: LChar = -1
- IF Col > MaxCol THEN MaxCol = Col
- GOSUB HighLight: GOTO MainLoop
-
- TabPos:
- FOR i = Col + 1 TO RM
- IF SCREEN(Row + 2, i) = 16 THEN
- OldCol = Col: Col = i
- GOSUB HighLight: LOCATE Row, Col
- GOTO MainLoop
- END IF
- NEXT
- SOUND 550, .5: GOTO MainLoop
-
- SetTab:
- IF Col = RM OR Col = LM THEN SOUND 550, .5: GOTO MainLoop
- LOCATE Row + 2, Col: COLOR 0, 7
- PRINT CHR$(16); : LOCATE Row, Col: COLOR 7, 0
- GOTO MainLoop
-
- ClearTab:
- IF SCREEN(Row + 2, Col) <> 16 THEN SOUND 550, .5: GOTO MainLoop
- COLOR 0, 7
- LOCATE Row + 2, Col: PRINT CHR$(250);
- LOCATE Row, Col: GOTO MainLoop
-
- SetMargin:
- OldLM = LM: OldRM = RM
- FOR i = 21 TO 24: LOCATE i, 1, 0: PRINT STRING$(80, 32); : NEXT
-
- SetMargin2:
- LOCATE 22, 30: COLOR 15, 0: LINE INPUT ; " Left Margin: "; LM$
- COLOR 7, 0
- IF LEN(LM$) = 0 THEN GOSUB MenuLine: GOTO MainLoop
- IF VAL(LM$) < 1 OR VAL(LM$) > 80 THEN
- SOUND 550, .5
- LOCATE 24, 25: PRINT "Invalid left margin. Try again...";
- GOTO SetMargin2
- END IF
- LOCATE 24, 1: PRINT STRING$(80, 32);
-
- SetMargin3:
- LOCATE 23, 30: COLOR 15, 0: LINE INPUT "Right Margin: "; RM$
- COLOR 7, 0
- IF LEN(RM$) = 0 THEN GOSUB MenuLine: GOTO MainLoop
- IF VAL(RM$) > 80 OR VAL(RM$) <= VAL(LM$) + 1 THEN
- SOUND 550, .5
- LOCATE 24, 24: PRINT "Invalid right margin. Try again...";
- GOTO SetMargin3
- END IF
- LOCATE Row + 2, LM: PRINT CHR$(250);
- LM = VAL(LM$): LOCATE Row + 2, LM: PRINT "L";
- LOCATE Row + 2, RM: PRINT CHR$(250);
-
- RM = VAL(RM$): LOCATE Row + 2, RM: PRINT "R"
- IF MaxCol = OldLM THEN
- OldCol = Col: Col = LM: GOSUB HighLight
- LChar = 0: MaxCol = Col: LOCATE Row, Col:
- GOSUB MenuLine: GOTO MainLoop
- END IF
- IF LM < OldLM OR RM > OldRM THEN
- LOCATE Row, Col: GOSUB MenuLine: GOTO MainLoop
- END IF
- LOCATE , , 0: LPRINT STRING$(OldLM - 1, 32);
- FOR i = OldLM TO MaxCol
- LPRINT CHR$(SCREEN(Row, i));
- NEXT: LPRINT
- LOCATE , , 1: GOSUB Scroll
- OldCol = Col: Col = LM: MaxCol = Col: GOSUB HighLight
- LChar = 0: LOCATE Row, Col
- GOSUB MenuLine: GOTO MainLoop
-
- Mode:
- Insert = (-1 XOR Insert)
- IF Insert THEN LOCATE 1, 7, 0, 0, 7: PRINT "Insert ";
- IF NOT Insert THEN LOCATE 1, 7, 0, 7, 7: PRINT "Overtype ";
- GOTO MainLoop
-
- Quit:
- GOSUB BlankArea
- LOCATE 23, 25, 0: COLOR 15, 0: PRINT "Are sure you want to Quit ? (Y/N)";
- COLOR 7, 0: k$ = INPUT$(1): IF k$ = "Y" OR k$ = "y" THEN CLS : END
- GOSUB MenuLine: GOTO MainLoop
-
- FormFeed:
- GOSUB PrintOut: LPRINT CHR$(12)
- VIEW PRINT 3 TO 18: CLS : VIEW PRINT
- OldCol = Col: Col = LM: MaxCol = LM: GOSUB HighLight
- GOTO MainLoop
-
- Status:
- COLOR 7, 0
- LOCATE 1, 76, 0: PRINT USING "##_/##"; Col; RM - Col + 1
- LOCATE Row, Col, 1: RETURN
-
- BlankArea:
- VIEW PRINT 21 TO 24: CLS : VIEW PRINT: RETURN
-
- MenuLine:
- GOSUB BlankArea: RESTORE MenuData
- LOCATE 24, 1, 0: COLOR 15, 7: PRINT STRING$(80, 32); : LOCATE 24, 2
- FOR i = 1 TO 6
- READ A$, b$
- COLOR 15, 7: PRINT " "; A$;
- COLOR 0, 7: PRINT ; b$;
- NEXT
- COLOR 7, 0: RETURN
-
- PrintQuality:
- Draft = (-1 XOR Draft)
- IF NOT Draft THEN
-
- 'See comments in the beginning of the listing on printer set-up strings
-
- PQ$ = CHR$(27) + "+" + CHR$(1) 'NLQ mode
- 'PQ$ = CHR$(27) + CHR$(73) + CHR$(3) 'NLQ mode OKIDATA 192
- LOCATE 1, 31, 0: PRINT "Final": GOTO MainLoop
- END IF
- PQ$ = CHR$(27) + "+" + CHR$(0) 'Draft mode
- 'PQ$ = CHR$(27) + CHR$(73) + CHR$(1) 'Draft OKIDATA 192
- LOCATE 1, 31, 0: PRINT "Draft": GOTO MainLoop
-
- PrinterError:
- RESUME PrinterError2
-
- PrinterError2:
- ON ERROR GOTO 0
- GOSUB BlankArea: SOUND 550, .5: COLOR 15, 0
- LOCATE 23, 25: PRINT "There is a problem with your printer.";
- LOCATE 24, 25: PRINT " (C)ontinue or (Q)uit ?"; : COLOR 7, 0
- ON ERROR GOTO 0
- k$ = INPUT$(1)
- IF k$ = "C" OR k$ = "c" THEN GOSUB MenuLine: GOTO PrintOut
- GOTO Quit
-
- MainScreen:
- COLOR 7, 0: CLS
- LOCATE 1, 1: PRINT "Mode: Overtype Quality: Final"
- PRINT STRING$(80, 196)
- GOSUB Hello: GOSUB MenuLine
- LOCATE 20, 1: PRINT FormatLine$; : LOCATE 20, LM: PRINT "L"
- LOCATE 20, LM + 5: PRINT CHR$(16); : LOCATE 20, RM: PRINT "R"
- OldCol = Col: GOSUB HighLight
- RETURN
-
- Hello:
- RESTORE HelloData
- LOCATE 3, 5, 0: PRINT CHR$(201); STRING$(69, 205); CHR$(187)
- FOR i = 4 TO 22
- LOCATE i, 5
- PRINT CHR$(186); : LOCATE i, 75: PRINT CHR$(186);
- NEXT
- LOCATE 23, 5: PRINT CHR$(200); STRING$(69, 205); CHR$(188);
- FOR i = 4 TO 22
- IF i = 4 OR i = 22 THEN COLOR 15, 0 ELSE COLOR 7, 0
- READ A$: LOCATE i, 40 - (LEN(A$) / 2): PRINT A$
- NEXT
- k$ = INPUT$(1)
- VIEW PRINT 3 TO 24: CLS : VIEW PRINT
- COLOR 7, 0: RETURN
-
- MenuData:
-
- DATA F1,Margins,F2,Set Tab
- DATA F3,Clear Tab,F4,Quality,F5,Form Feed
- DATA F10,Quit
-
-
- HelloData:
-
- 'Note: The spaces between the last character of the key descriptions and
- ' the end quote marks are required for proper centering of the text.
-
- DATA "TYPER - keys & descriptions"
- DATA " "
- DATA " Left - move left a character "
- DATA " Ctrl-Left - move left a word "
- DATA " Right - move right a character "
- DATA " Ctrl-Right - move right a word "
- DATA " Backspace - move left one character (destructive) "
- DATA " Tab - move to the next marked tab position "
- DATA " Home - move to left margin "
- DATA " End - move to end of current line "
- DATA " Insert - switch mode (insert/overtype) "
- DATA " Delete - delete character under cursor "
- DATA " F1 - set left and right margins "
- DATA " F2,F3 - set or clear a tab at the cursor "
- DATA " F4 - switch print quality (final/draft) "
- DATA " F5 - issue a form feed to the printer "
- DATA " F10 - return to DOS "
- DATA " "
- DATA "Press any key to start typing!
-
-
-