home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
magazine
/
pcresour
/
1981_05
/
typer.bas
< prev
next >
Wrap
BASIC Source File
|
1980-01-03
|
12KB
|
408 lines
' 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!