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

  1. '   TITLE: TYPER
  2. 'FUNCTION: An electronic typewriter simulator
  3. '      BY: Jim Woodruff
  4.  
  5. DEFINT A-Z
  6. RM = 70: LM = 10: Row = 18: Col = LM
  7. OldCol = Col: MaxCol = LM: Final = -1
  8.  
  9. FormatLine$ = STRING$(80, 250)
  10. Word$ = " <>,;.()[]{}!@$%^&*-_+=?"
  11.  
  12. 'The printer set-up strings below are for IBM- Epson-compatible
  13. 'printers. The replacement strings for Okidata 192 in IBM mode
  14. 'are added as comments. If you have an Okidata 192 in IBM mode
  15. 'remove the apostrophes from the beginning of the Okidata lines.
  16. 'For other printers, you can change the strings to your printer
  17. 'set-up strings or null them by assigning the string a "" value.
  18.  
  19. PQ$ = CHR$(27) + "+" + CHR$(1)        'near letter quality mode
  20. 'PQ$ = CHR$(27) + CHR$(73) + CHR$(3)   'NLQ  ==OKIDATA 192==
  21. WIDTH LPRINT 255
  22.  
  23. ON ERROR GOTO PrinterError
  24. CLS : LOCATE , , 0, 7, 7
  25. GOSUB MainScreen
  26.  
  27. MainLoop:
  28.     IF Col > MaxCol THEN MaxCol = Col
  29.     GOSUB Status
  30.     k$ = "": WHILE k$ = "": k$ = INKEY$: WEND
  31.     IF ASC(k$) < 32 THEN GOTO EditKey
  32.     IF k$ = " " AND LChar THEN GOTO Enter
  33.     IF LChar THEN GOTO Wordwrap
  34.     IF Insert THEN GOTO Insert
  35.     LOCATE Row, Col: PRINT k$;
  36.     OldCol = Col: Col = Col + 1: IF Col > RM THEN Col = RM: LChar = -1
  37.     IF Col > MaxCol THEN MaxCol = Col
  38.     GOSUB HighLight
  39.     GOTO MainLoop
  40.  
  41. EditKey:
  42.     k = ASC(RIGHT$(k$, 1))
  43.     IF k = 8 THEN GOTO Backspace
  44.     IF k = 9 THEN GOTO TabPos
  45.     IF k = 13 THEN GOTO Enter
  46.     IF k = 59 THEN GOTO SetMargin
  47.     IF k = 60 THEN GOTO SetTab
  48.     IF k = 61 THEN GOTO ClearTab
  49.     IF k = 62 THEN GOTO PrintQuality
  50.     IF k = 63 THEN GOTO FormFeed
  51.     IF k = 68 THEN GOTO Quit
  52.     IF k = 71 THEN GOTO Home
  53.     IF k = 75 THEN GOTO LeftArrow
  54.     IF k = 77 THEN GOTO RightArrow
  55.     IF k = 79 THEN GOTO EndOfLine
  56.     IF k = 82 THEN GOTO Mode
  57.     IF k = 83 THEN GOTO DeleteChar
  58.     IF k = 115 THEN GOTO WordLeft
  59.     IF k = 116 THEN GOTO WordRight
  60.     SOUND 550, .5: GOTO MainLoop
  61.  
  62. LeftArrow:
  63.     IF Col = LM THEN SOUND 550, .5: GOTO MainLoop
  64.     OldCol = Col: Col = Col - 1: LChar = 0: GOSUB HighLight
  65.     LOCATE Row, Col: GOTO MainLoop
  66.  
  67. RightArrow:
  68.     IF Col = RM THEN SOUND 550, .5: GOTO MainLoop
  69.     OldCol = Col: Col = Col + 1: GOSUB HighLight
  70.     LOCATE Row, Col: GOTO MainLoop
  71.  
  72. Home:
  73.     OldCol = Col: Col = LM: LChar = 0: GOSUB HighLight
  74.     LOCATE Row, Col: GOTO MainLoop
  75.  
  76. WordRight:
  77.     IF Col = RM THEN GOTO MainLoop
  78.     FOR i = Col TO MaxCol
  79.     IF INSTR(Word$, CHR$(SCREEN(Row, i))) > 0 THEN
  80.     FOR x = i + 1 TO MaxCol
  81.         IF INSTR(Word$, CHR$(SCREEN(Row, x))) = 0 THEN
  82.         OldCol = Col: Col = x
  83.         GOSUB HighLight: GOTO MainLoop
  84.         END IF
  85.     NEXT
  86.     END IF
  87.     NEXT: GOTO MainLoop
  88.  
  89. WordLeft:
  90.     IF Col = LM THEN GOTO MainLoop
  91.     FOR i = Col TO LM STEP -1
  92.     IF INSTR(Word$, CHR$(SCREEN(Row, i))) > 0 THEN
  93.     FOR x = i - 1 TO LM STEP -1
  94.         IF INSTR(Word$, CHR$(SCREEN(Row, x))) = 0 THEN
  95.         FOR z = x - 1 TO LM STEP -1
  96.         IF INSTR(Word$, CHR$(SCREEN(Row, z))) > 0 THEN
  97.         OldCol = Col: Col = z + 1
  98.         GOSUB HighLight: GOTO MainLoop
  99.         END IF
  100.         NEXT
  101.         END IF
  102.     NEXT
  103.     END IF
  104.     NEXT
  105.     OldCol = Col: Col = LM: GOSUB HighLight: GOTO MainLoop
  106.  
  107. DeleteChar:
  108.     IF Col = RM THEN
  109.     LOCATE Row, Col: PRINT " ";
  110.     LOCATE Row, Col: GOTO MainLoop
  111.     END IF
  112.     Temp$ = "": LOCATE , , 0
  113.     FOR i = Col TO MaxCol - 1
  114.     Temp$ = Temp$ + CHR$(SCREEN(Row, i + 1))
  115.     NEXT
  116.     Temp$ = Temp$ + " "
  117.     LOCATE Row, Col: PRINT Temp$;
  118.     MaxCol = MaxCol - 1: IF MaxCol < LM THEN MaxCol = LM
  119.     LOCATE Row, Col: GOTO MainLoop
  120.  
  121. EndOfLine:
  122.     OldCol = Col: Col = MaxCol: GOSUB HighLight
  123.     LOCATE Row, Col: GOTO MainLoop
  124.  
  125. Backspace:
  126.     Temp$ = ""
  127.     IF Col = LM THEN SOUND 550, .5: GOTO MainLoop
  128.     IF Col < MaxCol THEN
  129.     LOCATE , , 0
  130.     FOR i = Col - 1 TO MaxCol - 1
  131.         Temp$ = Temp$ + CHR$(SCREEN(Row, i + 1))
  132.     NEXT
  133.     OldCol = Col: Col = Col - 1: GOSUB HighLight
  134.     Temp$ = Temp$ + " "
  135.     LOCATE Row, Col: PRINT Temp$; : MaxCol = MaxCol - 1
  136.     LOCATE Row, Col: GOTO MainLoop
  137.     END IF
  138.  
  139.     IF LChar THEN Col = Col + 1: LChar = 0
  140.     OldCol = Col: Col = Col - 1: GOSUB HighLight
  141.     MaxCol = Col
  142.     LOCATE Row, Col: PRINT " ";
  143.     LOCATE Row, Col: COLOR 7, 0
  144.     GOTO MainLoop
  145.  
  146. Enter:
  147.     LOCATE Row + 2, Col, 0: COLOR 7, 0
  148.     OldCol = Col: Col = LM: GOSUB HighLight
  149.     GOSUB PrintOut
  150.     GOSUB Scroll: LOCATE Row, Col, 1: LChar = 0: MaxCol = LM
  151.     GOTO MainLoop
  152.  
  153. HighLight:
  154.     LOCATE Row + 2, OldCol, 0
  155.     COLOR 7, 0: PRINT CHR$(SCREEN(Row + 2, OldCol));
  156.     LOCATE Row + 2, Col
  157.     COLOR 0, 7: PRINT CHR$(SCREEN(Row + 2, Col));
  158.     LOCATE Row, Col
  159.     COLOR 7, 0
  160.     RETURN
  161.  
  162. Wordwrap:
  163.     IF SCREEN(Row, RM) = 32 OR SCREEN(Row, RM) = 45 THEN
  164.     GOSUB PrintOut: GOSUB Scroll
  165.     LOCATE Row, LM: PRINT k$; : OldCol = Col
  166.     Col = POS(44): GOSUB HighLight: LChar = 0
  167.     LOCATE Row, Col: MaxCol = Col: GOTO MainLoop
  168.     END IF
  169.  
  170.     FOR i = RM - 1 TO LM STEP -1
  171.     char = SCREEN(Row, i)
  172.     IF char = 32 THEN
  173.         Text$ = ""
  174.         FOR x = i + 1 TO RM: Text$ = Text$ + CHR$(SCREEN(Row, x)): NEXT
  175.         Text$ = Text$ + k$: LOCATE Row, i + 1
  176.         PRINT STRING$(RM - i, 32);
  177.         GOSUB PrintOut
  178.         GOSUB Scroll
  179.         LOCATE Row, LM: PRINT Text$; : OldCol = Col
  180.         Col = POS(44): GOSUB HighLight: LChar = 0
  181.         LOCATE Row, Col: MaxCol = Col: GOTO MainLoop
  182.     END IF
  183.     NEXT
  184.     GOSUB Scroll: Col = LM: LOCATE Row, LM
  185.     GOTO MainLoop
  186.  
  187. PrintOut:
  188.     ON ERROR GOTO PrinterError
  189.     LOCATE , , 0: LPRINT STRING$(LM - 1, 32);
  190.     LPRINT PQ$;
  191.     FOR i = LM TO MaxCol
  192.     LPRINT CHR$(SCREEN(Row, i));
  193.     NEXT: LPRINT : LOCATE , , 1
  194.     ON ERROR GOTO 0
  195.     RETURN
  196.  
  197. Scroll:
  198.     VIEW PRINT 3 TO 18: LOCATE 18, 80: PRINT
  199.     VIEW PRINT: RETURN
  200.  
  201. Insert:
  202.     Temp$ = "": LOCATE , , 0
  203.     IF Col < MaxCol THEN
  204.     FOR i = Col TO MaxCol - 1
  205.         Temp$ = Temp$ + CHR$(SCREEN(Row, i))
  206.     NEXT
  207.     LOCATE Row, Col: PRINT k$; Temp$;
  208.     OldCol = Col: Col = Col + 1: GOSUB HighLight
  209.     MaxCol = MaxCol + 1: IF MaxCol > RM THEN MaxCol = RM
  210.     LOCATE Row, Col: GOTO MainLoop
  211.     END IF
  212.     LOCATE Row, Col: PRINT k$;
  213.     OldCol = Col: Col = Col + 1
  214.     IF Col > RM THEN Col = RM: LChar = -1
  215.     IF Col > MaxCol THEN MaxCol = Col
  216.     GOSUB HighLight: GOTO MainLoop
  217.  
  218. TabPos:
  219.     FOR i = Col + 1 TO RM
  220.     IF SCREEN(Row + 2, i) = 16 THEN
  221.         OldCol = Col: Col = i
  222.         GOSUB HighLight: LOCATE Row, Col
  223.         GOTO MainLoop
  224.     END IF
  225.     NEXT
  226.     SOUND 550, .5: GOTO MainLoop
  227.  
  228. SetTab:
  229.     IF Col = RM OR Col = LM THEN SOUND 550, .5: GOTO MainLoop
  230.     LOCATE Row + 2, Col: COLOR 0, 7
  231.     PRINT CHR$(16); : LOCATE Row, Col: COLOR 7, 0
  232.     GOTO MainLoop
  233.  
  234. ClearTab:
  235.     IF SCREEN(Row + 2, Col) <> 16 THEN SOUND 550, .5: GOTO MainLoop
  236.     COLOR 0, 7
  237.     LOCATE Row + 2, Col: PRINT CHR$(250);
  238.     LOCATE Row, Col: GOTO MainLoop
  239.  
  240. SetMargin:
  241.     OldLM = LM: OldRM = RM
  242.     FOR i = 21 TO 24: LOCATE i, 1, 0: PRINT STRING$(80, 32); : NEXT
  243.  
  244. SetMargin2:
  245.     LOCATE 22, 30: COLOR 15, 0: LINE INPUT ; " Left Margin: "; LM$
  246.     COLOR 7, 0
  247.     IF LEN(LM$) = 0 THEN GOSUB MenuLine: GOTO MainLoop
  248.     IF VAL(LM$) < 1 OR VAL(LM$) > 80 THEN
  249.     SOUND 550, .5
  250.     LOCATE 24, 25: PRINT "Invalid left margin.  Try again...";
  251.     GOTO SetMargin2
  252.     END IF
  253.     LOCATE 24, 1: PRINT STRING$(80, 32);
  254.  
  255. SetMargin3:
  256.     LOCATE 23, 30: COLOR 15, 0: LINE INPUT "Right Margin: "; RM$
  257.     COLOR 7, 0
  258.     IF LEN(RM$) = 0 THEN GOSUB MenuLine: GOTO MainLoop
  259.     IF VAL(RM$) > 80 OR VAL(RM$) <= VAL(LM$) + 1 THEN
  260.     SOUND 550, .5
  261.     LOCATE 24, 24: PRINT "Invalid right margin.  Try again...";
  262.     GOTO SetMargin3
  263.     END IF
  264.     LOCATE Row + 2, LM: PRINT CHR$(250);
  265.     LM = VAL(LM$): LOCATE Row + 2, LM: PRINT "L";
  266.     LOCATE Row + 2, RM: PRINT CHR$(250);
  267.  
  268.     RM = VAL(RM$): LOCATE Row + 2, RM: PRINT "R"
  269.     IF MaxCol = OldLM THEN
  270.     OldCol = Col: Col = LM: GOSUB HighLight
  271.     LChar = 0: MaxCol = Col: LOCATE Row, Col:
  272.     GOSUB MenuLine: GOTO MainLoop
  273.     END IF
  274.     IF LM < OldLM OR RM > OldRM THEN
  275.     LOCATE Row, Col: GOSUB MenuLine: GOTO MainLoop
  276.     END IF
  277.     LOCATE , , 0: LPRINT STRING$(OldLM - 1, 32);
  278.     FOR i = OldLM TO MaxCol
  279.     LPRINT CHR$(SCREEN(Row, i));
  280.     NEXT: LPRINT
  281.     LOCATE , , 1: GOSUB Scroll
  282.     OldCol = Col: Col = LM: MaxCol = Col: GOSUB HighLight
  283.     LChar = 0: LOCATE Row, Col
  284.     GOSUB MenuLine: GOTO MainLoop
  285.  
  286. Mode:
  287.     Insert = (-1 XOR Insert)
  288.     IF Insert THEN LOCATE 1, 7, 0, 0, 7: PRINT "Insert    ";
  289.     IF NOT Insert THEN LOCATE 1, 7, 0, 7, 7: PRINT "Overtype ";
  290.     GOTO MainLoop
  291.  
  292. Quit:
  293.     GOSUB BlankArea
  294.     LOCATE 23, 25, 0: COLOR 15, 0: PRINT "Are sure you want to Quit ? (Y/N)";
  295.     COLOR 7, 0: k$ = INPUT$(1): IF k$ = "Y" OR k$ = "y" THEN CLS : END
  296.     GOSUB MenuLine: GOTO MainLoop
  297.  
  298. FormFeed:
  299.     GOSUB PrintOut: LPRINT CHR$(12)
  300.     VIEW PRINT 3 TO 18: CLS : VIEW PRINT
  301.     OldCol = Col: Col = LM: MaxCol = LM: GOSUB HighLight
  302.     GOTO MainLoop
  303.  
  304. Status:
  305.     COLOR 7, 0
  306.     LOCATE 1, 76, 0: PRINT USING "##_/##"; Col; RM - Col + 1
  307.     LOCATE Row, Col, 1: RETURN
  308.  
  309. BlankArea:
  310.     VIEW PRINT 21 TO 24: CLS : VIEW PRINT: RETURN
  311.  
  312. MenuLine:
  313.     GOSUB BlankArea: RESTORE MenuData
  314.     LOCATE 24, 1, 0: COLOR 15, 7: PRINT STRING$(80, 32); : LOCATE 24, 2
  315.     FOR i = 1 TO 6
  316.     READ A$, b$
  317.     COLOR 15, 7: PRINT "   "; A$;
  318.     COLOR 0, 7: PRINT ; b$;
  319.     NEXT
  320.     COLOR 7, 0: RETURN
  321.  
  322. PrintQuality:
  323.     Draft = (-1 XOR Draft)
  324.     IF NOT Draft THEN
  325.  
  326. 'See comments in the beginning of the listing on printer set-up strings  
  327.  
  328.     PQ$ = CHR$(27) + "+" + CHR$(1)              'NLQ mode
  329.     'PQ$ = CHR$(27) + CHR$(73) + CHR$(3)         'NLQ mode OKIDATA 192
  330.     LOCATE 1, 31, 0: PRINT "Final": GOTO MainLoop
  331.     END IF
  332.     PQ$ = CHR$(27) + "+" + CHR$(0)                  'Draft mode
  333.     'PQ$ = CHR$(27) + CHR$(73) + CHR$(1)             'Draft OKIDATA 192
  334.     LOCATE 1, 31, 0: PRINT "Draft": GOTO MainLoop
  335.  
  336. PrinterError:
  337.     RESUME PrinterError2
  338.  
  339. PrinterError2:
  340.     ON ERROR GOTO 0
  341.     GOSUB BlankArea: SOUND 550, .5: COLOR 15, 0
  342.     LOCATE 23, 25: PRINT "There is a problem with your printer.";
  343.     LOCATE 24, 25: PRINT "     (C)ontinue or (Q)uit ?"; : COLOR 7, 0
  344.     ON ERROR GOTO 0
  345.     k$ = INPUT$(1)
  346.     IF k$ = "C" OR k$ = "c" THEN GOSUB MenuLine: GOTO PrintOut
  347.     GOTO Quit
  348.  
  349. MainScreen:
  350.     COLOR 7, 0: CLS
  351.     LOCATE 1, 1: PRINT "Mode: Overtype       Quality: Final"
  352.     PRINT STRING$(80, 196)
  353.     GOSUB Hello: GOSUB MenuLine
  354.     LOCATE 20, 1: PRINT FormatLine$; : LOCATE 20, LM: PRINT "L"
  355.     LOCATE 20, LM + 5: PRINT CHR$(16); : LOCATE 20, RM: PRINT "R"
  356.     OldCol = Col: GOSUB HighLight
  357.     RETURN
  358.             
  359. Hello:
  360.     RESTORE HelloData
  361.     LOCATE 3, 5, 0: PRINT CHR$(201); STRING$(69, 205); CHR$(187)
  362.     FOR i = 4 TO 22
  363.     LOCATE i, 5
  364.     PRINT CHR$(186); : LOCATE i, 75: PRINT CHR$(186);
  365.     NEXT
  366.     LOCATE 23, 5: PRINT CHR$(200); STRING$(69, 205); CHR$(188);
  367.     FOR i = 4 TO 22
  368.     IF i = 4 OR i = 22 THEN COLOR 15, 0 ELSE COLOR 7, 0
  369.     READ A$: LOCATE i, 40 - (LEN(A$) / 2): PRINT A$
  370.     NEXT
  371.     k$ = INPUT$(1)
  372.     VIEW PRINT 3 TO 24: CLS : VIEW PRINT
  373.     COLOR 7, 0: RETURN
  374.  
  375. MenuData:
  376.  
  377. DATA F1,Margins,F2,Set Tab
  378. DATA F3,Clear Tab,F4,Quality,F5,Form Feed
  379. DATA F10,Quit
  380.  
  381.  
  382. HelloData:
  383.  
  384. 'Note: The spaces between the last character of the key descriptions and
  385. '      the end quote marks are required for proper centering of the text.
  386.  
  387. DATA "TYPER - keys & descriptions"
  388. DATA " "
  389. DATA "       Left - move left a character                     "
  390. DATA "  Ctrl-Left - move left a word                          "
  391. DATA "      Right - move right a character                    "
  392. DATA " Ctrl-Right - move right a word                         "
  393. DATA "  Backspace - move left one character (destructive)     "
  394. DATA "        Tab - move to the next marked tab position      "
  395. DATA "       Home - move to left margin                       "
  396. DATA "        End - move to end of current line               "
  397. DATA "     Insert - switch mode (insert/overtype)             "
  398. DATA "     Delete - delete character under cursor             "
  399. DATA "         F1 - set left and right margins                "
  400. DATA "      F2,F3 - set or clear a tab at the cursor          "
  401. DATA "         F4 - switch print quality (final/draft)        "
  402. DATA "         F5 - issue a form feed to the printer          "
  403. DATA "        F10 - return to DOS                             "
  404. DATA " "                                                          
  405. DATA "Press any key to start typing!
  406.  
  407.  
  408.