home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / dos / fraktale / fracxtr6.exe / OTHER / FIMAPS.ZIP / FIMAPS.CLA < prev    next >
Text File  |  1993-10-30  |  64KB  |  1,816 lines

  1. !═══════════════════════════════════════════════════════════════════════════════
  2. ! FIMAPS 1.0 - Creates random smooth color maps for use by Fractint.
  3. ! This program is in the public domain.
  4. ! Written in Clarion Professional Developer 2.1
  5. ! by Nick Grasso, 4092 Murphy Road, Thompson, Ohio 44086, U.S.A.
  6. ! I can also be reached on the RIME Fractal Conference.
  7. !═══════════════════════════════════════════════════════════════════════════════
  8. FIMAPS         PROGRAM
  9.  
  10.   INCLUDE('STD_KEYS.CLA')
  11.  
  12. SHFT_TAB     EQUATE(276)
  13. PLUS_KEY     EQUATE(43)
  14. MINUS_KEY    EQUATE(45)
  15. LEFT_ANGLE   EQUATE(60)
  16. RIGHT_ANGLE  EQUATE(62)
  17. COMMA_KEY    EQUATE(44)
  18. PERIOD_KEY   EQUATE(46)
  19. CTRL_PGUP    EQUATE(284)
  20. CTRL_PGDN    EQUATE(288)
  21.  
  22.   MAP
  23.  
  24.     !───────────────────────────────────────────────────────────────────────────
  25.     ! INTERNAL SUBROUTINES.
  26.     !───────────────────────────────────────────────────────────────────────────
  27.     FUNC(CONFIRM),STRING           !CONFIRM FILE OVERWRITE OR QUIT PROGRAM
  28.     FUNC(VERIFILE),LONG               !VERIFY GIF FILE, DISPLAY FILE LIST
  29.     PROC(EXEC_EXT)               !RUN A DOS COMMAND
  30.  
  31.     !───────────────────────────────────────────────────────────────────────────
  32.     ! EXTERNAL SUBROUTINES - AKATOOLS 2.5
  33.     !───────────────────────────────────────────────────────────────────────────
  34.     MODULE('AKAVideo'),BINARY
  35.       FUNC(VidIsVGA),LONG           !is it a VGA video adapter?
  36.     END!MODULE
  37.  
  38.     MODULE('AKAClars.BIN'),BINARY
  39.       PROC(ClaSetBlkMax)           !set (or disable) Clarion's video timeout
  40.     END!MODULE
  41.  
  42.     MODULE('AKAEnvir'  ),BINARY
  43.       FUNC(EnvProgPath ),STRING           !path of EXE (used to locate .CFG file)
  44.     END!MODULE
  45.  
  46.     MODULE('AKAFiles'  ),BINARY
  47.       FUNC(FilExists   ),LONG           !return whether passed file exists
  48.       FUNC(FilFullName ),STRING           !return full name of passed file
  49.       FUNC(FilDrive    ),STRING           !return drive     of passed file
  50.       FUNC(FilDirectory),STRING           !return directory of passed file
  51.       FUNC(FilName     ),STRING           !return name     of passed file
  52.       FUNC(FilExtension),STRING           !return extension of passed file
  53.     END!MODULE
  54.  
  55.     MODULE('AKADirec'),BINARY
  56.       FUNC(DirGetFirst ),STRING           !begin     reading directory
  57.       FUNC(DirGetNext  ),STRING           !continue reading directory
  58.     END!MODULE
  59.  
  60.     !───────────────────────────────────────────────────────────────────────────
  61.     ! EXTERNAL SUBROUTINES - PCX3
  62.     !───────────────────────────────────────────────────────────────────────────
  63.     MODULE('PCX3'),BINARY
  64.       PROC(SETVMODE)               !SET VIDEO MODE
  65.       PROC(LINE)               !DRAW A LINE
  66.       PROC(SETCOLOR)               !SET VIDEO COLOR
  67.       FUNC(RED),LONG               !READ VIDEO COLOR - RED
  68.       FUNC(GREEN),LONG               !READ VIDEO COLOR - GREEN
  69.       FUNC(BLUE),LONG               !READ VIDEO COLOR - BLUE
  70.     END!MODULE
  71.   END!MAP
  72.  
  73. !───────────────────────────────────────────────────────────────────────────────
  74. ! SCREEN FOR MAIN MENU.
  75. !───────────────────────────────────────────────────────────────────────────────
  76. SCREEN         SCREEN      PRE(SCR),HUE(7,0)
  77.  OMIT('**-END-**')
  78. █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  79. █  Memory: <<<,<<#      FRACTINT MAP CREATION PROGRAM             v1.0  █
  80. █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  81. █                                           █
  82. █   No. of color ranges: <<#    Repeat every: <<#                   █
  83. █           Neon: ■      Neon color: R:<# G:<# B:<#               █
  84. █        Set color 0: ■                               █
  85. █     Save map filename: ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    █
  86. █                   Prompt if file exists: ■               █
  87. █     View GIF filename: ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■    █
  88. █                                           █
  89. █  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  █
  90. █──────────────────────────────────────────────────────────────────────────────█
  91. █         While viewing a map: F5 views the GIF file                   █
  92. █   While viewing a map or a GIF: Enter or F9 creates a new map               █
  93. █                  < or > rotates color palette               █
  94. █                  1 thru 0 rotates palette times 10           █
  95. █                  + or - changes direction of rotation           █
  96. █                  (you must return here to save the map)       █
  97. █──────────────────────────────────────────────────────────────────────────────█
  98. █           ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■           █
  99. █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  100. ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ F8-Execute DOS command
  101. F1-Help                  F2-Configure                 F3-Exit
  102. F4-View current map  F5-View GIF  F6-Save current map to file  F9-Create new map
  103. **-END-**
  104.  
  105.            ROW(2,1)      PAINT(20,1),HUE(9,0)
  106.            ROW(25,1)  PAINT(1,79),HUE(9,0)
  107.            ROW(2,80)  PAINT(24,1),HUE(9,0)
  108.            ROW(1,1)      PAINT(1,80),HUE(9,0)
  109.            ROW(3,2)      PAINT(1,79),HUE(9,0)
  110.            ROW(24,1)  PAINT(1,80),HUE(9,0)
  111.            ROW(5,26)  PAINT(6,1),HUE(15,0)
  112.            ROW(22,1)  PAINT(1,79),HUE(9,0)
  113.            ROW(9,4)      PAINT(1,51),HUE(7,0)
  114.            ROW(19,2)  PAINT(2,78),HUE(9,0)
  115.            ROW(11,2)  PAINT(1,79),HUE(9,0)
  116.            ROW(18,1)  PAINT(1,79),HUE(9,0)
  117.            ROW(23,1)  PAINT(1,80),HUE(3,0)
  118.            ROW(2,3)      PAINT(1,77),HUE(5,0)
  119.            ROW(2,27)  PAINT(1,29),HUE(13,0)
  120.            ROW(12,2)  PAINT(6,78),HUE(9,0)
  121.            ROW(1,1)      STRING('█▀{78}█')
  122.            ROW(2,1)      REPEAT(2),EVERY(19);STRING('█<0{78}>█') .
  123.            ROW(3,1)      REPEAT(2),EVERY(19);STRING('█▄{78}█') .
  124.            ROW(4,1)      REPEAT(9);STRING('█<0{78}>█') .
  125.            ROW(13,1)  REPEAT(2),EVERY(7);STRING('█─{78}█') .
  126.            ROW(14,1)  REPEAT(6);STRING('█<0{78}>█') .
  127.            ROW(2,4)      STRING('Memory:')
  128.          COL(27)  STRING('FRACTINT MAP CREATION PROGRAM')
  129.          COL(74)  STRING('v1.0')
  130.            ROW(14,14) STRING('While viewing a map: F5 views the GIF file')
  131.            ROW(15,5)  STRING('While viewing a map or a GIF: Enter or F9 creates a new map')
  132.            ROW(16,35) STRING('<< or > rotates color palette')
  133.            ROW(17,35) STRING('1 thru 0 rotates palette times 10')
  134.            ROW(18,35) STRING('+ or - changes direction of rotation')
  135.            ROW(19,35) STRING('(you must return here to save the map)')
  136.            ROW(23,59) STRING('F8-Execute DOS command')
  137.            ROW(24,1)  STRING('F1-Help {27}F2-Configure {27}F3-Exit')
  138.            ROW(25,1)  STRING('F4-View current map  F5-View GIF  F6-Save current map to '  |
  139.                 & 'file  F9-Create new map')
  140. MEM_LEFT       ROW(2,12)  STRING(@N7)
  141.            ROW(5,5)      STRING('No. of color ranges:')
  142.          COL(26)  ENTRY(@N3),USE(RANGE),INS,IMM,NUM
  143.          COL(33)  STRING('Repeat every:')
  144.          COL(47)  ENTRY(@N3),USE(REPEAT),ENH,INS,IMM,NUM
  145.            ROW(6,20)  STRING('Neon:')
  146.          COL(26)  ENTRY(@S1),USE(NEON),IMM,UPR
  147.          COL(35)  STRING('Neon color: R:')
  148.          COL(49)  ENTRY(@N2),USE(NEONR),ENH,INS,IMM,NUM
  149.          COL(52)  STRING('G:')
  150.          COL(54)  ENTRY(@N2),USE(NEONG),ENH,INS,IMM,NUM
  151.          COL(57)  STRING('B:')
  152.          COL(59)  ENTRY(@N2),USE(NEONB),ENH,INS,IMM,NUM
  153.            ROW(7,13)  STRING('Set color 0:')
  154.          COL(26)  ENTRY(@S1),USE(SET0),ENH,IMM,UPR
  155.            ROW(8,7)      STRING('Save map filename:')
  156.          COL(26)  ENTRY(@S50),USE(DOSNAME),ENH,LFT,UPR
  157.            ROW(9,36)  STRING('Prompt if file exists:')
  158.          COL(59)  ENTRY(@S1),USE(PROMPT),ENH,IMM,UPR
  159.            ROW(10,7)  STRING('View GIF filename:')
  160.          COL(26)  ENTRY(@S50),USE(GIFNAME),ENH,LFT,UPR
  161. MESSAGE           ROW(21,16) STRING(50),HUE(14,0)
  162.            ROW(22,79) ENTRY,USE(?ACCEPT)
  163.            ROW(12,4)  ENTRY(@S74),USE(F5_TEXT),HUE(3,0)
  164.            ROW(23,1)  ENTRY(@S57),USE(F7_TEXT)
  165.          .
  166.  
  167. !───────────────────────────────────────────────────────────────────────────────
  168. ! CONFIGURATION SETUP WINDOW.
  169. !───────────────────────────────────────────────────────────────────────────────
  170. CFG_SCR         SCREEN      WINDOW(19,61),AT(5,10),HUE(12,1)
  171.  OMIT('**-END-**')
  172.      █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  173.      █             CONFIGURATION                 █
  174.      █───────────────────────────────────────────────────────────█
  175.      █  View GIF command: ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ █
  176.      █  Run in existing memory: ■  (N/Y)                 █
  177.      █                                 █
  178.      █  The View GIF program must leave the image on the screen  █
  179.      █  after it exits. Examples for common GIF viewers are:     █
  180.      █    TPICEM /V:x /E /K     (x is the video mode - see docs)    █
  181.      █    VPIC /A /R     (will run in existing memory)         █
  182.      █    GDS /S /Z0 /X                         █
  183.      █    CSHOW         (special case - see docs)         █
  184.      █───────────────────────────────────────────────────────────█
  185.      █  DOS command for F7: ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ █
  186.      █  Run in existing memory: ■  (N/Y)                 █
  187.      █  Screen text for F7: ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ █
  188.      █───────────────────────────────────────────────────────────█
  189.      █             F3-Cancel      F9-Accept             █
  190.      █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  191. **-END-**
  192.  
  193.            ROW(18,12) PAINT(1,40),HUE(11,1)
  194.            ROW(2,12)  PAINT(1,40),HUE(11,1)
  195.            ROW(4,2)      PAINT(13,59),HUE(7,1)
  196.            ROW(13,2)  PAINT(1,59),HUE(12,1)
  197.            ROW(1,1)      STRING('█▀{59}█')
  198.            ROW(2,1)      REPEAT(2),EVERY(12);STRING('█<0{59}>█') .
  199.            ROW(3,1)      REPEAT(2),EVERY(10);STRING('█─{59}█') .
  200.            ROW(4,1)      REPEAT(9);STRING('█<0{59}>█') .
  201.            ROW(15,1)  REPEAT(2);STRING('█<0{59}>█') .
  202.            ROW(17,1)  STRING('█─{59}█')
  203.            ROW(18,1)  STRING('█<0{59}>█')
  204.            ROW(19,1)  STRING('█▄{59}█')
  205.            ROW(2,25)  STRING('CONFIGURATION')
  206.            ROW(5,31)  STRING('(N/Y)')
  207.            ROW(7,4)      STRING('The View GIF program must leave the image on the screen')
  208.            ROW(8,4)      STRING('after it exits. Examples for common GIF viewers are:')
  209.            ROW(9,6)      STRING('TPICEM /V:x /E /K  (x is the video mode - see docs)')
  210.            ROW(10,6)  STRING('VPIC /A /R {9}(will run in existing memory)')
  211.            ROW(11,6)  STRING('GDS /S /Z0 /X')
  212.            ROW(12,6)  STRING('CSHOW {14}(special case - see docs)')
  213.            ROW(15,31) STRING('(N/Y)')
  214.            ROW(18,21) STRING('F3-Cancel    F9-Accept')
  215.            ROW(4,4)      STRING('View GIF command:')
  216.          COL(22)  ENTRY(@S38),USE(F5_CMD),ENH,LFT
  217.            ROW(5,4)      STRING('Run in existing memory:')
  218.          COL(28)  ENTRY(@S1),USE(F5_NOYES),ENH,REQ,IMM,UPR
  219.            ROW(14,4)  STRING('DOS command for F7:')
  220.          COL(24)  ENTRY(@S36),USE(F7_CMD),HUE(15,1),LFT
  221.            ROW(15,4)  STRING('Run in existing memory:')
  222.          COL(28)  ENTRY(@S1),USE(F7_NOYES),HUE(15,1),REQ,IMM,UPR
  223.            ROW(16,4)  STRING('Screen text for F7:')
  224.          COL(24)  ENTRY(@S36),USE(F7_TEXT),HUE(15,1)
  225.            ROW(17,51) ENTRY,USE(?CFG_ACCEPT)
  226.          .
  227.  
  228. !───────────────────────────────────────────────────────────────────────────────
  229. ! RUN DOS COMMAND WINDOW.
  230. !───────────────────────────────────────────────────────────────────────────────
  231. DOS_SCR         SCREEN      WINDOW(10,74),AT(5,4),HUE(12,1)
  232.  OMIT('**-END-**')
  233.    █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  234.    █                     EXECUTE                    █
  235.    █────────────────────────────────────────────────────────────────────────█
  236.    █  Enter DOS command:                            █
  237.    █  ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■  █
  238.    █  Run in existing memory: ■     (N/Y)                        █
  239.    █   Pause after execution: ■     (Y/N)                        █
  240.    █────────────────────────────────────────────────────────────────────────█
  241.    █                 F3-Cancel        F9-Do it                █
  242.    █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  243. **-END-**
  244.  
  245.            ROW(4,2)      PAINT(4,72),HUE(7,1)
  246.            ROW(9,2)      PAINT(1,72),HUE(11,1)
  247.            ROW(2,2)      PAINT(1,72),HUE(11,1)
  248.            ROW(1,1)      STRING('█▀{72}█')
  249.            ROW(2,1)      REPEAT(3),EVERY(2);STRING('█<0{72}>█') .
  250.            ROW(3,1)      REPEAT(2),EVERY(5);STRING('█─{72}█') .
  251.            ROW(5,1)      REPEAT(3),EVERY(2);STRING('█<0{72}>█') .
  252.            ROW(10,1)  STRING('█▄{72}█')
  253.            ROW(2,35)  STRING('EXECUTE')
  254.            ROW(4,4)      STRING('Enter DOS command:')
  255.            ROW(6,31)  STRING('(N/Y)')
  256.            ROW(7,31)  STRING('(Y/N)')
  257.            ROW(9,27)  STRING('F3-Cancel {6}F9-Do it')
  258.            ROW(5,4)      ENTRY(@S68),USE(F8_CMD),HUE(15,1),REQ,LFT
  259.            ROW(6,4)      STRING('Run in existing memory:')
  260.          COL(28)  ENTRY(@S1),USE(F8_NOYES),HUE(15,1),REQ,IMM,UPR
  261.            ROW(7,5)      STRING('Pause after execution:')
  262.          COL(28)  ENTRY(@S1),USE(F8_PAUSE),HUE(15,1),REQ,IMM,UPR
  263.            ROW(8,3)      ENTRY,USE(?DOS_ACCEPT)
  264.          .
  265.  
  266. !───────────────────────────────────────────────────────────────────────────────
  267. ! HELP WINDOW.
  268. !───────────────────────────────────────────────────────────────────────────────
  269. HELP_SCR     SCREEN      WINDOW(5,43),AT(11,20),HUE(12,2)
  270.  OMIT('**-END-**')
  271.            █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  272.            █                         █
  273.            █                         █
  274.            █                         █
  275.            █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  276. **-END-**
  277.  
  278.            ROW(2,2)      PAINT(3,41),HUE(14,2)
  279.            ROW(1,1)      STRING('█▀{41}█')
  280.            ROW(2,1)      REPEAT(3);STRING('█<0{41}>█') .
  281.            ROW(5,1)      STRING('█▄{41}█')
  282.          .
  283.  
  284. !═══════════════════════════════════════════════════════════════════════════════
  285. ! GLOBAL VARIABLES.
  286. !═══════════════════════════════════════════════════════════════════════════════
  287. CFG_GROUP    GROUP               !VARIABLES FROM CONFIGURATION FILE
  288. F5_CMD           STRING(64)           !GIF VIEW COMMAND FOR F5
  289. F5_NOYES       STRING('N')           !Y=RUNSMALL(), N=RUN()
  290. F7_CMD           STRING(127)           !DOS COMMAND RUN FOR F7
  291. F7_NOYES       STRING('N')           !Y=RUNSMALL(), N=RUN()
  292. F7_TEXT           STRING(57)           !F7 TEXT ON SCREEN
  293.          END!GROUP
  294. SAVE_CFG     STRING(250)           !SAVE CFG_GROUP IF CFG SCREEN IS ABORTED
  295. F5_TEXT         STRING(74)               !TEXT OF F5 COMMAND FOR SCREEN DISPLAY
  296. F5_CSHOW     STRING(2)               !MUST ADD '+X' TO GIF FILE FOR COMPUSHOW
  297. CFG_ERROR    BYTE               !1 IF ANY ERROR READING CONFIG FILE
  298.  
  299. RANGE         SHORT(5)               !NO. OF COLOR RANGES (2:255)
  300. REPEAT         SHORT               !REPEAT COLORS EVERY x COLOR (2:RANGE-1)
  301. NEON         STRING('N')           !SET EVERY OTHER COLOR TO BLACK (YES/NO)
  302. NEONR         BYTE               !NEON COLOR RED
  303. NEONG         BYTE               !NEON COLOR GREEN
  304. NEONB         BYTE               !NEON COLOR BLUE
  305. SET0         STRING('N')           !SET COLOR 0 (YES/NO)
  306. DOSNAME         STRING(78)               !DOS FILENAME FOR MAP OR CONFIG FILE
  307. PROMPT         STRING('Y')           !CONFIRM IF SAVE MAP FILENAME EXISTS
  308. GIFNAME         STRING(78)               !GIF FILENAME AS ENTERED BY USER
  309.  
  310. F8_GROUP     GROUP               !VARIABLES FOR F8-DOS COMMAND
  311. F8_CMD           STRING(127)           !DOS COMMAND RUN FOR F8
  312. F8_NOYES       STRING('N')           !Y=RUNSMALL(), N=RUN()
  313. F8_PAUSE       STRING('Y')           !PAUSE AFTER DOS_CMD (Y/N)
  314.          END!GROUP
  315. SAVE_F8         STRING(129)           !SAVE F8_GROUP IF DOS SCREEN IS ABORTED
  316.  
  317. RETURNFILE   STRING(128)           !GIF FILENAME RETURNED BY VERIFILE()
  318. UNIQUE         SHORT(5)               !SAME AS REPEAT IF REPEAT USED,ELSE RANGE
  319. FIRST         BYTE(2)               !  2 IF SET0=N,     1 IF SET0=Y
  320. MAX         SHORT(255)               !255 IF SET0=N, 256 IF SET0=Y
  321. K         SHORT               !KEYCODE() OF KEY STRUCK BY USER
  322. BACKINGUP    BYTE               !1 IF USER HIT UP-ARROW OR SHIFT-TAB
  323. SAVE_PLACE   BYTE               !SAVE CURRENT SCREEN ENTRY FIELD
  324. I         SHORT               !LOOP COUNTER
  325. J         SHORT               !LOOP COUNTER
  326. PALGROUP     GROUP               !GROUPED FOR ASSIGNMENT STATEMENT
  327. PALR           BYTE,DIM(257)           ! RED
  328. PALG           BYTE,DIM(257)           ! GREEN
  329. PALB           BYTE,DIM(257)           ! BLUE
  330.          END!GROUP
  331. SAVEPAL         GROUP               !SAVE PALETTE FOR COLOR CYCLING
  332. SAVR           BYTE,DIM(257)           ! RED
  333. SAVG           BYTE,DIM(257)           ! GREEN
  334. SAVB           BYTE,DIM(257)           ! BLUE
  335.          END!GROUP
  336. NUMPAL         SHORT,DIM(257)           !PALETTE NUMBER OF COLOR CHANGE
  337. INCREMENT    REAL               !INCREMENT BETWEEN RANGES (REAL NO.)
  338.                        !(ALSO USED AS FLAG IF MAP WAS DRAWN YET)
  339. INCR_R         REAL               !INCREMENT BETWEEN RANGES OF RED
  340. INCR_B         REAL               !INCREMENT BETWEEN RANGES OF BLUE
  341. INCR_G         REAL               !INCREMENT BETWEEN RANGES OF GREEN
  342. SPREAD         BYTE               !NUMBER OF PALETTES BETWEEN NUMPALS
  343. N         SHORT               !CURRENT PALETTE BEING WORKED ON
  344. NO_CYCLE     BYTE               !NO. OF COLORS TO CYCLE (1,10,20,...,100)
  345. DIRECTION    SHORT(1)               !DIRECTION TO CYCLE (1=FORWARD,-1=BACK)
  346. ON_GIF         BYTE               !SET TO 1 IF NEW_MAP CALLED BY VIEW_GIF
  347. MESSAGE         STRING(50)               !ERROR MSG RETURNED BY GRAPHICS FUNCTION
  348.  
  349. DIRGROUP     GROUP               !USED BY AKADIREC.BIN (length=46)
  350.            BYTE               ! Attribute, bitmapped
  351.            SHORT               ! Time (DOS format)
  352.            SHORT               ! Date (DOS format)
  353.            LONG               ! Size
  354.            STRING(13)           ! Name (null terminated)
  355. AKAName           STRING(8)           ! Name only
  356. AKAExt           STRING(3)           ! Extension only
  357.            LONG               ! Clarion standard date
  358.            LONG               ! Clarion standard time
  359.            STRING(4)           ! Attr, string (ARHS)
  360.            BYTE               ! 0=File,1=Sub,2=Pre,3=Cur
  361.          END!GROUP               !End AKADirec Group
  362.  
  363. !───────────────────────────────────────────────────────────────────────────────
  364. ! DOS FILE STRUCTURE FOR SAVING THE MAP FILE OR READING CONFIGURATION FILE.
  365. !───────────────────────────────────────────────────────────────────────────────
  366. DOSFILE         DOS,ASCII,PRE(DOS),NAME(DOSNAME)
  367.            RECORD
  368. RECORD         STRING(127)
  369.            END!RECORD
  370.          END!DOS FILE
  371.  
  372. !═══════════════════════════════════════════════════════════════════════════════
  373. ! CODE.
  374. !═══════════════════════════════════════════════════════════════════════════════
  375.   CODE
  376.  
  377.   !─────────────────────────────────────────────────────────────────────────────
  378.   ! COMMENTED OUT FIELDS ARE INITIALIZED BY COMPILER.
  379.   !─────────────────────────────────────────────────────────────────────────────
  380. ! RANGE = 5
  381. ! UNIQUE = RANGE               !BE SURE TO INIT IN CASE F5 HIT BEFORE F9
  382. ! NEON = 'N'
  383. ! SET0 = 'N'
  384. ! PROMPT = 'Y'
  385. ! F8_NOYES = 'N'
  386. ! F8_PAUSE = 'Y'
  387. ! DIRECTION = 1                   !COLOR CYCLING DIRECTION
  388.  
  389.   !─────────────────────────────────────────────────────────────────────────────
  390.   ! ONE TIME START UP CODE.
  391.   !─────────────────────────────────────────────────────────────────────────────
  392.   CLASETBLKMAX(0)               !TURN OFF SCREEN BLANKING
  393.   OPEN(SCREEN)
  394.   DO READ_CONFIG               !READ CONFIGURATION FILE
  395.   IF F5_CMD
  396.     F5_TEXT = CENTER('View GIF command: ' & F5_CMD,74)     !FOR SCREEN DISPLAY
  397.   ELSE
  398.     F5_TEXT = CENTER('View GIF command: (none)',74)
  399.   END!IF-ELSE
  400.   IF INSTRING('CSHOW',UPPER(F5_CMD),1) !IF RUNNING CSHOW
  401.     F5_CSHOW = '+X'                    !  MUST ADD '+X' TO GIF NAME
  402.   ELSE
  403.     CLEAR(F5_CSHOW)
  404.   END!IF
  405.   SCR:MEM_LEFT = MEMORY(0)           !DISPLAY MEMORY LEFT
  406.   IF NOT VIDISVGA()               !IF VGA NOT DETECTED
  407.     BEEP(244,38);BEEP(129,88)           !  NASTY BEEP
  408.     SETHUE(30,0)               !  BLINK MESSAGE
  409.     SCR:MESSAGE = '!! VGA NOT DETECTED - CONTINUE AT YOUR OWN RISK !!'
  410.     SETHUE
  411.   END!IF
  412.   DISPLAY
  413.  
  414.   DO SET_ALERT                   !ALERT SCREEN ACTION KEYS
  415.  
  416.   !─────────────────────────────────────────────────────────────────────────────
  417.   ! MAIN SCREEN LOOP.
  418.   !─────────────────────────────────────────────────────────────────────────────
  419.   LOOP
  420.  
  421.     ACCEPT
  422.     CLEAR(SCR:MESSAGE)
  423.     CLEAR(MESSAGE)               !CLEAR GIF FILE ERROR
  424.     CLEAR(BACKINGUP)               !CLEAR BACKING UP FLAG
  425.  
  426.     !───────────────────────────────────────────────────────────────────────────
  427.     ! HOT KEY LOGIC.
  428.     !───────────────────────────────────────────────────────────────────────────
  429.     CASE KEYCODE()
  430.  
  431.     !───────────────────────────────────────────────────────────────────────────
  432.     ! TAB, SHIFT-TAB, ESC, UP-ARROW: NON-STANDARD HANDLING.
  433.     !───────────────────────────────────────────────────────────────────────────
  434.     OF TAB_KEY                   !TAB: GO TO NEXT FIELD
  435.       UPDATE(?)
  436.  
  437.     OF ESC_KEY                   !ESC: RESTORE FIELD THEN GO TO PREVIOUS
  438.       DISPLAY(?)
  439.       IF FIELD() = 1               !  IF ON FIRST FIELD
  440.     IF CONFIRM('Y')               !    ASK USER IF HE WANTS TO QUIT
  441.       RETURN
  442.     ELSE
  443.       SELECT(?)
  444.     END!IF-ELSE
  445.     ELSIF FIELD() = ?SET0 AND NEON = 'N'; SELECT(?NEON)
  446.     ELSE; SELECT(?-1)
  447.       END!IF
  448.       CYCLE
  449.  
  450.     OF UP_KEY OROF SHFT_TAB           !UP OR SHIFT-TAB: GO TO PREVIOUS FIELD
  451.       BACKINGUP = 1
  452.       UPDATE(?)
  453.       IF FIELD() = 1; SELECT(?)
  454.     ELSE; SELECT(?-1)
  455.       END!IF
  456.  
  457.     !───────────────────────────────────────────────────────────────────────────
  458.     ! F - KEYS.
  459.     !───────────────────────────────────────────────────────────────────────────
  460.     OF F1_KEY                   !F1: HELP (of sorts)
  461.       UPDATE(?)
  462.       SELECT(?)
  463.       DO HELP
  464.       CYCLE
  465.  
  466.     OF F2_KEY                   !F2: CONFIGURATION
  467.       UPDATE(?)
  468.       SELECT(?)
  469.       DO CONFIGURE
  470.       DISPLAY(?F5_TEXT,FIELDS())       !  DISPLAY NEW VALUES (IF ANY)
  471.       DO SET_ALERT
  472.       CYCLE
  473.  
  474.     OF F3_KEY                   !F3: RETURN
  475.       RETURN
  476.  
  477.     OF F4_KEY                   !F4: REDISPLAY CURRENT MAP
  478.       UPDATE(?)
  479.       SELECT(?)
  480.       SAVE_PLACE = FIELD()           !  RETURN TO SAME FIELD
  481.       SELECT                   !  VERIFY ALL FIELDS THEN GOTO ACCEPT
  482.       K=F4_KEY
  483.       CYCLE
  484.  
  485.     OF F5_KEY                   !F5: SHOW GIF
  486.       UPDATE(?)
  487.       SELECT(?)
  488.       SAVE_PLACE = FIELD()           !  RETURN TO SAME FIELD
  489.       SELECT                   !  VERIFY ALL FIELDS THEN GOTO ACCEPT
  490.       K=F5_KEY
  491.       CYCLE
  492.  
  493.     OF F6_KEY                   !F6: SAVE MAP FILE
  494.       UPDATE(?)
  495.       SELECT(?)
  496.       DO SAVE_MAP
  497.       CYCLE
  498.  
  499.     OF F7_KEY                   !F7: RUN PRE-SET DOS COMMAND
  500.       UPDATE(?)
  501.       SELECT(?)
  502.       IF NOT F7_CMD               !  IF USER DIDN'T DEFINE A COMMAND
  503.     SCR:MESSAGE = '     NO COMMAND DEFINED - PRESS F2 TO DEFINE'
  504.     BEEP
  505.       ELSE
  506.     EXEC_EXT(F7_CMD,F7_NOYES,'N')  !  RUN COMMAND, DON'T PAUSE AFTERWARDS
  507.       END!IF-ELSE
  508.       CYCLE
  509.  
  510.     OF F8_KEY                   !F8: RUN ANY DOS COMMAND
  511.       UPDATE(?)
  512.       SELECT(?)
  513.       DO DOS_CMD
  514.       DO SET_ALERT
  515.       CYCLE
  516.  
  517.     OF F9_KEY                   !F9: CREATE NEW MAP
  518.       UPDATE(?)
  519.       SELECT(?)
  520.       SAVE_PLACE = FIELD()           !  RETURN TO SAME FIELD
  521.       SELECT                   !  VERIFY ALL FIELDS THEN GOTO ACCEPT
  522.       CYCLE
  523.  
  524.     END!CASE KEYCODE()
  525.  
  526.     !───────────────────────────────────────────────────────────────────────────
  527.     ! FIELD VALIDATION.
  528.     !───────────────────────────────────────────────────────────────────────────
  529.     CASE FIELD()
  530.  
  531.     OF ?RANGE
  532.       IF RANGE < 2 OR RANGE > 255
  533.     SCR:MESSAGE = CENTER('MUST BE 2 - 255',50)
  534.     BEEP
  535.     SELECT(?)
  536.       END!IF
  537.       IF REPEAT >= RANGE
  538.     ERASE(?REPEAT)
  539.       END!IF
  540.  
  541.     OF ?REPEAT
  542.       IF REPEAT = 1 OR REPEAT >= RANGE
  543.     SCR:MESSAGE = 'MUST BE BETWEEN 2 AND RANGE-1, OR 0 FOR NO REPEAT'
  544.     BEEP
  545.     SELECT(?)
  546.       END!IF
  547.  
  548.     OF ?NEON
  549.       IF NEON <> 'N' AND NEON <> 'Y'
  550.     SCR:MESSAGE = CENTER('MUST BE Y (YES) OR N (NO)',50)
  551.     BEEP
  552.     SELECT(?)
  553.     CYCLE
  554.       END!IF
  555.       IF NEON = 'N' AND NOT BACKINGUP
  556.     SELECT(?SET0)
  557.       END!IF
  558.  
  559.     OF ?NEONR
  560.       IF NEONR > 63
  561.     SCR:MESSAGE = CENTER('MUST BE 0 - 63',50)
  562.     BEEP
  563.     SELECT(?)
  564.       END!IF
  565.  
  566.     OF ?NEONG
  567.       IF NEONG > 63
  568.     SCR:MESSAGE = CENTER('MUST BE 0 - 63',50)
  569.     BEEP
  570.     SELECT(?)
  571.       END!IF
  572.  
  573.     OF ?NEONB
  574.       IF NEONB > 63
  575.     SCR:MESSAGE = CENTER('MUST BE 0 - 63',50)
  576.     BEEP
  577.     SELECT(?)
  578.       END!IF
  579.  
  580.     OF ?SET0
  581.       IF SET0 <> 'N' AND SET0 <> 'Y'
  582.     SCR:MESSAGE = CENTER('MUST BE Y (YES) OR N (NO)',50)
  583.     BEEP
  584.     SELECT(?)
  585.     CYCLE
  586.       END!IF-ELSE
  587.       IF SET0 = 'N'
  588.     FIRST = 2
  589.     MAX = 255
  590.       ELSIF SET0 = 'Y'
  591.     FIRST = 1
  592.     MAX = 256
  593.       END!IF-ELSE
  594.       IF BACKINGUP AND NEON = 'N'
  595.     SELECT(?NEON)
  596.       END!IF
  597.  
  598.     OF ?PROMPT
  599.       IF PROMPT <> 'N' AND PROMPT <> 'Y'
  600.     SCR:MESSAGE = CENTER('MUST BE Y (YES) OR N (NO)',50)
  601.     BEEP
  602.     SELECT(?)
  603.       END!IF
  604.  
  605.     OF ?GIFNAME
  606.       IF KEYCODE() AND NOT BACKINGUP   !IF NOT F4,F5,F9 AND NOT UP-ARROW OR
  607.     SELECT(?)               !  SHIFT-TAB, STAY ON LAST ENTRY FIELD
  608.       END!IF
  609.  
  610.     !───────────────────────────────────────────────────────────────────────────
  611.     ! ACCEPT WILL BE SELECTED AFTER F4, F5, OR F9.
  612.     !───────────────────────────────────────────────────────────────────────────
  613.     OF ?ACCEPT
  614.  
  615.       IF REPEAT                   !SET MAX UNIQUE COLORS
  616.     UNIQUE = REPEAT
  617.       ELSE
  618.     UNIQUE = RANGE
  619.       END!IF-ELSE
  620.  
  621.       CASE K
  622.       !─────────────────────────────────────────────────────────────────────────
  623.       ! F4: DISPLAY EXISTING MAP.
  624.       !─────────────────────────────────────────────────────────────────────────
  625.       OF F4_KEY
  626.       CLOSE(SCREEN)
  627.       IF NOT INCREMENT               !IF NO MAP WAS YET CREATED
  628.     DO DEFAULT_MAP               !  READ DEFAULT PALETTE FROM VIDEO CARD
  629.       END!IF
  630.       DO VIEW_MAP               !DISPLAY THE MAP
  631.       DO WAIT4KEY               !WAIT FOR KEYSTROKE
  632.       SETVMODE(3)               !RESET TO TEXT MODE
  633.       OPEN(SCREEN)               !REOPEN SCREEN
  634.       SCR:MEM_LEFT = MEMORY(0)           !REDISPLAY MEMORY LEFT
  635.       DISPLAY
  636.       SELECT(SAVE_PLACE)           !RETURN TO SAME FIELD
  637.       IF MESSAGE               !IF ERROR VIEWING GIF FILE
  638.     SCR:MESSAGE = CENTER(MESSAGE,50)
  639.     BEEP
  640.     SELECT(?GIFNAME)
  641.       END!IF
  642.       CYCLE
  643.       !─────────────────────────────────────────────────────────────────────────
  644.       ! F5: DISPLAY GIF WITH EXISTING MAP.
  645.       !─────────────────────────────────────────────────────────────────────────
  646.       OF F5_KEY
  647.       SELECT(?)                   !CANCEL AUTOSELECT IN CASE OF ERROR
  648.       I = VERIFILE()               !CHECK FILE OR SHOW TABLE OF FILES
  649.       SCR:MEM_LEFT = MEMORY(0)           !REDISPLAY MEMORY LEFT
  650.       DO SET_ALERT               !RESET MAIN SCREEN ALERT KEYS
  651.       IF I = 1                   !IF USER ABORTED TABLE
  652.     SELECT(SAVE_PLACE)           !  RETURN TO SAME FIELD
  653.     CYCLE
  654.       ELSIF I = 2               !IF NO FILES IN DIRECTORY MATCH SPEC
  655.     SCR:MESSAGE = CENTER('NO MATCHING FILES IN DIRECTORY',50)
  656.     BEEP
  657.     SELECT(?GIFNAME)
  658.     CYCLE
  659.       ELSIF I = 3               !  IF BAD PATH
  660.     SCR:MESSAGE = CENTER('INVALID PATH\FILENAME',50)
  661.     BEEP
  662.     SELECT(?GIFNAME)
  663.     CYCLE
  664.       END!IF
  665.       GIFNAME = RETURNFILE           !  DISPLAY FILE RETURNED BY VERIFILE()
  666.       DISPLAY(?GIFNAME)
  667.       CLOSE(SCREEN)
  668.       IF NOT INCREMENT               !  IF NO MAP WAS YET CREATED
  669.     DO DEFAULT_MAP               !    READ DEFAULT PALETTE FROM VIDEO CARD
  670.       END!IF
  671.       DO VIEW_GIF               !  DISPLAY THE GIF, ETC.
  672.       SETVMODE(3)               !  RESET TO TEXT MODE
  673.       OPEN(SCREEN)               !  REOPEN SCREEN
  674.       SCR:MEM_LEFT = MEMORY(0)           !  REDISPLAY MEMORY LEFT
  675.       DISPLAY
  676.       SELECT(SAVE_PLACE)           !  RETURN TO SAME FIELD
  677.       IF MESSAGE               !  IF ERROR VIEWING GIF FILE
  678.     SCR:MESSAGE = CENTER(MESSAGE,50)
  679.     BEEP
  680.     SELECT(?GIFNAME)
  681.       END!IF
  682.       CYCLE
  683.       END!CASE K
  684.       !─────────────────────────────────────────────────────────────────────────
  685.       ! F9: CREATE AND DISPLAY NEW MAP.
  686.       !─────────────────────────────────────────────────────────────────────────
  687.       CLOSE(SCREEN)
  688.       DO NEW_MAP               !DRAW AND DISPLAY NEW MAP
  689.       DO WAIT4KEY               !WAIT FOR KEYSTROKE
  690.       SETVMODE(3)               !RESET TO TEXT MODE
  691.       OPEN(SCREEN)               !REOPEN SCREEN
  692.       SCR:MEM_LEFT = MEMORY(0)           !REDISPLAY MEMORY LEFT
  693.       DISPLAY
  694.       SELECT(SAVE_PLACE)           !RETURN TO SAME FIELD
  695.       IF MESSAGE               !IF ERROR VIEWING GIF FILE
  696.     SCR:MESSAGE = CENTER(MESSAGE,50)
  697.     BEEP
  698.     SELECT(?GIFNAME)
  699.       END!IF
  700.  
  701.     END!CASE FIELD()
  702.  
  703.   END!SCREEN LOOP
  704.  
  705.  
  706. !───────────────────────────────────────────────────────────────────────────────
  707. ! SET ALERT KEYS FOR MAIN SCREEN.
  708. !───────────────────────────────────────────────────────────────────────────────
  709. SET_ALERT    ROUTINE
  710.  
  711.   ALERT
  712.   ALERT(ESC_KEY)
  713.   ALERT(TAB_KEY)
  714.   ALERT(SHFT_TAB)
  715.   ALERT(UP_KEY)
  716.   ALERT(F1_KEY,F9_KEY)               !ALERT F1 THROUGH F9
  717.   EXIT
  718.  
  719.  
  720. !═══════════════════════════════════════════════════════════════════════════════
  721. ! ROUTINE TO CREATE AND DISPLAY A NEW MAP.
  722. !═══════════════════════════════════════════════════════════════════════════════
  723. NEW_MAP         ROUTINE
  724.  
  725.   !─────────────────────────────────────────────────────────────────────────────
  726.   ! SET TO 320x200x256 MODE UNLESS VIEWING GIF.
  727.   !─────────────────────────────────────────────────────────────────────────────
  728.   IF NOT ON_GIF                   !IF NOT VIEWING GIF
  729.     SETVMODE(19)               !  SET TO 320x200x256
  730. !!! LINE(32,0,32,199,0)               !  DISPLAY COLOR 0
  731.   END!IF
  732.  
  733.   !─────────────────────────────────────────────────────────────────────────────
  734.   ! IF NOT USING COLOR 0, SET IT TO BLACK.
  735.   !─────────────────────────────────────────────────────────────────────────────
  736.   IF SET0 = 'N'
  737.     PALR[1] = 0
  738.     PALG[1] = 0
  739.     PALB[1] = 0
  740.     SETCOLOR(0,0,0,0)
  741.   END!IF
  742.  
  743.   !─────────────────────────────────────────────────────────────────────────────
  744.   ! SET RANDOM COLOR FOR COLOR 1, OR SET TO NEONx IF NEON REQUESTED.
  745.   !─────────────────────────────────────────────────────────────────────────────
  746.   IF NEON = 'Y'
  747.     PALR[FIRST] = NEONR
  748.     PALG[FIRST] = NEONG
  749.     PALB[FIRST] = NEONB
  750.   ELSE
  751.     PALR[FIRST] = RANDOM(0,63)
  752.     PALG[FIRST] = RANDOM(0,63)
  753.     PALB[FIRST] = RANDOM(0,63)
  754.   END!IF-ELSE
  755.   PALR[257] = PALR[FIRST]           !257 WILL CAUSE WRAP AROUND TO FIRST
  756.   PALG[257] = PALG[FIRST]
  757.   PALB[257] = PALB[FIRST]
  758.   SETCOLOR(FIRST-1,PALR[FIRST],PALG[FIRST],PALB[FIRST])
  759.   NUMPAL[1] = FIRST
  760.   IF NOT ON_GIF                   !IF NOT VIEWING GIF
  761.     LINE(FIRST+31,0,FIRST+31,199,FIRST-1)   !DRAW A LINE
  762.   END!IF
  763.  
  764.   !─────────────────────────────────────────────────────────────────────────────
  765.   ! FIND THE PALETTE NUMBERS WHERE THE COLOR CHANGES AND SET A RANDOM COLOR
  766.   ! FOR EACH.
  767.   !─────────────────────────────────────────────────────────────────────────────
  768.   INCREMENT = MAX/RANGE               !SET REAL NO. INCREMENT
  769.   LOOP I = 2 TO RANGE               !SET REMAINING RANDOM COLORS
  770.     NUMPAL[I] = FIRST + ROUND(INCREMENT * (I-1),1)
  771.     IF I > UNIQUE               !IF REPEAT, SET TO PREVIOUS COLOR
  772.       PALR[NUMPAL[I]] = PALR[NUMPAL[I - REPEAT]]
  773.       PALG[NUMPAL[I]] = PALG[NUMPAL[I - REPEAT]]
  774.       PALB[NUMPAL[I]] = PALB[NUMPAL[I - REPEAT]]
  775.     ELSIF NEON = 'Y' AND I%2           !IF NEON, SET EVERY OTHER COLOR TO
  776.       PALR[NUMPAL[I]] = NEONR           !  REQUESTED COLOR
  777.       PALG[NUMPAL[I]] = NEONG
  778.       PALB[NUMPAL[I]] = NEONB
  779.     ELSE                   !IF NORMAL COLOR CHANGE
  780.       PALR[NUMPAL[I]] = RANDOM(0,63)   !  SET TO A NEW RANDOM COLOR
  781.       PALG[NUMPAL[I]] = RANDOM(0,63)
  782.       PALB[NUMPAL[I]] = RANDOM(0,63)
  783.     END!IF-ELSE
  784.     SETCOLOR(NUMPAL[I]-1,PALR[NUMPAL[I]],PALG[NUMPAL[I]],PALB[NUMPAL[I]])
  785.     IF NOT ON_GIF               !IF NOT VIEWING GIF
  786.       LINE(NUMPAL[I]+31,0,NUMPAL[I]+31,199,NUMPAL[I]-1)      !DRAW A LINE
  787.     END!IF
  788.   END!LOOP
  789.  
  790.   !─────────────────────────────────────────────────────────────────────────────
  791.   ! SET THE IN-BETWEEN COLORS FOR EACH RANGE.
  792.   !─────────────────────────────────────────────────────────────────────────────
  793.   NUMPAL[RANGE + 1] = 257           !SO LAST COLOR BLENDS INTO 1ST
  794.   LOOP I = 2 TO RANGE + 1
  795.     SPREAD = NUMPAL[I] - NUMPAL[I-1]
  796.     INCR_R = (PALR[NUMPAL[I]] - PALR[NUMPAL[I-1]]) / SPREAD
  797.     INCR_G = (PALG[NUMPAL[I]] - PALG[NUMPAL[I-1]]) / SPREAD
  798.     INCR_B = (PALB[NUMPAL[I]] - PALB[NUMPAL[I-1]]) / SPREAD
  799.     LOOP J = 1 TO SPREAD - 1
  800.       N = NUMPAL[I-1] + J
  801.       PALR[N] = PALR[NUMPAL[I-1]] + ROUND(INCR_R * J,1)
  802.       PALG[N] = PALG[NUMPAL[I-1]] + ROUND(INCR_G * J,1)
  803.       PALB[N] = PALB[NUMPAL[I-1]] + ROUND(INCR_B * J,1)
  804.       SETCOLOR(N-1,PALR[N],PALG[N],PALB[N])
  805.       IF NOT ON_GIF               !IF NOT VIEWING GIF
  806.     LINE(N+31,0,N+31,199,N-1)      !  DRAW A LINE
  807.       END!IF
  808.     END!LOOP
  809.   END!LOOP
  810.  
  811. ! !─────────────────────────────────────────────────────────────────────────────
  812. ! ! SET THE LAST RANGE SO IT BLENDS INTO COLOR 1.
  813. ! !─────────────────────────────────────────────────────────────────────────────
  814. ! SPREAD = 257 - NUMPAL[RANGE]
  815. ! INCR_R = (PALR[FIRST] - PALR[NUMPAL[RANGE]]) / SPREAD
  816. ! INCR_G = (PALG[FIRST] - PALG[NUMPAL[RANGE]]) / SPREAD
  817. ! INCR_B = (PALB[FIRST] - PALB[NUMPAL[RANGE]]) / SPREAD
  818. ! LOOP J = 1 TO SPREAD - 1
  819. !   N = NUMPAL[RANGE] + J
  820. !   PALR[N] = PALR[NUMPAL[RANGE]] + ROUND(INCR_R * J,1)
  821. !   PALG[N] = PALG[NUMPAL[RANGE]] + ROUND(INCR_G * J,1)
  822. !   PALB[N] = PALB[NUMPAL[RANGE]] + ROUND(INCR_B * J,1)
  823. !   SETCOLOR(N-1,PALR[N],PALG[N],PALB[N])
  824. !   IF NOT ON_GIF               !IF NOT VIEWING GIF
  825. !     LINE(N+31,0,N+31,199,N-1)
  826. !   END!IF
  827. ! END!LOOP
  828.  
  829.   EXIT
  830.  
  831.  
  832. !═══════════════════════════════════════════════════════════════════════════════
  833. ! ROUTINE TO REDISPLAY THE CURRENT MAP.
  834. !═══════════════════════════════════════════════════════════════════════════════
  835. VIEW_MAP     ROUTINE
  836.  
  837.   SETVMODE(19)                   !SET TO 320x200x256
  838.   LOOP I = 1 TO 256
  839.     SETCOLOR(I-1,PALR[I],PALG[I],PALB[I])
  840.     LINE(I+31,0,I+31,199,I-1)
  841.   END!LOOP
  842.  
  843.  
  844. !═══════════════════════════════════════════════════════════════════════════════
  845. ! THIS ROUTINE IS CALLED WHENEVER A MAP IS DISPLAYED (AFTER NEW_MAP OR VIEW_MAP)
  846. ! IF F9 OR <ENTER> IS HIT A NEW MAP IS DRAWN; IF F5 THE GIF FILE IS DISPLAYED;
  847. ! +,- CHANGES DIRECTION OF COLOR CYCLING (BUT DOESN'T COLOR CYCLE);
  848. ! <,>,1,2,...0 CYCLES COLORS.    ANY OTHER KEY RETURNS.
  849. !═══════════════════════════════════════════════════════════════════════════════
  850. WAIT4KEY     ROUTINE
  851.  
  852.   LOOP
  853.     ASK
  854.     K = KEYCODE()
  855.     IF K = ENTER_KEY |
  856.     OR K = F9_KEY
  857.       DO NEW_MAP
  858.     ELSIF K = GPLUS_KEY |
  859.     OR      K = PLUS_KEY
  860.       DIRECTION = 1
  861.       BEEP(2960,10);BEEP(0,6);BEEP(3520,10)
  862.     ELSIF K = GMINUS_KEY |
  863.     OR      K = MINUS_KEY
  864.       DIRECTION = -1
  865.       BEEP(3520,10);BEEP(0,6);BEEP(2960,10)
  866.     ELSIF (K >= 48 AND K <= 57) |
  867.     OR K = COMMA_KEY |
  868.     OR K = PERIOD_KEY |
  869.     OR K = LEFT_ANGLE |
  870.     OR K = RIGHT_ANGLE
  871.       DO COLOR_CYCLE
  872.     ELSIF K = F5_KEY
  873.       IF NOT FILEXISTS(GIFNAME)
  874.     MESSAGE = 'FILE NOT FOUND'
  875.       ELSE
  876.     DO VIEW_GIF
  877.       END!IF-ELSE
  878.       IF MESSAGE THEN EXIT.           !EXIT IF ERROR VIEWING GIF
  879.       DO VIEW_MAP               !REDISPLAY MAP
  880.     ELSE
  881.       EXIT
  882.     END!IF-ELSE
  883.   END!LOOP
  884.  
  885.  
  886. !═══════════════════════════════════════════════════════════════════════════════
  887. ! ROUTINE TO DISPLAY A GIF PICTURE WITH THE CURRENT MAP PALETTE.
  888. !═══════════════════════════════════════════════════════════════════════════════
  889. VIEW_GIF     ROUTINE
  890.  
  891.   !─────────────────────────────────────────────────────────────────────────────
  892.   ! SHELL TO GIF VIEWER. GIF VIEWER MUST LEAVE IMAGE ON SCREEN AFTER RETURNING
  893.   ! AND NOT RESET VIDEO MODE.
  894.   !─────────────────────────────────────────────────────────────────────────────
  895.   IF NOT F5_CMD                   !IF USER DIDN'T DEFINE A COMMAND
  896.     MESSAGE = 'NO COMMAND DEFINED - PRESS F2 TO DEFINE'     ! SET ERROR MESSAGE
  897.     EXIT                   !  EXIT
  898.   END!IF
  899.  
  900.   IF F5_NOYES = 'N'
  901.     RUN(CLIP(F5_CMD) & ' ' & CLIP(GIFNAME) & F5_CSHOW)
  902.   ELSE
  903.     RUNSMALL(CLIP(F5_CMD) & ' ' & CLIP(GIFNAME) & F5_CSHOW)
  904.   END!IF-ELSE
  905.  
  906.   IF RUNCODE() = -4               !IF .TMP FILE COULDN'T BE CREATED
  907.     MESSAGE = 'COULDN''T CREATE .TMP MEMORY IMAGE FILE'
  908.     EXIT
  909.   END!IF
  910.  
  911. !!! THE FOLLOWING CODE WAS DELETED BECAUSE IT NEVER SEEMED TO RETURN ANYTHING
  912. ! IF F5_ERROR AND ERRORCODE()           !IF USER WANTS ERRORS & PGM RETURNED CODE
  913. !   MESSAGE = ERROR()               !  SET ERROR MESSAGE
  914. !   EXIT                   !  EXIT
  915. ! END!IF
  916.  
  917.   !─────────────────────────────────────────────────────────────────────────────
  918.   ! THE GIF WILL BE DISPLAYED WITH ITS OWN COLORS SO THE COLORS MUST BE RESET TO
  919.   ! THE CURRENT MAP.
  920.   !─────────────────────────────────────────────────────────────────────────────
  921.   LOOP I = 1 TO 256
  922.     SETCOLOR(I-1,PALR[I],PALG[I],PALB[I])
  923.   END!LOOP
  924.  
  925.   !─────────────────────────────────────────────────────────────────────────────
  926.   ! WHILE GIF IMAGE IS DISPLAYED USER CAN HIT F9 OR <ENTER> TO CREATE A NEW MAP;
  927.   ! +,- CHANGES DIRECTION OF COLOR CYCLING; <,>,1,2,...,0 CYCLES COLORS;
  928.   ! ANY OTHER KEY EXITS.
  929.   !─────────────────────────────────────────────────────────────────────────────
  930.   ON_GIF = 1                   !FOR USE BY NEW_MAP
  931.   LOOP
  932.     ASK
  933.     K = KEYCODE()
  934.     IF K = F9_KEY |
  935.     OR K = ENTER_KEY
  936.       DO NEW_MAP
  937.     ELSIF K = GPLUS_KEY |
  938.     OR      K = PLUS_KEY
  939.       DIRECTION = 1
  940.       BEEP(2960,10);BEEP(0,6);BEEP(3520,10)
  941.     ELSIF K = GMINUS_KEY |
  942.     OR      K = MINUS_KEY
  943.       DIRECTION = -1
  944.       BEEP(3520,10);BEEP(0,6);BEEP(2960,10)
  945.     ELSIF (K >= 48 AND K <= 57) |
  946.     OR K = COMMA_KEY |
  947.     OR K = PERIOD_KEY |
  948.     OR K = LEFT_ANGLE |
  949.     OR K = RIGHT_ANGLE
  950.       DO COLOR_CYCLE
  951.     ELSE
  952.       CLEAR(ON_GIF)
  953.       EXIT
  954.     END!IF-ELSE
  955.   END!LOOP
  956.  
  957.   EXIT
  958.  
  959.  
  960. !═══════════════════════════════════════════════════════════════════════════════
  961. ! COLOR CYCLE WHILE VIEWING A MAP OR VIEWING A GIF.
  962. !═══════════════════════════════════════════════════════════════════════════════
  963. COLOR_CYCLE  ROUTINE
  964.  
  965.   !─────────────────────────────────────────────────────────────────────────────
  966.   ! DETERMINE NO. OF COLORS TO CYCLE AND DIRECTION BASED ON THE KEY USER HIT.
  967.   !─────────────────────────────────────────────────────────────────────────────
  968.   IF K = LEFT_ANGLE |               !'<'
  969.   OR K = COMMA_KEY               !','
  970.     DIRECTION = -1
  971.     NO_CYCLE = 1
  972.   ELSIF K = RIGHT_ANGLE |           !'>'
  973.   OR    K = PERIOD_KEY               !'.'
  974.     DIRECTION = 1
  975.     NO_CYCLE = 1
  976.   ELSIF K = 48                   !'0'
  977.     NO_CYCLE = 100
  978.   ELSE                       !'1' - '9'
  979.     NO_CYCLE = (K - 48) * 10
  980.   END!IF-ELSE
  981.  
  982.   SAVEPAL = PALGROUP               !SAVE EXISTING COLORS
  983.  
  984.   !─────────────────────────────────────────────────────────────────────────────
  985.   ! RECALC COLOR MAP BY ROTATING COLORS FORWARD.
  986.   !─────────────────────────────────────────────────────────────────────────────
  987.   IF DIRECTION = 1
  988.  
  989.     LOOP I = FIRST TO 256 - NO_CYCLE
  990.       J = I + NO_CYCLE
  991.       PALR[I] = SAVR[J]
  992.       PALG[I] = SAVG[J]
  993.       PALB[I] = SAVB[J]
  994.       SETCOLOR(I-1,PALR[I],PALG[I],PALB[I])
  995.     END!LOOP
  996.  
  997.     J = FIRST - 1
  998.     LOOP I = 257 - NO_CYCLE TO 256
  999.       J += 1
  1000.       PALR[I] = SAVR[J]
  1001.       PALG[I] = SAVG[J]
  1002.       PALB[I] = SAVB[J]
  1003.       SETCOLOR(I-1,PALR[I],PALG[I],PALB[I])
  1004.     END!LOOP
  1005.  
  1006.   !─────────────────────────────────────────────────────────────────────────────
  1007.   ! RECALC COLOR MAP BY ROTATING COLORS BACKWARD.
  1008.   !─────────────────────────────────────────────────────────────────────────────
  1009.   ELSE !DIRECTION = -1
  1010.  
  1011.     LOOP I = FIRST TO FIRST + NO_CYCLE - 1
  1012.       J = MAX - NO_CYCLE + I
  1013.       PALR[I] = SAVR[J]
  1014.       PALG[I] = SAVG[J]
  1015.       PALB[I] = SAVB[J]
  1016.       SETCOLOR(I-1,PALR[I],PALG[I],PALB[I])
  1017.     END!LOOP
  1018.  
  1019.     LOOP I = FIRST + NO_CYCLE TO 256
  1020.       J = I - NO_CYCLE
  1021.       PALR[I] = SAVR[J]
  1022.       PALG[I] = SAVG[J]
  1023.       PALB[I] = SAVB[J]
  1024.       SETCOLOR(I-1,PALR[I],PALG[I],PALB[I])
  1025.     END!LOOP
  1026.  
  1027.   END!IF-ELSE
  1028.  
  1029.   CLEAR(NUMPAL[])               !NUMPAL ARRAY NO LONGER VALID
  1030.  
  1031.   EXIT
  1032.  
  1033.  
  1034. !═══════════════════════════════════════════════════════════════════════════════
  1035. ! SAVE CURRENT PALETTE TO AN ASCII FRACTINT MAP FILE.
  1036. !═══════════════════════════════════════════════════════════════════════════════
  1037. SAVE_MAP     ROUTINE
  1038.  
  1039.   !─────────────────────────────────────────────────────────────────────────────
  1040.   ! CREATE DOS FILE, CONFIRM IF FILE ALREADY EXISTS.
  1041.   !─────────────────────────────────────────────────────────────────────────────
  1042.   SCR:MESSAGE = CENTER('PLEASE WAIT . . .',50)
  1043.   OPEN(DOSFILE)
  1044.   IF NOT ERRORCODE()               !IF FILE EXISTS
  1045.     CLOSE(DOSFILE)
  1046.     IF PROMPT = 'Y'               !AND USER WANTS TO BE PROMPTED
  1047.       CLEAR(SCR:MESSAGE)
  1048.       IF NOT CONFIRM(' ')              !  AND DOESN'T CONFIRM
  1049.     SELECT(?DOSNAME)
  1050.     EXIT                   !    RETURN TO MAIN SCREEN
  1051.       END!IF
  1052.       SCR:MESSAGE = CENTER('PLEASE WAIT . . .',50)
  1053.     END!IF
  1054.   ELSIF ERRORCODE() <> 2           !IF ERROR OTHER THAN FILE NOT FOUND
  1055.     SCR:MESSAGE = CENTER(ERROR(),50)
  1056.     CLOSE(DOSFILE)               !  IN CASE FILE IS READ ONLY
  1057.     BEEP
  1058.     SELECT(?DOSNAME)
  1059.     EXIT
  1060.   END!IF-ELSE
  1061.  
  1062.   CREATE(DOSFILE)               !CREATE OR EMPTY FILE
  1063.   IF ERRORCODE()
  1064.     SCR:MESSAGE = CENTER(ERROR(),50)
  1065.     BEEP
  1066.     SELECT(?DOSNAME)
  1067.     EXIT
  1068.   END!IF
  1069.  
  1070.   !─────────────────────────────────────────────────────────────────────────────
  1071.   ! WRITE EACH OF THE 256 COLORS TO THE FILE.
  1072.   ! NOTE THAT EACH PALETTE NUMBER MUST BE MULTIPLIED BY 4.
  1073.   ! A '<' IS PRINTED NEXT TO EACH COLOR CHANGE UNLESS THERE HAS BEEN COLOR
  1074.   ! CYCLING IN WHICH CASE THIS IS NOT KEPT TRACK OF.
  1075.   !─────────────────────────────────────────────────────────────────────────────
  1076.   SCR:MESSAGE = CENTER('WRITING FILE . . .',50)
  1077.   J = 1
  1078.   LOOP I = 1 TO 256
  1079.     DOS:RECORD = FORMAT(PALR[I] * 4,@N3) |
  1080.            & FORMAT(PALG[I] * 4,@N4) |
  1081.            & FORMAT(PALB[I] * 4,@N4)
  1082.     IF I = NUMPAL[J]
  1083.       DOS:RECORD = CLIP(DOS:RECORD) & ' <<'
  1084.       J += 1
  1085.     END!IF
  1086.     ADD(DOSFILE)
  1087.   END!LOOP
  1088.  
  1089.   CLOSE(DOSFILE)
  1090.   SCR:MESSAGE = CENTER('FILE WRITTEN',50)
  1091.  
  1092.   EXIT
  1093.  
  1094.  
  1095. !═══════════════════════════════════════════════════════════════════════════════
  1096. ! CONFIGURATION SCREEN - SELECT F5 VIEW COMMAND AND F7 DOS COMMAND.
  1097. !═══════════════════════════════════════════════════════════════════════════════
  1098. CONFIGURE    ROUTINE
  1099.  
  1100.   OPEN(CFG_SCR)
  1101.   SAVE_CFG = CFG_GROUP               !SAVE CURRENT VALUES IN CASE OF ABORT
  1102.   DISPLAY                   !DISPLAY CURRENT VALUES
  1103.  
  1104.   ALERT
  1105.   ALERT(ESC_KEY)
  1106.   ALERT(TAB_KEY)
  1107.   ALERT(SHFT_TAB)
  1108.   ALERT(UP_KEY)
  1109.   ALERT(F3_KEY)
  1110.   ALERT(F9_KEY)
  1111.  
  1112.   LOOP
  1113.  
  1114.     ACCEPT
  1115.     CLEAR(BACKINGUP)
  1116.  
  1117.     !───────────────────────────────────────────────────────────────────────────
  1118.     ! HOT KEY LOGIC.
  1119.     !───────────────────────────────────────────────────────────────────────────
  1120.     CASE KEYCODE()
  1121.     OF TAB_KEY                   !TAB: GO TO NEXT FIELD
  1122.       UPDATE(?)
  1123.     OF ESC_KEY                   !ESC: RESTORE FIELD THEN GO TO PREVIOUS
  1124.       DISPLAY(?)
  1125.       IF FIELD() = 1               !  IF ON FIRST FIELD
  1126.     CLOSE(CFG_SCR)
  1127.     CFG_GROUP = SAVE_CFG           !    RESTORE ORIGINAL VALUES
  1128.     EXIT                   !    EXIT
  1129.       ELSE
  1130.     SELECT(?-1)
  1131.       END!IF
  1132.       CYCLE
  1133.     OF UP_KEY OROF SHFT_TAB           !UP OR SHIFT-TAB: GO TO PREVIOUS FIELD
  1134.       BACKINGUP = 1
  1135.       UPDATE(?)
  1136.       IF FIELD() = 1; SELECT(?)
  1137.     ELSE; SELECT(?-1)
  1138.       END!IF
  1139.     OF F3_KEY                   !F3: CANCEL
  1140.       CLOSE(CFG_SCR)
  1141.       CFG_GROUP = SAVE_CFG           !  RESTORE ORIGINAL VALUES
  1142.       EXIT
  1143.     OF F9_KEY                   !F9: ACCEPT
  1144.       UPDATE(?)
  1145.       SELECT(?)
  1146.       SELECT
  1147.       CYCLE
  1148.     END!CASE
  1149.  
  1150.     !───────────────────────────────────────────────────────────────────────────
  1151.     ! FIELD VALIDATION.
  1152.     !───────────────────────────────────────────────────────────────────────────
  1153.     CASE FIELD()
  1154.  
  1155.     OF ?F5_NOYES
  1156.       IF F5_NOYES <> 'N' AND F5_NOYES <> 'Y'
  1157.     BEEP
  1158.     SELECT(?)
  1159.       END!IF
  1160.  
  1161.     OF ?F7_NOYES
  1162.       IF F7_NOYES <> 'N' AND F7_NOYES <> 'Y'
  1163.     BEEP
  1164.     SELECT(?)
  1165.       END!IF
  1166.  
  1167.     OF FIELDS() - 1               !CAN'T USE '?F7_TEXT' (ALSO ON MAIN SCR)
  1168.       IF KEYCODE() AND NOT BACKINGUP   !IF NOT F9 AND NOT UP-ARROW OR SHIFT-TAB
  1169.     SELECT(?)               !  STAY ON LAST ENTRY FIELD
  1170.       END!IF
  1171.  
  1172.     OF ?CFG_ACCEPT
  1173.       CLOSE(CFG_SCR)
  1174.       IF F5_CMD
  1175.     F5_TEXT = CENTER('View GIF command: ' & F5_CMD,74)   !FOR SCREEN DISPLAY
  1176.       ELSE
  1177.     F5_TEXT = CENTER('View GIF command: (none)',74)
  1178.       END!IF-ELSE
  1179.       IF INSTRING('CSHOW',UPPER(F5_CMD),1)   !IF RUNNING CSHOW
  1180.     F5_CSHOW = '+X'                      !  MUST ADD '+X' TO GIF NAME
  1181.       ELSE
  1182.     CLEAR(F5_CSHOW)
  1183.       END!IF
  1184.       EXIT
  1185.     END!CASE
  1186.  
  1187.   END!LOOP
  1188.  
  1189.   EXIT
  1190.  
  1191.  
  1192. !═══════════════════════════════════════════════════════════════════════════════
  1193. ! RUN EXTERNAL DOS COMMAND.
  1194. !═══════════════════════════════════════════════════════════════════════════════
  1195. DOS_CMD         ROUTINE
  1196.  
  1197.   OPEN(DOS_SCR)
  1198.   SAVE_F8 = F8_GROUP               !SAVE CURRENT VALUES IN CASE OF ABORT
  1199.   DISPLAY                   !DISPLAY CURRENT VALUES
  1200.  
  1201.   ALERT
  1202.   ALERT(ESC_KEY)
  1203.   ALERT(TAB_KEY)
  1204.   ALERT(SHFT_TAB)
  1205.   ALERT(UP_KEY)
  1206.   ALERT(F3_KEY)
  1207.   ALERT(F9_KEY)
  1208.  
  1209.   LOOP
  1210.  
  1211.     ACCEPT
  1212.     CLEAR(BACKINGUP)
  1213.  
  1214.     !───────────────────────────────────────────────────────────────────────────
  1215.     ! HOT KEY LOGIC.
  1216.     !───────────────────────────────────────────────────────────────────────────
  1217.     CASE KEYCODE()
  1218.     OF TAB_KEY                   !TAB: GO TO NEXT FIELD
  1219.       UPDATE(?)
  1220.     OF ESC_KEY                   !ESC: RESTORE FIELD THEN GO TO PREVIOUS
  1221.       DISPLAY(?)
  1222.       IF FIELD() = 1               !  IF ON FIRST FIELD
  1223.     CLOSE(DOS_SCR)
  1224.     F8_GROUP = SAVE_F8           !    RESTORE ORIGINAL VALUES
  1225.     EXIT                   !    EXIT
  1226.       ELSE
  1227.     SELECT(?-1)
  1228.       END!IF
  1229.       CYCLE
  1230.     OF UP_KEY OROF SHFT_TAB           !UP OR SHIFT-TAB: GO TO PREVIOUS FIELD
  1231.       BACKINGUP = 1
  1232.       UPDATE(?)
  1233.       IF FIELD() = 1; SELECT(?)
  1234.     ELSE; SELECT(?-1)
  1235.       END!IF
  1236.     OF F3_KEY                   !F3: CANCEL
  1237.       CLOSE(DOS_SCR)
  1238.       F8_GROUP = SAVE_F8           !  RESTORE ORIGINAL VALUES
  1239.       EXIT
  1240.     OF F9_KEY                   !F9: ACCEPT
  1241.       UPDATE(?)
  1242.       SELECT(?)
  1243.       SELECT
  1244.       CYCLE
  1245.     END!CASE
  1246.  
  1247.     !───────────────────────────────────────────────────────────────────────────
  1248.     ! FIELD VALIDATION.
  1249.     !───────────────────────────────────────────────────────────────────────────
  1250.     CASE FIELD()
  1251.  
  1252.     OF ?F8_NOYES
  1253.       IF F8_NOYES <> 'N' AND F8_NOYES <> 'Y'
  1254.     BEEP
  1255.     SELECT(?)
  1256.       END!IF
  1257.  
  1258.     OF ?F8_PAUSE
  1259.       IF F8_PAUSE<> 'N' AND F8_PAUSE <> 'Y'
  1260.     BEEP
  1261.     SELECT(?)
  1262.     CYCLE
  1263.       END!IF
  1264.       IF KEYCODE() AND NOT BACKINGUP
  1265.     SELECT(?)
  1266.       END!IF
  1267.  
  1268.     OF ?DOS_ACCEPT
  1269.       UPDATE(?)
  1270. !     SELECT(?)
  1271.       CLOSE(DOS_SCR)
  1272.       EXEC_EXT(F8_CMD,F8_NOYES,F8_PAUSE)
  1273.       EXIT
  1274.  
  1275.     END!CASE
  1276.  
  1277.   END!LOOP
  1278.  
  1279.   EXIT
  1280.  
  1281.  
  1282. !═══════════════════════════════════════════════════════════════════════════════
  1283. ! HELP SCREEN.
  1284. !═══════════════════════════════════════════════════════════════════════════════
  1285. HELP         ROUTINE
  1286.  
  1287.   I = RANDOM(1,4)
  1288.   OPEN(HELP_SCR)
  1289.   BEEP(2960,16)
  1290.   CASE I
  1291.   OF 1
  1292.     SHOW(13,23,'You expect help in a free program ?!?')
  1293.   OF 2
  1294.     SHOW(13,31,'For Help, Dial 9-1-1')
  1295.   OF 3
  1296.     SHOW(12,25,'This program is totally intuitive')
  1297.     SHOW(13,25,'How could you possibly need help?')
  1298.     SHOW(14,27,'You really hurt my feelings!')
  1299.   OF 4
  1300.     SHOW(12,29,'I''d like to help you out')
  1301.     SHOW(14,28,'Which way did you come in?')
  1302.   END!CASE
  1303.   ASK
  1304.   CLOSE(HELP_SCR)
  1305.  
  1306.   EXIT
  1307.  
  1308.  
  1309. !═══════════════════════════════════════════════════════════════════════════════
  1310. ! THIS ROUTINE READS THE VIDEO CARD'S DEFAULT PALETTE. IT IS ONLY CALLED IF THE
  1311. ! USER HITS F4 (VIEW MAP) OR F5 (VIEW GIF) BEFORE A MAP IS CREATED.
  1312. ! IT IS NOT CALLED AT BEGINNING OF PROGRAM BECAUSE IT TAKES A LONG TIME.
  1313. !═══════════════════════════════════════════════════════════════════════════════
  1314. DEFAULT_MAP  ROUTINE
  1315.  
  1316.   SETVMODE(19)                   !MUST FIRST SET TO 320x200x256
  1317.   LOOP I = 0 TO 255
  1318.     PALR[I+1] = RED(I)
  1319.     PALG[I+1] = GREEN(I)
  1320.     PALB[I+1] = BLUE(I)
  1321.   END!LOOP
  1322.   INCREMENT = 1                   !SET FLAG THAT A MAP EXISTS
  1323. ! SETVMODE(3)
  1324.  
  1325.   EXIT
  1326.  
  1327.  
  1328. !═══════════════════════════════════════════════════════════════════════════════
  1329. ! READ CONFIGURATION FILE (FIMAPS.CFG).
  1330. !═══════════════════════════════════════════════════════════════════════════════
  1331. READ_CONFIG  ROUTINE
  1332.  
  1333.   DOSNAME = 'FIMAPS.CFG'
  1334.   IF NOT FILEXISTS(DOSNAME)           !IF IT'S NOT IN CURRENT DIRECTORY
  1335.     DOSNAME = ENVPROGPATH() & DOSNAME  !  LOOK IN THE EXE DIRECTORY
  1336.   END!IF
  1337.  
  1338.   OPEN(DOSFILE)
  1339.  
  1340.   IF NOT ERRORCODE() |               !IF NO ERRORS
  1341.   OR ERRORCODE() = 67               !OR READ ONLY
  1342.  
  1343. !   SCR:MESSAGE = CENTER('PLEASE WAIT - READING FIMAPS.CFG',50)
  1344.     SET(DOSFILE)
  1345.  
  1346.     DO NEXT_CFG                   !READ F5 COMMAND
  1347.     F5_CMD = DOS:RECORD
  1348.  
  1349.     DO NEXT_CFG                   !READ F5 RUN IN EXISTING MEMORY (N/Y)
  1350.     DOS:RECORD = UPPER(DOS:RECORD)
  1351.     IF DOS:RECORD = 'N' OR DOS:RECORD = 'Y'
  1352.       F5_NOYES = DOS:RECORD
  1353.     ELSIF DOS:RECORD
  1354.       CFG_ERROR = 1
  1355.     END!IF-ELSE
  1356.  
  1357.     DO NEXT_CFG                   !READ F7 COMMAND
  1358.     F7_CMD = DOS:RECORD
  1359.     F7_TEXT = F7_CMD
  1360.  
  1361.     DO NEXT_CFG                   !READ F7 RUN IN EXISTING MEMORY (N/Y)
  1362.     DOS:RECORD = UPPER(DOS:RECORD)
  1363.     IF DOS:RECORD = 'N' OR DOS:RECORD = 'Y'
  1364.       F7_NOYES = DOS:RECORD
  1365.     ELSIF DOS:RECORD
  1366.       CFG_ERROR = 1
  1367.     END!IF-ELSE
  1368.  
  1369.     DO NEXT_CFG                   !READ F7 SCREEN TEXT
  1370.     F7_TEXT = DOS:RECORD
  1371.  
  1372.   END!IF FIMAPS.CFG READ
  1373.  
  1374.   CLOSE(DOSFILE)
  1375.   CLEAR(DOSNAME)
  1376.  
  1377.   IF CFG_ERROR
  1378.     SCR:MESSAGE = '  ERROR IN FIMAPS.CFG - USING INTERNAL DEFAULTS'
  1379.     BEEP
  1380.   END!IF
  1381.  
  1382.   EXIT
  1383.  
  1384. !───────────────────────────────────────────────────────────────────────────────
  1385. ! READ NEXT RECORD FROM FIMAPS.CFG SKIPPING ';' COMMENT LINES.
  1386. ! IF EOF, CLEAR DOS:RECORD AND PRETEND TO READ ENTIRE FILE ANYWAY,
  1387. ! ANY REMAINING OPTIONS WILL BE SET TO INTERNAL DEFAULTS.
  1388. !───────────────────────────────────────────────────────────────────────────────
  1389. NEXT_CFG     ROUTINE
  1390.  
  1391.   LOOP
  1392.     IF EOF(DOSFILE) OR ERRORCODE()
  1393.       CLEAR(DOS:RECORD)
  1394.       EXIT
  1395.     END!IF
  1396.     NEXT(DOSFILE)
  1397.     DOS:RECORD = LEFT(DOS:RECORD)      !ALL RECORDS ARE LEFT JUSTIFIED
  1398.     IF SUB(DOS:RECORD,1,1) <> ';'      !SKIP ANY LINE BEGINNING WITH ';'
  1399.       EXIT
  1400.     END!IF
  1401.   END!LOOP
  1402.  
  1403.   EXIT
  1404.  
  1405.  
  1406. !╔═════════════════════════════════════════════════════════════════════════════╗
  1407. !║ FUNCTION TO RETURN USER CONFIRMATION FOR OVERWRITING MAP FILE OR EXITING    ║
  1408. !║ PROGRAM. RETURNS 'Y' OR BLANK.                           ║
  1409. !╚═════════════════════════════════════════════════════════════════════════════╝
  1410. CONFIRM         FUNCTION(DEFAULT)
  1411.  
  1412. CON_SCR         SCREEN      WINDOW(3,37),AT(9,25),HUE(12,4)
  1413.  OMIT('**-END-**')
  1414.             █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1415.             █  File Exists - Overwrite? N  Y/N  █
  1416.             █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1417. **-END-**
  1418.  
  1419.            ROW(2,2)      PAINT(1,35),HUE(11,4)
  1420.            ROW(2,29)  PAINT(1,1),HUE(11,0)
  1421.            ROW(1,1)      STRING('█▀{35}█')
  1422.            ROW(2,1)      STRING('█<0{35}>█')
  1423.            ROW(3,1)      STRING('█▄{35}█')
  1424.            ROW(2,4)      STRING('File Exists - Overwrite?')
  1425.          COL(29)  STRING('N')
  1426.          COL(32)  STRING('Y/N')
  1427.          .
  1428.  
  1429. EXIT_SCR     SCREEN      WINDOW(3,18),AT(9,32),HUE(12,4)
  1430.  OMIT('**-END-**')
  1431.                    █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1432.                    █  Exit? Y  Y/N    █
  1433.                    █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1434. **-END-**
  1435.  
  1436.            ROW(2,2)      PAINT(1,16),HUE(11,4)
  1437.            ROW(2,10)  PAINT(1,1),HUE(11,0)
  1438.            ROW(1,1)      STRING('█▀{16}█')
  1439.            ROW(2,1)      STRING('█<0{16}>█')
  1440.            ROW(3,1)      STRING('█▄{16}█')
  1441.            ROW(2,4)      STRING('Exit?')
  1442.          COL(10)  STRING('Y')
  1443.          COL(13)  STRING('Y/N')
  1444.          .
  1445.  
  1446. DEFAULT         STRING(1)               !DEFAULT 'Y' OR 'N'
  1447.  
  1448.   CODE
  1449.  
  1450.   IF DEFAULT = 'Y'
  1451.     OPEN(EXIT_SCR)
  1452.     SETCURSOR(10,41)
  1453.   ELSE !DEFAULT = ' ' (NO)
  1454.     BEEP
  1455.     OPEN(CON_SCR)
  1456.     SETCURSOR(10,53)
  1457.   END!IF-ELSE
  1458.  
  1459.   LOOP                       !LOOP UNTIL VALID KEY IS HIT
  1460.     ASK
  1461.     CASE KEYCODE()
  1462.     OF ENTER_KEY OROF F9_KEY
  1463.       RETURN(DEFAULT)
  1464.     OF ESC_KEY OROF F3_KEY |
  1465.     OROF VAL('N') OROF VAL('n')
  1466.       RETURN(' ')
  1467.     OF VAL('Y') OROF VAL('y')
  1468.       RETURN('Y')
  1469.     END!CASE
  1470.     BEEP                   !BEEP AND ASK AGAIN
  1471.   END!LOOP
  1472.  
  1473.  
  1474. !╔═════════════════════════════════════════════════════════════════════════════╗
  1475. !║ PROCEDURE TO RUN A DOS COMMAND.                           ║
  1476. !║ THIS PROC WILL ALSO DISPLAY ANY ERROR MESSAGE ON THE MAIN SCREEN.           ║
  1477. !║ THE PROC DOES NOT AUTOMATICALLY PAUSE IF THE PROGRAM ENDS WITH AN           ║
  1478. !║ ERRORLEVEL SINCE MANY PROGRAMS THAT END NORMALLY RETURN AN ERROR LEVEL.     ║
  1479. !║                                           ║
  1480. !║ PARAMETERS:                                       ║
  1481. !║   CMD      - THE COMMAND TO RUN                           ║
  1482. !║   RUNSMALL - RUN IN EXISTING MEMORY (Y/N)                       ║
  1483. !║   PAUSE    - PAUSE AFTER RUNNING (Y/N)                       ║
  1484. !╚═════════════════════════════════════════════════════════════════════════════╝
  1485. EXEC_EXT     PROCEDURE(DOS:CMD, DOS:RUNSMALL, DOS:PAUSE)
  1486.  
  1487. RUN_SCR         SCREEN      WINDOW(25,80),HUE(7,0)
  1488.  OMIT('**-END-**')      Rows 1 thru 1
  1489. Please Wait . . .
  1490. **-END-**
  1491.  
  1492.            ROW(1,1)      STRING('Please Wait . . .')
  1493.          .
  1494.  
  1495.          GROUP,PRE(DOS)
  1496. CMD           STRING(127)           !THE COMMAND TO RUN
  1497. RUNSMALL       STRING(1)           !RUN IN EXISTING MEMORY (Y/N)
  1498. PAUSE           STRING(1)           !DISPLAY 'Press any key' BEFORE RETURNING
  1499.          END!GROUP
  1500.  
  1501.   CODE
  1502.  
  1503.   OPEN(RUN_SCR)                   !DISPLAY 'Please Wait ... '
  1504.  
  1505.   IF DOS:RUNSMALL = 'N'               !DOWNLOAD MEMORY IMAGE, THEN RUN
  1506.     RUN(DOS:CMD)
  1507.   ELSE                       !RUN IN EXISTING MEMORY
  1508.     RUNSMALL(DOS:CMD)
  1509.   END!IF-ELSE
  1510.  
  1511.   IF (DOS:PAUSE = 'Y'  |          !IF USER REQUESTED PAUSE
  1512.   AND RUNCODE() <> -4) |          !AND NO .TMP CREATE ERROR
  1513.   OR RUNCODE() = -1              !OR UNKNOWN ERROR
  1514.     SETHUE(13,0)              !     BRIGHT MAGENTA ON BLACK
  1515.     SHOW(25,1,'Press any key to return . . . ')
  1516.     SETHUE
  1517.     ASK                      !     PAUSE
  1518.   .
  1519.  
  1520.   CLOSE(RUN_SCR)               !RESTORE MAIN SCREEN
  1521.   SCR:MEM_LEFT = MEMORY(0)           !REDISPLAY MEMORY LEFT
  1522.  
  1523.   !─────────────────────────────────────────────────────────────────────────────
  1524.   ! DISPLAY ANY ERROR MESSAGE AFTER RETURNING TO THE MAIN SCREEN.
  1525.   ! NOTE THAT -2 IS NOT AN ERROR. -2 IS RETURNED FOR INTERNAL DOS COMMANDS
  1526.   ! WHICH DO NOT RETURN EXIT CODES.
  1527.   !─────────────────────────────────────────────────────────────────────────────
  1528.   IF RUNCODE() = -1
  1529.     SCR:MESSAGE = CENTER('COMMAND NOT EXECUTED',50)
  1530.   ELSIF RUNCODE() = -3
  1531.     SCR:MESSAGE = CENTER('COULDN''T FIND COMMAND.COM',50)
  1532.     BEEP
  1533.   ELSIF RUNCODE() = -4
  1534.     SCR:MESSAGE = CENTER('COULDN''T CREATE .TMP MEMORY IMAGE FILE',50)
  1535.     BEEP
  1536.   ELSIF RUNCODE() > 0
  1537.     SCR:MESSAGE = CENTER('PROGRAM ENDED WITH EXIT CODE OF ' & RUNCODE(),50)
  1538.   END!IF-ELSE
  1539.  
  1540.   RETURN
  1541.  
  1542.  
  1543. !╔═════════════════════════════════════════════════════════════════════════════╗
  1544. !║ FUNCTION TO VERIFY THE EXISTENCE OF THE GIF FILE. IF THE FILE IS NOT FOUND, ║
  1545. !║ IT MAY BRING UP A SCROLLING LIST OF THE FILES IN THE DIRECTORY.           ║
  1546. !║                                           ║
  1547. !║ RETURN CODE:                                       ║
  1548. !║   0 - FILE WAS SELECTED, RETURNED IN RETURNFILE GLOBAL VARIABLE           ║
  1549. !║   1 - NO FILE SELECTED - USER ESCAPED OFF OF SCROLLING TABLE               ║
  1550. !║   2 - NO FILES IN DIRECTORY                               ║
  1551. !║   3 - INVALID DIRECTORY                               ║
  1552. !╚═════════════════════════════════════════════════════════════════════════════╝
  1553. VERIFILE     FUNCTION
  1554.  
  1555. !───────────────────────────────────────────────────────────────────────────────
  1556. ! WINDOW FOR SCROLLING TABLE OF FILENAMES.
  1557. !───────────────────────────────────────────────────────────────────────────────
  1558. FILE_SCR     SCREEN      WINDOW(25,26),AT(1,53),PRE(SCT),HUE(12,1)
  1559.  OMIT('**-END-**')
  1560.                             █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
  1561.                             █       SELECT FILE         █
  1562.                             █────────────────────────█
  1563.                             █     ■■■■■■■■■■■■■■■     █
  1564.                             █       ■■■■■■■■ ■■■         █
  1565.                             █                 █
  1566.                             █                 █
  1567.                             █                 █
  1568.                             █                 █
  1569.                             █                 █
  1570.                             █                 █
  1571.                             █                 █
  1572.                             █                 █
  1573.                             █                 █
  1574.                             █                 █
  1575.                             █                 █
  1576.                             █                 █
  1577.                             █                 █
  1578.                             █                 █
  1579.                             █                 █
  1580.                             █                 █
  1581.                             █                 █
  1582.                             █────────────────────────█
  1583.                             █  Enter-View  F3-Cancel █
  1584.                             █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
  1585. **-END-**
  1586.  
  1587.            ROW(2,2)      PAINT(1,24),HUE(11,1)
  1588.            ROW(24,2)  PAINT(1,24),HUE(11,1)
  1589.            ROW(5,8)      PAINT(18,12),HUE(15,1)
  1590.            ROW(1,1)      STRING('█▀{24}█')
  1591.            ROW(2,1)      REPEAT(2),EVERY(22);STRING('█<0{24}>█') .
  1592.            ROW(3,1)      REPEAT(2),EVERY(20);STRING('█─{24}█') .
  1593.            ROW(4,1)      REPEAT(19);STRING('█<0{24}>█') .
  1594.            ROW(25,1)  STRING('█▄{24}█')
  1595.            ROW(2,8)      STRING('SELECT FILE')
  1596.            ROW(24,4)  STRING('Enter-View  F3-Cancel')
  1597. FILESPEC       ROW(4,6)      STRING(15),HUE(7,1)
  1598.               REPEAT(18),INDEX(TABNDX)
  1599.            ROW(5,7)        POINT(1,14),USE(?IPOINT),SEL(1,7)
  1600. NAME         COL(8)        STRING(8)
  1601. EXT         COL(17)    STRING(3)
  1602.          .          .
  1603.  
  1604. !───────────────────────────────────────────────────────────────────────────────
  1605. ! MEMORY TABLE AND LOCAL VARIABLES.
  1606. !───────────────────────────────────────────────────────────────────────────────
  1607. DIR_TABLE    TABLE,PRE(TAB)           !TABLE OF FILENAMES
  1608. NAME           STRING(8)           !  NAME
  1609. EXT           STRING(3)           !  EXTENSION
  1610.          END!TABLE
  1611.  
  1612. FULLGIFNAME  STRING(128)           !GIF FILENAME INCLUDING DRIVE:\PATH\
  1613.                        !  ALSO, THE FILE SPEC USED FOR DIR GET
  1614. FPATH         STRING(116)           !DRIVE:\PATH ONLY OF FULLGIFNAME
  1615. FOUND         BYTE               !1 IF GIF FILE FOUND
  1616. WILDCARD     BYTE               !1 IF GIF FILENAME CONTAINS '*' OR '?'
  1617. TABTOT         SHORT               !TOTAL FILES IN MEMORY TABLE
  1618. TABPOINTER   SHORT               !LAST FILE READ FROM MEMORY TABLE
  1619. TABNDX         BYTE               !REPEAT INDEX FOR SCROLLING TABLE
  1620. NUM_DISP     BYTE               !NO. OF RECORDS ON SCROLLING TABLE
  1621.  
  1622.  
  1623.   !─────────────────────────────────────────────────────────────────────────────
  1624.   ! CODE.
  1625.   !─────────────────────────────────────────────────────────────────────────────
  1626.   CODE
  1627.  
  1628.   FULLGIFNAME = FILFULLNAME(GIFNAME)   !GET COMPLETE FILENAME WITH DRIVE:\PATH
  1629.   FOUND = FILEXISTS(FULLGIFNAME)       !DOES FILE EXIST?
  1630.   IF ERRORCODE() = 3 AND GIFNAME       !IF BAD PATH (IF BLANK DEFAULT TO *.GIF)
  1631.     RETURN(3)                   !  RETURN ERROR CODE
  1632.   END!IF
  1633.  
  1634.   IF INSTRING('*',GIFNAME,1) |           !DOES FILE CONTAIN A WILDCARD?
  1635.   OR INSTRING('?',GIFNAME,1)
  1636.     WILDCARD = 1
  1637.   ELSE
  1638.     WILDCARD = 0
  1639.   END!IF-ELSE
  1640.  
  1641.   IF FOUND AND NOT WILDCARD           !IF SINGLE FILE WAS FOUND
  1642.     RETURNFILE = GIFNAME           !  DON'T DISPLAY FULL NAME
  1643.     RETURN(0)                   !  RETURN
  1644.   ELSIF NOT FOUND AND WILDCARD           !IF WILDCARD BUT NO FILES MATCHING SPEC
  1645.     RETURN(2)                   !  NO FILES IN GIVEN DIRECTORY
  1646.   END!IF-ELSE
  1647.  
  1648.   FPATH = FILDRIVE(FULLGIFNAME) & FILDIRECTORY(FULLGIFNAME)
  1649.   IF NOT FOUND AND NOT WILDCARD           !IF FILE NOT FOUND AND NO WILDCARD
  1650.     FULLGIFNAME = CLIP(FPATH) & '*.GIF'     !DISPLAY ALL GIF FILES IN DIRECTORY
  1651. ! ELSEIF FOUND AND WILDCARD           !IF WILDCARD
  1652. !   DO DIRECTORY               !  DEFAULT TO USER'S WILDCARD SPECS
  1653.   END!IF-ELSE
  1654.  
  1655.   DO DIRECTORY                   !DISPLAY SCROLLING TABLE OF FILES
  1656.  
  1657. !───────────────────────────────────────────────────────────────────────────────
  1658. ! DISPLAY SCROLLING LIST OF FILES. RETURN FULL NAME IF USER CHOOSES ONE OR
  1659. ! RETURN ERROR CODE OF 1 IF USER ABORTS.
  1660. !───────────────────────────────────────────────────────────────────────────────
  1661. DIRECTORY    ROUTINE
  1662.  
  1663.   !─────────────────────────────────────────────────────────────────────────────
  1664.   ! READ FILENAMES INTO MEMORY TABLE AND SORT.
  1665.   !─────────────────────────────────────────────────────────────────────────────
  1666.   DIRGROUP = DIRGETFIRST(FULLGIFNAME,6)!GET FIRST FILE IN DIRECTORY
  1667.   LOOP UNTIL ERRORCODE()           !READ THE REST OF THEM
  1668.     TAB:NAME = AKANAME               !  NAME
  1669.     TAB:EXT  = AKAEXT               !  EXTENSION
  1670.     ADD(DIR_TABLE)               !  ADD TO MEMORY TABLE
  1671.     DIRGROUP = DIRGETNEXT()           !  READ ANOTHER DIRECTORY ENTRY
  1672.   END!LOOP
  1673.   SORT(DIR_TABLE,TAB:NAME)           !SORT TABLE FIRST BY NAME
  1674.   SORT(DIR_TABLE,TAB:EXT)           !THEN BY EXTENSION
  1675.   TABTOT = RECORDS(DIR_TABLE)           !COUNT TOTAL RECORDS
  1676.   SHOW(2,12,MEMORY(0),@N7)           !REDISPLAY MEMORY AFTER TABLE IS FILLED
  1677.   IF NOT TABTOT                   !IF NO FILES FOR SOME REASON
  1678.     FREE(DIR_TABLE)               !  FREE MEMORY TABLE
  1679.     RETURN(2)                   !  RETURN ERROR CODE
  1680.   END!IF
  1681.  
  1682.   !─────────────────────────────────────────────────────────────────────────────
  1683.   ! DISPLAY TABLE.
  1684.   !─────────────────────────────────────────────────────────────────────────────
  1685.   ALERT
  1686.   ALERT(ESC_KEY)
  1687.   ALERT(F3_KEY)
  1688.  
  1689.   OPEN(FILE_SCR)               !OPEN WINDOW
  1690.   SCT:FILESPEC = CENTER('..\'&CLIP(FILNAME(FULLGIFNAME))&CLIP(FILEXTENSION(FULLGIFNAME)),15)
  1691.   TABPOINTER = 0               !SET TO FIRST ONE
  1692.   DO SHOWTAB                   !SHOW ONE SCREENFUL
  1693.   TABNDX = 1                   !HIGHLIGHT FIRST ENTRY
  1694.  
  1695.   !─────────────────────────────────────────────────────────────────────────────
  1696.   ! MAIN SCREEN LOOP.
  1697.   !─────────────────────────────────────────────────────────────────────────────
  1698.   LOOP
  1699.  
  1700.     ACCEPT
  1701.     K = KEYCODE()
  1702.  
  1703.     IF K = F3_KEY |
  1704.     OR K = ESC_KEY
  1705.       FREE(DIR_TABLE)               !CLEAR MEMORY TABLE
  1706.       CLOSE(FILE_SCR)               !CLOSE WINDOW
  1707.       RETURN(1)                   !TELL CALLER NO SELECTION MADE
  1708.     END!IF
  1709.  
  1710.     CASE FIELD()
  1711.  
  1712.     OF ?IPOINT
  1713.  
  1714.       !─────────────────────────────────────────────────────────────────────────
  1715.       ! PROCESS ACTION KEYS.
  1716.       !─────────────────────────────────────────────────────────────────────────
  1717.       CASE K
  1718.  
  1719.       OF ENTER_KEY               !ENTER: RETURN SELECTION
  1720.     RETURNFILE = CLIP(FPATH) & CLIP(SCT:NAME) & '.' & SCT:EXT
  1721.     FREE(DIR_TABLE)               !  CLEAR MEMORY TABLE
  1722.     CLOSE(FILE_SCR)               !  CLOSE WINDOW
  1723.     RETURN(0)               !  TELL CALLER SELECTION MADE
  1724.  
  1725.       OF UP_KEY                   !UP ARROW
  1726.     IF TABPOINTER - NUM_DISP <= 0  !  IF ALREADY ON FIRST ONE
  1727.       SELECT(?)               !    STAY HERE
  1728.     ELSE
  1729.       GET(DIR_TABLE, TABPOINTER - NUM_DISP)
  1730.       SCROLL(5,59,18,14,-1)
  1731.       SCT:NAME = TAB:NAME
  1732.       SCT:EXT  = TAB:EXT
  1733.       IF NUM_DISP < 18           !  IF LESS THAN A FULL SCREEN
  1734.         NUM_DISP += 1           !    INCREMENT TOTAL DISPLAYED
  1735.       ELSE                   !  ELSE
  1736.         TABPOINTER -= 1           !    RESET POINTER TO LAST ONE ON SCREEN
  1737.       END!IF-ELSE
  1738.     END!IF-ELSE
  1739.  
  1740.       OF DOWN_KEY               !DOWN ARROW
  1741.     IF TABPOINTER >= TABTOT           !  IF ALREADY ON LAST ONE
  1742.       SELECT(?)               !    STAY HERE
  1743.     ELSE                   !  ELSE
  1744.       TABPOINTER += 1           !    RESET POINTER TO LAST ONE ON SCREEN
  1745.       GET(DIR_TABLE, TABPOINTER)
  1746.       SCROLL(5,59,18,14,1)
  1747.       SCT:NAME = TAB:NAME
  1748.       SCT:EXT  = TAB:EXT
  1749.     END!IF-ELSE
  1750.  
  1751.       OF PGUP_KEY               !PAGE UP
  1752.     IF TABPOINTER <= 18           !  IF ALREADY ON FIRST ONE
  1753.       SELECT(?)               !    STAY HERE
  1754.     ELSE
  1755.       TABPOINTER -= (NUM_DISP + 18)
  1756.       IF TABPOINTER < 0
  1757.         TABPOINTER = 0
  1758.       END!IF
  1759.       DO SHOWTAB
  1760.     END!IF-ELSE
  1761.     TABNDX = 1               !  HIGHLIGHT FIRST ONE ON SCREEN
  1762.  
  1763.       OF PGDN_KEY               !PAGE DOWN
  1764.     IF TABPOINTER >= TABTOT           !  IF ALREADY ON LAST ONE
  1765.       SELECT(?)               !    STAY HERE
  1766.       TABNDX = NUM_DISP           !    HIGHLIGHT LAST ONE ON SCREEN
  1767.     ELSE                   !  ELSE
  1768.       DO SHOWTAB               !    DISPLAY NEXT PAGE
  1769.       TABNDX = 1               !    HIGHLIGHT FIRST ONE ON SCREEN
  1770.     END!IF-ELSE
  1771.  
  1772.       OF CTRL_PGUP               !CONTROL/PAGE UP
  1773.     TABPOINTER = 0
  1774.     DO SHOWTAB
  1775.     TABNDX = 1
  1776.  
  1777.       OF CTRL_PGDN               !CONTROL/PAGE DOWN
  1778.     TABPOINTER = TABTOT - 18
  1779.     IF TABPOINTER < 0
  1780.       TABPOINTER = 0
  1781.     END!IF
  1782.     DO SHOWTAB
  1783.     TABNDX = NUM_DISP
  1784.  
  1785.       END!CASE KEYCODE()
  1786.  
  1787.     END!CASE FIELD()
  1788.  
  1789.   END!SCREEN LOOP
  1790.  
  1791. !───────────────────────────────────────────────────────────────────────────────
  1792. ! DISPLAY (REDISPLAY) ONE SCREENFUL.
  1793. ! TABPOINTER MUST FIRST POINT TO THE ONE PREVIOUS TO THE ONE TO DISPLAY FIRST.
  1794. ! AFTERWARDS, TABPOINTER WILL POINT TO THE LAST ONE ON THE SCREEN.
  1795. !───────────────────────────────────────────────────────────────────────────────
  1796. SHOWTAB         ROUTINE
  1797.  
  1798.   LOOP TABNDX = 1 TO 18               !DISPLAY MAX OF 18 FILES
  1799.     IF TABPOINTER >= TABTOT           !BUT IF LAST ONE ALREADY READ
  1800.       BREAK                   !  BREAK OUT OF LOOP
  1801.     END!IF
  1802.     TABPOINTER += 1
  1803.     GET(DIR_TABLE,TABPOINTER)
  1804.     SCT:NAME = TAB:NAME
  1805.     SCT:EXT  = TAB:EXT
  1806.   END!LOOP
  1807.  
  1808.   NUM_DISP = TABNDX - 1               !TOTAL ON SCROLLING TABLE
  1809.  
  1810.   LOOP TABNDX = NUM_DISP + 1 TO 18     !IF SCROLLING TABLE IS NOT FULL
  1811.     CLEAR(SCT:NAME)               !  CLEAR REMAINING ENTRIES
  1812.     CLEAR(SCT:EXT)
  1813.   END!LOOP
  1814.  
  1815.   EXIT
  1816.