home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MAGAZINE / MISC / COMP8809.ZIP / SOURCE.EXE / SCREEN.BAS < prev    next >
Encoding:
BASIC Source File  |  1988-04-21  |  58.6 KB  |  1,780 lines

  1. '┌───────────────────────────────────────────────────────────────────────────┐
  2. '│                              SCREEN.BAS                                │
  3. '│                             VERSION 1.0                                   │
  4. '│                                                                           │
  5. '│                                                                           │
  6. '│                                                                           │
  7. '│   This program allows the user to design screen formats and then          │
  8. '│ save them in ANSI or BASIC format files.                                  │
  9. '│                                                                           │
  10. '│ Screen 0 - Working screen                                                 │
  11. '│ Screen 1 - Commands screen                                                │
  12. '│ Screen 2 - Help screen & Status                                           │
  13. '│ Screen 3 - Directory screen & DOS Shell                                   │
  14. '└───────────────────────────────────────────────────────────────────────────┘
  15.  
  16.  
  17. DEFINT A-Z                             ' All Integers
  18.  
  19. GOSUB Init                             ' Set-up
  20.  
  21. '┌─────────────────────────────── MAIN ───────────────────────────────────────┐
  22. START:
  23. Xpos=POS : Ypos=CSRLIN                 ' Save current position
  24. CALL Update                            ' Status Line
  25. CALL Getkey(A$)
  26. IF A$=CHR$(27) THEN GOTO GOODBYE        ' EXIT ?
  27. IF A$=CHR$(13) THEN A$=LastChar$       ' Repeat ?
  28. IF A$=CHR$(8) THEN CALL BackSpace      ' BackSpace ?
  29.   IF LEFT$(A$,1)<>CHR$(0) THEN         ' Text ?
  30.    CALL InsertText(A$)
  31.    GOTO START
  32.   END IF
  33. CALL Extkey(A$,K)                      ' Extended key code
  34.  
  35.  IF K=71 THEN CALL BeginofLine
  36.  IF K=79 THEN CALL EndofLine
  37.  IF K=73 THEN CALL ClearScreen
  38.  IF K=77 THEN CALL MoveRight
  39.  IF K=75 THEN CALL MoveLeft
  40.  IF K=72 THEN CALL MoveUp
  41.  IF K=80 THEN CALL MoveDown
  42.  IF K=81 THEN CALL PageDn
  43.  IF K=115 THEN CALL MidScreen
  44.  IF K=116 THEN CALL MidScreen
  45.  IF K=117 THEN CALL CtrlEnd
  46.  IF K=119 THEN CALL CtrlHome
  47.  IF K=59 THEN CALL F10
  48.  IF K=60 THEN CALL F2
  49.  IF K=61 THEN CALL Block
  50.  IF K=63 THEN CALL F5
  51.  IF K=64 THEN CALL F6
  52.  IF K=65 THEN CALL F7
  53.  IF K=66 THEN CALL F8
  54.  IF K=67 THEN CALL F9
  55.  IF K=68 THEN CALL F10
  56.  
  57. GOTO START
  58. '└──────────────────────────────── END MAIN ──────────────────────────────────┘
  59.  
  60.  
  61. ' Updates the current X & Y position
  62. SUB Update
  63.     SHARED Xpos,Ypos
  64.  
  65.     COLOR 11,0
  66.     LOCATE 25,6,0  : ? Ypos;
  67.     LOCATE 25,14,0 : ? Xpos;
  68.     CALL RestoreCursor
  69.  
  70. END SUB    ' Update
  71.  
  72.  
  73. ' Getkey returns keypress in A$
  74. SUB Getkey(A$)
  75.  
  76.   WHILE NOT INSTAT:WEND                ' Wait for keypress
  77.   A$=INKEY$                            ' Into A$
  78.  
  79. END SUB    ' Getkey
  80.  
  81.  
  82. ' Extkey K=extended code of A$
  83. SUB Extkey(A$,K)
  84. K=ASC(MID$(A$,2))                      ' K=EXT KEY CODE
  85.                                        ' K=59-68 F1-F10
  86.                                        ' K=77 Right Arrow, 116 Ctrl
  87.                                        ' K=75 Left Arrow, 115 Ctrl
  88.                                        ' K=72 Up Arrow, 144 Ctrl
  89.                                        ' K=80 Down Arrow, 150 Ctrl
  90. END SUB    ' Extkey
  91.  
  92.  
  93. ' RestoreCursor Restores current cursor position and curent colors
  94. SUB RestoreCursor
  95.     SHARED Ypos,Xpos,CurrentFore,CurrentBack
  96.  
  97.      LOCATE Ypos,Xpos,1,1,7
  98.      COLOR CurrentFore,CurrentBack
  99.  
  100. END SUB    ' RestoreCursor
  101.  
  102.  
  103. SUB ClearScreen
  104.     SHARED WSmall(),WClearData()
  105.  
  106.      CALL OPENWINDOW(WSmall(),WClearData())     ' Open Clear Window
  107.      LOCATE 12,26,0
  108.      COLOR 15,4
  109.      ?" Erase entire Screen ? (Y/N)";            ' Sure ?
  110.      WHILE NOT INSTAT:WEND                       ' Wait for keypress
  111.      A$=INKEY$
  112.      CALL CLOSEWINDOW(WSmall(),WClearData())     ' Close Window
  113.      CALL RestoreCursor                          ' Restore Position
  114.      IF UCASE$(A$) <> "Y" THEN EXIT SUB          ' Convert A$ to UpperCase
  115.  
  116.      CLS
  117.      CALL Status
  118.      CALL RestoreCursor
  119.  
  120. END SUB    ' ClearScreen
  121.  
  122. ' PageDn toggles special arrow keys on/off
  123. SUB PageDn
  124.     SHARED Arrow,OldArrow
  125.  
  126.      IF Arrow =0 THEN                            ' Test current setting
  127.         Arrow =OldArrow                          ' Restore old setting
  128.         CALL Status                              ' Update status line
  129.         CALL RestoreCursor
  130.         EXIT SUB                                 ' EXIT
  131.      END IF
  132.  
  133.      Arrow =0                                    ' Turn off arrow keys
  134.      CALL Status
  135.  
  136. END SUB    ' PageDn
  137.  
  138.  
  139. ' ************** Cursor positioning routines ***************
  140. SUB EndofLine
  141.     SHARED Xpos
  142.  
  143.      LOCATE CSRLIN,80
  144.      Xpos=80
  145.  
  146. END SUB    ' EndofLine
  147.  
  148.  
  149. SUB BeginofLine
  150.     SHARED Xpos
  151.  
  152.      LOCATE CSRLIN,1
  153.      Xpos=1
  154.  
  155. END SUB    ' BeginofLine
  156.  
  157. SUB MidScreen
  158.     SHARED Xpos
  159.  
  160.      LOCATE CSRLIN,40
  161.      Xpos =40
  162.  
  163. END SUB    ' MidScreen
  164.  
  165. SUB CtrlHome
  166.     SHARED Xpos,Ypos
  167.  
  168.      Xpos=1 : Ypos=1
  169.      LOCATE Ypos,Xpos
  170.  
  171. END SUB    ' CtrlHome
  172.  
  173. SUB CtrlEnd
  174.     SHARED Xpos,Ypos
  175.  
  176.      Xpos=80 : Ypos=24
  177.      LOCATE Ypos,Xpos
  178.  
  179. END SUB    ' CtrlEnd
  180.  
  181. SUB BackSpace
  182.  
  183.      Xpos = POS : Ypos = CSRLIN        ' Get Current position
  184.      IF Xpos=1 THEN EXIT SUB           ' Column 1 ?
  185.      Xpos=Xpos-1                       ' Back-up one space
  186.      LOCATE Ypos,Xpos
  187.      ? " ";                            ' Clear character
  188.      LOCATE Ypos,Xpos                  ' Restore cursor position
  189.  
  190. END SUB
  191.  
  192.  
  193. ' ************** Arrow Routines ***************
  194. SUB MoveRight
  195.     SHARED Xpos,Ypos,Arrow,LastChar$
  196.  
  197.      IF Arrow=1 THEN A$="─"           ' Single Border ?
  198.      IF Arrow=2 THEN A$="═"           ' Double Border ?
  199.      IF Arrow=3 THEN A$=LastChar$     ' Print Last Character ?
  200.      IF Arrow=4 THEN A$=CHR$(SCREEN(Ypos,Xpos)) ' Change Color ?
  201.  
  202.      IF Arrow > 0 THEN                ' Special arrow keys on ?
  203.         CALL InsertText(A$)           ' OutPut Character    
  204.      END IF
  205.  
  206.      Xpos=Xpos+1
  207.      IF Xpos>79 THEN Xpos=80
  208.      LOCATE Ypos,Xpos
  209.  
  210. END SUB    ' MoveRight
  211.  
  212.  
  213. SUB MoveLeft
  214.     SHARED Xpos,Ypos,Arrow,LastChar$
  215.  
  216.      IF Arrow=1 THEN A$="─"           ' Single Border
  217.      IF Arrow=2 THEN A$="═"           ' Double Border
  218.      IF Arrow=3 THEN A$=LastChar$     ' Print Last Character
  219.      IF Arrow=4 THEN A$=CHR$(SCREEN(Ypos,Xpos)) ' Change Color ?
  220.  
  221.      IF Arrow > 0 THEN                ' Special arrow keys on ?
  222.         CALL InsertText(A$)           ' OutPut Character    
  223.      END IF
  224.  
  225.      Xpos=Xpos-1:IF Xpos<1 THEN Xpos=1
  226.      LOCATE Ypos,Xpos
  227.  
  228. END SUB    ' MoveLeft
  229.  
  230.  
  231. SUB MoveUp
  232.     SHARED Xpos,Ypos,Arrow,LastChar$
  233.  
  234.      IF Arrow=1 THEN A$="│"           ' Single Border
  235.      IF Arrow=2 THEN A$="║"           ' Double Border
  236.      IF Arrow=3 THEN A$=LastChar$     ' Last Character
  237.      IF Arrow=4 THEN A$=CHR$(SCREEN(Ypos,Xpos)) ' Change Color ?
  238.  
  239.      IF Arrow > 0 THEN                ' Special arrow keys on ?
  240.         CALL InsertText(A$)           ' Output Character
  241.      END IF
  242.  
  243.      Ypos=Ypos-1:IF Ypos<1 THEN Ypos=1
  244.      LOCATE Ypos,Xpos
  245.  
  246. END SUB    ' MoveUp
  247.  
  248.  
  249. SUB MoveDown
  250.     SHARED Xpos,Ypos,Arrow,LastChar$
  251.  
  252.      IF Arrow =1 THEN A$="│"          ' Single Border
  253.      IF Arrow =2 THEN A$="║"          ' Double Border
  254.      IF Arrow =3 THEN A$=LastChar$    ' Last Character
  255.      IF Arrow=4 THEN A$=CHR$(SCREEN(Ypos,Xpos)) ' Change Color ?
  256.  
  257.      IF Arrow > 0 THEN                ' Special arrow keys on ?
  258.         CALL InsertText(A$)           ' Output Character
  259.      END IF
  260.  
  261.      Ypos=Ypos+1:IF Ypos>23 THEN Ypos=24
  262.      LOCATE Ypos,Xpos
  263.  
  264. END SUB    ' MoveDown
  265.  
  266. ' F2 - FILES key
  267. SUB F2
  268.  
  269.      Xpos=POS : Ypos=CSRLIN            ' Get current position
  270.  
  271.      CALL FileService
  272.  
  273.      SCREEN 0,0,0,0               ' Back to Program    
  274.      CALL RestoreCursor
  275.      CALL Status
  276.  
  277. END SUB    ' F2
  278.  
  279.  
  280. ' F5 - COLORS key
  281. SUB F5
  282.      SHARED CurrentFore,CurrentBack
  283.  
  284.      Xpos=POS : Ypos=CSRLIN            ' Get Current Position
  285.                                        ' CALL Colors Routine
  286.      CALL Colors(CurrentFore,CurrentBack)
  287.      CALL RestoreCursor
  288.  
  289. END SUB    ' F5
  290.  
  291.  
  292. ' F6 - SPECIAL character key
  293. SUB F6
  294.     SHARED YSpec,XSpec,WLarge(),WSCharData(),A$
  295.  
  296.     LOCATE 1,1,0                       ' Hide Cursor & Open Window
  297.     CALL OPENWINDOW(WLarge(),WSCharData())
  298.     COLOR 14,0
  299.     LOCATE 2,2
  300.     ?"                        " : LOCATE 3,2
  301.     ?"                                    " : LOCATE 4,2
  302.     ?"             ";CHR$(26);"      Ç  ü  é " : LOCATE 5,2
  303.     ?"                                    " : LOCATE 6,2
  304.     ?" â  ä  à  å  ç  ê  ë  è  ï  î  ì  Ä " : LOCATE 7,2
  305.     ?"                                    " : LOCATE 8,2
  306.     ?" Å  É  æ  Æ  ô  ö  ò  û  ù  ÿ  Ö  Ü " : LOCATE 9,2
  307.     ?"                                    " : LOCATE 10,2
  308.     ?" ¢  £  ¥  ₧  ƒ  á  í  ó  ú  ñ  Ñ  ª " : LOCATE 11,2
  309.     ?"                                    " : LOCATE 12,2
  310.     ?" º  ¿  ⌐  ¬  ½  ¼  ¡  «  »  ░  ▒  ▓ " : LOCATE 13,2
  311.     ?"                                    " : LOCATE 14,2
  312.     ?" █  ▄  ▌  ▐  ▀  α  ß  Γ  π  Σ  σ  µ " : LOCATE 15,2
  313.     ?"                                    " : LOCATE 16,2
  314.     ?" τ  Φ  Θ  Ω  δ  ∞  φ  ε  ∩  ≡  ±  ≥ " : LOCATE 17,2
  315.     ?"                                    " : LOCATE 18,2
  316.     ?" ≤  ⌠  ⌡  ÷  ≈  °  ∙  ·  √  ⁿ  ²  ■ " : LOCATE 19,2
  317.     ?"                                    " : LOCATE 20,2 : COLOR 11,0
  318.     ?"          Escape to EXIT!           "
  319.  
  320.  
  321.     CALL CharSelect(A$,YSpec,XSpec,2,2,35,18)   ' HighLight Character
  322.     CALL CLOSEWINDOW(WLarge(),WSCharData())     ' Close Window &
  323.     CALL RestoreCursor                          ' Restore Cursor
  324.     IF A$ <> CHR$(0) THEN CALL InsertText(A$)   ' Print Character
  325.  
  326. END SUB    ' F6
  327.  
  328.  
  329. ' F7 - BOX character key
  330.  
  331. SUB F7
  332.     SHARED YBox,XBox,WLarge(),WBCharData(),A$
  333.  
  334.     LOCATE 1,1,0                             ' Hide Cursor &
  335.     CALL OPENWINDOW(WLarge(),WBCharData())   ' Open Window
  336.     COLOR 14,0
  337.     LOCATE 2,2
  338.     ?" ╒  ╤  ╕  ╓  ╥  ╖ " : LOCATE 3,2
  339.     ?"                  " : LOCATE 4,2
  340.     ?" ╞  ╪  ╡  ╟  ╫  ╢ " : LOCATE 5,2
  341.     ?"                  " : LOCATE 6,2
  342.     ?" ╘  ╧  ╛  ╙  ╨  ╜ " : LOCATE 7,2
  343.     ?"                  " : LOCATE 8,2
  344.     ?" ╔  ╦  ╗  ┌  ┬  ┐ " : LOCATE 9,2
  345.     ?"                  " : LOCATE 10,2
  346.     ?" ╠  ╬  ╣  ├  ┼  ┤ " : LOCATE 11,2
  347.     ?"                  " : LOCATE 12,2
  348.     ?" ╚  ╩  ╝  └  ┴  ┘ " : LOCATE 13,2
  349.     COLOR 11,0:?" Escape to exit! "
  350.  
  351.     CALL CharSelect(A$,YBox,XBox,2,2,17,12)   ' HighLight Character
  352.     CALL CLOSEWINDOW(WLarge(),WBCharData())   ' Close Window
  353.     CALL RestoreCursor                        ' Restore Cursor
  354.     IF A$ <> CHR$(0) THEN CALL InsertText(A$) ' Print Character
  355.  
  356. END SUB    ' F7
  357.  
  358.  
  359. ' F8 - Rotate Options -Last character/Single Border/Double Border/Change Color
  360. ' Arrow will equal  0 - Special Arrow keys off
  361. '                   1 - Single Border
  362. '                   2 - Double Border
  363. '                3 - Last Character
  364. '                4 - Change Color under cursor
  365. SUB F8
  366.     SHARED Arrow,OldArrow,Border$()
  367.  
  368.      IF Arrow = 0 THEN EXIT SUB        ' Are special arrow keys on ?
  369.  
  370.      Arrow = Arrow + 1                 ' Rotate status by 1
  371.      IF Arrow > 4 THEN Arrow = 1
  372.      OldArrow = Arrow
  373.  
  374.      Xpos=POS : Ypos=CSRLIN            ' Get Current Position
  375.  
  376.      COLOR 11,0                        ' Set Status line color
  377.      LOCATE 25,1                       ' Position cursor
  378.      LOCATE 25,22,0 : ? "=";Border$(Arrow);
  379.      CALL RestoreCursor                ' Restore cursor
  380.  
  381. END SUB    ' F8
  382.  
  383.  
  384. ' F9 -
  385. SUB F9
  386.     SHARED CurrentFore,CurrentBack,Path$,FileName$,InitialPath$
  387.     SHARED Mask$,StatColor$
  388.     LOCAL StatBack$,StatFore$,Fore
  389.  
  390.      Xpos=POS : Ypos=CSRLIN            ' Get current position
  391.  
  392.      SCREEN 0,0,2,0                    ' Screen 2 for HELP
  393.      COLOR 7,0
  394.      CLS
  395.  
  396.      StatBack$=MID$(StatColor$,(CurrentBack*7)+1,7)
  397.      Fore=CurrentFore
  398.  
  399.      IF Fore > 23 THEN
  400.         StatFore$="Blinking High Intensity "
  401.         Fore=Fore-24
  402.      END IF
  403.      IF Fore > 15 THEN
  404.         StatFore$="Blinking "
  405.         Fore=Fore-16
  406.      END IF
  407.      IF Fore > 7 THEN
  408.         StatFore$="High Intensity "
  409.         Fore=Fore-8
  410.      END IF
  411.      StatFore$=StatFore$+MID$(StatColor$,(Fore*7)+1,7)
  412.  
  413.      ?" Current Setting "
  414.      ?
  415.      ?" Background Color: ";StatBack$
  416.      ?" Foreground Color: ";StatFore$
  417.      ?
  418.      ?" File Name: ";FileName$
  419.      ?" Directory: ";Path$
  420.      ?" Mask Setting: ";Mask$
  421.      ?
  422.      ?" Help Directory: ";InitialPath$
  423.      ? : ?
  424.      ?" Press any key to continue ...";
  425.  
  426.      SCREEN 0,0,0,2
  427.      CALL GetKey(A$)
  428.  
  429.      SCREEN 0,0,0,0                    ' Back to Program
  430.      CALL RestoreCursor
  431.  
  432. END SUB    ' F9
  433.  
  434.  
  435. ' F10 - Show command menu
  436. SUB F10
  437.  
  438.     SCREEN 0,0,0,1                     ' SCREEN 1 for Commands Menu
  439.     WHILE NOT INSTAT : WEND            ' Wait for keypress
  440.     SCREEN 0,0,0,0                     ' Return
  441.  
  442. END SUB    ' F10
  443.  
  444.  
  445. ' ************* SUBROUTINES *****************
  446.  
  447. ' Status updates entire status line
  448. SUB Status
  449.     SHARED Xpos,Ypos,Arrow,Border$(),Arrow$
  450.  
  451.     Ypos=CSRLIN : Xpos=POS             ' Get Current Position
  452.         LOCATE 25,1
  453.         COLOR 14,0
  454.         ? "Line     Col     ";Arrow$;"                           Esc          F1 or F10        ";
  455.         COLOR 11,0
  456.         LOCATE 25,5,0  : ? "=";Ypos;     ' Print status information
  457.         LOCATE 25,13,0 : ? "=";Xpos;
  458.         LOCATE 25,22,0 : ? "=";Border$(Arrow);
  459.         LOCATE 25,52,0 : ? "-Exit";
  460.         LOCATE 25,71,0 : ? "-Help";
  461.   CALL LowerCorner(32,0,3998)            ' Poke Character into Lower Corner
  462.   CALL RestoreCursor                     ' Restore Position
  463.  
  464. END SUB       ' Status    
  465.  
  466. ' LowerCorner Pokes the character and attribute into video
  467. ' Otherwise printing character will scroll top line off the screen
  468. SUB LowerCorner(Character,Attr,Position)
  469.     SHARED VideoOffset
  470.  
  471.     DEF SEG=%VideoSegment                 ' Point to Video Segment
  472.     POKE Position,Character               ' Poke Character &
  473.     POKE Position+1,Attr                  ' Attribute
  474.     DEF SEG                               ' Return Segment
  475.  
  476. END SUB    ' LowerCorner
  477.  
  478.  
  479. ' InsertText(A$)  Inserts Text (A$) at the current cursor location
  480. SUB InsertText(A$)
  481.     SHARED LastChar$,CurrentFore,CurrentBack
  482.  
  483.     IF ASC(A$) > 6 AND ASC(A$) < 14 THEN EXIT SUB    ' Non-printing
  484.     IF ASC(A$) > 28 AND ASC(A$) < 32 THEN EXIT SUB   '  Characters
  485.  
  486.     Xpos=POS:Ypos=CSRLIN               ' Current Position
  487.  
  488.     IF Xpos > 79 AND Ypos=24 THEN      ' Is this the Lower Corner?
  489.        A=ASC(A$)                       ' Get Character
  490.        B=CurrentBack*16+CurrentFore    ' and Color
  491.        Position=3838                   ' and Position
  492.       CALL LowerCorner(A,B,Position)   ' Poke it in
  493.       EXIT SUB                         ' EXIT
  494.    END IF
  495.  
  496.     LOCATE Ypos,Xpos                   ' Normal Printing
  497.     ? A$;
  498.     LastChar$=A$                       ' Store Character for Repeat
  499.  
  500. END SUB    ' InsertText
  501.  
  502.  
  503. 'CharSelect Highlights 3 characters. Used to select from characters window.
  504. 'A$=Character under cursor when RETURN is pressed.
  505. 'Y,X=Position to start highlighting
  506. 'XMin,YMin,XMax,YMax=Minimum and Maximum X,Y positions within the window
  507. SUB CharSelect(A$,Y,X,XMin,YMin,XMax,YMax)
  508.      SHARED TextHigh,TextNorm
  509.  
  510.     DO
  511.      CALL HighLightText(Y,X,3,TextHigh)          ' HighLight Text
  512.       CALL Getkey(A$)                            ' Wait for keypress
  513.        IF A$=CHR$(27) THEN A$=CHR$(0) : EXIT SUB ' ESCAPE ?
  514.         IF LEFT$(A$,1)=CHR$(0) THEN              ' Extended Key Code ?
  515.            CALL Extkey(A$,K)                     ' Get Code
  516.  
  517.               IF K=77 THEN                       ' MOVE RIGHT
  518.                 CALL HighLightText(Y,X,3,TextNorm)
  519.                 X=X+3 : IF X > XMax THEN X=XMax
  520.               END IF
  521.  
  522.               IF K=75 THEN                       ' MOVE LEFT
  523.                 CALL HighLightText(Y,X,3,TextNorm)
  524.                 X=X-3 : IF X < XMin THEN X=XMin
  525.               END IF
  526.  
  527.               IF K=72 THEN                       ' MOVE UP
  528.                 CALL HighLightText(Y,X,3,TextNorm)
  529.                 Y=Y-2 : IF Y < YMin THEN Y=YMin
  530.               END IF
  531.  
  532.               IF K=80 THEN                       ' MOVE DOWN
  533.                 CALL HighLightText(Y,X,3,TextNorm)
  534.                 Y=Y+2 : IF Y > YMax THEN Y=YMax
  535.               END IF
  536.         END IF
  537.     LOOP UNTIL A$=CHR$(13)             ' Wait for RETURN
  538.  A=SCREEN (Y,X+1)                      ' Read Character from Screen
  539.  A$=CHR$(A)                            ' and Print it
  540.  
  541. END SUB    ' CharSelect
  542.  
  543. ' HighLightText(Y,X,WL,Attr)  Highlights text
  544. ' Y=ROW  X=COL  WL=Word Length  Attr=Color
  545. SUB HighLightText(Y,X,WL,Attr)
  546.     SHARED VideoOffset
  547.     LOCAL T,Row,Col,WordLength
  548.  
  549.     Row=Y
  550.     Col=X
  551.     WordLength=WL
  552.     Row=Row-1
  553.     Col=(Col-1)*2
  554.     WordLength=WordLength*2+Col
  555.  
  556.   DEF SEG=%VideoSegment + (Row*10)                ' Define Screen Segment
  557.     WHILE Col < WordLength
  558.      POKE Col+1,Attr                               ' Poke Attribute
  559.      INCR Col,2                                    ' to HighLight Text
  560.     WEND
  561.   DEF SEG                                          ' Return to Segment
  562.  
  563. END SUB    ' HighLightText
  564.  
  565.  
  566. ' EXIT routine
  567. GOODBYE:
  568.  SCREEN 0,0,0,0
  569.      CALL OPENWINDOW(WSmall(),WErrData())        ' Open Exit Window
  570.      LOCATE 12,29,0
  571.      COLOR 15,4
  572.      ?"Exit? Are you sure?(Y/N)";                ' Sure ?
  573.      WHILE NOT INSTAT:WEND                       ' Wait for keypress
  574.      A$=INKEY$
  575.      CALL CLOSEWINDOW(WSmall(),WErrData())       ' Close Window
  576.      CALL RestoreCursor                          ' Restore Position
  577.      IF UCASE$(A$) = "Y" THEN GOTO SureDone      ' Convert A$ to UpperCase
  578.  
  579. GOTO START                                       ' Return if NOT Y
  580.  
  581. SureDone:                                        ' Yes, EXIT
  582.  END
  583.  
  584.  
  585. ' ******************* BLOCK ROUTINES ********************
  586. SUB Block
  587.     SHARED CurrentFore,CurrentBack,Xpos,Ypos,Arrow
  588.     LOCAL XBegin,YBegin,XEnd,YEnd,ArrowStat
  589.  
  590.      ArrowStat =0
  591.      IF Arrow <> 0 THEN
  592.         CALL PageDn                    ' Turn off special arrow keys
  593.         ArrowStat = 1                  ' Set Flag
  594.      END IF
  595.  
  596.      XBegin=Xpos : YBegin=Ypos         ' Current Position when
  597.      COLOR 14,0                        ' when Routine is Called
  598.      LOCATE 25,1
  599.      ?" Move cursor to location and F4 to mark block end.                    Esc-Exit ";
  600.      LOCATE Ypos,Xpos
  601.      DO
  602.       DO
  603.        CALL Getkey(A$)                         ' Get Keypress
  604.        IF A$=CHR$(27) THEN A$=CHR$(0)+CHR$(0)  ' ESCAPE ?
  605.       LOOP UNTIL LEFT$(A$,1)=CHR$(0)           ' Wait For Extened Key
  606.        CALL Extkey(A$,K)                       ' Get Code
  607.         IF K=0 THEN EXIT LOOP                  ' Escape, So EXIT
  608.         IF K=71 THEN CALL BeginofLine          ' HOME
  609.         IF K=79 THEN CALL EndofLine            ' END
  610.         IF K=77 THEN CALL MoveRight            ' RIGHT ARROW
  611.         IF K=75 THEN CALL MoveLeft             ' LEFT ARROW
  612.         IF K=72 THEN CALL MoveUp               ' UP ARROW
  613.         IF K=80 THEN CALL MoveDown             ' DOWN ARROW
  614.         IF K=115 THEN CALL MidScreen           ' Middle Screen
  615.         IF K=116 THEN CALL MidScreen           ' Middle Screen
  616.         IF K=119 THEN CALL CtrlHome            ' UpperLeft Corner
  617.         IF K=117 THEN CALL CtrlEnd             ' LowerRight Corner
  618.      LOOP UNTIL K=62                           ' Wait for F4 key
  619.      IF K=0 THEN
  620.         IF ArrowStat =1 THEN CALL PageDn ' Turn on special arrow keys
  621.         CALL Status
  622.         EXIT SUB        ' Escape EXIT
  623.      END IF
  624.      XEnd=Xpos : YEnd=Ypos                     ' Get Position
  625.      IF XEnd < XBegin THEN SWAP XEnd,XBegin    ' Put Smaller Position in Begin
  626.      IF YEnd < YBegin THEN SWAP YEnd,YBegin    ' Put Larger Position in End
  627.      COLOR 14,0
  628.      LOCATE 25,1
  629.      ?" F1-Character Fill   F3-Single Border   F5-Double Border   F7-Copy    Esc-Exit ";
  630.      LOCATE Ypos,Xpos
  631.      DO
  632.       DO
  633.        CALL Getkey(A$)                         ' Get KeyPress
  634.        IF A$=CHR$(27) THEN A$=CHR$(0)+CHR$(0)  ' ESCAPE ?
  635.       LOOP UNTIL LEFT$(A$,1)=CHR$(0)           ' Wait for Extended Key
  636.        CALL Extkey(A$,K)                       ' Get Code
  637.         IF K=0 THEN EXIT LOOP                  ' Escape, so EXIT
  638.         IF K=59 THEN CALL CharFill(XBegin,YBegin,XEnd,YEnd) : EXIT LOOP
  639.         IF K=61 THEN CALL SingleFill(XBegin,YBegin,XEnd,YEnd) : EXIT LOOP
  640.         IF K=63 THEN CALL DoubleFill(XBegin,YBegin,XEnd,YEnd) : EXIT LOOP
  641.         IF K=65 THEN CALL CopyBlock(XBegin,YBegin,XEnd,YEnd) : EXIT LOOP
  642.      LOOP
  643.  
  644.      LOCATE Ypos,Xpos
  645.      IF ArrowStat =1 THEN CALL PageDn          ' Turn on special arrow keys
  646.  
  647.  CALL Status
  648.  
  649. END SUB    ' Block
  650.  
  651. ' Character fill routine
  652. SUB CharFill(XBegin,YBegin,XEnd,YEnd)
  653.     LOCAL X,Y,FillLength,FillWord$
  654.     SHARED CurrentFore,CurrentBack,A$
  655.  
  656.      COLOR 14,0
  657.      LOCATE 25,1
  658.      ?" Input character to FILL       ";:COLOR 11,0 : ?" F6"; : COLOR 14,0
  659.      ?"-Special "; : COLOR 11,0 : ?" F7"; : COLOR 14,0 : ?"-Box Characters        ";
  660.      COLOR 11,0 : ?" Esc"; : COLOR 14,0 : ?"-Exit ";
  661.      DO
  662.      LOCATE 25,26
  663.       CALL Getkey(A$)                          ' Get KeyPress
  664.        IF A$=CHR$(27) THEN A$=CHR$(7)          ' ESCAPE ?
  665.        IF LEFT$(A$,1)=CHR$(0) THEN             ' Extended Key ?
  666.          CALL Extkey(A$,K)                     ' Get Code
  667.          IF K=64 THEN CALL F6                  ' Special Character
  668.          IF K=65 THEN CALL F7                  ' Box Character
  669.        END IF
  670.      LOOP UNTIL LEFT$(A$,1) <> CHR$(0)
  671.       COLOR CurrentFore,CurrentBack
  672.  
  673.      ' Non-printing Characters
  674.      IF ASC(A$) > 6 AND ASC(A$) < 14 THEN LOCATE YEnd,XEnd : EXIT SUB
  675.      IF ASC(A$) > 28 AND ASC(A$) < 32 THEN LOCATE YEnd,XEnd : EXIT SUB
  676.  
  677.      FillLength=(XEnd+1)-XBegin
  678.      FillWord$=STRING$(FillLength,ASC(A$))     ' Set FillWord$
  679.      Y=YBegin
  680.      WHILE Y <= YEnd
  681.        X=XBegin
  682.           IF X + FillLength > 79 AND Y=24 THEN  ' Check For Lower Corner
  683.            A=ASC(A$)                           ' Character
  684.            B=CurrentBack*16+CurrentFore        ' Color
  685.            Position=3838                       ' Position
  686.            CALL LowerCorner(A,B,Position)      ' Poke into Screen
  687.            LOCATE 24,X
  688.            ? LEFT$(FillWord$,FillLength-1);
  689.            LOCATE YEnd,XEnd
  690.            EXIT SUB
  691.           END IF
  692.          LOCATE Y,X                            ' Position Cursor
  693.          ? FillWord$;                          ' Print String
  694.       Y=Y+1                                    ' Increment Y(NEXT LINE)
  695.      WEND                                      ' Loop
  696.    LOCATE YEnd,XEnd
  697.  
  698. END SUB    ' CharFill
  699.  
  700. ' Single border box routine
  701. SUB SingleFill(XBegin,YBegin,XEnd,YEnd)
  702.      SHARED CurrentFore,CurrentBack
  703.      LOCAL LastLine$,LastLength
  704.  
  705.      IF XEnd-XBegin < 1 THEN LOCATE 1,1 : EXIT SUB
  706.      IF YEnd-YBegin < 1 THEN LOCATE 1,1 : EXIT SUB
  707.  
  708.      LOCATE YBegin,XBegin                      ' Position Cursor
  709.      COLOR CurrentFore,CurrentBack             ' Set Color
  710.      ?"┌";STRING$((XEnd-XBegin)-1,196);"┐";    ' Set-up String to print
  711.      YBegin=YBegin+1                           ' Increment Line
  712.      WHILE YBegin < YEnd
  713.       LOCATE YBegin,XBegin : ?"│";             ' Print first edge of Border
  714.       LOCATE YBegin,XEnd : ?"│";               ' Second Edge
  715.       YBegin=YBegin+1                          ' Increment Line
  716.      WEND
  717.      LastLine$="└"+STRING$((XEnd-XBegin)-1,196)+"┘"  ' Last Line
  718.      LastLength=LEN(LastLine$)
  719.       IF XBegin + LastLength > 79 AND YBegin=24 THEN  ' Check for Lwer Corner
  720.        A=217                                   ' Character to Print
  721.        B=CurrentBack*16+CurrentFore            ' Color
  722.        Position=3838                           ' Position
  723.        CALL LowerCorner(A,B,Position)          ' Poke Character
  724.        LOCATE 24,XBegin
  725.        ? LEFT$(LastLine$,LastLength-1);
  726.        LOCATE YEnd,XEnd
  727.        EXIT SUB
  728.       END IF
  729.      LOCATE YBegin,XBegin
  730.      ? LastLine$;
  731.    LOCATE YEnd,XEnd
  732.  
  733. END SUB    ' SingleFill
  734.  
  735. ' Double border box routine
  736. SUB DoubleFill(XBegin,YBegin,XEnd,YEnd)
  737.      SHARED CurrentFore,CurrentBack
  738.      LOCAL LastLine$,LastLength
  739.  
  740.      IF XEnd-XBegin < 1 THEN LOCATE 1,1 : EXIT SUB
  741.      IF YEnd-YBegin < 1 THEN LOCATE 1,1 : EXIT SUB
  742.  
  743.      LOCATE YBegin,XBegin                      ' Set Cursor
  744.      COLOR CurrentFore,CurrentBack
  745.      ?"╔";STRING$((XEnd-XBegin)-1,205);"╗";    ' Print First Line
  746.      YBegin=YBegin+1                           ' Increment Line
  747.      WHILE YBegin < YEnd
  748.       LOCATE YBegin,XBegin : ?"║";             ' Print First edge
  749.       LOCATE YBegin,XEnd : ?"║";               ' Print Second edge
  750.       YBegin=YBegin+1                          ' Increment Line
  751.      WEND                                      ' Loop
  752.      LastLine$="╚"+STRING$((XEnd-XBegin)-1,205)+"╝"   ' Set-up Last Line
  753.      LastLength=LEN(LastLine$)
  754.       IF XBegin + LastLength > 79 AND YBegin=24 THEN  ' Check for Lower Corner
  755.        A=188                                   ' Character to Print
  756.        B=CurrentBack*16+CurrentFore            ' Color
  757.        Position=3838                           ' Position
  758.        CALL LowerCorner(A,B,Position)          ' Poke Character
  759.        LOCATE 24,XBegin
  760.        ? LEFT$(LastLine$,LastLength-1);
  761.        LOCATE YEnd,XEnd
  762.        EXIT SUB
  763.       END IF
  764.      LOCATE YBegin,XBegin                      ' If NOT Lower Corner
  765.      ? LastLine$;                              ' then Print Line
  766.    LOCATE YEnd,XEnd
  767.  
  768. END SUB    ' DoubleFill
  769.  
  770. ' Copy block routine
  771. SUB CopyBlock(XBegin,YBegin,XEnd,YEnd)
  772.      SHARED CurrentFore,CurrentBack,WLarge(),WBlockData(),WLarge2()
  773.      LOCAL T
  774.  
  775.                                                ' Set-up Window Data
  776.      WBlockData(0)=YBegin-1                    ' ROW
  777.      WBlockData(1)=XBegin-1                    ' COL
  778.      WBlockData(2)=(XEnd-XBegin)+1             ' WIDTH
  779.      WBlockData(3)=(YEnd-YBegin)+1             ' LENGTH
  780.      WBlockData(4)=(CurrentBack*16)+CurrentFore ' COLOR
  781.      WBlockData(5)=0                            ' BORDER TYPE (0=no border)
  782.  
  783.      CALL OPENWINDOW(WLarge(),WBlockData())    ' Block Data Window
  784.      CALL OPENWINDOW(WLarge2(),WBlockData())   ' Area under block
  785.  
  786.      COLOR 14,0
  787.      LOCATE 25,1
  788.      ?" Move cursor to new location and press Return to COPY block.          Esc-Exit ";
  789.  
  790.      DO
  791.       CALL Getkey(A$)                               ' Get Keypress
  792.       IF LEFT$(A$,1)=CHR$(0) THEN                   ' Test for Extended Key
  793.        CALL Extkey(A$,K)                            ' Get Code
  794.  
  795.        CALL CLOSEWINDOW(WLarge2(),WBlockData())     ' Area under window
  796.  
  797.         IF K=71 THEN WBlockdata(1)=0                ' HOME
  798.  
  799.         IF K=79 THEN WBlockData(1)=80-WBlockdata(2) ' END
  800.  
  801.         IF K=77 THEN                                ' RIGHT
  802.             WBlockData(1)=WBlockData(1)+1
  803.             IF WBLockData(1)+WBlockData(2) > 80 THEN
  804.                 WBlockData(1)=80-WBlockData(2)
  805.             END IF
  806.         END IF
  807.  
  808.         IF K=75 THEN                                ' LEFT
  809.             WBlockData(1)=WBlockData(1)-1
  810.             IF WBlockData(1) < 0 THEN WBlockData(1)=0
  811.         END IF
  812.  
  813.         IF K=72 THEN                                ' UP
  814.            WBlockData(0)=WBlockData(0)-1
  815.            IF WBlockData(0) < 0 THEN WBlockData(0)=0
  816.         END IF
  817.  
  818.         IF K=80 THEN                                ' DOWN
  819.            WBlockData(0)=WBlockData(0)+1
  820.            IF WBlockData(0)+WBlockData(3) > 24 THEN
  821.                WBlockdata(0)=24-WBlockData(3)
  822.            END IF
  823.         END IF
  824.  
  825.         IF K=119 THEN                               ' UPPER CORNER
  826.            WBlockData(0)=0
  827.            WBlockdata(1)=0
  828.         END IF
  829.  
  830.         IF K=117 THEN                               ' LOWER CORNER
  831.             WBlockData(1)=80-WBlockdata(2)
  832.             WBlockData(0)=24-WBlockData(3)
  833.         END IF
  834.  
  835.         CALL OPENWINDOW(WLarge2(),WBlockData())     ' Area under block
  836.  
  837.         CALL CLOSEWINDOW(WLarge(),WBlockData())     ' Block Data
  838.  
  839.       END IF
  840.  
  841.       IF A$=CHR$(27) THEN EXIT LOOP                 ' ESCAPE ?
  842.  
  843.       IF A$=CHR$(13) THEN                           ' Return ?
  844.          CALL OPENWINDOW(WLarge2(),WBlockData())    ' New data under window
  845.          CALL CLOSEWINDOW(WLarge(),WBlockData())    ' Block Data
  846.       END IF
  847.  
  848.      LOOP
  849.  
  850.    CALL CLOSEWINDOW(WLarge2(),WBlockData())         ' Replace area under block
  851.  
  852.  ERASE WLarge,WLarge2,WBlockData                    ' Clear Arrays
  853.  
  854. END SUB    ' CopyBlock
  855.  
  856.  
  857.  
  858.  
  859. ' ********************* FILES routines *********************
  860.  
  861. SUB FileService
  862.     SHARED WLarge(),WFilesData(),FY,TextHigh,TextNorm,Path$,FileName$
  863.  
  864.     LOCATE 2,6,0 : COLOR 14,0
  865.     CALL OPENWINDOW(WLarge(),WFilesData())     ' Open Files Window
  866.     COLOR 14,0
  867.     LOCATE 2,6,0 : COLOR 14,0
  868.     ?" FILES "
  869.     LOCATE 3,3
  870.     ?"             " : LOCATE 4,3
  871.     ?" File Name   " : LOCATE 5,3
  872.     ?" Save File   " : LOCATE 6,3
  873.     ?" Load File   " : LOCATE 7,3
  874.     ?" Change Dir  " : LOCATE 8,3
  875.     ?" Directory   " : LOCATE 9,3
  876.     ?" DOS Shell   "
  877.     CALL HighLightText(FY,3,13,TextHigh)       ' HighLight Text
  878.     DO
  879.     CALL Getkey(A$)                            ' Get Keypress
  880.         IF A$=CHR$(27) THEN                    ' ESCAPE ?
  881.          CALL CLOSEWINDOW(WLarge(),WFilesData()) ' Close Window
  882.          EXIT SUB                              ' and Exit
  883.         END IF
  884.         IF LEFT$(A$,1)=CHR$(0) THEN            ' Extended Key ?
  885.            CALL Extkey(A$,K)                   ' Get Code
  886.  
  887.               IF K=72 THEN                     ' MOVE UP
  888.                CALL HighLightText(FY,3,13,TextNorm)
  889.                 IF FY = 4 THEN FY = 10         ' Check Location
  890.                 FY=FY-1
  891.                CALL HighLightText(FY,3,13,TextHigh)
  892.               END IF
  893.  
  894.               IF K=80 THEN                     ' MOVE DOWN
  895.                CALL HighLightText(FY,3,13,TextNorm)
  896.                 IF FY = 9 THEN FY = 3          ' Check Location
  897.                 FY=FY+1
  898.                CALL HighLightText(FY,3,13,TextHigh)
  899.               END IF
  900.         END IF
  901.    IF A$=CHR$(13) THEN                         ' RETURN ?
  902.     IF FY = 4 THEN CALL ChangeFileName         ' Change File ?
  903.     IF FY = 5 THEN                             ' Save File ?
  904.       CALL SaveFile(Stat)
  905.       IF Stat=1 THEN EXIT LOOP                 ' No Errors ?
  906.     END IF
  907.     IF FY = 6 THEN                             ' Load File ?
  908.       CALL CLOSEWINDOW(WLarge(),WFilesData())  ' Close Window
  909.        CALL LoadFile
  910.       EXIT LOOP                                ' EXIT
  911.      END IF
  912.     IF FY = 7 THEN CALL ChangePath             ' Change Path ?
  913.     IF FY = 8 THEN CALL Directory              ' Directory ?
  914.     IF FY = 9 THEN GOTO DOSSHELL               ' SHELL ?
  915.   END IF
  916.  LOOP                                          ' Loop until ESCAPE
  917.  
  918. END SUB    ' FileService
  919.  
  920.  
  921. ' ********************** FILENAME *********************
  922.  
  923. SUB ChangeFileName
  924.     SHARED FileName$,GoodFileName$,WSmall(),WFileNameData()
  925.     LOCAL NewFileName$
  926.  
  927.      CALL OPENWINDOW(WSmall(),WFileNameData()) ' Open FileName Window
  928.      LOCATE 3,20 : COLOR 14,0
  929.      ?" FileName "
  930.      LOCATE 4,19,1,1,7
  931.      ? FileName$;                              ' Print Current FileName
  932.      LOCATE 4,19
  933.  
  934.      DO
  935.       CALL Getkey(A$)                              ' Get Keypress
  936.       IF A$=CHR$(27) OR A$=CHR$(13) THEN           ' Escape OR Return ?
  937.         CALL CLOSEWINDOW(WSmall(),WFileNameData()) ' Close Window
  938.         LOCATE 1,1,0
  939.         EXIT SUB                                   ' and EXIT
  940.       END IF                                   ' If not EXIT then
  941.      LOOP UNTIL INSTR(GoodFileName$,A$) <> 0   ' Wait for Legal Character
  942.      NewFileName$=A$                           ' Set Variable
  943.  
  944.      DO
  945.        LOCATE 4,19 : ? SPACE$(8)               ' Clear Line
  946.        LOCATE 4,19 : ? NewFileName$;           ' Print New Filename
  947.  
  948.        CALL Getkey(A$)                         ' Get Next Character
  949.  
  950.        IF A$=CHR$(27) THEN                            ' Escape ?
  951.           LOCATE 1,1,0
  952.           CALL CLOSEWINDOW(WSmall(),WFileNameData())  ' Close Window
  953.           EXIT SUB
  954.        END IF
  955.  
  956.        ' Check For Legal Characters
  957.        IF INSTR(GoodFileName$,A$) <> 0 THEN NewFileName$=NewFilename$+A$
  958.  
  959.        ' BACKSPACE
  960.        IF A$=CHR$(8) THEN
  961.          IF LEN(NewFileName$) > 0 THEN NewFileName$=LEFT$(NewFileName$,(LEN(NewFileName$)-1))
  962.        END IF
  963.  
  964.        IF LEN(NewFileName$) > 7 THEN           ' More then 8 characters ?
  965.           NewFileName$=LEFT$(NewFileName$,8)
  966.        END IF
  967.  
  968.      LOOP UNTIL A$=CHR$(13)                   ' Wait For Return
  969.      FileName$=NewFileName$                   ' Save New Name
  970.  
  971.    CALL CLOSEWINDOW(WSmall(),WFileNameData())  ' Close Window
  972.    LOCATE 1,1,0
  973.  
  974. END SUB  ' ChangeFileName
  975.  
  976.  
  977.  
  978. ' ************************ LOAD FILE **************************
  979.  
  980. SUB LoadFile
  981.     SHARED FileName$,VideoOffset,Path$
  982.     LOCAL File$,FileSize,KeyStroke$
  983.  
  984.      File$=Path$
  985.      IF RIGHT$(File$,1) <> "\" THEN File$=File$+"\"
  986.  
  987.      File$=File$+FileName$+".SCR"              ' Set Filename with Extension
  988.       CALL FileCheck(File$,FileSize)           ' Check File
  989.        IF FileSize = 0 THEN                    ' File Length = 0 ?
  990.           CALL DiskError(2)                    ' Print Error
  991.           EXIT SUB                             ' and EXIT
  992.        END IF
  993.        IF FileSize <> 3848 THEN                ' ALL Screen files are 3848 bytes
  994.           CALL DiskError(3)                    ' Print Error
  995.           EXIT SUB                             ' and EXIT
  996.        END IF
  997.  
  998.          DEF SEG = %VideoSegment               ' Set Segment to Video
  999.           BLOAD File$,0                        ' Load File
  1000.          DEF SEG                               ' Return Segment
  1001.  
  1002. END SUB  ' LoadFile
  1003.  
  1004.  
  1005.  
  1006. ' *********************** SAVE FILE **********************
  1007.  
  1008. SUB SaveFile(Stat)
  1009.     SHARED FileName$,WSmall(),WSaveData(),XSave,YSave,TextHigh,TextNorm
  1010.     SHARED WLarge(),WFilesData(),VideoOffset,Path$
  1011.     LOCAL File$,FileSize,Free!,KeyStroke$,SaveType
  1012.  
  1013.      Stat=0                                    ' Initialize Stat
  1014.      CALL OPENWINDOW(WSmall(),WSaveData())     ' Open Window
  1015.      LOCATE 4,24 : COLOR 14,0
  1016.      ?" Format "
  1017.      LOCATE 5,18,0
  1018.      ? " SCR  ANS  BAS  All "
  1019.      DO                                        ' Get File Type
  1020.       CALL HighLightText(YSave,XSave,5,TextHigh)
  1021.        CALL Getkey(A$)                         ' Get Keypress
  1022.  
  1023.        IF A$=CHR$(27) THEN                     ' ESCAPE ?
  1024.          CALL CLOSEWINDOW(WSmall(),WSaveData())' Close Window
  1025.          EXIT SUB                              ' and EXIT
  1026.        END IF
  1027.  
  1028.        IF LEFT$(A$,1)=CHR$(0) THEN             ' Extended Key ?
  1029.            CALL Extkey(A$,K)                   ' Get Code
  1030.  
  1031.               IF K=77 THEN                     ' MOVE RIGHT
  1032.                 CALL HighLightText(YSave,XSave,5,TextNorm)
  1033.                 XSave=XSave+5 : IF XSave > 33 THEN XSave=18
  1034.               END IF
  1035.  
  1036.               IF K=75 THEN                     ' MOVE LEFT
  1037.                 CALL HighLightText(YSave,XSave,5,TextNorm)
  1038.                 XSave=XSave-5 : IF XSave < 18 THEN XSave=33
  1039.               END IF
  1040.        END IF
  1041.  
  1042.      LOOP UNTIL A$=CHR$(13)                    ' Loop until Return
  1043.     CALL CLOSEWINDOW(WSmall(),WSaveData())     ' Close Windows
  1044.     CALL CLOSEWINDOW(WLarge(),WFilesData())
  1045.     Stat=1                                     ' O.K.
  1046.  
  1047.     SaveType=(XSave-18)/5                      ' Get Type
  1048.  
  1049.      File$=Path$
  1050.      IF RIGHT$(File$,1) <> "\" THEN File$=File$+"\"
  1051.  
  1052.      File$=File$+FileName$+".SCR"              ' Save Screen format first
  1053.      CALL FileCheck(File$,FileSize)            ' Check File
  1054.        IF FileSize <> 0 THEN                   ' Does File Exist ?
  1055.          LOCATE 25,1 : COLOR 14,0
  1056.          ? SPACE$(79); : LOCATE 25,1           ' Print Message
  1057.          ? " File ";FileName$;".SCR Exists. Do you want to OverWrite.(Y/N)                      ";
  1058.          CALL Getkey(A$)                       ' Get KeyPress
  1059.          IF UCASE$(A$)="N" THEN EXIT SUB       ' OverWrite ?
  1060.        END IF
  1061.  
  1062.     ' Check available space on drive
  1063.      REG 4,0
  1064.      REG 1,&h3600
  1065.      CALL INTERRUPT &H21
  1066.      Free!=CSNG(REG(2)) * REG(3) * REG(1)
  1067.      IF Free! < 4000 THEN
  1068.          CALL DiskError(1)                     ' Not enough room on drive
  1069.          EXIT SUB
  1070.      END IF
  1071.  
  1072.      LOCATE 25,1
  1073.      COLOR 14,0
  1074.      ? "     Saving File. Please wait!                                                 ";
  1075.         DEF SEG = %VideoSegment                ' Video Segment
  1076.          BSAVE File$,0,3840                    ' Save File
  1077.         DEF SEG                                ' Return to Segment
  1078.  
  1079.     IF SaveType=1 THEN CALL AnsiSave(FileName$)  ' ANSI format Save
  1080.  
  1081.     IF SaveType=2 THEN CALL BasicSave(FileName$) ' BASIC format Save
  1082.  
  1083.     IF SaveType=3 THEN                           ' ANSI & BASIC Save
  1084.         CALL AnsiSave(FileName$)
  1085.         CALL BasicSave(FileName$)
  1086.     END IF
  1087.  
  1088.  
  1089. END SUB  ' SaveFile
  1090.  
  1091.  
  1092. ' ************************ ANSI SAVE ************************
  1093.  
  1094. SUB AnsiSave(FileName$)
  1095. 'AnsiSave    Saves Screen Colors and text in ANSI Format.
  1096. '            CALL AnsiSave(FileName$) with Filename$=File Name
  1097.  
  1098.     SHARED VideoOffset,Path$
  1099.     LOCAL LinePointer,ChrPointer,Attr,Lin$,Esc$
  1100.  
  1101.      Esc$=CHR$(27)+"["                         ' Escape Sequence
  1102.  
  1103.      File$=Path$
  1104.      IF RIGHT$(File$,1) <> "\" THEN File$=File$+"\"
  1105.  
  1106.      File$=FileName$+".ANS"                    ' Set Filename and Extension
  1107.      CALL FileCheck(File$,FileSize)            ' Check File
  1108.        IF FileSize <> 0 THEN                   ' File Exists
  1109.          LOCATE 25,1 : COLOR 14,0
  1110.          ? SPACE$(79); : LOCATE 25,1 : COLOR 14,0  ' Print Message to User
  1111.          ? " File ";FileName$;".ANS Exists. Do you want to OverWrite.(Y/N)                      ";
  1112.          CALL Getkey(A$)                       ' Get Keypress
  1113.          IF UCASE$(A$)="N" THEN EXIT SUB       ' OverWrite ?
  1114.        END IF
  1115.      LOCATE 25,1
  1116.      COLOR 14,0
  1117.      ? "     Saving File. Please wait!                                                 ";
  1118.  
  1119.      ON ERROR GOTO AnsiSaveError               ' Error Checking Enabled
  1120.      OPEN File$ FOR OUTPUT AS #1               ' Open File
  1121.      Lin$=Esc$+"2J"+Esc$+"=7l"                 ' Clear Screen and
  1122.                                                ' Turn off Word Wrap
  1123.      PRINT #1,Lin$                             ' OutPut Line
  1124.      Attr=256                                  ' Initialize Attribute
  1125.  
  1126.  
  1127.      FOR LinePointer=0 TO 23                   ' Save 24 lines
  1128.      Lin$=""                                   ' Clear Lin$
  1129.  
  1130.        ' Def Seg for start of each line
  1131.        DEF SEG=%VideoSegment+(LinePointer*10)
  1132.        ChrPointer=0                            ' Initialize Character Pointer              
  1133.         DO
  1134.                                                ' Did color change ?
  1135.          IF Attr <> PEEK(ChrPointer+1) THEN CALL NewColor(ChrPointer,Attr,Lin$)
  1136.  
  1137.             Lin$=Lin$+CHR$(PEEK(ChrPointer))   ' TextString To Be Output
  1138.  
  1139.          ChrPointer=ChrPointer+2               ' Increment Pointer
  1140.         LOOP UNTIL ChrPointer > 158            ' End of Line
  1141.  
  1142.      PRINT #1,Lin$                              ' Output TextString
  1143.      NEXT LinePointer                           ' Next Line
  1144.  
  1145.      Lin$=""                                    ' Clear Lin$
  1146.      Lin$=Esc$+"=7h"+Esc$+"3A"                  ' Turn On Word Wrap
  1147.                                                 ' & Move Up 3 Rows
  1148.      PRINT #1,Lin$                              ' Output Line
  1149.  
  1150.      Lin$=Esc$+"0m"                              ' Reset Screen Color
  1151.      PRINT #1,Lin$
  1152.  
  1153.     CLOSE #1                                    ' Close and Exit
  1154.     ON ERROR GOTO 0                             ' Disable Error Checking
  1155.     EXIT SUB                                    ' EXIT
  1156.  
  1157. ' Saving Errors Come here
  1158. AnsiSaveError:
  1159.      CLOSE #1                                   ' Close File
  1160.      RESUME AnsiError
  1161.  
  1162. AnsiError:
  1163.      ON ERROR GOTO 0                            ' Disable Error Checking
  1164.      CALL DiskError(1)                          ' Print Error Message
  1165.  
  1166. END SUB    ' AnsiSave
  1167.  
  1168.  
  1169. ' NEW COLOR FOR ANSI FILES
  1170. SUB NewColor(ChrPointer,Attr,Lin$)
  1171.  
  1172.     LOCAL AnsiCom$,AnsiFore$,AnsiBack$,Blink,High,Esc$,TempAttr,Back,Fore
  1173.  
  1174.      Esc$=CHR$(27)+"["                          ' Escape Sequence
  1175.      AnsiCom$=""
  1176.      Blink=0 : High=0
  1177.  
  1178.      Attr=PEEK(ChrPointer+1)                    ' Get Attribute
  1179.      TempAttr=Attr                              ' Into TempAttr
  1180.  
  1181.     IF TempAttr > 127 THEN                      ' Test for Blinking Char
  1182.       TempAttr=TempAttr-128
  1183.       Blink=1
  1184.     END IF
  1185.  
  1186.      Back=TempAttr\16                           ' Background
  1187.      Fore=TempAttr-(Back*16)
  1188.  
  1189.      IF Fore > 7 THEN                           ' Test for HIGH Intensity
  1190.       Fore=Fore-8
  1191.       High=1
  1192.      END IF
  1193.  
  1194.      CALL AnsiColor(Back)
  1195.      CALL AnsiColor(Fore)
  1196.  
  1197.      AnsiBack$=MID$(STR$(40+Back),2,2)+"m"      ' ANSI Background Color
  1198.      AnsiFore$=MID$(STR$(30+Fore),2,2)+";"      ' ANSI Foreground Color
  1199.  
  1200.      AnsiCom$=Esc$
  1201.  
  1202.      IF Blink=1 THEN                            ' Blinking Character ?
  1203.       AnsiCom$=AnsiCom$+"5;"
  1204.      END IF
  1205.  
  1206.      IF High=1 THEN                             ' High Intensity ?
  1207.       AnsiCom$=AnsiCom$+"1;"
  1208.      END IF
  1209.  
  1210.      Lin$=Lin$+Esc$+"m"
  1211.      Lin$=Lin$+AnsiCom$+AnsiFore$+AnsiBack$     ' Set-up Output String
  1212.  
  1213. END SUB    ' NewColor (ANSI files)
  1214.  
  1215. ' ANSI Color Codes
  1216. SUB AnsiColor(Code)
  1217.  
  1218.      IF Code=1 THEN Code=4 : EXIT SUB           ' Blue
  1219.      IF Code=3 THEN Code=6 : EXIT SUB           ' Cyan
  1220.      IF Code=4 THEN Code=1 : EXIT SUB           ' Red
  1221.      IF Code=6 THEN Code=3 : EXIT SUB           ' Yellow
  1222.      IF Code=0 THEN Code=0 : EXIT SUB           ' Black
  1223.      IF Code=2 THEN Code=2 : EXIT SUB           ' Green
  1224.      IF Code=5 THEN Code=5 : EXIT SUB           ' Magenta
  1225.      IF Code=7 THEN Code=7                      ' White
  1226.  
  1227. END SUB    ' AnsiColor
  1228.  
  1229.  
  1230. ' ************************ BASIC SAVE ************************
  1231.  
  1232. 'BasicSave   Saves Screen Colors and text in BASIC file Format.
  1233. '            CALL BasicSave(FileName$) with Filename$=File Name
  1234. SUB BasicSave(FileName$)
  1235.  
  1236.     SHARED VideoOffset,Path$
  1237.     LOCAL LinePointer,ChrPointer,Attr,Lin$,LineNumber,TempText$
  1238.  
  1239.      File$=Path$
  1240.      IF RIGHT$(File$,1) <> "\" THEN File$=File$+"\"
  1241.  
  1242.      File$=FileName$+".BAS"                     ' Set Filename and Extension
  1243.      CALL FileCheck(File$,FileSize)             ' Check File
  1244.        IF FileSize <> 0 THEN                    ' Does File Exist
  1245.          LOCATE 25,1 : COLOR 14,0
  1246.          ? SPACE$(79); : LOCATE 25,1 : COLOR 14,0 ' Print Message
  1247.          ? " File ";FileName$;".BAS Exists. Do you want to OverWrite.(Y/N)                      ";
  1248.          CALL Getkey(A$)                        ' Get Keypress
  1249.          IF UCASE$(A$)="N" THEN EXIT SUB        ' OverWrite ?
  1250.        END IF
  1251.      LOCATE 25,1
  1252.      COLOR 14,0
  1253.      ? "     Saving File. Please wait!                                                 ";
  1254.  
  1255.      ON ERROR GOTO BasSaveError               ' Error Checking Enabled
  1256.      OPEN File$ FOR OUTPUT AS #1                ' Open File
  1257.  
  1258.      LineNumber=10000                           ' Initialize Line Number
  1259.      CALL NewLine(Lin$,LineNumber)
  1260.      Lin$=Lin$+" KEY OFF : CLS "
  1261.      PRINT #1,Lin$                              ' Output Line
  1262.  
  1263.      Lin$=""                                    ' Clear Variable
  1264.      Attr=256
  1265.  
  1266.  
  1267.      FOR LinePointer=0 TO 22                    ' Save 23 lines
  1268.       TempText$=""
  1269.  
  1270.        DEF SEG=%VideoSegment+(LinePointer*10) ' Def Seg for start of each line
  1271.        ChrPointer=0
  1272.        CALL NewLine(Lin$,LineNumber)
  1273.         DO
  1274.  
  1275.          IF Attr <> PEEK(ChrPointer+1) THEN   ' Did color change ?
  1276.             CALL NewBasicColor(ChrPointer,Attr,LineNumber,Lin$,TempText$)
  1277.          END IF
  1278.  
  1279.             TempText$=TempText$+CHR$(PEEK(ChrPointer))' TextString To Be Output
  1280.  
  1281.          ChrPointer=ChrPointer+2
  1282.  
  1283.          LOOP UNTIL ChrPointer > 159
  1284.  
  1285.         IF LEN(TempText$) > 0 THEN CALL OutputText(LineNumber,Lin$,TempText$)
  1286.  
  1287.      NEXT LinePointer                         ' Next Line
  1288.  
  1289.      CALL NewLine(Lin$,LineNumber)
  1290.      Lin$=Lin$+" COLOR 7,0 : RETURN"
  1291.  
  1292.      PRINT #1, Lin$
  1293.      Close #1                                  ' Close and Exit
  1294.      ON ERROR GOTO 0                           ' Disable Error Checking
  1295.  
  1296.      EXIT SUB
  1297.  
  1298. ' Saving Errors Come here
  1299. BasSaveError:
  1300.      CLOSE #1                                   ' Close File
  1301.      RESUME BasError
  1302.  
  1303. BasError:
  1304.      ON ERROR GOTO 0                            ' Disable Error Checking
  1305.      CALL DiskError(1)                          ' Print Error Message
  1306.  
  1307. END SUB    ' BasicSave
  1308.  
  1309. SUB NewLine(Lin$,LineNumber)
  1310.  
  1311.      Lin$=""
  1312.      Lin$=MID$(STR$(LineNumber),2,5)
  1313.      LineNumber=LineNumber+10
  1314.  
  1315. END SUB    ' NewLine
  1316.  
  1317. SUB NewBasicColor(ChrPointer,Attr,LineNumber,Lin$,TempText$)
  1318.     LOCAL Blink,TempAttr,Back,Fore
  1319.  
  1320.      IF LEN(TempText$) > 0 THEN CALL OutputText(LineNumber,Lin$,TempText$)
  1321.                                
  1322.      Blink=0
  1323.      Attr=PEEK(ChrPointer+1)                  ' Get Attribute
  1324.      TempAttr=Attr                            ' Into TempAttr
  1325.  
  1326.      IF TempAttr>128 THEN                     ' Test for Blinking Char
  1327.       TempAttr=TempAttr-128
  1328.       Blink=1
  1329.      END IF
  1330.  
  1331.      Back=TempAttr\16                         ' Background
  1332.      Fore=TempAttr-(Back*16)                  ' ForeGround
  1333.       IF Blink=1 THEN Fore=Fore+16            ' Blinking ?
  1334.  
  1335.      Lin$=Lin$+" COLOR " + STR$(Fore) + "," + STR$(Back) + " :"
  1336.  
  1337. END SUB    ' NewBasicColor
  1338.  
  1339. SUB OutputText(LineNumber,Lin$,TempText$)
  1340.     LOCAL CurrentCharacter,Test$,StrFlag,NewLine
  1341.  
  1342.      Lin$=Lin$+" PRINT "
  1343.      NewLine=0
  1344.      CurrentCharacter=1
  1345.      DO                                       ' Test for repeating character
  1346.       Test$=MID$(TempText$,CurrentCharacter,1)
  1347.       Count=1
  1348.  
  1349.      FOR T=CurrentCharacter+1 TO LEN(TempText$)
  1350.          IF Test$ <> MID$(TempText$,T,1) THEN EXIT FOR
  1351.          Count=Count+1
  1352.      NEXT T
  1353.  
  1354.      IF Count > 12 THEN
  1355.          Lin$=Lin$ + "STRING$(" + STR$(Count) + "," + STR$(ASC(Test$)) + ")"
  1356.          StrFlag=1
  1357.          NewLine =1
  1358.          GOTO NextChar
  1359.      END IF
  1360.  
  1361.      ' Test for character 34 (quote)
  1362.      IF Count < 13 AND Test$=CHR$(34) THEN
  1363.          Lin$=Lin$ + "STRING$(" + STR$(Count) + "," + STR$(ASC(Test$)) + ")"
  1364.          StrFlag=1
  1365.          NewLine =1
  1366.          GOTO NextChar
  1367.      END IF
  1368.  
  1369.      ' Test for characters 26 (end of file)
  1370.      IF Count < 13 AND Test$ = CHR$(26) THEN
  1371.          Lin$=Lin$ + "STRING$(" + STR$(Count) + "," + STR$(ASC(Test$)) + ")"
  1372.          StrFlag=1
  1373.          NewLine =1
  1374.          GOTO NextChar
  1375.      END IF
  1376.  
  1377.      IF Count < 13 THEN
  1378.          IF RIGHT$(Lin$,1)=CHR$(34) THEN Lin$=LEFT$(Lin$,(LEN(Lin$)-1))
  1379.          IF RIGHT$(Lin$,1)=")" AND StrFlag=1 THEN
  1380.              Lin$=Lin$+CHR$(34)
  1381.              StrFlag=0
  1382.          END IF
  1383.          IF NewLine = 0 THEN
  1384.              Lin$=Lin$+CHR$(34)
  1385.              NewLine=1
  1386.          END IF
  1387.          Lin$=Lin$+MID$(TempText$,CurrentCharacter,Count) + CHR$(34)
  1388.      END IF
  1389.  
  1390. NextChar:
  1391.     CurrentCharacter=CurrentCharacter+Count
  1392.  
  1393.     LOOP UNTIL CurrentCharacter > LEN(TempText$)
  1394.  
  1395.      Lin$=Lin$ + ";"
  1396.      PRINT #1,Lin$                            ' Output Text String
  1397.      CALL NewLine(Lin$,LineNumber)            ' New Line
  1398.      TempText$=""                             ' Clear TempText$
  1399.  
  1400. END SUB    ' OutputText
  1401.  
  1402.  
  1403. ' FileCheck  File Checking routine
  1404. SUB FileCheck(FileName$,FileSize)
  1405.  
  1406.        ON ERROR GOTO FileError                ' Enable Error Checking
  1407.         OPEN "R",#9,FileName$,1 : FileSize=LOF(9) : CLOSE 9
  1408.         IF FileSize=0 THEN KILL FileName$     ' File Did NOT Exist
  1409.        ON ERROR GOTO 0                        ' Disable Error Checking
  1410.        EXIT SUB
  1411.  
  1412.     RouteErrorHere:
  1413.     ON ERROR GOTO 0
  1414.     EXIT SUB
  1415.  
  1416.    FileError:
  1417.        CALL DiskError(4)                      ' Disk Error
  1418.        CLOSE 9 : FileSize=0
  1419.        RESUME  RouteErrorHere
  1420.  
  1421. END SUB    ' FileCheck
  1422.  
  1423. ' DiskError prints error to screen
  1424. ' Type:
  1425. ' 1=Not enough rooom
  1426. ' 2=File not found
  1427. ' 3=Not a SCR file
  1428. ' 4=Disk Error
  1429. ' 5=No Help File
  1430. ' 6=Illegal Path
  1431. SUB DiskError(Type)
  1432.     SHARED WSmall(),WErrData()
  1433.  
  1434.      CALL OPENWINDOW(WSmall(),WErrData())     ' Open Window
  1435.      COLOR 15,4
  1436.      LOCATE 12,28,0
  1437.  
  1438.      IF Type = 1 THEN ?" Not enough room on drive"
  1439.      IF Type = 2 THEN ?"     File not found      "
  1440.      IF Type = 3 THEN ?" Not a SCREEN format file"
  1441.      IF Type = 4 THEN ?"       Disk Error        "
  1442.      IF Type = 5 THEN ?"File SCREEN.HLP not found"
  1443.      IF Type = 6 THEN ?" Error:Not a legal path  "
  1444.      WHILE NOT INSTAT : WEND
  1445.  
  1446.      CALL CLOSEWINDOW(WSmall(),WErrData())    ' Close Window
  1447.  
  1448. END SUB    ' DiskError
  1449.  
  1450. SUB ChangePath
  1451.     SHARED WSmall(),WPathData(),Path$,GoodPath$
  1452.     LOCAL NewPath$
  1453.  
  1454.     NewPath$=Path$
  1455.     CALL OPENWINDOW(WSmall(),WPathData())     ' Open Path Window
  1456.     LOCATE 6,30 : COLOR 14,0
  1457.     ?" Path "
  1458.     LOCATE 7,18,1,1,7
  1459.     ? LEFT$(Path$,29);                        ' Print Current Path
  1460.     LOCATE 7,18
  1461.  
  1462.     DO
  1463.      CALL Getkey(A$)                          ' Get Keypress
  1464.      IF A$=CHR$(27) OR A$=CHR$(13) THEN       ' Escape OR Exit ?
  1465.        CALL CLOSEWINDOW(WSmall(),WPathData()) ' Close Window
  1466.        LOCATE 1,1,0
  1467.        EXIT SUB                               ' and EXIT
  1468.      END IF
  1469.     LOOP UNTIL INSTR(GoodPath$,A$) <> 0       ' Wait for Legal Character
  1470.     NewPath$=A$                               ' Set Variable
  1471.  
  1472.     DO
  1473.       LOCATE 7,18 : ? SPACE$(30)
  1474.       LOCATE 7,18 : ? RIGHT$(NewPath$,29);
  1475.  
  1476.       CALL Getkey(A$)                         ' Get Next Character
  1477.  
  1478.       IF A$=CHR$(27) THEN                         ' Escape ?
  1479.          LOCATE 1,1,0
  1480.          CALL CLOSEWINDOW(WSmall(),WPathData())   ' Close Window
  1481.          EXIT SUB
  1482.       END IF
  1483.  
  1484.       IF INSTR(GoodPath$,A$) <> 0 THEN        ' Check for Legal Character
  1485.          NewPath$=NewPath$+A$
  1486.       END IF
  1487.  
  1488.       IF A$=CHR$(8) THEN                      ' Check for BackSpace
  1489.         IF LEN(NewPath$) > 0 THEN NewPath$=LEFT$(NewPath$,(LEN(NewPath$)-1))
  1490.       END IF
  1491.  
  1492.                                               ' Maximum length of 66
  1493.       IF LEN(NewPath$) > 66 THEN NewPath$=LEFT$(NewPath$,66)
  1494.  
  1495.      LOOP UNTIL A$=CHR$(13)                   ' Wait for Return
  1496.  
  1497.      CALL CLOSEWINDOW(WSmall(),WPathData())   ' Close Window
  1498.      LOCATE 1,1,0
  1499.  
  1500.      IF LEN(NewPath$) = 1 THEN IF NewPath$="\" THEN NewPath$="A:\"
  1501.      IF LEN(NewPath$) = 1 THEN NewPath$=NewPath$+":\"
  1502.      IF LEN(NewPath$) = 2 THEN NewPath$=NewPath$+"\"
  1503.  
  1504.      IF FNPath(NewPath$)=0 THEN CALL DiskError(6) : NewPath$=Path$ ' Error
  1505.      Path$=NewPath$                          ' Set Path$
  1506.  
  1507. END SUB    ' ChangePath
  1508.  
  1509. ' FNPath returns 0 if PATH doesn't exist
  1510. '                1 if it does
  1511. DEF FNPath(NewPath$)
  1512.  
  1513.     LOCAL Path
  1514.  
  1515.     ON ERROR GOTO PathError            ' Enable Error Checking
  1516.     Path=1
  1517.     CHDIR NewPath$                     ' Change Directory
  1518.     IF ERR=0 THEN CHDIR NewPath$       ' Error ?
  1519.     GOTO FinishPath
  1520.  
  1521.     PathError:
  1522.       Path=0                           ' Set Error Flag
  1523.       RESUME NEXT
  1524.  
  1525.     FinishPath:
  1526.     ON ERROR GOTO 0                    ' Disable Error Checking
  1527.     FNPath=Path
  1528.  
  1529. END DEF    ' FNPath
  1530.  
  1531. SUB Directory
  1532.     SHARED Path$,Mask$
  1533.     LOCAL TempPath$
  1534.  
  1535.     CALL ChangeMask(Stat)              ' Check Current Mask
  1536.      IF Stat THEN EXIT SUB             ' EXIT ?
  1537.  
  1538.      TempPath$=Path$
  1539.      IF RIGHT$(TempPath$,1) <> "\" THEN TempPath$=TempPath$+"\"
  1540.      TempPath$=TempPath$+Mask$
  1541.  
  1542.      SCREEN 0,0,2,2                    ' Screen 2 for Directory
  1543.      COLOR 14,1
  1544.      CLS
  1545.  
  1546.      ON ERROR GOTO DirectoryError      ' Error Checking
  1547.      LOCATE 1,1 : ? TempPath$
  1548.      FILES TempPath$                   ' Print Directory
  1549.      ?:?"Press any key to continue."
  1550.      WHILE NOT INSTAT : WEND           ' Wait for Keypress
  1551.      SCREEN 0,0,0,0                    ' and Return
  1552.  
  1553.      GOTO DirectDone
  1554.  
  1555.    DirectoryError:                     ' Errors come here
  1556.     ?"No files matching ";TempPath$
  1557.     RESUME NEXT
  1558.  
  1559.    Directdone:
  1560.     ON ERROR GOTO 0                    ' Disable Error Checking
  1561.  
  1562. END SUB    ' Directory
  1563.  
  1564. SUB ChangeMask(Stat)
  1565.  
  1566.     SHARED Mask$,GoodMask$,WSmall(),WMaskData()
  1567.  
  1568.     Stat = 0
  1569.     NewMask$=Mask$
  1570.     CALL OPENWINDOW(WSmall(),WMaskData())        ' Open Mask Window
  1571.     LOCATE 7,22 : COLOR 14,0
  1572.     ?" MASK "
  1573.     LOCATE 8,19,1,1,7
  1574.     ? Mask$;                                     ' Print Current Mask
  1575.     LOCATE 8,19
  1576.  
  1577.     DO
  1578.      CALL Getkey(A$)                              ' Get Keypress
  1579.      IF A$=CHR$(27) OR A$=CHR$(13) THEN           ' Escape OR Exit ?
  1580.        CALL CLOSEWINDOW(WSmall(),WMaskData())     ' Close Window
  1581.        LOCATE 1,1,0
  1582.        IF A$=CHR$(27) THEN Stat = 1               ' Set Flag
  1583.        EXIT SUB                                   ' EXIT
  1584.      END IF
  1585.     LOOP UNTIL INSTR(GoodMask$,A$) <> 0
  1586.     NewMask$=A$                                 ' Set Variable String
  1587.  
  1588.      DO
  1589.        LOCATE 8,19 : ? SPACE$(12)                ' Clear Line
  1590.        LOCATE 8,19 : ? NewMask$;                 ' Print New Mask
  1591.        CALL Getkey(A$)
  1592.  
  1593.        IF A$=CHR$(27) THEN
  1594.          CALL CLOSEWINDOW(WSmall(),WMaskData())     ' Close Mask Window
  1595.          LOCATE 1,1,0
  1596.          Stat=1
  1597.          EXIT SUB
  1598.        END IF
  1599.  
  1600.        ' Check for Legal Characters
  1601.        IF INSTR(GoodMask$,A$) <> 0 THEN NewMask$=NewMask$+A$
  1602.  
  1603.        IF A$=CHR$(8) THEN                        ' BackSpace
  1604.          IF LEN(NewMask$) > 0 THEN NewMask$=LEFT$(NewMask$,(LEN(NewMask$)-1))
  1605.        END IF
  1606.  
  1607.        ' Maximum Than 12 characters
  1608.        IF LEN(NewMask$) > 11 THEN NewMask$=LEFT$(NewMask$,12)
  1609.  
  1610.      LOOP UNTIL A$=CHR$(13)                      ' Wait for Return
  1611.  
  1612.      LOCATE 1,1,0
  1613.      Mask$=NewMask$
  1614.      CALL CLOSEWINDOW(WSmall(),WMaskData())     ' Close Mask Window
  1615.  
  1616. END SUB    ' ChangeMask
  1617.  
  1618. DOSSHELL:
  1619.     CALL CLOSEWINDOW(WLarge(),WFilesData())      ' Close Files Window
  1620.     SCREEN 0,0,3,3                               ' Screen 3 for SHELL
  1621.     CLS
  1622.  
  1623.     ON ERROR GOTO ErrorShell                     ' Error Checking
  1624.  
  1625.     SHELL
  1626.  
  1627.     SCREEN 0,0,0,0                               ' Return
  1628.     ON ERROR GOTO 0                              ' Disable Error Checking
  1629.     GOTO START                                   ' Return
  1630.  
  1631. ErrorShell:
  1632.      RESUME NEXT
  1633.  
  1634. GOTO START
  1635.  
  1636.  
  1637.  
  1638. ' ********************** COLORS ********************
  1639.  
  1640. ' New Background COLOR
  1641. SUB Colors(CurrentFore,CurrentBack)
  1642.      SHARED WBack(),WBackData()
  1643.      LOCAL T,NewBack
  1644.  
  1645.      LOCATE 1,1,0                                ' Hide Cursor
  1646.       CALL OPENWINDOW(WBack(),WBackData())       ' Open Color Window
  1647.      COLOR 14,0                                  ' Set-up Color Menu
  1648.      LOCATE 2,12:?"    Choose"
  1649.      LOCATE 3,12:?"  BackGround"
  1650.      COLOR 11,0
  1651.      LOCATE 4,11:?"╟──────────────╢"
  1652.      FOR T=0 TO 7 : LOCATE T+5,14 : COLOR T,T
  1653.      ?"            "
  1654.      NEXT T
  1655.      COLOR 14,0 : LOCATE 5+CurrentBack,13 :?">"
  1656.      NewBack=CurrentBack
  1657.      DO
  1658.       CALL Getkey(A$)                            ' Get Keypress
  1659.  
  1660.         IF A$=CHR$(27) THEN                      ' ESCAPE ?
  1661.            CALL CLOSEWINDOW(WBack(),WBackData()) ' Close Color Window
  1662.            EXIT SUB                              ' and EXIT
  1663.         END IF
  1664.  
  1665.         IF LEFT$(A$,1)=CHR$(0) THEN              ' Extened Key ?
  1666.            CALL Extkey(A$,K)                     ' Get Code
  1667.  
  1668.               IF K=72 THEN                       ' MOVE UP
  1669.                LOCATE 5 + NewBack,13 :?" "
  1670.                 IF NewBack = 0 THEN NewBack = 8
  1671.                 NewBack = NewBack-1
  1672.                 LOCATE 5+NewBack,13 :?">"
  1673.               END IF
  1674.  
  1675.               IF K=80 THEN                       ' MOVE DOWN
  1676.                LOCATE 5 + NewBack,13 :?" "
  1677.                 IF NewBack = 7 THEN NewBack = -1
  1678.                 NewBack = NewBack + 1
  1679.                 LOCATE 5+NewBack,13 :?">"
  1680.               END IF
  1681.  
  1682.         END IF
  1683.  
  1684.      IF A$=CHR$(13) THEN                         ' RETURN ?
  1685.       CurrentBack=NewBack
  1686.       CALL ForeColor(CurrentFore,CurrentBack,Stat)
  1687.       IF Stat = 1 THEN EXIT LOOP                 ' Flag for ForeGround Color
  1688.      END IF
  1689.      LOOP
  1690.  
  1691.   CALL CLOSEWINDOW(WBack(),WBackData())          ' Close Color Window
  1692.  
  1693. END SUB    ' Colors
  1694.  
  1695.  
  1696. '
  1697. ' New Foreground COLOR
  1698. '
  1699. SUB ForeColor(CurrentFore,CurrentBack,Stat)
  1700.      SHARED WFore(),WForeData()
  1701.      LOCAL T,NewFore,BlinkFore
  1702.  
  1703.      BlinkFore=0
  1704.      Stat = 0                                    ' Set Flag
  1705.      CALL OPENWINDOW(WFore(),WForeData())        ' Open ForeGround Color Window
  1706.      COLOR 14,0                                  ' Set-up Menu
  1707.      LOCATE 2,28:?"           Choose"
  1708.      LOCATE 3,28:?"         ForeGround"
  1709.      COLOR 11,0
  1710.      LOCATE 4,27:?"╟────────────────────────────╢"
  1711.      FOR T=0 TO 15 : LOCATE T+5,30 : COLOR T,CurrentBack
  1712.      ?" Foreground "; : COLOR 11,0 : ?"  ";
  1713.      COLOR T+16,CurrentBack : ?" Foreground "
  1714.      NEXT T
  1715.      COLOR 14,0
  1716.  
  1717.      NewFore=CurrentFore
  1718.  
  1719.      IF NewFore > 15 THEN
  1720.         NewFore=NewFore-16
  1721.         BlinkFore=14
  1722.      END IF
  1723.  
  1724.      LOCATE 5+NewFore,29+BlinkFore :?">"
  1725.  
  1726.      DO
  1727.       CALL Getkey(A$)                            ' Get Keypress
  1728.         IF A$=CHR$(27) THEN                      ' ESCAPE ?
  1729.            CALL CLOSEWINDOW(WFore(),WForeData()) ' Close Window
  1730.            EXIT SUB                              ' and EXIT
  1731.         END IF
  1732.  
  1733.         IF LEFT$(A$,1)=CHR$(0) THEN              ' Extended Key ?
  1734.            CALL Extkey(A$,K)                     ' Get Code
  1735.  
  1736.               IF K=72 THEN                       ' MOVE UP
  1737.                LOCATE 5+NewFore,29+BlinkFore :?" "
  1738.                 IF NewFore = 0 THEN NewFore = 16
  1739.                 NewFore = NewFore-1
  1740.                 LOCATE 5+NewFore,29+BlinkFore :?">"
  1741.               END IF
  1742.  
  1743.               IF K=75 THEN                       ' MOVE LEFT
  1744.                IF BlinkFore=0 THEN EXIT IF
  1745.                LOCATE 5+NewFore,29+BlinkFore :?" "
  1746.                BlinkFore=0
  1747.                LOCATE 5+NewFore,29+BlinkFore :?">"
  1748.               END IF
  1749.  
  1750.               IF K=77 THEN                       ' MOVE RIGHT
  1751.                IF BlinkFore=14 THEN EXIT IF
  1752.                LOCATE 5+NewFore,29+BlinkFore :?" "
  1753.                BlinkFore=14
  1754.                LOCATE 5+NewFore,29+BlinkFore :?">"
  1755.               END IF
  1756.  
  1757.               IF K=80 THEN                       ' MOVE DOWN
  1758.                LOCATE 5+NewFore,29+BlinkFore :?" "
  1759.                 IF NewFore = 15 THEN NewFore = -1
  1760.                 NewFore = NewFore + 1
  1761.                 LOCATE 5+NewFore,29+BlinkFore :?">"
  1762.               END IF
  1763.         END IF
  1764.  
  1765.      LOOP UNTIL A$=CHR$(13)                      ' Wait for Return
  1766.  
  1767.      CurrentFore=NewFore                         ' Set Variable
  1768.  
  1769.      IF BlinkFore=14 THEN CurrentFore=CurrentFore+16
  1770.      Stat = 1                                    ' Set Flag
  1771.  
  1772.      CALL CLOSEWINDOW(WFore(),WForeData())       ' Close Window
  1773.  
  1774. END SUB    ' ForeColor
  1775.  
  1776.  
  1777.  
  1778.  
  1779. $INCLUDE "INIT.INC"
  1780.