home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 15 / CD_ASCQ_15_070894.iso / vrac / dnalib7a.zip / DNAWRITE.BAS < prev    next >
BASIC Source File  |  1994-05-16  |  60KB  |  2,022 lines

  1. DECLARE SUB GetStrLoc() 'we have to declare this because we need it
  2. $INCLUDE "DNALIB.INC"
  3. $LINK "DNALIB.PBL"
  4.  
  5. StatusAttr% = 14: BarAttr% = 112: HelpTextColor% = 0
  6. HelpAttr% = 48: TextAttr% = 30: ErrorTxt% = 14: ErrorAttr% = 79
  7. Allow$ = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-=`~!@#$%^&*()_+}{[]:;'?><,./\|"
  8. SearchFor$ = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-*~='└├╞╟╚╔╠╙╘╒╓┌"
  9. Delimiter$ = " ,($[{" + CHR$(10)
  10. Top% = 3: Bottom% = 23: LeftSide% = 2: RightSide% = 79: TextWidth% = 78
  11. Pointer% = 1: Offset% = 0: Immbed% = 0: Tag% = 0
  12.  
  13. IF MouseThere% THEN Mouse% = 1
  14.  
  15. DIM About$(15)
  16. DIM Prnter$(40)
  17. DIM Action$(40)
  18.  
  19. HorzMenu$(1) = "@File" :HorzMenu$(2) = "@Edit"
  20. HorzMenu$(3) = "@Search" :HorzMenu$(4) = "@Utilities"
  21. HorzMenu$(5) = "@Help"
  22.  
  23. VertMenu1$(1) = "@New" :
  24. VertMenu1$(2) = "@Open" :
  25. VertMenu1$(3) = "@Save"
  26. VertMenu1$(4) = "Save @As" :
  27. VertMenu1$(5) = "_"
  28. VertMenu1$(6) = "@Print" :
  29. VertMenu1$(7) = "_"
  30. VertMenu1$(8) = "@Dos Shell"
  31. VertMenu1$(9) = "E@xit"
  32.  
  33. VertMenu2$(1) = "Cu@t" :VertMenu2$(2) = "@Copy"
  34. VertMenu2$(3) = "@Paste" :VertMenu2$(4) = "@Delete"
  35. VertMenu2$(5) = "@Show Clipboard"
  36.  
  37. VertMenu3$(1) = "@Find" :VertMenu3$(2) = "@Replace"
  38. VertMenu3$(3) = "@Search again"
  39.  
  40. VertMenu4$(1) = "Printer @Setup": VertMenu4$(2) = "Codes to @Printer"
  41. VertMenu4$(3) = "@Tagging OFF"
  42.  
  43. VertMenu5$(1) = "@Help" :VertMenu5$(2) = "About @DNA.Write"
  44.  
  45. About$(1) = "DNA Library meets PBWrite"
  46. About$(2) = "by"
  47. About$(3) = " Chris Foot. Erik Olson. Lloyd Smith. Mel Bishop "
  48. About$(4) = " "
  49. About$(5) = "I would like to thank the above people and others "
  50. About$(6) = "who have contributed source code either knowingly "
  51. About$(7) = "or other wise to this project.   And to encourage "
  52. About$(8) = "other PowerBASIC users to share their Source code "
  53. About$(9) = " "
  54. About$(10) = "  I can be reached at the PowerBASIC tech support"
  55. About$(11) = "BBS or at this address                           "
  56. About$(12) = "                               15305 - 117 avenue"
  57. About$(13) = "                                Edmonton, Alberta"
  58. About$(14) = "FAX (403)452-5969                 CANADA, T5M 3X4"
  59.  
  60. ON ERROR GOTO WriteError
  61.  
  62. IF LEN(COMMAND$) THEN
  63.   FileName$ = COMMAND$
  64.   Test$ = DIR$(FileName$)
  65.   IF LEN(Test$) THEN
  66.     Been% = 1
  67.     GOSUB LoadFile
  68.   ELSE
  69.     IF YesNo%("File does not Exist! should I create it? (Y or N)",1,10,79,112,1,1) THEN
  70.       Been% = 1
  71.       GOSUB LoadFile
  72.     ELSE
  73.       Test$ = DIR$("NONAME.TXT")
  74.       IF LEN(Test$) THEN
  75.         FileName$ = "NONAME.TXT"
  76.         Been% = 1
  77.         GOSUB LoadFile
  78.       ELSE
  79.         GOSUB DefaultFile
  80.       END IF
  81.     END IF
  82.   END IF
  83. ELSE
  84.   Test$ = DIR$("NONAME.TXT")
  85.   IF LEN(Test$) THEN
  86.     FileName$ = "NONAME.TXT"
  87.     Been% = 1
  88.     GOSUB LoadFile
  89.   ELSE
  90.     GOSUB DefaultFile
  91.   END IF
  92. END IF
  93.  
  94. SplitPath GetProgramName$, Home$, EXEName$
  95.  
  96. SCREEN 0
  97.  
  98. TopRow% = 1
  99. Marker% = 99
  100. Popwind Title$,2,1,24,80,23,Shadow%,1
  101. COLOR 7,1
  102. LOCATE 24,3,0
  103. PRINT "┤Line:     Col:     ├────────┤FileSize:        ├"
  104. LOCATE 4,80,0: PRINT CHR$(24);
  105. LOCATE 22,80,0: PRINT CHR$(25);
  106. LOCATE 24,62,0: PRINT CHR$(27) + STRING$(16,176) + CHR$(26);
  107. AreaCLS 5,80,17,1,176,23
  108. COLOR 0,7
  109. LOCATE 25,1,0
  110. PRINT SPACE$(80);
  111. COLOR 4,7
  112. LOCATE 25,2,0: PRINT "F1       F2       F3       F4               F6";
  113. COLOR 0,7
  114. LOCATE 25,4,0: PRINT "-Help";
  115. LOCATE 25,13,0: PRINT "-Save";
  116. LOCATE 25,22,0: PRINT "-Open";
  117. LOCATE 25,31,0: PRINT "-Search Again";
  118. LOCATE 25,48,0: PRINT "-Load Macros";
  119.  
  120. Menu:
  121.  
  122. LockStatus 25,70,BarAttr%,StatusAttr%
  123.  
  124. HORIZONTALMENU HorzMenu$(),BarSave$,HiLight%,Mouse%,HPointer%,4,112,15,TopRow%,4,Marker%
  125.  
  126. SELECT CASE HPointer%
  127.     CASE 1  'Miscellaneous
  128.       VERTICALMENU VertMenu1$(),VertInfo1$(),VRtrn$,BarSave$,Mouse%,4,HelpTextColor%,HelpAttr%,15,TopRow%,Marker%,HPointer%,112,1,1
  129.       IF LEN(VRtrn$) THEN
  130.         SELECT CASE VRtrn$
  131.         CASE "New"
  132.                   GOSUB ClearAll
  133.                 CASE "Open"
  134.                   GOSUB LoadNew
  135.         CASE "Save"
  136.                   GOSUB Save
  137.                 CASE "Save As"
  138.                   GOSUB SaveAs
  139.                 CASE "Print"
  140.                   IF LEN(Block$) THEN
  141.                     IF YesNo%("Print Marked Text? (Y or N)",1,10,79,112,1,1) THEN
  142.                       WIDTH "LPT1:",255
  143.                       LPRINT Block$
  144.                     ELSE
  145.                       GOSUB PrintAll
  146.                     END IF
  147.                   ELSE
  148.                     GOSUB PrintAll
  149.                   END IF
  150.                 CASE "Dos Shell"
  151.                   GOSUB DosShell
  152.                 CASE "Exit"
  153.                   IF NoSave% THEN
  154.                     IF YesNo%("Quit and Lose Changes to Current File? (Y or N)",1,10,79,112,1,1) THEN
  155.                       GOTO WayOut
  156.                     ELSE
  157.                       GOSUB QuitSave
  158.                     END IF
  159.                   ELSE
  160.                     GOTO WayOut
  161.                   END IF
  162.         END SELECT
  163.           ELSE
  164.             IF Marker% THEN GOTO Menu
  165.       END IF
  166.     CASE 2  'Edit
  167.           VERTICALMENU VertMenu2$(),VertInfo2$(),VRtrn$,BarSave$,Mouse%,4,HelpTextColor%,HelpAttr%,15,TopRow%,Marker%,HPointer%,112,1,1
  168.       IF LEN(VRtrn$) THEN
  169.         SELECT CASE VRtrn$
  170.         CASE "Cut"
  171.                   GOSUB DeleteBlock
  172.         CASE "Copy"
  173.         CASE "Paste"
  174.                   GOSUB CopyBlock
  175.         CASE "Delete"
  176.         CASE "Show Clipboard"
  177.                   IF LEN(Block$) THEN
  178.                     GOSUB ViewClipboard
  179.                   ELSE
  180.                     Message$(1) = " Nothing to View "
  181.                     SOUND 50,5
  182.                     DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  183.                   END IF
  184.         END SELECT
  185.           ELSE
  186.             IF Marker% THEN GOTO Menu
  187.       END IF
  188.     CASE 3  'Screen
  189.           VERTICALMENU VertMenu3$(),VertInfo3$(),VRtrn$,BarSave$,Mouse%,4,HelpTextColor%,HelpAttr%,15,TopRow%,Marker%,HPointer%,112,1,1
  190.       IF LEN(VRtrn$) THEN
  191.         SELECT CASE VRtrn$
  192.         CASE "Find"
  193.                   GOSUB FindText
  194.                 CASE "Replace"
  195.                   GOSUB SearchAndReplace
  196.                 CASE "Search again"
  197.                   GOSUB SearchAgain
  198.         END SELECT
  199.           ELSE
  200.             IF Marker% THEN GOTO Menu
  201.       END IF
  202.     CASE 4  'Utilities
  203.           VERTICALMENU VertMenu4$(),VertInfo4$(),VRtrn$,BarSave$,Mouse%,4,HelpTextColor%,HelpAttr%,15,TopRow%,Marker%,HPointer%,112,1,1
  204.       IF LEN(VRtrn$) THEN
  205.         SELECT CASE VRtrn$
  206.         CASE "Printer Setup"
  207.                   GOSUB PrinterSetup
  208.                 CASE "Codes to Printer"
  209.                   VertMenu4$(2) = "Codes to @Document"
  210.                   Immbed% = 1
  211.                 CASE "Codes to Document"
  212.                   VertMenu4$(2) = "Codes to @Printer"
  213.                   Immbed% = 0
  214.                 CASE "Tagging ON"
  215.                   VertMenu4$(3) = "@Tagging OFF"
  216.                   Tag% = 0
  217.                 CASE "Tagging OFF"
  218.                   VertMenu4$(3) = "@Tagging ON"
  219.                   Tag% = 4
  220.         END SELECT
  221.           ELSE
  222.             IF Marker% THEN GOTO Menu
  223.       END IF
  224.     CASE 5  'Help
  225.           VERTICALMENU VertMenu5$(),VertInfo5$(),VRtrn$,BarSave$,Mouse%,4,HelpTextColor%,HelpAttr%,15,TopRow%,Marker%,HPointer%,112,1,1
  226.       IF LEN(VRtrn$) THEN
  227.         SELECT CASE VRtrn$
  228.         CASE "Help"
  229.                   GOSUB KeyBoardHelp
  230.         CASE "About DNA.Write"
  231.           DIALOG About$(),"",0,Mouse%,3,0,0,0,112,1,1
  232.         END SELECT
  233.           ELSE
  234.             IF Marker% THEN GOTO Menu
  235.       END IF
  236. END SELECT
  237.  
  238. IF Been% = 0 THEN
  239.   DIALOG About$(),"",0,Mouse%,3,0,0,0,112,1,1
  240.   Been% = 1
  241. END IF
  242.  
  243. DO
  244.  
  245. MouseJump:
  246.  
  247. GOSUB PrintRoutine
  248.  
  249. IF CursorRow% < 3 OR CursorRow% > 23 THEN CursorRow% = 3
  250. IF CursorCol% < 2 OR CursorCol% > 79 THEN CursorCol% = 2
  251.  
  252. GOSUB FileInfo
  253.  
  254. IF InsertKey% THEN
  255.   LOCATE CursorRow%,CursorCol%,1,0,13    'Block Cursor
  256. ELSE
  257.   LOCATE CursorRow%,CursorCol%,1,11,12   'Normal Cursor
  258. END IF
  259.  
  260. WHILE NOT INSTAT
  261.   IF Mouse% THEN
  262.     ShowCursor
  263.     Rgt% = 0:Lft% = 0
  264.     Clicked Rgt%,Lft%,MRow%,MCol%
  265.     IF MRow% >= Top% - 2 AND MRow% <= Bottom% + 2 AND MCol% >= LeftSide% - 1 AND MCol% <= RightSide% + 1 THEN
  266.       IF MRow% >= Top% AND MRow% <= Bottom% AND MCol% >= LeftSide% AND MCol% <= RightSide% THEN
  267.         IF Lft% THEN
  268.           CursorRow% = MRow%: CursorCol% = MCol%
  269.           LOCATE CursorRow%,CursorCol%,1
  270.           GOTO MouseJump
  271.         END IF
  272.       ELSE
  273.         SELECT CASE MRow%
  274.           CASE 1
  275.             IF LeftButtonReleased% THEN
  276.               FindMenu MRow%,MCol%,Found%
  277.               IF Found% THEN
  278.                 HPointer% = Found%: Marker% = 1: HiLight% = 1: GOTO Menu
  279.               END IF
  280.             END IF
  281.           CASE 2
  282.           CASE 4        'Scroll arrow up
  283.             IF Lft% AND MCol% = 80 THEN
  284.               Editkey% = 26: GOTO KeyBoardRoutine
  285.             END IF
  286.           CASE 5 TO 21  'pageing
  287.           CASE 22       'Scroll arrow down
  288.             IF Lft% AND MCol% = 80 THEN
  289.               Editkey% = 23: GOTO KeyBoardRoutine
  290.             END IF
  291.           CASE 24
  292.             SELECT CASE MCol%
  293.               CASE 62
  294.                 IF Lft% THEN
  295.                   Editkey% = -157: GOTO KeyBoardRoutine
  296.                 END IF
  297.               CASE 63 TO 78  'Home and End?
  298.               CASE 79
  299.                 IF Lft% THEN
  300.                   Editkey% = -155: GOTO KeyBoardRoutine
  301.                 END IF
  302.             END SELECT
  303.           CASE 25
  304.             IF LeftButtonReleased% THEN
  305.               ScreenPlus MRow%,MCol%,TextFound$
  306.               SELECT CASE TextFound$
  307.                 CASE "F1-Help"
  308.                   Editkey% = -59:GOTO KeyBoardRoutine
  309.                 CASE "F2-Save"
  310.                   Editkey% = -60:GOTO KeyBoardRoutine
  311.                 CASE "F3-Open"
  312.                   Editkey% = -61:GOTO KeyBoardRoutine
  313.                 CASE "F4-Search","Again"
  314.                   Editkey% = -62:GOTO KeyBoardRoutine
  315.                 CASE "F6-Load","Macros"
  316.                   Editkey% = -64:GOTO KeyBoardRoutine
  317.               END SELECT
  318.             END IF
  319.         END SELECT
  320.       END IF
  321.     END IF
  322.   END IF
  323.   IF KeyDown% THEN
  324.     LockStatus 25,70,BarAttr%,StatusAttr%
  325.     LOCATE CursorRow%,CursorCol%,1
  326.   END IF
  327.   IF AltKey% THEN HiLight% = 1: GOTO Menu
  328. WEND
  329.  
  330. Ky$ = INKEY$
  331.  
  332. IF LEN(Ky$) = 1 THEN
  333.   EditKey% = ASC(Ky$)
  334. ELSE
  335.   EditKey% = -ASC(RIGHT$(Ky$,1))
  336. END IF
  337.  
  338. KeyBoardRoutine:
  339.  
  340. SELECT CASE EditKey%
  341.         CASE 1     'Ctrl A
  342.           GOSUB WordLeft
  343.         CASE 3     'Ctrl C
  344.           GOSUB PageDown
  345.         CASE 4     'Ctrl D
  346.           GOSUB MoveRight
  347.         CASE 5     'Ctrl E
  348.           GOSUB MoveUp
  349.         CASE 6     'Ctrl F
  350.           GOSUB WordRight
  351.         CASE 7     'Ctrl G
  352.           GOSUB DeleteKey
  353.     CASE 8     'BackSpace or Ctrl H
  354.           GOSUB BackSpace
  355.         CASE 9     'TabKey
  356.           GOSUB TabKey
  357.         CASE 11    'Ctrl K
  358.           GOSUB CtrlKHelp
  359.           WHILE NOT INSTAT
  360.             IF Mouse% THEN
  361.               ShowCursor
  362.               Rgt% = 0:Lft% = 0
  363.               Clicked Rgt%,Lft%,MRow%,MCol%
  364.               IF Lft% THEN
  365.                 CtrlKKey% = 0: GOTO CtrlKRoutine
  366.               END IF
  367.             END IF
  368.           WEND
  369.  
  370.           Ky$ = INKEY$
  371.  
  372.           IF LEN(Ky$) = 1 THEN
  373.             CtrlKKey% = ASC(Ky$)
  374.           ELSE
  375.             CtrlKKey% = -ASC(RIGHT$(Ky$,1))
  376.           END IF
  377.  
  378.           CtrlKRoutine:
  379.           IF Mouse% THEN HideCursor
  380.           RestoreScreen CtrlK$,6,50
  381.           SELECT CASE CtrlKKey%
  382.                  CASE 2,66,98   '^K B Mark Block begin
  383.                    GOSUB MarkBlockBegin
  384.                  CASE 3,67,99   '^K C Copy Block
  385.                    GOSUB CopyBlock
  386.                  CASE 4,68,100  '^K D Save and Exit
  387.                    GOSUB QuitSave
  388.                  CASE 8,72,104  '^K H View Clipboard
  389.                    IF LEN(Block$) THEN
  390.                      GOSUB ViewClipboard
  391.                    ELSE
  392.                      Message$(1) = " Nothing to View "
  393.                      SOUND 50,5
  394.                      DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  395.                    END IF
  396.                  CASE 11,75,107  '^K K Mark Block end
  397.                    GOSUB MarkBlockEnd
  398.                  CASE 14,78,110  '^K N Mark Position
  399.                    GOSUB MarkPosition
  400.                  CASE 16,80,112  '^K P Print Block
  401.                    IF LEN(Block$) THEN
  402.                      IF YesNo%("Print Marked Text? (Y or N)",1,10,79,112,1,1) THEN
  403.                        WIDTH "LPT1:",255
  404.                        LPRINT Block$
  405.                      ELSE
  406.                        GOSUB PrintAll
  407.                      END IF
  408.                ELSE
  409.                      GOSUB PrintAll
  410.                    END IF
  411.                  CASE 17,81,113  '^K Q Quit No Save
  412.                    IF NoSave% THEN
  413.                      IF YesNo%("Quit and Loose Changes to Current File? (Y or N)",1,10,79,112,1,1) THEN
  414.                        GOTO WayOut
  415.                      ELSE
  416.                        GOSUB QuitSave
  417.                      END IF
  418.                    ELSE
  419.                      GOTO WayOut
  420.                    END IF
  421.                  CASE 18,82,114  '^K R Read Block from disk
  422.                    InFile% = 1
  423.                    GOSUB InsertFile
  424.                  CASE 19,83,115  '^K S Save and Edit
  425.                    GOSUB Save
  426.                  CASE 20,84,116  '^K T Mark Single word
  427.                  CASE 22,86,118  '^K V Move Block
  428.                    GOSUB MoveBlock
  429.                  CASE 23,87,119  '^K W Write Block to disk
  430.                    IF LEN(Block$) THEN
  431.                      GOSUB WriteBlockToDisk
  432.                    ELSE
  433.                      Message$(1) = " Clipboard is Empty Nothing to Save "
  434.                      SOUND 50,5
  435.                      DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  436.                    END IF
  437.                  CASE 25,89,121  '^K Y Delete Block
  438.                    GOSUB DeleteBlock
  439.                  CASE -59     'F1 key
  440.                    GOSUB KeyBoardHelp
  441.           END SELECT
  442.         CASE 12    'Crtl L
  443.           GOSUB SearchAgain
  444.         CASE 13    'EnterKey
  445.           GOSUB CarriageReturn
  446.         CASE 14    'Ctrl N
  447.           GOSUB InsertLine
  448.         CASE 16    'Ctrl P
  449.           GOSUB ExtendedKeys
  450.         CASE 17    'Ctrl Q
  451.           GOSUB CtrlQHelp
  452.           WHILE NOT INSTAT
  453.             IF Mouse% THEN
  454.               ShowCursor
  455.               Rgt% = 0:Lft% = 0
  456.               Clicked Rgt%,Lft%,MRow%,MCol%
  457.               IF Lft% THEN
  458.                 CtrlQKey% = 0: GOTO CtrlQRoutine
  459.               END IF
  460.             END IF
  461.           WEND
  462.  
  463.           Ky$ = INKEY$
  464.  
  465.           IF LEN(Ky$) = 1 THEN
  466.             CtrlQKey% = ASC(Ky$)
  467.           ELSE
  468.             CtrlQKey% = -ASC(RIGHT$(Ky$,1))
  469.           END IF
  470.  
  471.           CtrlQRoutine:
  472.           IF Mouse% THEN HideCursor
  473.           RestoreScreen CtrlQ$,6,50
  474.           SELECT CASE CtrlQKey%
  475.  
  476.                  CASE 1,65,97   '^Q A Search and Replace
  477.                    GOSUB SearchAndReplace
  478.                  CASE 2,66,98   '^Q B Move to Block begin
  479.                    GOSUB RestoreBlockBegin
  480.                  CASE 3,67,99   '^Q C End of File
  481.                    GOSUB EndOfFile
  482.                  CASE 4,68,100  '^Q D End of line
  483.                    GOSUB LineEnd
  484.                  CASE 5,69,101  '^Q E Top of screen
  485.                    CursorRow% = Top%
  486.                  CASE 6,70,102  '^Q F Search
  487.                    GOSUB FindText
  488.                  CASE 11,75,107  '^Q K Move to Block end
  489.                    GOSUB RestoreBlockEnd
  490.                  CASE 12,76,108  '^Q L Restore line
  491.                    GOSUB RestoreLine
  492.                  CASE 16,80,112  '^Q P Move to previous position
  493.                    GOSUB RestorePosition
  494.                  CASE 18,82,114  '^Q R Start of File
  495.                    GOSUB StartOfFile
  496.                  CASE 19,83,115  '^Q S Start of line
  497.                    GOSUB LineStart
  498.                  CASE 23,87,119  '^Q W Last Message
  499.                    IF Message$(1) = "" THEN Message$(1) = "No Message to Restore"
  500.                    DIALOG Message$(),"",0,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  501.                  CASE 24,88,120  '^Q X Bottom of screen
  502.                    CursorRow% = Bottom%
  503.                  CASE 25,89,121  '^Q Y Delete to end of line
  504.                    GOSUB DeleteToEndOfLine
  505.                  CASE -59     'F1 key
  506.                    GOSUB KeyBoardHelp
  507.           END SELECT
  508.         CASE 18    'Ctrl R
  509.           GOSUB PageUp
  510.         CASE 19    'Ctrl S
  511.           GOSUB MoveLeft
  512.         CASE 20    'Ctrl T
  513.           GOSUB DeleteWordRight
  514.         CASE 21    'Ctrl U
  515.           GOSUB RestoreLine
  516.         CASE 23    'Ctrl W
  517.           GOSUB ScrollUp
  518.         CASE 24    'Ctrl X
  519.           GOSUB MoveDown
  520.         CASE 25    'Ctrl Y
  521.           GOSUB DeleteLine
  522.         CASE 26    'Ctrl Z
  523.           GOSUB ScrollDown
  524.     CASE 27    'EscKey
  525.         CASE 32 TO 126 'Normal Editing Keys
  526.           GOSUB AddText
  527.         CASE -59   'F1 Key
  528.           GOSUB KeyBoardHelp
  529.         CASE -60   'F2 Key
  530.           GOSUB Save
  531.         CASE -61   'F3 Key
  532.           GOSUB LoadNew
  533.         CASE -62   'F4 Key
  534.           GOSUB SearchAgain
  535.         CASE -64   'F6 Key
  536.           GOSUB LoadMacro
  537.         CASE -65   'F7 Key
  538.           GOSUB PrinterSetup
  539.     CASE -71   'HomeKey
  540.           GOSUB LineStart
  541.         CASE -72   'Up Arrow
  542.           GOSUB MoveUp
  543.         CASE -73   'Page Up
  544.           GOSUB PageUp
  545.     CASE -75   'LeftArrow
  546.           GOSUB MoveLeft
  547.     CASE -77   'RightArrow
  548.           GOSUB MoveRight
  549.     CASE -79   'EndKey
  550.           GOSUB LineEnd
  551.         CASE -80   'Down Arrow
  552.           GOSUB MoveDown
  553.         CASE -81   'Page Down
  554.           GOSUB PageDown
  555.     CASE -82   'InsertKey
  556.           GOSUB ToggleInsert
  557.     CASE -83   'DeleteKey
  558.           GOSUB DeleteKey
  559.         CASE -94   'Ctrl F1
  560.           Mackro$ = Macro$(1)
  561.           GOSUB MacroKeys
  562.         CASE -95   'Ctrl F2
  563.           Mackro$ = Macro$(2)
  564.           GOSUB MacroKeys
  565.         CASE -96   'Ctrl F3
  566.           Mackro$ = Macro$(3)
  567.           GOSUB MacroKeys
  568.         CASE -97   'Ctrl F4
  569.           Mackro$ = Macro$(4)
  570.           GOSUB MacroKeys
  571.         CASE -98   'Ctrl F5
  572.           Mackro$ = Macro$(5)
  573.           GOSUB MacroKeys
  574.         CASE -99   'Ctrl F6
  575.           Mackro$ = Macro$(6)
  576.           GOSUB MacroKeys
  577.         CASE -100  'Ctrl F7
  578.           Mackro$ = Macro$(7)
  579.           GOSUB MacroKeys
  580.         CASE -101  'Ctrl F8
  581.           Mackro$ = Macro$(8)
  582.           GOSUB MacroKeys
  583.         CASE -102  'Ctrl F9
  584.           Mackro$ = Macro$(9)
  585.           GOSUB MacroKeys
  586.         CASE -103  'Ctrl F10
  587.           Mackro$ = Macro$(10)
  588.           GOSUB MacroKeys
  589.         CASE -115  'Ctrl LeftArrow
  590.           GOSUB WordLeft
  591.         CASE -116  'Ctrl RightArrow
  592.           GOSUB WordRight
  593.         CASE -117  'Ctrl End
  594.           CursorRow% = Bottom%
  595.         CASE -118  'Ctrl PgDn
  596.           GOSUB EndOfFile
  597.         CASE -119  'Ctrl Home
  598.           CursorRow% = Top%
  599.         CASE -132  'Ctrl PgUp
  600.           GOSUB StartOfFile
  601.         CASE -155
  602.           GOSUB ScrollLeft
  603.         CASE -157
  604.           GOSUB ScrollRight
  605.         CASE ELSE
  606.       BEEP
  607.  
  608. END SELECT
  609.  
  610. LOOP
  611.  
  612. WayOut:
  613.  
  614. DELAY .5
  615. COLOR 7,0
  616. CLS
  617.  
  618. END
  619. '----------------------------------------------------------------------------
  620. KeyBoardHelp:
  621.  
  622. BROWSE Home$ + "KEYBOARD.HLP",Mouse%,HelpTextColor%,3,12,23,67,HelpAttr%,1,1
  623.  
  624. RETURN
  625. '----------------------------------------------------------------------------
  626. MacroKeys:
  627.  
  628. NoSave% = 1
  629.  
  630. GOSUB CheckForChange
  631.  
  632. IF LEN(Mackro$) THEN
  633.   IF ((Offset% + CursorCol%) - LeftSide%) > EditLineLenght% THEN
  634.     Text$ = LEFT$(Text$,EditEndPointer% - 1) + _
  635.     SPACE$(((Offset% + CursorCol%) - LeftSide%) - EditLineLenght%) + _
  636.     Mackro$ + MID$(Text$, EditEndPointer%)
  637.   ELSE
  638.     Text$ = LEFT$(Text$,Character% - 1) + Mackro$ + MID$(Text$, Character%)
  639.   END IF
  640. END IF
  641.  
  642. RETURN
  643. '----------------------------------------------------------------------------
  644. LoadMacro:
  645.  
  646. MacroLoaded% = 0
  647. MacroName$(1) = "MACRO1.MAC": MacroName$(2) = "MACRO2.MAC"
  648. MacroName$(3) = "MACRO3.MAC": MacroName$(4) = "MACRO4.MAC"
  649. MacroName$(5) = "MACRO5.MAC": MacroName$(6) = "MACRO6.MAC"
  650. MacroName$(7) = "MACRO7.MAC": MacroName$(8) = "MACRO8.MAC"
  651. MacroName$(9) = "MACRO9.MAC": MacroName$(10) = "MACRO10.MAC"
  652.  
  653. FOR i% = 1 TO 10
  654.   Test$ = DIR$(Home$ + MacroName$(i%))
  655.   IF LEN(Test$) THEN
  656.     FileNumber% = FREEFILE
  657.     OPEN Home$ + MacroName$(i%) FOR BINARY AS FileNumber%
  658.       IF LOF(FileNumber%) < 2000 THEN
  659.         GET$ FileNumber%, LOF(FileNumber%), Macro$(i%)
  660.         MacroLoaded% = 1
  661.       END IF
  662.     CLOSE FileNumber%
  663.   END IF
  664. NEXT i%
  665.  
  666. IF MacroLoaded% THEN
  667.   COLOR 4,7: LOCATE 25,46,0: PRINT "Ctrl F1 to F10";
  668.   COLOR 0,7: LOCATE 25,60,0: PRINT "-Macro#";
  669. END IF
  670.  
  671. RETURN
  672. '----------------------------------------------------------------------------
  673. WordLeft:
  674.  
  675. Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  676. LeftWord% = Character%
  677.  
  678. IF EditStartPointer% THEN
  679.   DO
  680.     IF LeftWord% > 1 THEN
  681.       IF LeftWord% = EditStartPointer% AND LeftWord% > 1 THEN GOTO LineAbove
  682.       DECR LeftWord%
  683.     ELSE
  684.       Offset% = 0: CursorCol% = LeftSide%
  685.       EXIT
  686.     END IF
  687.     IF INSTR(MID$(Text$,LeftWord%,1),ANY SearchFor$) THEN
  688.       DO
  689.         IF LeftWord% > 1 THEN
  690.           DECR LeftWord%
  691.         ELSE
  692.           Offset% = 0: CursorCol% = LeftSide%
  693.           EXIT,EXIT
  694.         END IF
  695.         IF INSTR(MID$(Text$,LeftWord%,1),ANY DeLimiter$) THEN
  696.           DO
  697.           INCR LeftWord%
  698.             IF INSTR(MID$(Text$,LeftWord%,1),ANY SearchFor$) THEN
  699.               FOR l% = LeftWord% + 1 TO Character%
  700.                 GOSUB MoveLeft
  701.               NEXT l%
  702.               EXIT,EXIT,EXIT
  703.             END IF
  704.           LOOP UNTIL LeftWord% = Character%
  705.         END IF
  706.       LOOP
  707.     END IF
  708.   LOOP
  709. END IF
  710.  
  711. RETURN
  712. '----------------------------------------------------------------------------
  713. LineAbove:
  714.  
  715. GOSUB MoveUp
  716. GOSUB PrintRoutine
  717. GOSUB LineEnd
  718. GOTO WordLeft
  719.  
  720. '----------------------------------------------------------------------------
  721. WordRight:
  722.  
  723. Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  724. RightWord% = Character%
  725.  
  726. IF Character% < EditEndPointer% + 1 AND Character% < LEN(Text$) - 2 THEN
  727.   RightWord% = INSTR(RightWord%,Text$,ANY DeLimiter$)
  728.   IF RightWord% THEN
  729.     RightWord% = INSTR(RightWord%,Text$,ANY SearchFor$)
  730.     IF RightWord% < EditEndPointer% THEN
  731.       FOR i% = Character% TO RightWord% - 1
  732.         GOSUB MoveRight
  733.       NEXT i%
  734.     ELSE  'search for blank lines
  735.       BlankLine% = 0
  736.       FOR i% = EditEndPointer% + 1 TO RightWord%
  737.         IF MID$(Text$,i%,1) = CHR$(10) THEN
  738.           INCR BlankLine%
  739.           GOSUB MoveDown
  740.         END IF
  741.       NEXT i%
  742.       IF BlankLine% THEN
  743.         CursorCol% = ((RightWord% - EditEndPointer%) - (2 * BlankLine%)) + 2
  744.         IF CursorCol% > RightSide% THEN
  745.           Offset% = (CursorCol% - RightSide%) + LeftSide%
  746.           CursorCol% = RightSide% - 2
  747.         ELSE
  748.           Offset% = 0
  749.         END IF
  750.       ELSE
  751.         CursorCol% = RightWord% - EditEndPointer%
  752.         IF CursorCol% > RightSide% THEN
  753.           Offset% = (CursorCol% - RightSide%) + LeftSide%
  754.           CursorCol% = RightSide% - 2
  755.         ELSE
  756.           Offset% = 0
  757.         END IF
  758.         GOSUB MoveDown
  759.       END IF
  760.     END IF
  761.   END IF
  762. END IF
  763.  
  764. RETURN
  765. '----------------------------------------------------------------------------
  766. MarkWordRight:
  767.  
  768. RETURN
  769. '----------------------------------------------------------------------------
  770. AddText:
  771.  
  772. NoSave% = 1
  773.  
  774. GOSUB CheckForChange
  775.  
  776. IF Tabs% = 0 THEN
  777.   IF ((Offset% + CursorCol%) - LeftSide%) > EditLineLenght% THEN
  778.     Text$ = LEFT$(Text$,EditEndPointer% - 1) + _
  779.     SPACE$(((Offset% + CursorCol%) - LeftSide%) - EditLineLenght%) + _
  780.     MID$(Text$, EditEndPointer%)
  781.   END IF
  782. END IF
  783.  
  784. 'INSERT OR OVERTYPE THE CHARACTER
  785.  
  786. IF ISFALSE InsertKey% THEN
  787.   Text$ = LEFT$(Text$,Character% - 1) + Ky$ + MID$(Text$,Character%)
  788. ELSE
  789.   IF MID$(Text$,Character%,1) = CHR$(13) THEN
  790.     Text$ = LEFT$(Text$,Character% - 1) + Ky$ + MID$(Text$,Character%)
  791.   ELSE
  792.     MID$(Text$,Character%,1) = Ky$
  793.   END IF
  794. END IF
  795.  
  796. 'NOW ADJUST THE CURSOR POSITION
  797.  
  798. IF CursorCol% < 79 THEN
  799.   INCR CursorCol%
  800. ELSE
  801.   INCR Offset%
  802. END IF
  803.  
  804. RETURN
  805. '----------------------------------------------------------------------------
  806. ExtendedKeys:
  807.  
  808. Only$ = "1234567890"
  809. Num$ = "   "
  810. IF Mouse% THEN HideCursor
  811. SAVESCREEN CtrlScreen$,3,4,22,76,1
  812. POPWIND "ASCII Table Quick Reference",3,4,17,76,112,1,1
  813. COLOR 0,7
  814. LOCATE 4,6,0: PRINT "001 " + CHR$(1) + "   004 " + CHR$(4) + "   007 " + CHR$(7) + "   014 " + CHR$(14) + "   017 " + CHR$(17) + "   020 " + CHR$(20) + "   023 " + CHR$(23) + "   026 " + CHR$(26) + "   029 " + CHR$(29);
  815. LOCATE 5,6,0: PRINT "002 " + CHR$(2) + "   005 " + CHR$(5) + "   011 " + CHR$(11) + "   015 " + CHR$(15) + "   018 " + CHR$(18) + "   021 " + CHR$(21) + "   024 " + CHR$(24) + "   027 " + CHR$(27) + "   030 " + CHR$(30);
  816. LOCATE 6,6,0: PRINT "003 " + CHR$(3) + "   006 " + CHR$(6) + "   012 " + CHR$(12) + "   016 " + CHR$(16) + "   019 " + CHR$(19) + "   022 " + CHR$(22) + "   025 " + CHR$(25) + "   028 " + CHR$(28) + "   031 " + CHR$(31);
  817. LOCATE 8,6,0: PRINT "174 «   183 ╖   192 └   201 ╔   210 ╥   219 █   228 Σ   237 φ   246 ÷";
  818. LOCATE 9,6,0: PRINT "175 »   184 ╕   193 ┴   202 ╩   211 ╙   220 ▄   229 σ   238 ε   247 ≈";
  819. LOCATE 10,6,0: PRINT "176 ░   185 ╣   194 ┬   203 ╦   212 ╘   221 ▌   230 µ   239 ∩   248 °";
  820. LOCATE 11,6,0: PRINT "177 ▒   186 ║   195 ├   204 ╠   213 ╒   222 ▐   231 τ   240 ≡   249 ∙";
  821. LOCATE 12,6,0: PRINT "178 ▓   187 ╗   196 ─   205 ═   214 ╓   223 ▀   232 Φ   241 ±   250 ·";
  822. LOCATE 13,6,0: PRINT "179 │   188 ╝   197 ┼   206 ╬   215 ╫   224 α   233 Θ   242 ≥   251 √";
  823. LOCATE 14,6,0: PRINT "180 ┤   189 ╜   198 ╞   207 ╧   216 ╪   225 ß   234 Ω   243 ≤   252 ⁿ";
  824. LOCATE 15,6,0: PRINT "181 ╡   190 ╛   199 ╟   208 ╨   217 ┘   226 Γ   235 δ   244 ⌠   253 ²";
  825. LOCATE 16,6,0: PRINT "182 ╢   191 ┐   200 ╚   209 ╤   218 ┌   227 π   236 ∞   245 ⌡   254 ■";
  826.  
  827. POPWIND Title$,20,55,22,76,112,1,1
  828. COLOR 0,7: LOCATE 21,57,0: PRINT "Extended Key #";
  829. LINEEDIT Only$,Num$,0,MouseRow%,MouseCol%,176,21,72,Editkey%,14
  830. RESTORESCREEN CtrlScreen$,3,4
  831. IF LEN(RTRIM$(Num$)) THEN
  832.   IF VAL(Num$) > 254 THEN
  833.     Message$(1) = " Sorry that Key is not supported "
  834.     SOUND 50,5
  835.     DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  836.   ELSE
  837.     Ky$ = CHR$(VAL(Num$))
  838.     IF INSTR(Ky$,ANY CHR$(9,10,13)) THEN
  839.       Message$(1) = " Sorry No Tabs, Linefeeds, or Carriage Returns "
  840.       SOUND 50,5
  841.       DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  842.     ELSE
  843.       GOSUB AddText
  844.     END IF
  845.   END IF
  846. END IF
  847.  
  848. RETURN
  849. '----------------------------------------------------------------------------
  850. InsertLine:
  851.  
  852. NoSave% = 1
  853.  
  854. GOSUB CheckForChange
  855.  
  856. o% = Offset%: c% = CursorCol%: r% = CursorRow%
  857. GOSUB CarriageReturn
  858. Offset% = o%: CursorCol% = c%: CursorRow% = r%
  859.  
  860. RETURN
  861. '----------------------------------------------------------------------------
  862. CarriageReturn:
  863.  
  864. NoSave% = 1
  865.  
  866. GOSUB CheckForChange
  867.  
  868. IF ((Offset% + CursorCol%) - LeftSide%) > EditLineLenght% THEN
  869.   Text$ = LEFT$(Text$,EditEndPointer% - 1) + CHR$(13) + CHR$(10) + _
  870.   MID$(Text$,EditEndPointer%)
  871. ELSE
  872.   Text$ = LEFT$(Text$,Character% - 1) + CHR$(13) + CHR$(10) + MID$(Text$,Character%)
  873. END IF
  874.  
  875. CursorCol% = LeftSide%
  876.  
  877. IF Offset% > 0 THEN Offset%=0
  878. IF CursorRow% < 23 THEN
  879.   INCR CursorRow%
  880. ELSE
  881.   IF TempPointer% < LEN(Text$) THEN
  882.     Pointer% = INSTR(Pointer%, Text$, CHR$(13)) + 2
  883.   END IF
  884. END IF
  885.  
  886. RETURN
  887. '----------------------------------------------------------------------------
  888. TabKey:
  889.  
  890. NoSave% = 1
  891.  
  892. GOSUB CheckForChange
  893.  
  894. IF ((Offset% + CursorCol%) - LeftSide%) > EditLineLenght% THEN
  895.   Tabs% = 8 - (((Offset% + CursorCol%) - LeftSide%) MOD 8)
  896.   Text$ = LEFT$(Text$,EditEndPointer% - 1) + _
  897.   SPACE$(((Offset% + CursorCol% + Tabs%) - LeftSide%) - EditLineLenght%) + _
  898.   MID$(Text$,EditEndPointer%)
  899.   GOSUB PrintRoutine
  900.   CursorCol% = (LeftSide% + EditLineLenght%) - Offset%
  901.   IF CursorCol% > 79 THEN GOSUB LineEnd
  902. ELSE
  903.   Tabs% = 8 - (((Offset% + CursorCol%) - LeftSide%) MOD 8)
  904.   FOR i% = 1 TO Tabs%
  905.     Ky$ = CHR$(32): GOSUB AddText
  906.   NEXT i%
  907. END IF
  908.  
  909. Tabs% = 0
  910.  
  911. RETURN
  912. '----------------------------------------------------------------------------
  913. DeleteKey:
  914.  
  915. NoSave% = 1
  916.  
  917. GOSUB CheckForChange
  918.  
  919. IF Character% =< EditEndPointer% THEN
  920.   IF LEN(Text$) THEN
  921.     IF MID$(Text$,Character%,1) = CHR$(13) THEN
  922.       Text$ = LEFT$(Text$,Character% - 1) + MID$(Text$,Character% + 2)
  923.     ELSE
  924.       Text$ = LEFT$(Text$,Character% - 1) + MID$(Text$,Character% + 1)
  925.     END IF
  926.   END IF
  927. END IF
  928.  
  929. RETURN
  930. '----------------------------------------------------------------------------
  931. ToggleInsert:
  932.  
  933. IF InsertKey% THEN
  934.   LOCATE ,,,0,13    'Block Cusor
  935. ELSE
  936.   LOCATE ,,,11,12   'Normal Cursor
  937. END IF
  938.  
  939. RETURN
  940. '----------------------------------------------------------------------------
  941. LineStart:
  942.  
  943. IF Offset% THEN
  944.   Offset% = 0
  945.   CursorCol% = LeftSide%
  946. ELSE
  947.   CursorCol% = LeftSide%
  948. END IF
  949.  
  950. RETURN
  951. '----------------------------------------------------------------------------
  952. LineEnd:
  953.  
  954. CursorCol% = LeftSide% + EditLineLenght%
  955.  
  956. IF CursorCol% > RightSide% THEN
  957.   CursorCol% = RightSide% - 1
  958.   Offset% = (EditLineLenght% - RightSide%) + (LeftSide% + 1)
  959. ELSE
  960.   Offset% = 0
  961. END IF
  962.  
  963. RETURN
  964. '----------------------------------------------------------------------------
  965. StartOfFile:
  966.  
  967. Pointer% = 1: Offset% = 0: CursorRow% = Top%: CursorCol% = LeftSide%
  968.  
  969. RETURN
  970. '----------------------------------------------------------------------------
  971. EndOfFile:
  972.  
  973. IF EditEndPointer% < LEN(Text$) - 2 THEN
  974.   Pointer% = LEN(Text$): Count% = 0: RowCount% = Top% - 1
  975.  
  976.   FOR PageLenght% = Top% TO Bottom%
  977.     IF Pointer% > 1 THEN
  978.       INCR RowCount%
  979.       DECR Pointer%,2
  980.       DO
  981.         DECR Pointer%
  982.         IF PageLenght% = Top% THEN INCR Count%
  983.       LOOP UNTIL MID$(Text$, Pointer%, 1) = CHR$(13) OR Pointer% = 1
  984.       IF Pointer% > 1 THEN INCR Pointer%,2
  985.     ELSE
  986.       EXIT FOR
  987.     END IF
  988.   NEXT PageLenght%
  989.  
  990.   IF Count% > 78 THEN
  991.     Offset% = Count% - 78: CursorCol% = RightSide%: CursorRow% = RowCount%
  992.   ELSE
  993.     Offset% = 0: CursorCol% = Count% + 1: CursorRow% = RowCount%
  994.   END IF
  995. ELSE
  996.   GOSUB LineEnd
  997. END IF
  998.  
  999. RETURN
  1000. '----------------------------------------------------------------------------
  1001. BackSpace:
  1002.  
  1003. NoSave% = 1
  1004.  
  1005. GOSUB CheckForChange
  1006.  
  1007. IF Offset% + (CursorCol% - LeftSide%) > EditLineLenght% THEN
  1008.   Adjust% = 0
  1009. ELSE
  1010.   Adjust% = 1
  1011. END IF
  1012.  
  1013. IF Character% > 2 AND Offset% = 0 AND CursorCol% = LeftSide% THEN WrapUp% = 1
  1014.  
  1015. IF CursorCol% > 2 THEN
  1016.   DECR CursorCol%: DECR Character%: NormalLine% = 1
  1017. ELSE
  1018.   IF Offset% THEN DECR Offset%: DECR Character%: NormalLine% = 1
  1019. END IF
  1020.  
  1021. IF Adjust% THEN
  1022.   IF WrapUp% THEN
  1023.     Text$ = LEFT$(Text$,Character% - 3) + MID$(Text$,Character%)
  1024.     Ptr% = EditStartPointer%: Count% = 0: WrapUp% = 0:
  1025.  
  1026.     DECR Ptr%,2
  1027.     DO
  1028.       DECR Ptr%
  1029.       IF Ptr% = 0 THEN EXIT LOOP
  1030.       IF Mid$(Text$,Ptr%,1) = CHR$(13) OR Ptr% = 1 THEN
  1031.         INCR Count%
  1032.         EXIT LOOP
  1033.       ELSE
  1034.         INCR Count%
  1035.       END IF
  1036.     LOOP
  1037.  
  1038.     IF Ptr% = 1 AND CursorRow% = Top% + 1 THEN INCR Count%,2
  1039.  
  1040.     IF Count% > 78 THEN
  1041.       Offset% = Count% - 79: CursorCol% = RightSide%
  1042.     ELSE
  1043.       Offset% = 0: CursorCol% = Count%
  1044.     END IF
  1045.     IF CursorRow% > Top% + 2 THEN
  1046.       DECR CursorRow%
  1047.     ELSE
  1048.       IF Pointer% > 1 THEN
  1049.         GOSUB ScrollDown
  1050.       ELSE
  1051.         DECR CursorRow%
  1052.       END IF
  1053.     END IF
  1054.   ELSE
  1055.     IF NormalLine% THEN
  1056.       NormalLine% = 0
  1057.       IF LEN(Text$) AND MID$(Text$,Character%,1) <> CHR$(13) AND _
  1058.       MID$(Text$,Character%,1) <> CHR$(10) THEN_
  1059.       Text$ = LEFT$(Text$,Character% - 1) + MID$(Text$,Character% + 1)
  1060.     END IF
  1061.   END IF
  1062. END IF
  1063.  
  1064. RETURN
  1065. '----------------------------------------------------------------------------
  1066. ScrollRight:
  1067.  
  1068. IF Offset% THEN DECR Offset%
  1069.  
  1070. RETURN
  1071. '----------------------------------------------------------------------------
  1072. ScrollLeft:
  1073.  
  1074. INCR Offset%
  1075.  
  1076. RETURN
  1077. '----------------------------------------------------------------------------
  1078. MoveRight:
  1079.  
  1080.   IF CursorCol% < 79 THEN
  1081.     INCR CursorCol%
  1082.   ELSE
  1083.     INCR Offset%
  1084.   END IF
  1085.  
  1086. RETURN
  1087. '----------------------------------------------------------------------------
  1088. MoveLeft:
  1089.  
  1090. IF CursorCol% > 2 THEN
  1091.   DECR CursorCol%
  1092. ELSE
  1093.   IF Offset% THEN DECR Offset%
  1094. END IF
  1095.  
  1096. RETURN
  1097. '----------------------------------------------------------------------------
  1098. MoveUp:
  1099.  
  1100. IF CursorRow% > 3 THEN
  1101.   DECR CursorRow%
  1102. ELSE
  1103.   GOSUB ScrollDown
  1104. END IF
  1105.  
  1106. RETURN
  1107. '----------------------------------------------------------------------------
  1108. MoveDown:
  1109.  
  1110. IF CursorRow% < 23 THEN
  1111.   INCR CursorRow%
  1112. ELSE
  1113.   GOSUB ScrollUp
  1114. END IF
  1115.  
  1116. RETURN
  1117. '----------------------------------------------------------------------------
  1118. PageUp:
  1119.  
  1120. FOR PageLenght% = Top% TO (Bottom% - 1)
  1121.   IF Pointer% > 1 THEN
  1122.     GOSUB ScrollDown
  1123.   ELSE
  1124.     EXIT FOR
  1125.   END IF
  1126. NEXT PageLenght%
  1127.  
  1128. RETURN
  1129. '----------------------------------------------------------------------------
  1130. PageDown:
  1131.  
  1132. Oldptr% = TempPointer%
  1133.  
  1134. IF ISFALSE LastLine% THEN
  1135.   FOR PageLenght% = Top% TO (Bottom% - 1)
  1136.     GOSUB ScrollUp
  1137.     TempPointer% = Pointer%
  1138.     IF Pointer% = 0 THEN
  1139.       Pointer% = Oldptr%
  1140.       EXIT FOR
  1141.     END IF
  1142.   NEXT PageLenght%
  1143. END IF
  1144.  
  1145. RETURN
  1146. '----------------------------------------------------------------------------
  1147. ScrollUp:
  1148.  
  1149. IF TempPointer% < LEN(Text$) THEN
  1150.   Pointer% = INSTR(Pointer%, Text$, CHR$(13)) + 2
  1151. END IF
  1152.  
  1153. RETURN
  1154. '----------------------------------------------------------------------------
  1155. ScrollDown:
  1156.  
  1157. IF Pointer% > 1 THEN
  1158.   DECR Pointer%,2
  1159.   DO
  1160.     DECR Pointer%
  1161.   LOOP UNTIL MID$(Text$, Pointer%, 1) = CHR$(13) OR Pointer% = 1
  1162.   IF Pointer% > 1 THEN INCR Pointer%,2
  1163. END IF
  1164.  
  1165. RETURN
  1166. '----------------------------------------------------------------------------
  1167. RestoreBlockBegin:
  1168.  
  1169. IF BlockBeginPointer% THEN
  1170.   Pointer% = BlockBeginPointer%: Offset% = BlockBeginOffset%
  1171.   CursorRow% = BlockBeginCursorRow%: CursorCol% = BlockBeginCursorCol%
  1172. ELSE
  1173.   Message$(1) = "Beginning of Block not Marked"
  1174.   SOUND 50,5
  1175.   DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1176. END IF
  1177.  
  1178. RETURN
  1179. '----------------------------------------------------------------------------
  1180. RestoreBlockEnd:
  1181.  
  1182. IF BlockEndPointer% THEN
  1183.   Pointer% = BlockEndPointer%: Offset% = BlockEndOffset%
  1184.   CursorRow% = BlockEndCursorRow%: CursorCol% = BlockEndCursorCol%
  1185. ELSE
  1186.   Message$(1) = "End of Block not Marked"
  1187.   SOUND 50,5
  1188.   DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1189. END IF
  1190.  
  1191. RETURN
  1192. '----------------------------------------------------------------------------
  1193. MarkBlockBegin:
  1194.  
  1195. Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1196. IF Character% <= EditEndPointer% THEN
  1197.   BlockStart% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1198.   BlockBeginPointer% = Pointer%: BlockBeginOffset% = Offset%
  1199.   BlockBeginCursorRow% = CursorRow%: BlockBeginCursorCol% = CursorCol%
  1200.   IF BlockEnd% > BlockStart% THEN
  1201.     Change% = 0
  1202.     SOUND 2500,.5: SOUND 3000,.5: SOUND 3500,.5
  1203.     Block$ = MID$(Text$,BlockStart%,BlockEnd%-BlockStart%)
  1204.   END IF
  1205. ELSE
  1206.   Message$(1) = "Cursor is Past the End of the Line!"
  1207.   SOUND 50,5
  1208.   DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1209. END IF
  1210.  
  1211. RETURN
  1212. '----------------------------------------------------------------------------
  1213. MarkBlockEnd:
  1214.  
  1215. Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1216. IF Character% <= EditEndPointer% THEN
  1217.   BlockEnd% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1218.   BlockEndPointer% = Pointer%: BlockEndOffset% = Offset%
  1219.   BlockEndCursorRow% = CursorRow%: BlockEndCursorCol% = CursorCol%
  1220.   IF BlockEnd% > BlockStart% THEN
  1221.     Change% = 0
  1222.     SOUND 2500,.5: SOUND 3000,.5: SOUND 3500,.5
  1223.     Block$ = MID$(Text$,BlockStart%,BlockEnd% - BlockStart%)
  1224.   END IF
  1225. ELSE
  1226.   Message$(1) = "Cursor is Past the End of the Line!"
  1227.   SOUND 50,5
  1228.   DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1229. END IF
  1230.  
  1231. RETURN
  1232. '----------------------------------------------------------------------------
  1233. CopyBlock:
  1234.  
  1235. NoSave% = 1: Change% = 0
  1236.  
  1237. IF LEN(Block$) THEN
  1238.   OldBlock$ = ""
  1239.   Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1240.   IF ((Offset% + CursorCol%) - LeftSide%) > EditLineLenght% THEN
  1241.     Text$ = LEFT$(Text$,EditEndPointer% - 1) + _
  1242.     SPACE$(((Offset% + CursorCol%) - LeftSide%) - EditLineLenght%) + _
  1243.     Block$ + MID$(Text$, EditEndPointer%)
  1244.   ELSE
  1245.     Text$ = LEFT$(Text$,Character% - 1) + Block$ + MID$(Text$, Character%)
  1246.   END IF
  1247.   BlockStart% = Character%: BlockEnd% = Character% + LEN(Block$)
  1248. END IF
  1249.  
  1250. RETURN
  1251. '----------------------------------------------------------------------------
  1252. MoveBlock:
  1253.  
  1254. NoSave% = 1
  1255.  
  1256. IF LEN(Block$) THEN
  1257.   IF Block$ = OldBlock$ THEN
  1258.     Message$(1) = "You Cannot Move A Deleted Block use Copy Instead"
  1259.     SOUND 50,5
  1260.     DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1261.   ELSE
  1262.     IF Change% = 0 THEN
  1263.       BlockBeginPointer% = 0: BlockEndPointer% = 0
  1264.       Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1265.       IF Character% > EditEndPointer% THEN Character% = EditEndPointer%
  1266.       IF Character% < BlockStart% THEN
  1267.         Text$ = LEFT$(Text$,BlockStart% - 1) + MID$(Text$,BlockEnd%)
  1268.         Text$ = LEFT$(Text$,Character% - 1) + Block$ + MID$(Text$,Character%)
  1269.         BlockStart% = Character%: BlockEnd% = Character% + LEN(Block$)
  1270.       ELSEIF Character% > BlockEnd% THEN
  1271.         Text$ = LEFT$(Text$,Character% - 1) + Block$ + MID$(Text$,Character%)
  1272.         Text$ = LEFT$(Text$,BlockStart% - 1) + MID$(Text$,BlockEnd%)
  1273.         BlockStart% = Character%: BlockEnd% = Character% + LEN(Block$)
  1274.       END IF
  1275.     ELSE
  1276.       Message$(1) = "Pointers are no longer Valid! Remark Block"
  1277.       SOUND 50,5
  1278.       DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1279.     END IF
  1280.   END IF
  1281. END IF
  1282.  
  1283. RETURN
  1284. '----------------------------------------------------------------------------
  1285. DeleteWordRight:
  1286.  
  1287. NoSave% = 1
  1288.  
  1289. GOSUB CheckForChange
  1290.  
  1291. IF Character% < EditEndPointer% THEN
  1292.   Temp% = (INSTR(Character% + 1,Text$,ANY CHR$(32,10)) + 1) - Character%
  1293.   SaveLine$ =  MID$(Text$,Character%,temp%) + CHR$(255) + SaveLine$
  1294.   Text$ = LEFT$(Text$,Character% - 1) + MID$(Text$,Character% + Temp%)
  1295.   IF Text$ = "" THEN Text$ = CHR$(13) + CHR$(10)
  1296. END IF
  1297.  
  1298. RETURN
  1299. '----------------------------------------------------------------------------
  1300. RestoreLine:
  1301.  
  1302. NoSave% = 1
  1303.  
  1304. GOSUB CheckForChange
  1305.  
  1306. IF LEN(SaveLine$) THEN
  1307.   Temp$ = EXTRACT$(SaveLine$,CHR$(255))
  1308.   IF LEN(Temp$) THEN
  1309.     SaveLine$ = MID$(SaveLine$,INSTR(SaveLine$,CHR$(255)) + 1)
  1310.     IF ((Offset% + CursorCol%) - LeftSide%) > EditLineLenght% THEN
  1311.       Text$ = LEFT$(Text$,EditEndPointer% - 1) + _
  1312.       SPACE$(((Offset% + CursorCol%) - LeftSide%) - EditLineLenght%) + _
  1313.       Temp$ + MID$(Text$, EditEndPointer%)
  1314.     ELSE
  1315.       Text$ = LEFT$(Text$,Character% - 1) + Temp$ + MID$(Text$, Character%)
  1316.     END IF
  1317.   ELSE
  1318.     IF SaveLine$ = Temp$ + CHR$(255) THEN SaveLine$ = ""
  1319.   END IF
  1320. END IF
  1321.  
  1322. RETURN
  1323. '----------------------------------------------------------------------------
  1324. DeleteToEndOfLine:
  1325.  
  1326. NoSave% = 1
  1327.  
  1328. GOSUB CheckForChange
  1329.  
  1330. IF Character% < EditEndPointer% THEN
  1331.   i% = ((EditStartPointer% + Offset% + CursorCol%) - LeftSide%)
  1332.   SaveLine$ = MID$(Text$,i%,EditEndPointer% - i%) + CHR$(255) + SaveLine$
  1333.   Text$ = LEFT$(Text$,i% - 1) + MID$(Text$,EditEndPointer%)
  1334. END IF
  1335.  
  1336. RETURN
  1337. '----------------------------------------------------------------------------
  1338. DeleteLine:
  1339.  
  1340. NoSave% = 1
  1341.  
  1342. GOSUB CheckForChange
  1343.  
  1344. SaveLine$ = MID$(Text$,EditStartPointer%,EditEndPointer% - EditStartPointer%) + _
  1345. CHR$(13) + CHR$(10) + CHR$(255) + SaveLine$
  1346. Text$ = LEFT$(Text$,EditStartPointer% - 1) + MID$(Text$,EditEndPointer% + 2)
  1347. IF Text$ = "" THEN Text$ = CHR$(13) + CHR$(10)
  1348.  
  1349. RETURN
  1350. '----------------------------------------------------------------------------
  1351. CheckForChange:
  1352.  
  1353. Character% = EditStartPointer% + Offset% + (CursorCol% - LeftSide%)
  1354.  
  1355. IF BlockEnd% THEN
  1356.   IF Character% < BlockEnd% THEN Change% = 1
  1357. END IF
  1358.  
  1359. RETURN
  1360. '----------------------------------------------------------------------------
  1361. DeleteBlock:
  1362.  
  1363. NoSave% = 1
  1364.  
  1365. IF LEN(Block$) THEN
  1366.   IF Change% = 0 THEN
  1367.     BlockEndPointer% = 0
  1368.     IF Block$ = OldBlock$ THEN
  1369.       Message$(1) = "You have Deleted that Block Already !!!"
  1370.       SOUND 50,5
  1371.       DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1372.     ELSE
  1373.       OldBlock$ = Block$
  1374.       Text$ = LEFT$(Text$,BlockStart% - 1) + MID$(Text$,BlockEnd%)
  1375.       IF Text$ = "" THEN Text$ = CHR$(13) + CHR$(10)
  1376.     END IF
  1377.   ELSE
  1378.     Message$(1) = "Pointers are no longer Valid! Remark Block"
  1379.     SOUND 50,5
  1380.     DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1381.   END IF
  1382. END IF
  1383.  
  1384. RETURN
  1385. '----------------------------------------------------------------------------
  1386. FindText:
  1387.  
  1388. SearchPointer% = Pointer%
  1389. TextOne$ = SPACE$(45)
  1390. EditBox "Find what:",TextOne$,Allow$,Mouse%,176,6,79,14,112,1,1
  1391. TextOne$ = RTRIM$(TextOne$)
  1392.  
  1393. IF LEN(TextOne$) THEN GOSUB SearchAgain
  1394.  
  1395. RETURN
  1396. '----------------------------------------------------------------------------
  1397. SearchAndReplace:
  1398.  
  1399. SearchPointer% = Pointer%
  1400. TextOne$ = SPACE$(40)
  1401. TextTwo$ = SPACE$(40)
  1402. DoubleBox "Find what:","Replace with:",TextOne$,TextTwo$,Allow$,Mouse%,255,176,6,79,14,112,1,1
  1403. TextOne$ = RTRIM$(TextOne$)
  1404. TextTwo$ = RTRIM$(TextTwo$)
  1405.  
  1406. IF LEN(TextOne$) AND LEN(TextTwo$) THEN
  1407.   DO
  1408.     GOSUB SearchAgain
  1409.     IF TestPointer% THEN
  1410.       GOSUB PrintRoutine
  1411.       GOSUB FileInfo
  1412.       LOCATE 3,CursorCol%,0: COLOR 31,1: PRINT TextOne$;
  1413.       MayBe "Replace the Hilighted Text ? (Y or N or Esc)",Answer%,Mouse%,10,79,112%,1,1
  1414.       SELECT CASE Answer%
  1415.              CASE 0
  1416.                EXIT SELECT
  1417.              CASE 1
  1418.                NoSave% = 1
  1419.                GOSUB CheckForChange
  1420.                Text$ = LEFT$(Text$,TestPointer% - 1) + TextTwo$ + MID$(Text$,(TestPointer% + LEN(TextOne$)))
  1421.                GOSUB PrintRoutine
  1422.                DELAY .5
  1423.              CASE 2
  1424.                RETURN
  1425.       END SELECT
  1426.     END IF
  1427.   LOOP WHILE TestPointer%
  1428. ELSE
  1429.   Message$(1) = "Both Lines must contain Text"
  1430.   IF LEN(TextOne$) OR LEN(TextTwo$) THEN SOUND 50,5: DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1431. END IF
  1432.  
  1433. RETURN
  1434. '----------------------------------------------------------------------------
  1435. SearchAgain:
  1436.  
  1437. Position% = 0
  1438.  
  1439. IF LEN(TextOne$) THEN
  1440.   IF SearchPointer% THEN
  1441.     SearchPointer% = INSTR(SearchPointer%,Text$,TextOne$)
  1442.     IF ISFALSE SearchPointer% THEN
  1443.       Message$(1) = "Text Not Found or No More Matches"
  1444.       SOUND 50,5
  1445.       DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1446.       TestPointer% = SearchPointer%
  1447.       RETURN
  1448.     END IF
  1449.   END IF
  1450. ELSE
  1451.   Message$(1) = "No Text to Search For"
  1452.   SOUND 50,5
  1453.   DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1454.   RETURN
  1455. END IF
  1456.  
  1457. TestPointer% = SearchPointer%
  1458.  
  1459. IF SearchPointer% THEN
  1460.     DO
  1461.       IF SearchPointer% > 1 THEN DECR SearchPointer%: INCR Position%
  1462.     LOOP UNTIL MID$(Text$, SearchPointer%, 1) = CHR$(13) OR SearchPointer% = 1
  1463.     IF SearchPointer% > 1 THEN
  1464.       INCR SearchPointer%,2
  1465.     ELSE
  1466.       IF ISFALSE Add% THEN
  1467.         INCR Position%,2
  1468.       ELSE
  1469.         INCR SearchPointer%,2
  1470.       END IF
  1471.     END IF
  1472. END IF
  1473.  
  1474. IF SearchPointer% THEN
  1475.   Pointer% = SearchPointer%
  1476.   INCR SearchPointer%,(Position% + LEN(TextOne$))
  1477.   IF Position% + LEN(TextOne$) > 78 THEN
  1478.     Offset% = (Position% + LEN(TextOne$)) - 78
  1479.     CursorCol% = 78 - LEN(TextOne$)
  1480.   ELSE
  1481.     Offset% = 0
  1482.     CursorCol% = Position%
  1483.   END IF
  1484.   CursorRow% = Top%
  1485. END IF
  1486.  
  1487. RETURN
  1488. '----------------------------------------------------------------------------
  1489. MarkPosition:
  1490.  
  1491. MarkedPointer% = Pointer%: MarkedOffset% = Offset%
  1492. MarkedCursorRow% = CursorRow%: MarkedCursorCol% = CursorCol%
  1493.  
  1494. RETURN
  1495. '----------------------------------------------------------------------------
  1496. RestorePosition:
  1497.  
  1498. IF MarkedPointer% THEN
  1499.   Pointer% = MarkedPointer%: Offset% = MarkedOffset%
  1500.   CursorRow% = MarkedCursorRow%: CursorCol% = MarkedCursorCol%
  1501. ELSE
  1502.   Message$(1) = "Previous Position Not Marked"
  1503.   SOUND 50,5
  1504.   DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1505. END IF
  1506.  
  1507. RETURN
  1508. '----------------------------------------------------------------------------
  1509. DosShell:
  1510.  
  1511. MEMPACK
  1512. IF Mouse% THEN HideCursor
  1513. SaveScreen Dos$,1,1,25,80,0
  1514. COLOR 7,0: CLS: LOCATE 1,1,0
  1515. PRINT "Type EXIT to Return to DNAWrite";
  1516. SHELL
  1517. IF Mouse% THEN HideCursor
  1518. RestoreScreen Dos$,1,1
  1519.  
  1520. RETURN
  1521. '----------------------------------------------------------------------------
  1522. FileInfo:
  1523.  
  1524. FileSize% = LEN(Text$)
  1525. ColNumber% = ((Offset% + CursorCol%) - LeftSide%)
  1526. LineNumber% = 0
  1527.  
  1528. FOR i% = 1 TO EditEndPointer%
  1529.   j% = INSTR(i%,Text$,CHR$(13))
  1530.   IF j% THEN INCR LineNumber%: i% = j%
  1531. NEXT i%
  1532.  
  1533. COLOR 7,1
  1534. LOCATE 2,2,0: PRINT RIGHT$(STRING$(77,196) + "┤ " + CurrentName$ + " ├",77);
  1535. LOCATE 24,9,0: PRINT LEFT$(STR$(LineNumber%) + "   ",4);
  1536. LOCATE 24,18,0: PRINT LEFT$(STR$(ColNumber% + 1) + "   ",4);
  1537. IF FileSize% > 31999 THEN COLOR 31,1
  1538. LOCATE 24,42,0: PRINT LEFT$(STR$(FileSize%) + "     ",6);
  1539.  
  1540. RETURN
  1541. '----------------------------------------------------------------------------
  1542. CtrlKHelp:
  1543.  
  1544. IF Mouse% THEN HideCursor
  1545. SaveScreen CtrlK$,6,50,21,76,1
  1546. Popwind "Control - K",6,50,21,76,112,1,1
  1547. COLOR 0,7
  1548. LOCATE 7,52,0: PRINT "B  mark block begin";
  1549. LOCATE 8,52,0: PRINT "K  mark block end";
  1550. LOCATE 9,52,0: PRINT "T  mark single word";
  1551. LOCATE 10,52,0: PRINT "C  copy block";
  1552. LOCATE 11,52,0: PRINT "V  move block";
  1553. LOCATE 12,52,0: PRINT "Y  delete block";
  1554. LOCATE 13,52,0: PRINT "R  read block from file";
  1555. LOCATE 14,52,0: PRINT "W  save marked block";
  1556. LOCATE 15,52,0: PRINT "H  view clipboard";
  1557. LOCATE 16,52,0: PRINT "P  print block";
  1558. LOCATE 17,52,0: PRINT "D  save and exit";
  1559. LOCATE 18,52,0: PRINT "S  save";
  1560. LOCATE 19,52,0: PRINT "Q  quit without saving";
  1561. LOCATE 20,52,0: PRINT "N  set place marker";
  1562.  
  1563. RETURN
  1564. '----------------------------------------------------------------------------
  1565. CtrlQHelp:
  1566.  
  1567. IF Mouse% THEN HideCursor
  1568. SaveScreen CtrlQ$,6,50,21,76,1
  1569. Popwind "Control - Q",6,50,21,76,112,1,1
  1570.  
  1571. COLOR 0,7
  1572. LOCATE 7,52,0: PRINT "S  beginning of line";
  1573. LOCATE 8,52,0: PRINT "D  end of line";
  1574. LOCATE 9,52,0: PRINT "E  top of window";
  1575. LOCATE 10,52,0: PRINT "X  bottom of window";
  1576. LOCATE 11,52,0: PRINT "R  top of file";
  1577. LOCATE 12,52,0: PRINT "C  end of file";
  1578. LOCATE 13,52,0: PRINT "B  beginning of block";
  1579. LOCATE 14,52,0: PRINT "K  end of block";
  1580. LOCATE 15,52,0: PRINT "P  last cursor position";
  1581. LOCATE 16,52,0: PRINT "W  restore last message";
  1582. LOCATE 17,52,0: PRINT "Y  delete to line end";
  1583. LOCATE 18,52,0: PRINT "L  restore line";
  1584. LOCATE 19,52,0: PRINT "F  search";
  1585. LOCATE 20,52,0: PRINT "A  search and replace";
  1586.  
  1587. RETURN
  1588. '----------------------------------------------------------------------------
  1589. PrintRoutine:
  1590.  
  1591. IF Mouse% THEN HideCursor
  1592.  
  1593.  TempPointer% = Pointer% : Row% = Top% : LastLine% = 0: FirstTime% = 1
  1594.  IF RIGHT$(Text$,2) <> CHR$(13) + CHR$(10) THEN Text$ = Text$ + CHR$(13) + CHR$(10)
  1595.  DO
  1596.   EndOfLine% = INSTR(MID$(Text$,TempPointer%),CHR$(13))
  1597.     IF EndOfLine% = 0 THEN
  1598.       EndOfLine% = LEN(Text$)
  1599.       IF LastLine% = 0 THEN
  1600.         LastLine% = Row% - 1
  1601.         DECR Row%
  1602.         EndOfLine% = LastEndOfLine%
  1603.         TempPointer% = LastPointer%
  1604.       END IF
  1605.       IF CursorRow% > LastLine% THEN  CursorRow% = LastLine%
  1606.     ELSE
  1607.       DECR EndOfLine%   ' DECR: do not show the CR
  1608.     END IF
  1609.   LastPointer% = TempPointer%: LastEndOfLine% = EndOfLine%
  1610.   CurrentLine$ = MID$(Text$, TempPointer%,EndOfLine%)
  1611.   IF CurrentLine$ = CHR$(10) THEN CurrentLine$ = ""
  1612.   IF Row% = CursorRow% THEN
  1613.     EditLineLenght% = LEN(CurrentLine$)
  1614.     EditStartPointer% = TempPointer%
  1615.     EditEndPointer% = TempPointer% + EndOfLine%
  1616.   END IF
  1617.   QPRINT Row%, LeftSide%, MID$(CurrentLine$ + SPACE$(TextWidth% + Offset%), 1 + Offset% , TextWidth%), TextAttr%
  1618.   TempPointer% = INSTR(TempPointer%,Text$, CHR$(13)) + 2  ' +2 for CRLF
  1619.   IF Pointer% = 1 AND FirstTime% THEN
  1620.     FirstTime% = 0
  1621.     IF TempPointer% > 5 THEN Add% = 0 ELSE Add% = 1
  1622.   END IF
  1623.   IF TempPointer% = 2 THEN TempPointer% = LEN(Text$)
  1624.   INCR Row%
  1625.   IF Row% > Bottom% THEN EXIT LOOP
  1626.  LOOP
  1627.  
  1628. RETURN
  1629. '----------------------------------------------------------------------------
  1630. Save:
  1631.  
  1632. IF LEN(CurrentName$) THEN
  1633.   FileNumber% = FREEFILE
  1634.   OPEN CurrentName$ FOR OUTPUT AS #FileNumber%
  1635.   PRINT #FileNumber%,Text$;
  1636.   CLOSE #FileNumber%
  1637.   NoSave% = 0
  1638. END IF
  1639.  
  1640. RETURN
  1641. '----------------------------------------------------------------------------
  1642. SaveAs:
  1643.  
  1644. Kurrent$ = CurrentName$
  1645.  
  1646. FOR i% = 1 TO LEN(Kurrent$)      'get the path and file name
  1647.   Test$ = RIGHT$(Kurrent$,i%)
  1648.   IF LEFT$(Test$,1) = CHR$(92) THEN
  1649.     FindPath$ = LEFT$(Kurrent$,LEN(Kurrent$) - (i% - 1))
  1650.     EXIT FOR
  1651.   END IF
  1652. NEXT i%
  1653.  
  1654. DefaultName$ = LTRIM$(Kurrent$,FindPath$)
  1655.  
  1656. WriteToBox ReturnedFile$,DefaultName$,Mouse%,112,14,79,1,1
  1657.  
  1658. IF LEN(ReturnedFile$) THEN CurrentName$ = ReturnedFile$: GOSUB Save
  1659.  
  1660. RETURN
  1661. '----------------------------------------------------------------------------
  1662. QuitSave:
  1663.  
  1664. GOSUB SaveAll
  1665. GOTO WayOut
  1666.  
  1667. RETURN
  1668. '----------------------------------------------------------------------------
  1669. PrinterSetup:
  1670.  
  1671. PrnCfg$ = Home$ + "PRINTER.CFG"
  1672. Count% = 0
  1673.  
  1674. Test$ = DIR$(PrnCfg$)
  1675.  
  1676. IF LEN(Test$) THEN
  1677.   OPEN PrnCfg$ FOR INPUT AS #1
  1678.   DO
  1679.     INCR Count%
  1680.     LINE INPUT #1, Prnter$(Count%)
  1681.     LINE INPUT #1, Action$(Count%)
  1682.   LOOP WHILE NOT EOF(1)
  1683.   CLOSE #1
  1684. ELSE
  1685.   RETURN
  1686. END IF
  1687.  
  1688. SCROLLBOX Prnter$(),Instruction$,"Printer",Mouse%,10,Tag%,1,0,14,112,0,0,1,1
  1689.  
  1690. IF LEN(Instruction$) THEN
  1691.   TagCount% = 0
  1692.   IF Tag% THEN
  1693.     Temp$ = LTRIM$(Instruction$,CHR$(Tag%))
  1694.   ELSE
  1695.     Temp$ = LTRIM$(Instruction$)
  1696.   END IF
  1697.   DO
  1698.     INCR TagCount%
  1699.     b% = INSTR(Temp$,ANY CHR$(Tag%))
  1700.     IF b% = 0 THEN
  1701.       Compare$(TagCount%) = Temp$
  1702.     ELSE
  1703.       Compare$(TagCount%) = LEFT$(Temp$,b% - 1)
  1704.     END IF
  1705.     Temp$ = LTRIM$(Temp$,Compare$(TagCount%))
  1706.     Temp$ = LTRIM$(Temp$,CHR$(Tag%))
  1707.   LOOP UNTIL Compare$(TagCount%) = ""
  1708.   DECR TagCount%
  1709.   FOR i% = 1 TO TagCount%
  1710.     j% = 0
  1711.     DO
  1712.       INCR j%
  1713.       IF Prnter$(j%) = Compare$(i%) THEN
  1714.         IF Immbed% THEN
  1715.           FOR k% = 1 TO LEN(Action$(j%))
  1716.             a$ = LEFT$(Action$(j%),k%)
  1717.             b$ = RIGHT$(a$,1)
  1718.             Ky$ = b$
  1719.             GOSUB AddText
  1720.             GOSUB PrintRoutine
  1721.           NEXT k%
  1722.           EXIT LOOP
  1723.         ELSE
  1724.           LPRINT Action$(j%);
  1725.           EXIT LOOP
  1726.         END IF
  1727.       END IF
  1728.     LOOP UNTIL j% = Count%
  1729.   NEXT i%
  1730.   FOR i% = 1 to TagCount%
  1731.     Compare$(i%) = ""
  1732.   NEXT i%
  1733. END IF
  1734.  
  1735. RETURN
  1736. '----------------------------------------------------------------------------
  1737. PrintAll:
  1738.  
  1739. WIDTH "LPT1:",255
  1740. LPRINT Text$
  1741.  
  1742. SOUND 5000,.5:SOUND 1000,.5
  1743.  
  1744. RETURN
  1745. '----------------------------------------------------------------------------
  1746. WriteBlockToDisk:
  1747.  
  1748. WriteToBox ReturnedFile$,"NONAME.BLK",Mouse%,112,14,79,1,1
  1749. BlockName$ = ReturnedFile$
  1750.  
  1751. IF LEN(BlockName$) THEN
  1752.   FileNumber% = FREEFILE
  1753.   OPEN BlockName$ FOR OUTPUT AS #FileNumber%
  1754.   PRINT #FileNumber%,Block$;
  1755.   CLOSE #FileNumber%
  1756. END IF
  1757.  
  1758. RETURN
  1759. '----------------------------------------------------------------------------
  1760. SaveAll:
  1761.  
  1762. IF NoSave% THEN
  1763.   IF CurrentName$ = "NONAME.TXT" THEN
  1764.     WriteToBox ReturnedFile$,"NONAME.TXT",Mouse%,112,14,79,1,1
  1765.     IF LEN(ReturnedFile$) THEN
  1766.       CurrentName$ = ReturnedFile$: GOSUB Save
  1767.     END IF
  1768.     RETURN
  1769.   ELSE
  1770.     IF YesNo%("Save " + CurrentName$ + " (Y or N)",1,10,79,112,1,1) THEN
  1771.       GOSUB Save
  1772.     END IF
  1773.     RETURN
  1774.   END IF
  1775. ELSE
  1776.   RETURN
  1777. END IF
  1778.  
  1779. RETURN
  1780. '----------------------------------------------------------------------------
  1781. ClearAll:
  1782.  
  1783. GOSUB SaveAll
  1784.  
  1785. DefaultFile:
  1786.  
  1787. CurrentName$ = "NONAME.TXT"
  1788. Text$ = CHR$(13,10)
  1789. Pointer% = 1: Offset% = 0: NoSave% = 0
  1790. CursorRow% = Top%: CursorCol% = LeftSide%
  1791. MarkedPointer% = 0: SearchPointer% = 1
  1792. BlockBeginPointer% = 0: BlockEndPointer% = 0
  1793. BlockStart% = 0: BlockEnd% = 0
  1794.  
  1795. RETURN
  1796. '----------------------------------------------------------------------------
  1797. LoadNew:
  1798.  
  1799. IF NoSave% THEN GOSUB SaveAll
  1800.  
  1801. InsertFile:
  1802.  
  1803. DirectoryBox FileName$,Mouse%,112,14,79,1,1
  1804.  
  1805. LoadFile:
  1806.  
  1807. IF LEN(FileName$) THEN
  1808.   IF LEN(DIR$(FileName$)) THEN
  1809.     FileNumber% = FREEFILE
  1810.     OPEN FileName$ FOR BINARY AS FileNumber%
  1811.     IF LOF(FileNumber%) > 32000 THEN
  1812.       ERROR 188
  1813.       CLOSE #FileNumber%
  1814.       RETURN
  1815.     ELSE
  1816.       IF InFile% = 1 THEN
  1817.         GET$ FileNumber%, LOF(FileNumber%),Block$
  1818.         InFile% = 0
  1819.         ExpandTabs Block$
  1820.         IF Mouse% THEN HideCursor
  1821.         SaveScreen Msg$,12,13,15,66,1
  1822.         Popwind "Expanding Tabs",12,13,15,66,112,1,1
  1823.         FOR j% = 1 to 100
  1824.           Percentage j%,13,15,4,112:DELAY .054
  1825.         NEXT j%
  1826.         IF Mouse% THEN HideCursor
  1827.         RestoreScreen Msg$,12,13
  1828.       ELSE
  1829.         GET$ FileNumber%, LOF(FileNumber%), Text$
  1830.         ExpandTabs Text$
  1831.         IF Mouse% THEN HideCursor
  1832.         SaveScreen Msg$,12,13,15,66,1
  1833.         Popwind "Expanding Tabs",12,13,15,66,112,1,1
  1834.         FOR j% = 1 to 100
  1835.           Percentage j%,13,15,4,112:DELAY .054
  1836.         NEXT j%
  1837.         IF Mouse% THEN HideCursor
  1838.         RestoreScreen Msg$,12,13
  1839.         CurrentName$ = FileName$
  1840.         IF Text$ = "" THEN Text$ = " " + CHR$(13) + CHR$(10)
  1841.           Offset% = 0: Pointer% = 1: NoSave% = 0
  1842.           CursorRow% = Top%: CursorCol% = LeftSide%
  1843.           MarkedPointer% = 0: SearchPointer% = 1
  1844.           BlockBeginPointer% = 0: BlockEndPointer% = 0
  1845.           BlockStart% = 0: BlockEnd% = 0
  1846.       END IF
  1847.       CLOSE #FileNumber%
  1848.     END IF
  1849.   ELSE
  1850.     Message$(1) = FileName$ + " is an Invalid Name"
  1851.     SOUND 50,5
  1852.     DIALOG Message$(),"",0,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1853.   END IF
  1854. END IF
  1855.  
  1856. RETURN
  1857. '----------------------------------------------------------------------------
  1858. ViewClipboard:
  1859.  
  1860. CbOffset% = Offset%: CbPointer% = Pointer%: CbCursorRow% = CursorRow%
  1861. CbCursorCol% = CursorCol%: CbText$ = Text$
  1862.  
  1863. Pointer% = 1: CursorRow% = Top%: CusorCol% = LeftSide%
  1864. Offset% = 0: Text$ = Block$: TextAttr% = 112
  1865.  
  1866. IF Mouse% THEN HideCursor
  1867. ClipKey$ = "Viewing Keys │ Home End PageUp PageDown ArrowKeys │ Esc = Exit"
  1868. SaveScreen Clip$,2,1,24,80,0
  1869. Popwind ClipKey$,2,1,24,80,15,0,1
  1870.  
  1871. DO
  1872.  
  1873. GOSUB PrintRoutine
  1874.  
  1875. WHILE NOT INSTAT:WEND
  1876. Ky$ = INKEY$
  1877.  
  1878. IF LEN(Ky$) = 1 THEN
  1879.   Chose% = ASC(Ky$)
  1880. ELSE
  1881.   Chose% = -ASC(RIGHT$(Ky$,1))
  1882. END IF
  1883.  
  1884.   SELECT CASE Chose%
  1885.  
  1886.        CASE -80 'down arrow
  1887.          GOSUB ScrollUp
  1888.        CASE -72 ' up arrow
  1889.          GOSUB ScrollDown
  1890.        CASE -71 ' home
  1891.          GOSUB StartOfFile
  1892.        CASE -77 ' right arrow
  1893.         INCR Offset%
  1894.        CASE -75 ' left arrow
  1895.         IF Offset% THEN DECR Offset%
  1896.        CASE -81 ' page down
  1897.          GOSUB PageDown
  1898.        CASE -73 ' page up
  1899.          GOSUB PageUp
  1900.        CASE -79  'EndKey
  1901.          GOSUB EndOfFile
  1902.        CASE 27
  1903.          EXIT LOOP
  1904.        CASE ELSE
  1905.  
  1906.   END SELECT
  1907.  
  1908. LOOP
  1909.  
  1910. Offset% = CbOffset%: Pointer% = CbPointer%: CursorRow% = CbCursorRow%
  1911. CursorCol% = CbCursorCol%: Text$ = CbText$:
  1912. TextAttr% = 30
  1913. IF Mouse% THEN HideCursor
  1914. RestoreScreen Clip$,2,1
  1915.  
  1916. RETURN
  1917. '----------------------------------------------------------------------------
  1918. WriteError:
  1919.  
  1920. SELECT CASE ERR
  1921.  
  1922.   CASE 5
  1923.     Message$(1) = "   ILLEGAL FUNCTION CALL   "
  1924.   CASE 6
  1925.     Message$(1) = "   OVERFLOW   "
  1926.   CASE 7
  1927.     Message$(1) = "   OUT OF MEMORY   "
  1928.   CASE 9
  1929.     Message$(1) = "   SEGMENT OR STACK EXPIRED   "
  1930.   CASE 11
  1931.     Message$(1) = "   DIVIDE BY 0   "
  1932.   CASE 14
  1933.     Message$(1) = "   OUT OF VARIABLE SPACE   "
  1934.   CASE 15
  1935.     Message$(1) = "   FILE EXCEEDS 32K   "
  1936.   CASE 24
  1937.     Message$(1) = "   DEVICE TIMEOUT   "
  1938.   CASE 25
  1939.     Message$(1) = "   DEVICE FAULT   "
  1940.   CASE 27
  1941.     Message$(1) = "   NO PAPER   "
  1942.   CASE 52
  1943.     Message$(1) = "   IMPROPER FILE LOGIC   "
  1944.   CASE 53
  1945.     Message$(1) = "   FILE NOT ACCESSABLE   "
  1946.   CASE 54
  1947.     Message$(1) = "   BAD FILE MODE   "
  1948.   CASE 55
  1949.     Message$(1) = "   FILE IS OPEN   "
  1950.   CASE 57
  1951.     Message$(1) = "   DEVICE I/O   "
  1952.   CASE 58
  1953.     Message$(1) = "   FILE EXISTS   "
  1954.   CASE 61
  1955.     Message$(1) = "   DISK IS FULL   "
  1956.   CASE 62
  1957.     Message$(1) = "   UNEXPECTED END OF FILE   "
  1958.   CASE 64
  1959.     Message$(1) = "   BAD FILE NAME   "
  1960.   CASE 67
  1961.     Message$(1) = "   TOO MANY FILES OPEN   "
  1962.   CASE 68
  1963.     Message$(1) = "   DEVICE UNNAVAILABLE   "
  1964.   CASE 70
  1965.     Message$(1) = "   FILE LOCK   "
  1966.   CASE 71
  1967.     Message$(1) = "   DISK IS NOT READY   "
  1968.   CASE 72
  1969.     Message$(1) = "   DISK MEDIA ERROR   "
  1970.   CASE 73
  1971.     Message$(1) = "   ADVANCED FEATURE UNNAVAILABLE   "
  1972.   CASE 74
  1973.     Message$(1) = "   RENAME ACROSS DISKS   "
  1974.   CASE 75
  1975.     Message$(1) = "   BAD PATH/FILE   "
  1976.   CASE 76
  1977.     Message$(1) = "   PATH NOT FOUND   "
  1978.   CASE 188
  1979.     Message$(1) = "   FILE EXCEEDS 32K   "
  1980.   CASE ELSE
  1981.     Message$(1) = "   ERROR" + STR$(ERR) + " AT PGM-CTR" + STR$(ERADR) + "   "
  1982. END SELECT
  1983.  
  1984. SOUND 50,5
  1985. DIALOG Message$(),"",1,Mouse%,3,0,0,ErrorTxt%,ErrorAttr%,1,2
  1986.  
  1987. RESUME NEXT
  1988. '----------------------------------------------------------------------------
  1989. SUB QPrint(BYVAL Row%,BYVAL Col%,BYVAL St$, BYVAL Attr%)PUBLIC
  1990. ! push            si              ; Save em
  1991. ! push            di              ;
  1992. ! push            ds              ;
  1993. ! mov             ax,St$          ; get the handle
  1994. ! push            ax              ; push it
  1995. ! call            getstrloc       ; Get String info
  1996. ! mov             ds,dx           ; Set the string seg
  1997. ! mov             si,ax           ; set string ptr
  1998. ! cmp             cx,0            ; Quit if string = 0
  1999. ! je              Done            ;
  2000. ! xor             ax,ax           ;
  2001. ! mov             ax,Row%         ; get the row
  2002. ! dec             al              ; convert row to zero base
  2003. ! mov             bl,80           ; get the number of cols
  2004. ! mul             bl              ; multiply # of cols * rows
  2005. ! add             ax,Col%         ; add the column
  2006. ! dec             al              ; convert column to zero base
  2007. ! mov             di,ax           ; offset within video page
  2008. ! shl             di,1            ; account for color/attribute
  2009. ! mov             ax,&HB800       ; default to mono card segment
  2010. Display:
  2011. ! mov             es,ax           ; point ES to video
  2012. ! mov             ax,Attr%        ; color/attribute
  2013. ! mov          ah,al
  2014. Printit:
  2015. ! lodsb                           ; get a char into al
  2016. ! stosw                           ; write char and attr to screen
  2017. ! loop            Printit         ; go for entire string
  2018. Done:                             ' (len\counter already in cx)
  2019. ! pop             ds              ; pop em
  2020. ! pop             di              ;
  2021. ! pop             si              ;
  2022. END SUB