home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 December / VPR9712A.ISO / OLS / OS2 / FD2ET776 / FD2ET776.LZH / ET.CMD < prev    next >
OS/2 REXX Batch file  |  1995-10-03  |  111KB  |  2,718 lines

  1. /*****************************************************************
  2.  *                     Presented by Shumann                      *
  3.  *                                                               *
  4.  *    日本語版OS/2 全画面用ファイラ  FD/2 version 0.77 拡張版    *
  5.  *                 FD/2 version 0.77 exTension 0.6              *
  6.  *                                                               *
  7.  *               (C) Copyright 1994,1995 by Shumann              *
  8.  *                                                               *
  9.  *    ------------------------------------------------------     *
  10.  *               Original version FD/2 version 0.77              *
  11.  *   Copyright (C) 1992,1993 by Nob_Kozawa ALL RIGHTS RESERVED   *
  12.  *                                                             *
  13.  *****************************************************************/
  14.  /* Added Altair☆'s modification 1992/10/31 */
  15.  /* Added Mistral's modification 1994/11/28 & 12/10 */
  16.  
  17. VER = '0.6'; DATE = '(1995/10/03)'; TITLE = 'FD2eT' VER
  18. parse upper arg OPT1 with '/' OPT2 OPT3 .
  19. if OPT1 = '' then SPATH = OPT3
  20. else SPATH = OPT1
  21. if datatype(OPT2) = 'NUM' then '@MODE CO80' OPT2
  22. /* Setup */
  23. signal on SYNTAX                        /* Trap for debug */
  24. '@prompt'        /* HELP OFF */
  25. call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
  26. call SysLoadFuncs                           /* Load all rexx utilities */
  27. X = SysTextScreenSize(); ROW = subword(X,1,1); COL = subword(X,2,1)
  28. call SETPARM
  29. HIST. = ''; HIST.0 = 0; ALIST. = ''; AUNPK. = ''; CCLR. = ''
  30.  
  31. /*****************************/
  32. /* Configuration parameteres */
  33. /*****************************/
  34. /*   ROW = 20; COL = 60 */
  35.    EDITOR = 'E'
  36.    VIEWER = 'T2'
  37.    APACK  = 'LHA A'
  38.    ALIST.ZIP = 'UNZIP -v'
  39.    ALIST.LZH = 'LHA V'
  40.    ALIST.ZOO = 'ZOO l'
  41.    AUNPK.ZIP = 'UNZIP'
  42.    AUNPK.LZH = 'LHA X'
  43.    AUNPK.ZOO = 'ZOO x'
  44.    TREEFILE  = 'FD2eTREE.DAT'
  45.  
  46.    /* SET DISPlay Mode */
  47.    call SETDISPM 5         /* Choose 1, 2, 3 or 5 */
  48.  
  49.    /* COLOR SETUP */
  50.    /* format : CCLR.n = [H]ff[bb]              */
  51.    /*                    H  : High intensify   */
  52.    /*                    ff : foreground color */
  53.    /*                    bb : background color */
  54.    /* Colors : BK=BLACK RE=READ GR=GREEN YE=YELLOW BL=BLUE    */
  55.    /*          PU=PURPLE TU=TURQUOISE WH=WHITE RV=REVERSE     */
  56.    CCLR.0 = '1B'x||'[0m'                 /* No attribute */
  57.    CCLR.1 = HWHBL                        /* フレーム */
  58.    CCLR.2 = HYEBL                          /* 情報 */
  59.    CCLR.3 = HPUbl                        /* システムファイル */
  60.    CCLR.4 = HBLbl                        /* 隠しファイル */
  61.    CCLR.5 = HGRbl                        /* 読出し専用ファイル */
  62.    CCLR.6 = HTUbl                        /* ディレクトリ */
  63.    CCLR.13 = hpuPU                        /* システムファイル, 反転 */
  64.    CCLR.14 = hblBk                        /* 隠しファイル, 反転 */
  65.    CCLR.15 = hgrGR                        /* 読出し専用ファイル, 反転 */
  66.    CCLR.16 = htuTU                        /* ディレクトリ, 反転 */
  67.    CCLR.7 = HWHbl                          /* 通常ファイル */
  68.    CCLR.19 = blwh                          /* 通常ファイル, 反転 */
  69.    CCLR.8 = WHBL                         /* メッセージ */
  70.    CCLR.9 = BLWH                         /* 影 */
  71.    CCLR.10 = WHBL                        /* プロンプト */
  72.    CCLR.11 = BLWH                        /* Input area */
  73.    CCLR.12 = HWHTU                       /* 選択 */
  74.    CCLR.17 = HYEBL                       /* 見出し文字 */
  75.    CCLR.18 = TUBL                        /* ダイアログフレーム */
  76.    CCLR.20 = HREBL                       /* VOLUME */
  77.    CCLR.21 = HWHPU                       /* ドライブ切替名 */
  78.    CCLR.22 = HPUBL                       /* ヘルプ次頁 */
  79.    CCLR.23 = HTUBK
  80.    CCLR.24 = HTUBL
  81.    CCLR.25 = HGRBL
  82.    cclr.26 = tuwh
  83.    call SETCOLOR 26
  84. /***********************************************************/
  85.  
  86. ORIGINAL = directory()                      /* save original directory */
  87. CURRENT = directory(SPATH)                  /* change directory */
  88. CURRENT = directory()
  89. if right(CURRENT,2) <> ':\' then CURRENT = CURRENT||'\'
  90. call CLS                  /* Clear screen */
  91. call DISPFRAME            /* DISPlay FRAME */
  92. call TITLEDISP            /* TITLE display */
  93. call SysSleep 0
  94. call GETFILES             /* GET current directory FILES */
  95. call DISPFILE             /* DISPlay FILE field */
  96. call DISPINFO             /* DISPlay INFOmation field */
  97. SP = 0
  98. /* Main loop */
  99.   do forever
  100.     parse upper value right(FNAME.INR,4) with X '.' EXT
  101.     SAVFNAME = FNAME.INR; SAVNR = NR; SAVFST = FST; SAVDIR = CURRENT /* Save */
  102.     if EXT = 'CMD' | EXT = 'EXE' | EXT = 'COM' | EXT = 'BAT' then EXTT = 1
  103.     else EXTT = 0                       /* EXTT : 1 = executable, 0 = other */
  104. /* call SAYRC */
  105.     parse upper value sysgetkey('NOECHO') with CMD
  106.     select
  107.        when SP = 0 & CMD = 'E0'X then SP = 1      /* Extended key code */
  108.        when SP = 0 & CMD = '00'X then SP = 2      /* alt key code */
  109.  
  110.        when SP = 1 & CMD = '48'X  then do          /* UP ARROW */
  111.           SP = 0; NR = NR - 1
  112.           if NR < 1 | NR < FST then NR = FST + NX * NY - 1
  113.           if NR > FCOUNT then NR = FCOUNT
  114.           call DISPFILE 'X'
  115.           call DISPINFO 'X'
  116.        end  /* Do */
  117.  
  118.        when SP = 1 & CMD = '50'X then call DOWNARROW     /* DOWN ARROW */
  119.  
  120.        when SP = 1 & CMD = '4D'X then do           /* RIGHT ARROW */
  121.           NR = NR + NX; if NR >= FST + NX * NY then NR = NR - NX * NY
  122.           if NR > FCOUNT then NR = (NR - 1) // NX + FST
  123.           call DISPFILE 'X'; call DISPINFO 'X'; SP = 0
  124.        end  /* Do */
  125.  
  126.        when SP = 1 & CMD = '4B'X then do           /* LEFT ARROW */
  127.           NR = NR - NX; if NR < FST then NR = NR + NX * NY
  128.           if NR > FCOUNT then NR = NR - ((NR - FCOUNT - 1) % NX + 1) * NX
  129.           call DISPFILE 'X'; call DISPINFO 'X'; SP = 0
  130.        end  /* Do */
  131.  
  132.        when SP = 1 & CMD = '51'X then do           /* DOWN */
  133.           FST = FST + NX * NY; if FST > FCOUNT then FST = FST - NX * NY
  134.           NR = FST; SP = 0
  135.           call DISPFILE; call DISPINFO
  136.        end  /* Do */
  137.  
  138.        when SP = 1 & CMD = '49'X then do           /* UP */
  139.           FST = FST - NX * NY; if FST < 1 then FST = 1
  140.           SP = 0; NR = FST
  141.           call DISPFILE; call DISPINFO
  142.        end  /* Do */
  143.  
  144.        when SP = 2 & CMD = '3B'X then do          /* Help */
  145.           call SETHELP 'MAIN'; call DISPHELP
  146.           call DISPFILE
  147.           SP = 0
  148.        end  /* Do */
  149.  
  150.          when SP = 0 & (CMD = '2C'X | CMD = '<') then do      /* Go Top File */
  151.             FST = FST ; if FST > FCOUNT  then FST = FST - NX * NY
  152.           SP = 0; NR = FST
  153.           call DISPFILE; call DISPINFO
  154.        end      /* Do */
  155.  
  156.         when SP = 0 &( CMD = '2E'X | CMD = '>') then do       /* Go End File */
  157.           SP = 0; NR = NR - 90
  158.           if NR < 1 | NR < FST then NR = FST + NX * NY - 1
  159.           if NR > FCOUNT then NR = FCOUNT
  160.           call DISPFILE 'X'
  161.           call DISPINFO 'X'
  162.      end     /* do */
  163.  
  164.         when SP = 0 & (CMD = '51'X | CMD = 'Q') then do  /* Quick Quit */
  165.         call GOTOXY ROW 1; X = charout(,'1b'x||'[0m')
  166.       if CMD = 'Q' then X = directory(ORIGINAL)
  167.       '@prompt $i[$p]'
  168.       exit
  169.      end
  170.  
  171.        when SP = 0 & (CMD = '1B'X | CMD = 'Esc') then do  /* QUIT */
  172.          call M_QUIT; QUITRC = result
  173.          if QUITRC = 'Q' | QUITRC = 'Y' then leave
  174.          call DISPFILE
  175.        end
  176.  
  177.        when SP = 0 & CMD = 'L' then do            /* LOG DRIVE */
  178.           call M_LOGDRIVE
  179.           if result = '0D'X then do   /* CR was pressed */
  180.           push 'ディレクトリ読込中'
  181.           call RUNMSG; call GETFILES; call DISPFILE; call DISPINFO
  182.           end
  183.           else do                  /* ESC キー was pressed */
  184.              call DISPFILE ; call DISPINFO
  185.           end  /* Do */
  186.        end
  187.  
  188.        when SP = 0 & (CMD = '08'X | CMD = '\') then do   /* BS : CD ..*/
  189.           if substr(CURRENT,2) <> ':\' then do           /* \  : CD \ */
  190.             if CMD = '\' then                    /* Altair☆'s special */
  191.                CURRENT = directory('\')          /* Altair☆'s special */
  192.             else
  193.                CURRENT = directory('..')
  194.             CURRENT = directory()
  195.             if right(CURRENT,2) <> ':\' then CURRENT = CURRENT||'\'
  196.             push 'ディレクトリ読込中'
  197.            call RUNMSG; call GETFILES; call DISPFILE; call DISPINFO
  198.           end
  199.        end  /* Do */
  200.  
  201.        when SP = 0 & CMD = 'X' then do          /* COMMAND */
  202.           push
  203.           call CMDEXECM; KEY = result; parse pull XCMD; XCMD = strip(XCMD)
  204.           if KEY <> '1B'X then do
  205.             XX = charout(,'1b'x||'[0m'); call CLS   /* Clear attribute */
  206.             call syscurstate 'ON'
  207.             if strip(XCMD) <> '' then do
  208.                say
  209.                '@CMD /C' XCMD
  210.                say 'RC =' RC
  211.                XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  212.             end
  213.             else do
  214.                say; say ' "EXIT" と入力すると FD2eT の画面に戻ります.'
  215.                '@CMD'
  216.             end  /* Do */
  217.             call GETDISP
  218.           end
  219.           else do
  220.             call DISPFILE
  221.           end
  222.        end  /* Do */
  223.  
  224.        when SP = 0 & CMD = 'K' then do       /* Make DIR */
  225.     push '';push 'Esc:中断'
  226.     push '新しいディレクトリ名を指定してください.'
  227.     push 'ディレクトリの作成'
  228.     push ' '
  229.            push '   '; push ''
  230.            call MSGANDGET 2
  231.            parse pull RES
  232.            if result <> '1B'X then do
  233.               XX = charout(,CCLR.24);                  /* Add by Shumann */
  234.              call CLS
  235.              'MD' FILENAME(RES)
  236.              if RC <> 0 then do
  237.                 say ' エラー発生 !    RC =' RC
  238.                 XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  239.              end  /* Do */
  240.              call GETDISP
  241.            end
  242.            else do
  243.               call DISPFILE
  244.            end  /* Do */
  245.        end  /* Do */
  246.  
  247.     when SP = 0 & CMD = 'H' then do       /* Undelete */
  248.     push '指定形式 ドライブ→X:/ディレクトリ→X '
  249.     push '       Esc:中断        Enterのみで現カレント全ディレクトリ解除'
  250.     push '解除先(ドライブ/ディレクトリ)を指定してください.'
  251.     push '削除ファイルの解除呼出し'
  252.     push '現カレント:'
  253.            push CURRENT; push ''
  254.            call MSGANDGET 2
  255.            parse pull RES
  256.            if result <> '1B'X then do
  257.               XX = charout(,CCLR.24);call CLS         /* Add by Shumann */
  258.            if RES = '' then 'UNDELETE' FILENAME(RES)'/s'
  259.             else 'UNDELETE' FILENAME(RES)'\*.* /s'
  260.            XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  261.             if RC <> 0 then do
  262.                 say ' エラー発生 !    RC =' RC
  263.                 XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  264.              end  /* Do */
  265.              call GETDISP
  266.            end
  267.            else do
  268.               call DISPFILE
  269.            end  /* Do */
  270.        end  /* Do */
  271.  
  272.        when SP = 0 & CMD = 'S' then call M_SORT     /* Tree */
  273.  
  274.        when SP = 0 & CMD = 'T' then call M_TREE     /* Tree */
  275.  
  276.        when FCOUNT = 0 then do                      /* No files */
  277.           SP = 0; iterate
  278.        end  /* Do */
  279.  
  280.        /* If no files, dose not reach bellow. */
  281.  
  282.        when SP = 0 & (CMD >= 1 & CMD <= 3 | CMD = 5) then do  /* DISPMODE */
  283.          if DISPMODE <> CMD then do
  284.            call SETDISPM CMD
  285.            NR = 1; FST = 1
  286.            call DISPFILE; call DISPINFO 'X'
  287.          end
  288.        end  /* Do */
  289.  
  290.        when SP = 0 & CMD = ' ' then do              /* SPACE : mark */
  291.           if substr(ATTR.INR,2,1) <> 'D' then do
  292.              if MASK.INR = ' ' then do
  293.                 MASK.INR = '*'; MCOUNT = MCOUNT + 1
  294.                 MBYTES = MBYTES + BYTES.INR
  295.              end  /* Do */
  296.              else do
  297.                 MASK.INR = ' '; MCOUNT = MCOUNT - 1
  298.                 MBYTES = MBYTES - BYTES.INR
  299.              end  /* Do */
  300.           end  /* Do */
  301.           call DOWNARROW
  302.        end  /* Do */
  303.  
  304.        when SP = 1 & CMD = '47'X then do            /* HOME */
  305.           SP = 0
  306.           if MCOUNT = 0 then do
  307.              MCOUNT = 0; MBYTES = 0    /* mark all */
  308.              do I = 1 to FCOUNT
  309.                if substr(ATTR.I,2,1) <> 'D' then do
  310.                  MASK.I = '*'; MCOUNT = MCOUNT + 1
  311.                  MBYTES = MBYTES + BYTES.I
  312.                end  /* Do */
  313.              end /* do */
  314.           end
  315.           else do
  316.              MCOUNT = 0; MBYTES = 0   /* unmark all */
  317.              do I = 1 to FCOUNT
  318.                 MASK.I = ' '
  319.              end /* do */
  320.           end  /* Do */
  321.           call DISPFILE; call DISPINFO
  322.        end  /* Do */
  323.  
  324.        when SP = 1 & CMD = '4F'X then do   /* END:mark invert */
  325.           SP = 0
  326.           MCOUNT = 0; MBYTES = 0
  327.           do I = 1 to FCOUNT
  328.              if substr(ATTR.I,2,1) <> 'D' then do
  329.                 if MASK.I = ' ' then do
  330.                   MASK.I = '*'; MCOUNT = MCOUNT + 1
  331.                   MBYTES = MBYTES + BYTES.I
  332.                 end
  333.                 else do
  334.                   MASK.I = ' '
  335.                 end  /* Do */
  336.              end  /* Do */
  337.           end /* do */
  338.           call DISPFILE; call DISPINFO
  339.        end  /* Do */
  340.  
  341.        when SP = 0 & CMD = 'N' then do            /* Rename */
  342.     push '';push 'Esc:中断'
  343.     push '新しい名前を指定してください.'
  344.     push 'ファイル/ディレクトリの名前変更'
  345.     push '変更元:'
  346.           push FNAME.INR; push FNAME.INR
  347.           call MSGANDGET 2; parse pull NEWNAME; KEY = result
  348.           if KEY <> '1B'X then do
  349.               XX = charout(,CCLR.24);                  /* Add by Shumann */
  350.              call CLS
  351.              'RENAME' FILENAME(FNAME.INR) FILENAME(NEWNAME)
  352.              if RC <> 0 then do
  353.                 say ' エラー発生 !    RC =' RC
  354.                 XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  355.              end  /* Do */
  356.               XX = charout(,CCLR.24);                  /* Add by Shumann */
  357.               push 'ディレクトリ読込中'
  358.              call CLS;  call DISPFRAME; call RUNMSG; call GETFILES
  359.              NR = SAVNR; FST = SAVFST         /* restore entry# */
  360.           end  /* Do */
  361.           else do
  362.            XX = charout(,CCLR.24);                  /* Add by Shumann */
  363.           call CLS ;  call DISPFRAME
  364.           end
  365.           call DISPFILE; call DISPINFO
  366.        end
  367.  
  368.        when SP = 0 & ((CMD = '0A'X & EXTT = 1) | CMD = 'R') then do
  369.           push FILENAME(FNAME.INR)                                  /* Execute */
  370.           call CMDEXEC; KEY = result; parse pull XCMD; XCMD = strip(XCMD)
  371.           if left(XCMD,1) = '"' then XCMD = '"'XCMD'"'
  372.           if KEY <> '1B'X then do
  373.             call syscurstate 'ON'
  374.             XX = charout(,'1B'X||'[0m'); call CLS
  375.             say XCMD
  376.             '@CMD /C' XCMD
  377.             say 'RC =' RC
  378.             XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  379.             call GETDISP
  380.           end
  381.           else call DISPFILE
  382.        end  /* Do */
  383.  
  384.        when SP = 0 & ((CMD = '0A'X & EXTT = 0) | CMD = 'E') then do
  385.          push '処理中'
  386.           call RUNMSG
  387.           '@'||EDITOR FILENAME(FNAME.INR)                    /* EDIT */
  388.           if RC <> 0 then do
  389.              say ' エラー発生 !    RC =' RC
  390.              XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  391.           end  /* Do */
  392.            XX = charout(,CCLR.24);       /* add by Shumann */
  393.           call CLS
  394.           call DISPFRAME
  395.           call DISPFILE
  396.           call DISPINFO
  397.        end
  398.  
  399.         when SP = 2 then do                    /* ALT+  */ /* Altとの連動 */
  400.             SP = 0; D = c2x(CMD); A = ALTT.D   /* ALT code -> Alpha. */
  401.             if A = 'F' then call M_FINDMARK    /* Alt + F */
  402.             if A = 'C' then call M_CP          /* Alt + C */
  403.             if A = 'D' then call M_D          /* Alt + D */
  404.             if XX = A then leave
  405.         end /* do */
  406.  
  407.        when SP = 0 & CMD = 'V' then call BROWSE FNAME.NR   /* ファイルの閲覧 */
  408.        when SP = 0 & CMD = 'P' then call M_PACK            /* ファイルの圧縮 */
  409.        when SP = 0 & CMD = 'U' then call M_UNPACK          /* ファイルの解凍 */
  410.        when SP = 0 & CMD = 'C' then call M_COPY            /* 複写 */
  411.        when SP = 0 & CMD = 'M' then call M_MOVE            /* 移動 */
  412.        when SP = 0 & CMD = 'D' then call M_DEL             /* 削除 */
  413.        when SP = 0 & CMD = 'F' then call M_FIND            /* 検索 */
  414.        when SP = 0 & CMD = 'A' then call M_ATTRIB          /* ファイル属性の変更 */
  415.        when SP = 0 & CMD = '0D'X then call M_CR            /* CR */
  416.  
  417.        otherwise do                                /* Undefined key */
  418.          call GOTOXY 1 2       /* Display undefined key (for debug) */
  419.          select
  420.             when SP = 1 then X = charout(,'1B'X||'[31m')
  421.             when SP = 2 then X = charout(,'1B'X||'[33m')
  422.             otherwise X = charout(,'1B'X||'[37m')
  423.          end
  424.          CC = c2x(CMD); XX = charout(,CC); SP = 0
  425.        end
  426.  
  427.     end  /* select */
  428.   end /* do */
  429. /* End of main loop */
  430.  
  431. /* Ending code */
  432. call GOTOXY ROW 1; X = charout(,'1b'x||'[0m')
  433. if QUITRC = 'Y' then X = directory(ORIGINAL) /* restore original directory */
  434. call syscurstate 'ON'
  435. '@prompt $i[$p]'       /* help on */
  436. exit
  437.  
  438. SYNTAX:                                       /* Syntax error trap */
  439.   say ' エラー発生 !    RC:' RC 'SIGL=' SIGL
  440.   say sourceline(SIGL)
  441.   say errortext(RC)
  442.   trace ?R; nop
  443. exit
  444. /****************************/
  445. /*       Subroutines        */
  446. /****************************/
  447.  
  448. SAYRC:
  449.   call GOTOXY 1 5; XX = charout(,RC)
  450. return
  451.  
  452. M_QUIT: procedure expose ROW COL CCLR. CUL CH CUR CLL CLR CV
  453.   X = ((ROW - 3) % 2) + 5 ; Y = (COL-40) % 2
  454.   C1 = CCLR.12; C2 = CCLR.1; C3 = CCLR.1; SP = 0
  455.     call GOTOXY X-3 Y
  456.     XX = charout(,CCLR.18||CUL||copies(CH,39)||CUR)
  457.     call GOTOXY X-2 Y
  458.     XX = charout(,CCLR.18||CV||center('',39)||CV||CCLR.9||' ')
  459.     call GOTOXY X-1 Y
  460.     XX = charout(,CCLR.18||CV left('',6)CCLR.20 center('∬',2)CCLR.25||,
  461.          center('FD',2)CCLR.17||center('2',1)CCLR.1||center('eT',2)CCLR.17,
  462.          center('を終了しますか ?',16)||CCLR.18 center('',6)||CV||CCLR.9||' ')
  463.     call GOTOXY X Y
  464.     XX = charout(,CCLR.18||CV center('',38)||CV||CCLR.9||' ')
  465.   do forever
  466.     call GOTOXY X+1 Y
  467.     XX = charout(,CCLR.18||CV CCLR.1 center('',7) C1 center('Y:はい',6) CCLR.18 right('',1),
  468.          C2 center('N:いいえ',8)CCLR.18 center('',7)||CCLR.18 CV||CCLR.9||' ')
  469.     call GOTOXY X+2 Y
  470.     XX = charout(,CCLR.18||CV CCLR.1 center(' ',36)|| CCLR.18 CV||CCLR.9||' ')
  471.     call GOTOXY X+3 Y
  472.     XX = charout(,CCLR.18||CLL||copies(CH,39)||CLR||CCLR.9||' ')
  473.     call GOTOXY X+4 Y+1; XX = charout(,CCLR.9||center('',41))
  474.     parse upper value sysgetkey('NOECHO') with KK
  475.     select
  476.       when KK = 'E0'X then SP = 1
  477.       when SP = 0 & (KK = 'Y' | KK = 'N')  then leave
  478.       when KK = '00'X then XX = sysgetkey('NOECHO')  /* discard */
  479.       when SP = 1 & (KK= '4D'X | KK = '4B'X) then do /* RIGHT ARROW */
  480.          SP = 0; TEMP = C1; C1 = C2; C2 = TEMP
  481.       end  /* Do */
  482.       when SP = 1 & (KK = '4B'X | KK = '4D'X) then do /* LEFT ARROW */
  483.          SP = 0; TEMP = C2; C2 = C1; C1 = TEMP
  484.       end  /* Do */
  485.       when SP = 0 & KK = '0D'X then do
  486.          if C1 = CCLR.12 then KK = 'Y'
  487.          else KK = 'N'
  488.          leave
  489.       end  /* Do */
  490.       when SP = 0 & KK = '1B'X then leave
  491.       otherwise nop
  492.     end
  493.     if KK = 'Y' | KK = 'N' | KK = '1B'X then leave
  494.   end
  495.   if KK <> 'Y' then KK = '1B'X
  496. return KK
  497.  
  498. M_LOGDRIVE: procedure expose CURRENT ROW COL CUR CUL CV CH CLL CLR CCLR.
  499.   LL = length(MSG)
  500.   X = ((ROW - 3) % 2) + 5 ; Y = (COL - LL - 32) % 2
  501.   C1 = CCLR.1 ; C2 = CCLR.18 ; C3 = CCLR.9 ; C4 = CCLR.0
  502.   C5 = CCLR.17 ; C6 = CCLR.11
  503.   KK = left(CURRENT,1)
  504.   call GOTOXY X-2 Y
  505.   XX = charout(,CCLR.18||CUL||copies(CH,LL+6)||CCLR.20||right('∬',2)CCLR.17||right('ドライブの変更',14) CCLR.18||,
  506.                 COPIES(CH,LL+6)||CUR)
  507.   call GOTOXY X-1 Y
  508.   XX = charout(,CCLR.18||CV center('',LL+30) CV||CCLR.9||' ')
  509.   call GOTOXY X Y
  510.   XX = charout(,CCLR.18||CV CCLR.1 right('ドライブ名を指定してください:',LL+26) CCLR.21||KK||,
  511.                 CCLR.18||'  '||CV||CCLR.9||' ')
  512.   call GOTOXY X+1 Y
  513.   XX = charout(,CCLR.18||CV CCLR.10||center('',LL+30)CCLR.18 CV||CCLR.9||' ')
  514.   call GOTOXY X+2 Y
  515.   XX = charout(,CCLR.18||CLL||copies(CH,LL+32)||CLR||CCLR.9||' ')
  516.   call GOTOXY X+3 Y+1; XX = charout(,CCLR.9||center('',LL+34))
  517.   do until KEY = '0D'X | KEY = '1B'X
  518.     D = KEY
  519.     call GOTOXY X Y+33; Z = charout(,CCLR.21)
  520.     parse upper value sysgetkey('NOECHO') with KEY
  521.     if 'A' <= KEY & KEY <= 'Z' then Z = charout(,KEY)
  522.   end /* do */
  523.     if KEY = '0D'X then do   /* CR was pressed */
  524.     CURRENT = directory(D||':')
  525.     if CURRENT = '' then CURRENT = directory()   /* Maybe failed */
  526.     if right(CURRENT,2) <> ':\' then CURRENT = CURRENT||'\'
  527.   end
  528. return KEY
  529.  
  530. M_PACK:
  531.     push '';push 'Esc:中断'
  532.     push '圧縮ファイル名(およびドライブ/ディレクトリ)を指定してください.'
  533.     push 'ファイルの圧縮'
  534.     push '圧縮元:'
  535.   if MCOUNT = 0 then
  536.     push FNAME.INR
  537.   else
  538.     push '* でマークされたファイル'; push ''
  539.   call MSGANDGET 2
  540.   parse pull RES; RES = strip(RES)
  541.   if result <> '1B'X then do
  542.       XX = charout(,CCLR.24);       /* add by Shumann */
  543.      call CLS
  544.      if MCOUNT = 0 then do
  545.         APACK FILENAME(RES) FILENAME(FNAME.INR)
  546.         if RC <> 0 then do
  547.            say ' エラー発生 !    RC =' RC
  548.            XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  549.         end  /* Do */
  550.         call GETDISP
  551.      end
  552.      else do
  553.        FILES = ''
  554.        do I = 1 to FCOUNT
  555.          II = FIDX.I
  556.          if MASK.II = '*' then FILES = FILES FILENAME(FNAME.II)
  557.          if words(FILES) > 4 then do
  558.            APACK FILENAME(RES) FILES
  559.            if RC <> 0 then do
  560.               say ' エラー発生 !    RC =' RC
  561.               XX = charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  562.               pull XX
  563.               if XX = 'Q' | XX = 'QUIT' then leave
  564.            end  /* Do */
  565.            FILES = ''
  566.          end  /* Do */
  567.       end /* do */
  568.        if FILES <> '' then APACK FILENAME(RES) FILES
  569.        call GETDISP
  570.      end  /* Do */
  571.   end
  572.   else do
  573.      call DISPFILE; call DISPINFO
  574.   end
  575. return
  576.  
  577. M_UNPACK:
  578.     push '';push '       Esc:中断            Ctrl+Enter:ツリー表示⇒実行  '
  579.     push '解凍先(ドライブ/ディレクトリ)を指定してください.'
  580.     push 'ファイルの解凍'
  581.     push '解凍元:'
  582.   if AUNPK.EXT <> '' then do
  583.     if EXT = 'ZOO' then do
  584.        RES = ''; result = 99
  585.     end  /* Do */
  586.     else do
  587.       push FNAME.INR ; push ''
  588.       call MSGANDGET 2
  589.       parse pull RES; RES = strip(RES)
  590.       if result = '0A'x then do
  591.          call TREEMODE RES
  592.          RES = NEWDIR
  593.       end  /* Do */
  594.     end
  595.     if result <> '1B'X then do
  596.        XX = charout(,CCLR.24);                  /* Add by Shumann */
  597.       call CLS
  598.       if RES = '' then AUNPK.EXT FILENAME(FNAME.INR)
  599.       else AUNPK.EXT FILENAME(FNAME.INR) FILENAME(RES)
  600.       if result <> '1B'X then                          /* add by Shumann */
  601.       AUNPK.EXT FILENAME(FNAME.INR) '-d' FILENAME(RES) /* add by Shumann */
  602.       if RC <> 0 then do
  603.          say ' エラー発生 !    RC =' RC
  604.          XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  605.       end  /* Do */
  606.       call GETDISP
  607.     end
  608.     else do
  609.        call DISPFILE
  610.     end  /* Do */
  611.   end  /* Do */
  612. return
  613.  
  614. M_COPY:
  615.     push '';push '       Esc:中断             Enter:ツリー表示⇒実行  '
  616.     push '複写先(ドライブ/ディレクトリ/ファイル)を指定してください.'
  617.     push 'ファイルの複写'
  618.     push '複写元:'
  619.   if MCOUNT = 0 then                   /* marked ? */
  620.     push FNAME.INR
  621.   else
  622.     push ' * でマークされたファイル' ; push ''
  623.   call MSGANDGET 2
  624.   parse pull RES; RES = strip(RES)
  625.   if (result <> '1B'X & RES = '') | result = '0A'x then do
  626.      call TREEMODE RES
  627.      RES = NEWDIR
  628.   end  /* Do */
  629.   if result <> '1B'X then do          /* Canceled ? */
  630.        XX = charout(,CCLR.24);       /* add by Shumann */
  631.      call CLS
  632.      if MCOUNT = 0 then do            /* Current file */
  633.         'COPY' FILENAME(FNAME.INR) FILENAME(RES)
  634.         if RC <> 0 then do
  635.            say ' エラー発生 !    RC =' RC
  636.            XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  637.         end  /* Do */
  638.         call GETDISP
  639.      end
  640.      else do                          /* Marked files */
  641.         do I = 1 to FCOUNT
  642.            II = FIDX.I
  643.            if MASK.II = '*' then do
  644.               'COPY' FILENAME(FNAME.II) FILENAME(RES)
  645.               if RC <> 0 then do
  646.                  say ' エラー発生 !    RC =' RC
  647.                  XX=charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  648.                  pull XX
  649.                  if XX = 'Q' | XX = 'QUIT' then leave
  650.               end  /* Do */
  651.            end  /* Do */
  652.         end /* do */
  653.         call GETDISP
  654.      end  /* Do */
  655.    end
  656.     else do
  657.       call DISPFILE; call DISPINFO
  658.     end
  659. return
  660.  
  661. M_CP:
  662.     push '';push '       Esc:中断             Enter:ツリー表示⇒実行  '
  663.     push '複写先(ドライブ/ディレクトリ/ファイル)を指定してください.'
  664.     push 'ファイル/ディレクトリの複写'
  665.     push '複写元:'
  666.   if MCOUNT = 0 then                   /* marked ? */
  667.     push FNAME.INR
  668.   else
  669.     push ' * でマークされたファイル' ; push ''
  670.   call MSGANDGET 2
  671.   parse pull RES; RES = strip(RES)
  672.   if (result <> '1B'X & RES = '') | result = '0A'x then do
  673.      call TREEMODE RES
  674.      RES = NEWDIR
  675.   end  /* Do */
  676.   if result <> '1B'X then do          /* Canceled ? */
  677.        XX = charout(,CCLR.24);       /* add by Shumann */
  678.      call CLS
  679.      if MCOUNT = 0 then do            /* Current file */
  680.         'CP -R' FILENAME(FNAME.INR) FILENAME(RES)
  681.         if RC <> 0 then do
  682.            say ' エラー発生 !    RC =' RC
  683.            XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  684.         end  /* Do */
  685.         call GETDISP
  686.      end
  687.      else do                          /* Marked files */
  688.         do I = 1 to FCOUNT
  689.            II = FIDX.I
  690.            if MASK.II = '*' then do
  691.               'CP -R' FILENAME(FNAME.II) FILENAME(RES)
  692.               if RC <> 0 then do
  693.                  say ' エラー発生 !    RC =' RC
  694.                  XX=charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  695.                  pull XX
  696.                  if XX = 'Q' | XX = 'QUIT' then leave
  697.               end  /* Do */
  698.            end  /* Do */
  699.         end /* do */
  700.         call GETDISP
  701.      end  /* Do */
  702.    end
  703.     else do
  704.       call DISPFILE; call DISPINFO
  705.     end
  706. return
  707.  
  708. M_MOVE:
  709.     push '';push '       Esc:中断             Enter:ツリー表示⇒実行  '
  710.     push '移動先(ドライブ/ディレクトリ/ファイル)を指定してください.'
  711.     push 'ファイル/ディレクトリの移動'
  712.     push '移動元:'
  713.   if MCOUNT = 0 then                          /* Marked ? */
  714.     push FNAME.INR
  715.   else
  716.     push '* でマークされたファイル'; push ''
  717.   call MSGANDGET 2
  718.   pull RES; RES = strip(RES)
  719.   if (result <> '1B'X & RES = '') | result = '0A'x then do
  720.      call TREEMODE RES
  721.      RES = NEWDIR
  722.   end  /* Do */
  723.   if result<>'1B'X then do
  724.      if substr(RES,2,1)=':' & left(CURRENT,2)<>left(RES,2) then call MOVE2
  725.      else call MOVE1
  726.   end
  727.   else do
  728.      call DISPFILE; call DISPINFO
  729.   end
  730. return
  731.  
  732. MOVE1:                          /* Move files */
  733.     push 'Y:はい' ;push 'N:いいえ'
  734.     push '移動元のファイルを削除しますか ?'; push '移動元:'
  735.     push '';push '       Esc:中断             Enter:ツリー表示⇒実行  '
  736.     push '移動先(ドライブ/ディレクトリ/ファイル)を指定してください.'
  737.     push 'ファイル/ディレクトリの移動'
  738.     push '移動元:'
  739.    XX = charout(,CCLR.24);                               /* Add by Shumann */
  740.    call CLS
  741.    if substr(RES,2,1) = ':' then RES = substr(RES,3)        /* Remove drv */
  742.    if right(RES,1) = '\' then RES = left(RES,length(RES)-1) /* RMV right\ */
  743.    if length(RES) = 0 then RES = '\'                        /* Root */
  744.    if MCOUNT = 0 then do              /* Current file */
  745.       'MOVE' FILENAME(FNAME.INR) FILENAME(RES)
  746.       if RC <> 0 then do
  747.          say ' エラー発生 !    RC =' RC
  748.          XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  749.       end  /* Do */
  750.    end
  751.    else do                            /* Marked files */
  752.       do I = 1 to FCOUNT
  753.          II = FIDX.I
  754.          if MASK.II = '*' then do
  755.             'MOVE' FILENAME(FNAME.II) FILENAME(RES)
  756.             if RC <> 0 then do
  757.                say ' エラー発生 !    RC =' RC
  758.                XX=charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  759.                pull XX
  760.                if XX = 'Q' | XX = 'QUIT' then leave
  761.             end  /* Do */
  762.          end  /* Do */
  763.       end /* do */
  764.    end  /* Do */
  765.        XX = charout(,CCLR.23);       /* add by Shumann */
  766.    call GETDISP
  767. return
  768.  
  769. MOVE2:                                     /* Copy & delete */
  770.     push 'Y:はい'; push 'N:いいえ'
  771.     push '移動元のファイルを削除しますか ?'; push '移動元:'
  772.     push '';push '       Esc:中断             Enter:ツリー表示⇒実行  '
  773.     push '移動先(ドライブ/ディレクトリ/ファイル)を指定してください.'
  774.     push 'ファイル/ディレクトリの移動'
  775.     push '移動元:'
  776.    XX = charout(,CCLR.24);       /* add by Shumann */
  777.    call CLS
  778.    if MCOUNT = 0 then do              /* Current file */
  779.       'CP -R' FILENAME(FNAME.INR) FILENAME(RES)
  780.       if RC <> 0 then do
  781.          say ' エラー発生 !    RC =' RC
  782.          XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  783.       end  /* Do */
  784.       else do
  785.          call DISPFRAME; call DISPFILE; call DISPINFO
  786.          push FNAME.INR
  787.          call MSGANDYN
  788.          if result <> '1B'x then do
  789.              XX = charout(,CCLR.24);       /* add by Shumann */
  790.             call CLS
  791.             'RM -R' FILENAME(FNAME.INR)
  792.             if RC <> 0 then do
  793.                say ' エラー発生 !    RC =' RC
  794.                XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  795.             end  /* Do */
  796.          end  /* Do */
  797.       end  /* Do */
  798.               XX = charout(,CCLR.24);                  /* Add by Shumann */
  799.       call GETDISP
  800.    end
  801.    else do                            /* Marked files */
  802.      COPIED. = ''
  803.      do I = 1 to FCOUNT
  804.         II = FIDX.I
  805.         if MASK.II = '*' then do
  806.            'CP' FILENAME(FNAME.II) FILENAME(RES)
  807.            if RC <> 0 then do
  808.               say ' エラー発生 !    RC =' RC
  809.               XX = charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  810.               pull XX
  811.               if XX = 'Q' | XX = 'QUIT' then leave
  812.               COPIED.II = ''
  813.            end  /* Do */
  814.            else COPIED.II = '*'
  815.         end  /* Do */
  816.      end /* do */
  817.      call DISPFRAME; call DISPFILE; call DISPINFO
  818.      push FNAME.INR
  819.      call MSGANDYN
  820.      if result <> '1B'x then do
  821.        XX = charout(,CCLR.24);       /* add by Shumann */
  822.         call CLS
  823.         do I = 1 to FCOUNT
  824.            II = FIDX.I
  825.            if COPIED.II = '*' then do
  826.               'RM -R' FILENAME(FNAME.II)
  827.               if RC <> 0 then do
  828.                 say ' エラー発生 !    RC =' RC
  829.                 XX=charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  830.                 pull XX
  831.                 if XX = 'Q' | XX = 'QUIT' then leave
  832.               end  /* Do */
  833.            end  /* Do */
  834.         end /* do */
  835.      end  /* Do */
  836.               XX = charout(,CCLR.24);                  /* Add by Shumann */
  837.      call GETDISP
  838.    end  /* Do */
  839. return
  840.  
  841. M_DEL:
  842.       push 'Y:する'; push 'N:しない'
  843.       push '通常ファイル/ディレクトリの削除'; push '削除元:'
  844.       push ''; push ''; push '' ;push ''; push ''
  845.     if MCOUNT = 0 then do          /* Marked ? */
  846.     if substr(ATTR.INR,2,1) = 'D' then do
  847.       push FNAME.INR
  848.       call MSGANDYN
  849.       if result <> '1B'X then do
  850.         XX = charout(,CCLR.24);                  /* Add by Shumann */
  851.          call DELDIR ATTR.INR FNAME.INR
  852.          if result = 0 then call GETDISP
  853.          else do
  854.          XX = charout(,CCLR.24);                  /* Add by Shumann */
  855.             call CLS; call DISPFRAME; call DISPFILE; call DISPINFO
  856.          end  /* Do */
  857.       end  /* Do */
  858.       else do
  859.          call DISPFILE
  860.       end  /* Do */
  861.     end  /* Do */
  862.     else do
  863.       push FNAME.INR
  864.       call MSGANDYN
  865.       if result <> '1B'X then do   /* Canceled ? */
  866.         XX = charout(,CCLR.24);                  /* Add by Shumann */
  867.         call CLS
  868.         'DEL' FILENAME(FNAME.INR)
  869.         if RC <> 0 then do
  870.            say 'エラー発生 !    RC =' RC
  871.            XX = charout(,'Enter キーで戻ります.'); pull XX
  872.         end  /* Do */
  873.         call GETDISP
  874.       end
  875.       else do
  876.         call DISPFILE
  877.       end
  878.     end  /* Do */
  879.   end  /* Do */
  880.   else do
  881.     push '* でマークされたファイル'
  882.     call MSGANDYN 2
  883.     if result <> '1B'X then do   /* Canceled ? */
  884.       XX = charout(,CCLR.24);                  /* Add by Shumann */
  885.       call CLS
  886.       do I = 1 to FCOUNT
  887.         II = FIDX.I
  888.         if MASK.II = '*' then do
  889.            'DEL' FILENAME(FNAME.II)
  890.            if RC <> 0 then do
  891.               say 'エラー発生 !    RC =' RC
  892.               XX=charout(,"'Q' キーで中断, Enter キーで継続.")
  893.               pull XX
  894.               if XX = 'Q' | XX = 'QUIT' then leave
  895.           end  /* Do */
  896.         end  /* Do */
  897.       end /* do */
  898.       call GETDISP
  899.     end
  900.     else do
  901.         XX = charout(,CCLR.24);                  /* Add by Shumann */
  902.       call CLS; call DISPFRAME; call DISPFILE; call DISPINFO
  903.     end
  904.   end  /* Do */
  905. return
  906.  
  907. DELDIR: procedure expose CURRENT
  908.   arg AT DIR                              /* Co-routine for M_DEL */
  909.   if substr(AT,3) <> '---' then SRHFLAG = 1
  910.   else SRHFLAG = 0
  911.   call CLS; XX=charout(,'Reading the directory structure.'||'0D'X||'0A'X)
  912.   call sysfiletree CURRENT||DIR||'\', 'DELBUFF', 'SBT'
  913.   do I = 1 to DELBUFF.0
  914.      if substr(subword(DELBUFF.I,3,1),3) <> '---' then do
  915.         SRHFLAG = 1
  916.         say '  ' subword(DELBUFF.I,3)
  917.      end  /* Do */
  918.   end /* do */
  919.   if SRHFLAG = 1 then do
  920.      say ' '
  921.      say 'システム・ファイル、読取専用ファイル、'
  922.      say '隠しファイルのいずれかが見つかりました.'
  923.      say 'ディレクトリの削除を中止します.'
  924.      say 'Enter キーで FD2eT の画面に戻ります.'
  925.      pull .
  926.   end
  927.   else do
  928.      do I = DELBUFF.0 to 1 by -1
  929.         if subword(DELBUFF.I,3,1) = '-D---' then do
  930.            'RD' FILENAME(subword(DELBUFF.I,4))
  931.            if RC <> 0 then do
  932.               say 'エラー発生 !   RC =' RC
  933.               say 'ディレクトリの削除を中止します.'
  934.               say 'Enter キーで FD/2eT の画面に戻ります.'
  935.               pull .
  936.               return 0
  937.            end  /* Do */
  938.         end  /* Do */
  939.         else do
  940.            'DEL' FILENAME(subword(DELBUFF.I,4))
  941.            if RC <> 0 then do
  942.               say 'エラー発生 !   RC =' RC
  943.               say 'ディレクトリの削除を中止します.'
  944.               say 'Enter キーで FD2eT の画面に戻ります.'
  945.               pull .
  946.               return 0
  947.            end  /* Do */
  948.         end  /* Do */
  949.      end /* do */
  950.      'RD' FILENAME(CURRENT||DIR)
  951.      if RC <> 0 then do
  952.         say 'エラー発生 !   RC =' RC
  953.         say 'ディレクトリの削除を中止します.'
  954.         say 'Enter キーで FD2eT の画面に戻ります.'
  955.         pull .
  956.      end  /* Do */
  957.   end  /* Do */
  958. return SRHFLAG
  959.  
  960. M_D:
  961.       push 'Y:する'; push 'N:しない'
  962.       push '属性変更ファイル/ディレクトリの削除'; push '削除元:'
  963.       push ''; push ''; push '' ;push ''; push ''
  964.       if MCOUNT = 0 then do          /* Marked ? */
  965.       push FNAME.INR
  966.       call MSGANDYN
  967.       if result <> '1B'X then do   /* Canceled ? */
  968.       XX = charout(,CCLR.24);                  /* Add by Shumann */
  969.       call CLS
  970.       'RM -R' FILENAME(FNAME.INR)
  971.       if RC <> 0 then do
  972.            say ' エラー発生 !    RC =' RC
  973.            XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  974.         end  /* Do */
  975.         call GETDISP
  976.        end
  977.       else do
  978.      call DISPFILE
  979.     end  /* Do */
  980.    end  /* Do */
  981.   else do
  982.     push '* でマークされたファイル'
  983.     call MSGANDYN  2
  984.     if result <> '1B'X then do   /* Canceled ? */
  985.        XX = charout(,CCLR.24);                  /* Add by Shumann */
  986.       call CLS
  987.       do I = 1 to FCOUNT
  988.         II = FIDX.I
  989.         if MASK.II = '*' then do
  990.            'RM' FILENAME(FNAME.II)
  991.            if RC <> 0 then do
  992.               say ' エラー発生 !    RC =' RC
  993.               XX=charout(," 'Q'+ Enter キーで中断, Enter キーで継続.")
  994.               pull XX
  995.               if XX = 'Q' | XX = 'QUIT' then leave
  996.            end  /* Do */
  997.         end  /* Do */
  998.       end /* do */
  999.       call GETDISP
  1000.     end
  1001.     else do
  1002.       call CLS; call DISPFRAME; call DISPFILE; call DISPINFO
  1003.     end
  1004.   end  /* Do */
  1005. return
  1006.  
  1007. M_TREE:
  1008.    call TREEMODE
  1009.    if result <> '1B'X then do
  1010.       LEN = length(NEWDIR)-1; if LEN < 3 then LEN = 3
  1011.       CURRENT = directory(left(NEWDIR,LEN))
  1012.       if right(CURRENT,2) <> ':\' then CURRENT = CURRENT||'\'
  1013.       push 'ディレクトリ読込中'
  1014.       call CLS; call DISPFRAME; call RUNMSG; call GETFILES
  1015.    end  /* Do */
  1016.    call DISPFILE; call DISPINFO
  1017. return
  1018.  
  1019. M_CR:
  1020.   if substr(ATTR.INR,2,1) = 'D' then do             /* DIRECTORY */
  1021.     push 'ディレクトリ読込中'
  1022.     CURRENT = directory(FNAME.INR)||'\'
  1023.    call RUNMSG; call GETFILES; call DISPFILE; call DISPINFO
  1024.   end
  1025.   else do
  1026.     select
  1027.       when ALIST.EXT <> '' then do                 /* Archiver list */
  1028.        XX = charout(,CCLR.24);                      /* Add by Mr.Mistral */
  1029.         call CLS
  1030.         ALIST.EXT FILENAME(FNAME.INR)
  1031.         XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  1032.        XX = charout(,CCLR.24);                      /* Add by Shumann */
  1033.         call CLS; call DISPFRAME; call DISPFILE; call DISPINFO
  1034.       end  /* Do */
  1035.       when EXT = 'INF' then '@VIEW' FILENAME(FNAME.INR)
  1036.       otherwise call BROWSE FNAME.INR
  1037.     end  /* select */
  1038.   end
  1039. return
  1040.  
  1041. /*----------- 「%」 handling. add 8 lines by Mr.Mistarl -------------*/
  1042. FILENAME: procedure
  1043. parse arg PATHNAME
  1044.   PATHNAME = strip(PATHNAME)
  1045.   if POS(' ',PATHNAME) <> 0 then PATHNAME = '"'PATHNAME'"'
  1046.   rexx2os2 = ''
  1047.   do i=1 to length(pathname)
  1048.     if substr(pathname,i,1) = '%'
  1049.       then rexx2os2 = rexx2os2'%%'
  1050.       else rexx2os2 = rexx2os2||substr(pathname,i,1)
  1051.   end
  1052. /* return PATHNAME */
  1053. return rexx2os2
  1054. /*-------------------------------------------------------------------*/
  1055.  
  1056. M_FINDMARK: procedure expose MCOUNT MBYTES MASK. ATTR. CCLR. BYTES. CURRENT,
  1057.                              TYPE. FILE. FBYTES FCOUNT NR FNAME. TOTAL,
  1058.                              FREE VOLID FST ROW COL LFILE DISPMODE LL LBL,
  1059.                              FLM NX NY LNR LFL CUL CUR CV CH CLL CLR FIDX.
  1060.       push 'ワイルドカード[*]も使えます. '
  1061.       push '     Esc:中断              [L]→[Enter]:元の画面 '
  1062.       push '検索名を指定してください, * でマークします.'
  1063.       push 'ファイルの検索と*マーク'
  1064.       push ' '  ;
  1065.    push ' '; push ''
  1066.    call MSGANDGET 2
  1067.    pull RES; FN = strip(RES)
  1068.    P = lastpos('.',FN)
  1069.    if P <> 0 then do
  1070.       EXT = substr(FN,P+1)
  1071.       FN = left(FN,P-1)
  1072.    end  /* Do */
  1073.    else EXT = ''
  1074.    if result <> '1B'X & (FN <> '' | EXT <> '') then do
  1075.       MCOUNT = 0; MBYTES = 0
  1076.       do I = 1 to FCOUNT
  1077.          II = FIDX.I
  1078.          MASK.II = ' '
  1079.          if substr(ATTR.II,2,1) <> 'D' then do
  1080.             P = lastpos('.',FNAME.II)
  1081.             if P = 0 then do
  1082.                DFN = FNAME.II
  1083.                DEXT = ''
  1084.             end  /* Do */
  1085.             else do
  1086.                DFN = left(FNAME.II,P-1)
  1087.                DEXT = substr(FNAME.II,P+1)
  1088.             end  /* Do */
  1089.             push FN; push DFN
  1090.             if STRCMPX() = 0 then do
  1091.                push EXT; push DEXT
  1092.                if STRCMPX() = 0 then do
  1093.                   MASK.II = '*'; MCOUNT = MCOUNT + 1
  1094.                   MBYTES = MBYTES + BYTES.II
  1095.                end
  1096.             end
  1097.          end  /* Do */
  1098.       end /* do */
  1099.    end
  1100.    call DISPFILE; call DISPINFO
  1101. return
  1102.  
  1103. M_FIND: procedure expose FST ROW COL FILE. LFILE TYPE. DISPMODE ATTR. LL,
  1104.                          LBL FLM CCLR. NX NY NR LNR FNAME. MASK. LFL,
  1105.                          FCOUNT CCLR. CURRENT  FBYTES MBYTES MCOUNT NR,
  1106.                          TOTAL FREE VOLID BYTES. CUL CH CUR CV CLL CLR FIDX.
  1107.       push 'ワイルドカード[*]も使えます. '
  1108.       push '     Esc:中断             [L]→[Enter]:元の画面 '
  1109.       push '検索名を指定してください,画面に表示します.'
  1110.       push 'ファイル/ディレクトリの検索'
  1111.       push '   ';
  1112.    push ' '; push ''
  1113.    call MSGANDGET 2
  1114.    pull RES; FN = strip(RES)
  1115.    P = lastpos('.',FN)
  1116.    if P <> 0 then do
  1117.       EXT = substr(FN,P+1)
  1118.       FN = left(FN,P-1)
  1119.    end  /* Do */
  1120.    else EXT = ''
  1121.    if result <> '1B'X & (FN <> '' | EXT <> '') then do
  1122.       TRK = 0; FBYTES = 0; MBYTES = 0; FST = 1; NR = 0; MCOUNT = 0
  1123.       do I = 1 to FCOUNT
  1124.          II = FIDX.I
  1125.          parse upper var FNAME.II DFN '.' DEXT
  1126.          P = lastpos('.',FNAME.II)
  1127.          if P = 0 then do
  1128.             DFN = FNAME.II
  1129.             DEXT = ''
  1130.          end  /* Do */
  1131.          else do
  1132.             DFN = left(FNAME.II,P-1)
  1133.             DEXT = substr(FNAME.II,P+1)
  1134.          end  /* Do */
  1135.          push FN; push DFN
  1136.          if STRCMPX() = 0 then do
  1137.             push EXT; push DEXT
  1138.             if STRCMPX() = 0 then do
  1139.                TRK = TRK + 1
  1140.                XFNAME.TRK = FNAME.II; XATTR.TRK = ATTR.II
  1141.                XMASK.TRK = MASK.II; XFILE.TRK = FILE.II
  1142.                XTYPE.TRK = TYPE.II; XBYTES.TRK = BYTES.II
  1143.                FBYTES = FBYTES + XBYTES.TRK
  1144.                if XMASK.TRK = '*' then do
  1145.                   MBYTES = MBYTES + XBYTES.TRK; MCOUNT = MCOUNT + 1
  1146.                end  /* Do */
  1147.             end  /* Do */
  1148.          end  /* Do */
  1149.       end /* do */
  1150.       do I = TRK+1 to FCOUNT
  1151.          FIDX.I = ''
  1152.       end /* do */
  1153.       FILE.0 = TRK; FCOUNT = TRK; FIDX.0 = TRK
  1154.       do I = 1 to TRK
  1155.          FIDX.I = I
  1156.          FNAME.I = XFNAME.I; ATTR.I = XATTR.I
  1157.          MASK.I = XMASK.I; FILE.I = XFILE.I
  1158.          TYPE.I = XTYPE.I; BYTES.I = XBYTES.I
  1159.       end /* do */
  1160.    end  /* Do */
  1161.    call DISPFILE; call DISPINFO
  1162. return
  1163.  
  1164. M_SORT:
  1165.   FSORTKEY = 'DATE'; FSORTORD = 'R'
  1166.   MSGSEL.0 = '6 10'
  1167.   MSGSEL.1 = ' '
  1168.   MSGSEL.2 = 'N:名  前'
  1169.   MSGSEL.3 = 'T:タ イ プ'
  1170.   MSGSEL.4 = 'D:時  間'
  1171.   MSGSEL.5 = 'S:サ イ ズ'
  1172.   MSGSEL.6 = 'O:初期化'
  1173.   MSGSEL.7 = 'ファイルの並び替え'
  1174.   call MSGANDSEL
  1175.   if result <> 0 then do
  1176.     parse upper value MSGSEL.result with . ':' FSORTKEY
  1177.     if result <> 6 then do
  1178.        call DISPFILE
  1179.        MSGSEL.0 = '3 10'
  1180.        MSGSEL.1 = ' '
  1181.        MSGSEL.2 = ' N:昇 順'
  1182.        MSGSEL.3 = ' R:降 順'
  1183.        MSGSEL.7 = '順序の選択'
  1184.        call MSGANDSEL
  1185.     end  /* Do */
  1186.     if result <> 0 then do
  1187.        push '処理中'
  1188.        FSORTORD = substr(MSGSEL.result,2,1)
  1189.        call DISPFILE
  1190.        call RUNMSG
  1191.        call FSORT
  1192.     end  /* Do */
  1193.   end  /* Do */
  1194.   call DISPFILE; call DISPINFO
  1195. return
  1196.  
  1197. M_ATTRIB:
  1198.   if ATTR.INR <> '-D---' then do
  1199.      if left(ATTR.INR,1)     = 'A' then XATTR.2 = 'ON'
  1200.      else XATTR.2 = 'OFF'
  1201.      do I = 3 to 5
  1202.         if substr(ATTR.INR,I,1) = '-' then XATTR.I = 'OFF'
  1203.         else XATTR.I = 'ON'
  1204.      end /* do */
  1205.      MSGSEL.0 = 6 15
  1206.      MSGSEL.1 = ' '
  1207.      SEL = 2
  1208.      do forever
  1209.         MSGSEL.2 = 'A:アーカイブ  ' XATTR.2
  1210.         MSGSEL.3 = 'H:隠しファイル' XATTR.3
  1211.         MSGSEL.4 = 'R:読取専用' XATTR.4
  1212.         MSGSEL.5 = 'S:システムファイル' XATTR.5
  1213.         MSGSEL.6 = 'W: < 書込み > '
  1214.         MSGSEL.7 = '属性の変更: 'FNAME.INR
  1215.         call MSGANDSEL SEL
  1216.         if result = 0 | result = 6 then leave
  1217.         if XATTR.result = 'ON' then XATTR.result = 'OFF'
  1218.         else XATTR.result = 'ON'
  1219.         SEL = result
  1220.      end /* do */
  1221.      if result = 6 then do
  1222.         ATOPT = ''                /* build attrib option */
  1223.         if XATTR.2 = 'ON' then ATOPT = ATOPT '+A'
  1224.         else ATOPT = ATOPT '-A'
  1225.         if XATTR.3 = 'ON' then ATOPT = ATOPT '+H'
  1226.         else ATOPT = ATOPT '-H'
  1227.         if XATTR.4 = 'ON' then ATOPT = ATOPT '+R'
  1228.         else ATOPT = ATOPT '-R'
  1229.         if XATTR.5 = 'ON' then ATOPT = ATOPT '+S'
  1230.         else ATOPT = ATOPT '-S'
  1231.          XX = charout(,CCLR.24);       /* add by Shumann */
  1232.         call CLS
  1233.         'ATTRIB' ATOPT FILENAME(FNAME.INR)
  1234.         if RC <> 0 then do
  1235.            say ' エラー発生 !   RC =' RC
  1236.            say ' Enter キーで FD2eT の画面に戻ります.'
  1237.            pull .
  1238.         end  /* Do */
  1239.         call GETDISP
  1240.      end  /* Do */
  1241.      else call DISPFILE
  1242.   end
  1243. return
  1244.  
  1245. /******************/
  1246. /* Other routines */
  1247. /******************/
  1248.  
  1249. FILENAME: procedure
  1250. parse arg PATHNAME
  1251.   PATHNAME = strip(PATHNAME)
  1252.   if POS(' ',PATHNAME) <> 0 then PATHNAME = '"'PATHNAME'"'
  1253. return PATHNAME
  1254.  
  1255. MSGANDSEL: procedure expose ROW COL CCLR. CUL CH CUR CLL CLR CV MSGSEL.
  1256.   /*  MSGSEL. array format :       */
  1257.   /*    MSGSEL.0 = Count Length    */
  1258.   /*    MSGSEL.1 = Message         */
  1259.   /*    MSGSEL.n = KEY||':'||Item  */
  1260.   arg SEL .
  1261.   parse value MSGSEL.0 with CNT LEN
  1262.   if SEL > CNT | SEL < 2 then SEL = 2
  1263.   X = ((ROW - 5 - CNT) % 2) + 5; Y = (COL - LEN - 36) % 2
  1264.   C. = CCLR.1; C.SEL = CCLR.12; SP = 0
  1265.   W = LEN+35;  Q = (W - LEN) %2 - 2
  1266.     call GOTOXY X-1 Y
  1267.     XX = charout(,CCLR.18||CUL||copies(CH,LEN+35)||CUR)
  1268.     call GOTOXY X Y
  1269.     XX = charout(,CCLR.18||CV CCLR.20 left('∬',2)CCLR.17||left(MSGSEL.7,LEN+31)CCLR.18||CV||CCLR.9||' ')
  1270.     do forever
  1271.     do I = 1 to CNT
  1272.       call GOTOXY X+I Y
  1273.     XX=charout(,CCLR.18||CV center('',Q) C.I center(MSGSEL.I,LEN-1),
  1274.        CCLR.18 center('',Q) CV||CCLR.9||' ')
  1275.     end /* do */
  1276.     call GOTOXY X+I Y
  1277.     XX=charout(,CCLR.18||CV CCLR.10,
  1278.     left('   Esc:中断                  Enter:実行/選択',LEN+31) CCLR.18 CV||CCLR.9||' ')
  1279.     call GOTOXY X+I+1 Y
  1280.     XX = charout(,CCLR.18||CLL||copies(CH,LEN+35)||CLR||CCLR.9||' ')
  1281.     call GOTOXY X+I+2 Y+1
  1282.     XX = charout(,CCLR.9||copies(' ',LEN+37))
  1283.     parse upper value sysgetkey('NOECHO') with KK
  1284.     select
  1285.       when KK = 'E0'X then SP = 1
  1286.       when KK = '00'X then XX = sysgetkey('NOECHO')  /* discard */
  1287.       when SP = 1 & (KK = '48'X | KK = '4B'X) then do    /* UP */
  1288.          SP = 0
  1289.          TEMP = C.2
  1290.          do I = 2 to CNT - 1
  1291.             J = I + 1
  1292.             C.I = C.J
  1293.          end /* do */
  1294.          C.CNT = TEMP
  1295.       end  /* Do */
  1296.       when SP = 1 & (KK = '50'X | KK = '4D'X) then do    /* DOWN */
  1297.          SP = 0
  1298.            TEMP = C.CNT
  1299.          do I = CNT to 3 by - 1
  1300.             J = I - 1
  1301.               C.I = C.J
  1302.             end /* do */
  1303.          C.2 = TEMP
  1304.       end  /* Do */
  1305.       when SP = 0 & KK = '0D'X then do   /* Enter */
  1306.          do SEL = 2 to CNT
  1307.             if C.1 <> C.SEL then leave
  1308.          end /* do */
  1309.          leave
  1310.       end  /* Do */
  1311.       when SP = 0 & KK = '1B'X then do   /* Esc */
  1312.          SEL = 0; leave
  1313.       end  /* Do */
  1314.       when SP = 0 then do                /* Serach Alphabet key */
  1315.          do I = 2 to CNT
  1316.             parse value strip(MSGSEL.I) with KEY ':' .
  1317.             if KEY = KK then do
  1318.                return I
  1319.             end  /* Do */
  1320.          end /* do */
  1321.       end  /* Do */
  1322.       otherwise SP = 0
  1323.    end
  1324.   end
  1325. return SEL
  1326.  
  1327. STRCMPX: procedure
  1328. /* STRings CoMPare, X value includes wild card                     */
  1329. /* This is recursive routine. Recursive call will occure until no  */
  1330. /* wild card. There are many return statements to reduce run time. */
  1331. /* Input: X, Y   X and Y are strings.  X may contain wild card     */
  1332. /* Return: If X matches Y, return 0                                */
  1333.   pull Y; pull X
  1334.   P = verify(X,'?*','Match')
  1335.   if P = 0 then do            /* No wild card, stop operator */
  1336.      if X = Y then return 0   /* Match return */
  1337.      else return -1           /* Unmatch return */
  1338.   end  /* Do */
  1339.   if left(X,P-1) = left(Y,P-1) then do
  1340.      if substr(X,P,1) = '?' then do        /* Skip 1 charcter */
  1341.         push substr(X,P+1); push substr(Y,P+1)
  1342.         if STRCMPX() = 0 then return 0
  1343.         else return -1
  1344.      end  /* Do */
  1345.      else do                               /* Skip multi */
  1346.         SUBX = substr(X,P+1)
  1347.         if length(SUBX) = 0 then return 0      /* No more charcter */
  1348.         do I = P to length(Y)
  1349.            if length(SUBX) = 0 | left(SUBX,1) = substr(Y,I,1) then do
  1350.               push substr(X,P+1); push substr(Y,I)
  1351.               if STRCMPX()=0 then return 0
  1352.               else return -1
  1353.            end  /* Do */
  1354.         end /* do */
  1355.      end  /* Do */
  1356.   end  /* Do */
  1357. return -1
  1358.  
  1359. TREEMODE: procedure expose CURRENT DRV TREE. TOTAL FREE VOLID TREELS. ,
  1360.                            DTREE. PTREE. TATTR. IDX. CV CH CVL CLL,
  1361.                            DRV TREE.  TREEFILE TST TNR ROW COL CUL CUR,
  1362.                            CLR CCLR. LTNR NXTREE. NEWDIR ALTT.
  1363. arg OPT .
  1364.   SAVCURRENT = CURRENT
  1365.   if OPT <> '' then do
  1366.      if length(OPT) = 1 then OPT = OPT':'
  1367.      CURRENT = directory(left(OPT,2))
  1368.      if CURRENT = '' then CURRENT = SAVCURRENT
  1369.      else if right(CURRENT,2) <> ':\' then CURRENT = CURRENT||'\'
  1370.   end
  1371.   call GETTREE; call DISPTREE; call DISPITREE
  1372.   SP = 0; TMEM = ''
  1373.   do forever
  1374.      parse upper value sysgetkey('NOECHO') with CMD
  1375.      select
  1376.         when SP = 0 & CMD = 'E0'X then SP = 1      /* Extended key code */
  1377.         when SP = 0 & CMD = '00'X then SP = 2      /* alt key code */
  1378.         when SP = 1 & CMD = '48'X then do          /* UP ARROW */
  1379.            SP = 0; TNR = TNR - 1                 /* Top */
  1380.            if TNR < 1 then TNR = 1
  1381.            if TNR < TST then do                  /* Need scroll ? */
  1382.              TST = TNR
  1383.              call DISPTREE; call DISPITREE 'X'   /* Full update */
  1384.            end  /* Do */
  1385.            else call DISPTREE 'X'; call DISPITREE 'X' /* Partial update */
  1386.         end  /* Do */
  1387.         when SP = 1 & CMD = '50'X then do          /* DOWN ARROW */
  1388.            SP = 0; TNR = TNR + 1
  1389.            if TNR > PTREE.DRV.0 then TNR = PTREE.DRV.0  /* Bottom */
  1390.            if TNR > TST + ROW - 9 then do         /* Need scroll */
  1391.              TST = TNR - ROW + 9
  1392.              call DISPTREE; call DISPITREE 'X'    /* Full update */
  1393.            end
  1394.            else call DISPTREE 'X'; call DISPITREE 'X'  /* Partial update */
  1395.         end  /* Do */
  1396.         when SP = 1 & CMD = '51'X then do          /* DOWN */
  1397.            TST = TST + ROW - 8
  1398.            if TST > PTREE.DRV.0 then TST = TST - ROW + 8
  1399.            TNR = TST; call DISPTREE; call DISPITREE 'X'; SP = 0
  1400.         end  /* Do */
  1401.         when SP = 1 & CMD = '49'X then do          /* UP */
  1402.            TST = TST - ROW + 9
  1403.            if TST < 1 then TST = 1
  1404.            TNR = TST; call DISPTREE; call DISPITREE 'X'; SP = 0
  1405.         end  /* Do */
  1406.         when SP = 0 & CMD = '0D'X then do          /* CR */
  1407.            II = IDX.DRV.TNR
  1408.            NEWDIR = directory(PTREE.DRV.II)
  1409.            if NEWDIR <> '' then do                /* exsist ? */
  1410.               NXTREE.DRV.II = ''
  1411.               if right(NEWDIR,2) <> ':\' then NEWDIR = NEWDIR||'\'
  1412.               leave
  1413.            end
  1414.            else do
  1415.               NXTREE.DRV.II = 'X'                /* Not exsist */
  1416.               call DISPTREE 'X'
  1417.            end
  1418.         end  /* Do */
  1419.         when SP = 0 & CMD = '1B'X then leave       /* ESC */
  1420.         when SP = 0 & CMD = 'Q'   then leave       /* QUIT */
  1421.         when SP = 2 & CMD = '3B'X then do          /* Help */
  1422.            SP = 0
  1423.            call SETHELP 'TREE'; call DISPHELP
  1424.            call DISPTREE
  1425.         end  /* Do */
  1426.         when SP = 0 & CMD = 'R'   then do          /* Read */
  1427.            call GETTREE 'READ'                     /* Force read */
  1428.            call DISPTREE; call DISPITREE
  1429.         end
  1430.         when SP = 0 & CMD = 'W'   then do          /* Write file */
  1431.            TF = PTREE.DRV.1||TREEFILE              /* File name */
  1432.            X = stream(TF,'c','query exist')
  1433.            if X <> '' then '@ERASE' X
  1434.            X = lineout(TF,TREE.DRV.0)
  1435.            do I = 1 to TREE.DRV.0
  1436.               II = IDX.DRV.I
  1437.               X = lineout(TF,TREE.DRV.II)
  1438.            end /* do */
  1439.            X = lineout(TF,)                 /* Close the file */
  1440.         end  /* Do */
  1441.         when (SP = 1 & CMD = '47'X) | CMD = '\' then do  /* HOME : top */
  1442.            SP = 0; TST = 1; TNR = 1
  1443.            call DISPTREE; call DISPITREE 'X'
  1444.         end  /* Do */
  1445.         when SP = 1 & CMD = '4F'X then do    /* END : bottom */
  1446.            SP = 0; TNR = PTREE.DRV.0
  1447.            TST = TNR - ROW + 9; if TST < 1 then TST = 1
  1448.            call DISPTREE; call DISPITREE 'X'
  1449.         end  /* Do */
  1450.         when SP = 0 & CMD = 'L' then do            /* Logdrive */
  1451.            call M_LOGDRIVE
  1452.            X = directory(left(SAVCURRENT,2))  /* Back to SAV, for cancel */
  1453.            if result = '0D'X then do     /* CURRENT <> SAVCURRENT, maybe */
  1454.              call GETTREE
  1455.              call DISPTREE; call DISPITREE
  1456.            end  /* Do */
  1457.            else call DISPTREE
  1458.         end  /* Do */
  1459.         when SP = 0 & CMD = 'F' then do                   /* Find */
  1460.       push '';push '     Esc:中断              [L]→[Enter]:元の画面 '
  1461.       push '検索名を指定してください,カーソルを移動します.'
  1462.       push 'ディレクトリの検索'
  1463.       push ' '  ;
  1464.            push ' ';
  1465.            push TMEM
  1466.            call MSGANDGET 2
  1467.            parse upper pull DN; DN = strip(DN)
  1468.            PP = lastpos('.',DN)
  1469.            if PP <> 0 then do
  1470.               DEXT = substr(DN,PP+1)
  1471.               DN = left(DN,PP-1)
  1472.            end  /* Do */
  1473.            else DEXT = ''
  1474.            if result <> '1B'X & (DN <> '' | DEXT <> '') then do
  1475.               TMEM = DN'.'DEXT             /* Save serach argument */
  1476.               do I = 1 to PTREE.DRV.0
  1477.                  II = I + TNR
  1478.                  if II > PTREE.DRV.0 then II = II - PTREE.DRV.0
  1479.                  INX = IDX.DRV.II; X = DTREE.DRV.II
  1480.                  PP = lastpos(CH,X)
  1481.                  parse upper value substr(X,PP+2) with TN
  1482.                  PP = lastpos('.',TN)
  1483.                  if PP <> 0 then do
  1484.                     TEXT = substr(TN,PP+1)
  1485.                     TN = left(TN,PP-1)
  1486.                  end  /* Do */
  1487.                  else TEXT = ''
  1488.                  push DN; push TN
  1489.                  if STRCMPX() = 0 then do
  1490.                     push DEXT; push TEXT
  1491.                     if STRCMPX() = 0 then leave
  1492.                  end
  1493.               end /* do */
  1494.               TNR = II
  1495.               if TNR < TST | (TST + ROW - 9) < TNR then do
  1496.                  TST = TNR - ((ROW - 9) % 2)
  1497.                  if TST < 1 then TST = 1
  1498.               end
  1499.            end
  1500.            call DISPTREE; call DISPITREE 'X'
  1501.         end  /* Do */
  1502.         when SP = 2 then do                    /* ALT+  */
  1503.             SP = 0; C = c2x(CMD); A = ALTT.C   /* ALT code -> Alpha. */
  1504.             if A <> '' then do                 /* ALT+alphabet ? */
  1505.                do I = 1 to PTREE.DRV.0
  1506.                   II = I + TNR
  1507.                   if II > PTREE.DRV.0 then II = II - PTREE.DRV.0
  1508.                   INX = IDX.DRV.II; X = lastpos(CH,DTREE.DRV.II)
  1509.                   parse upper value substr(DTREE.DRV.II,X+2,1) with XX
  1510.                   if XX = A then leave
  1511.                end /* do */
  1512.                TNR = II
  1513.                if TNR < TST | (TST + ROW - 9) < TNR then do
  1514.                   TST = TNR - ((ROW - 9) % 2)
  1515.                   if TST < 1 then TST = 1
  1516.                end
  1517.                call DISPTREE; call DISPITREE 'X'
  1518.             end  /* Do */
  1519.         end  /* Do */
  1520.         otherwise SP = 0
  1521.      end
  1522.   end
  1523.   CURRENT = SAVCURRENT
  1524.   LEN = length(CURRENT) - 1; if LEN < 3 then LEN = 3
  1525.   X = directory(left(CURRENT,LEN))
  1526.   if CMD = 'Q' then CMD = '1B'X
  1527. return CMD
  1528.  
  1529. DISPTREE: procedure expose DRV DTREE. PTREE. TATTR. IDX. TST TNR ROW COL,
  1530.                            CCLR. LTNR NXTREE. CH
  1531.   /* Usage: call DISPTREE      ...  Full update              */
  1532.   /*        call DISPTREE 'X'  ...  Partial update           */
  1533.   /*        Partial update routine will call itself twice.   */
  1534.   /*        They are 'call DISPTREE LTNR' and 'call DISPTREE */
  1535.   /*        TNR'. LTNR = Lagging TNR, TNR = Tree number      */
  1536.   arg OPT .
  1537.   if OPT = '' then do
  1538.     XSTART = 0; XEND = ROW - 9   /* Full update setup */
  1539.   end
  1540.   else do                        /* Partial update */
  1541.      if datatype(OPT) = 'NUM' then do
  1542.         XSTART = OPT - TST
  1543.         XEND = OPT - TST
  1544.      end  /* Do */
  1545.      else do
  1546.         call DISPTREE LTNR       /* Re-display previous TNR */
  1547.         call DISPTREE TNR        /* Re-display TNR */
  1548.         return                   /* End of partial update front end */
  1549.      end  /* Do */
  1550.   end  /* Do */
  1551.   PP = ((TNR-1)%(ROW-8))+1||'/'||format((PTREE.DRV.0-1)%(ROW-8)+0.5,,0)
  1552.   call GOTOXY 2 8; XX = charout(,CCLR.1||left(PP,5))  /* Display page count */
  1553.   do I = XSTART to XEND
  1554.      P = TST + I; PI = IDX.DRV.P
  1555.      if P > PTREE.DRV.0 then do
  1556.        call GOTOXY I+8 2
  1557.        X = charout(,copies(' ',COL-3))
  1558.      end
  1559.      else do
  1560.        select
  1561.           when substr(TATTR.DRV.PI,5)='S'   & TNR <> P then AT = CCLR.3
  1562.           when substr(TATTR.DRV.PI,3,1)='H' & TNR <> P then AT = CCLR.4
  1563.           when substr(TATTR.DRV.PI,4,1)='R' & TNR <> P then AT = CCLR.5
  1564.           when substr(TATTR.DRV.PI,5)='S'   & TNR = P then AT = CCLR.13
  1565.           when substr(TATTR.DRV.PI,3,1)='H' & TNR = P then AT = CCLR.14
  1566.           when substr(TATTR.DRV.PI,4,1)='R' & TNR = P then AT = CCLR.15
  1567.           otherwise do
  1568.              if TNR <> P then AT = CCLR.24
  1569.              else AT = CCLR.16
  1570.           end
  1571.        end  /* select */
  1572.        if NXTREE.DRV.PI = 'X' then do      /* Not exsist */
  1573.           if TNR <> P then AT = CCLR.17
  1574.           else AT = CCLR.18
  1575.        end  /* Do */
  1576.        call GOTOXY I+8 2
  1577.        XX = charout(,CCLR.24);
  1578.        LINE = DTREE.DRV.P; WI = lastpos(CH,LINE)
  1579.        LINE = left(LINE,WI)||AT substr(LINE,WI+2) CCLR.24
  1580.        TLEN = COL - 3 + length(AT||CCLR.24)
  1581.        X = charout(,CCLR.1||left(LINE,TLEN))
  1582.      end
  1583.   end /* do */
  1584.   LTNR = TNR
  1585. return
  1586.  
  1587. GETTREE: procedure expose CURRENT DTREE. PTREE. TATTR. IDX. CV CH CVL CLL,
  1588.                           DRV TREE. CCLR. TREEFILE TST TNR ROW COL CUL CUR,
  1589.                           CLR TREELS. NXTREE.
  1590. arg OPT                        /* if OPT was specified then force read */
  1591.   DRV = left(CURRENT,1); RTREE = left(CURRENT,3)
  1592.   /* Following if/then/do block is very BIG ! (almost entire routone) */
  1593.   if datatype(DTREE.DRV.0)<>'NUM' | DRV='A' | DRV='B' | OPT<>'' then do
  1594.     push '処理中'
  1595.     TF = DRV||':\'||TREEFILE; RC = stream(TF,'c','query exists')
  1596.     call RUNMSG
  1597.     if RC = '' | OPT <> '' then do
  1598.        call SysFileTree RTREE, 'T','DS'
  1599. /*     TREELS.DRV = 'DIRECTORY'  */
  1600.     end
  1601.     else do                              /* Reading form file */
  1602.        RC = stream(TF,'c','close')
  1603.        T.0 = linein(TF) - 1; X = linein(TF)
  1604.        do I = 1 to T.0
  1605.           T.I = linein(TF)
  1606.        end /* do */
  1607.        RC = stream(TF,'c','close')
  1608.        TREELS.DRV = TF
  1609.     end  /* Do */
  1610.  
  1611.     do I = 1 to T.0      /* Extract attribute and pathname */
  1612.        IP = I + 1; TREE.DRV.IP = T.I; NXTREE.DRV.IP = ''
  1613.        TATTR.DRV.IP = subword(T.I,4,1); PTREE.DRV.IP = subword(T.I,5)
  1614.     end /* do */
  1615.     PTREE.DRV.1 = RTREE; PTREE.DRV.0 = T.0 + 1
  1616.     TATTR.DRV.1 = ''; TREE.DRV.1 = ''; TREE.DRV.0 = T.0 + 1
  1617.  
  1618.     /*  SORT routine (COM-SORT-11)  */
  1619.     do I = 1 to PTREE.DRV.0; IDX.DRV.I = I; end        /* init the InDeX */
  1620.     GAP = PTREE.DRV.0                              /* initial GAP value */
  1621.     do until (SW = 0) & (GAP = 1)          /* SW=0 means no change occured */
  1622.        GAP = trunc(GAP / 1.3)              /* 1.3 : GAP shrink factor */
  1623.        select                              /* Modify the GAP */
  1624.           when GAP = 0  then GAP = 1
  1625.           when GAP = 9  then GAP = 11
  1626.           when GAP = 10 then GAP = 11
  1627.           otherwise nop
  1628.        end  /* select */
  1629.        SW = 0
  1630.        TOP = PTREE.DRV.0 - GAP
  1631.        do I = 2 to TOP
  1632.           J = I + GAP
  1633.           II = IDX.DRV.I; IJ = IDX.DRV.J             /* Indexing */
  1634.           if PTREE.DRV.II >> PTREE.DRV.IJ then do
  1635.              IDX.DRV.I = IJ; IDX.DRV.J = II; SW = 1  /* Swap */
  1636.           end  /* Do */
  1637.        end /* do */
  1638.     end /* do */
  1639.     /* End of sort routine */
  1640.  
  1641.     SAVT = ''; SAVB. = 0
  1642.     do I = PTREE.DRV.0 to 2 by -1      /* scaning from bottom */
  1643.        II = IDX.DRV.I                  /* indexing */
  1644.        XTPATH = PTREE.DRV.II
  1645.        XTEMP. = ''; XI = 2
  1646.  
  1647.        do forever             /* convert '\' -> ' ' */
  1648.           parse value XTPATH with '\' DNAME '\' REMAINS
  1649.           if KJTEST(right(DNAME,1)) = 1 then do
  1650.             DBCSPATH = DNAME||'\'||REMAINS; KJ = 0     /* DBCS process */
  1651.             do NLS = 1 to length(DBCSPATH)
  1652.                if KJ = 0 then do
  1653.                  NC = substr(DBCSPATH,NLS,1)
  1654.                  KJ = KJTEST(NC)
  1655.                  if NC = '\' then do
  1656.                     NLS = NLS - 1; leave
  1657.                  end  /* Do */
  1658.                end
  1659.                else KJ = 0
  1660.             end
  1661.             DNAME = left(DBCSPATH,NLS)
  1662.             REMAINS = substr(DBCSPATH,NLS+2)
  1663.           end  /* Do */                             /* End of DBCS process */
  1664.           XTEMP.XI = DNAME; XI = XI + 1
  1665.           if REMAINS = '' then leave
  1666.           XTPATH = '\'||REMAINS
  1667.        end /* do */
  1668.        XTEMP.1 = RTREE
  1669.  
  1670.        WS = XI - 1
  1671.        do J = WS to 1 by -1             /* scanning right to left */
  1672.           if J = WS then DTREE.DRV.I = XTEMP.J       /* Most right */
  1673.           else do
  1674.             if J = WS - 1 then do                      /* 2nd from right */
  1675.                if XTEMP.J = SAVT.J then do             /* Bottom ?*/
  1676.                   if XSAVT.J = 1 then do               /* not bottom */
  1677.                      BRANCH = CVL||CH||CH              /* prev is not blank */
  1678.                   end
  1679.                   else do
  1680.                      BRANCH = CLL||CH||CH; XSAVT.J = 1 /* prev is blank */
  1681.                   end  /* Do */
  1682.                end
  1683.                else do
  1684.                   BRANCH = CLL||CH||CH; XSAVT.J = 1    /* bottom */
  1685.                end
  1686.             end  /* Do */
  1687.             else do                                    /* 3rd or more left */
  1688.                if XTEMP.J = SAVT.J then do             /* bottom ?*/
  1689.                   if XSAVT.J = 0 then BRANCH = '   '   /* prev is blank */
  1690.                   else BRANCH = CV||'  '               /* prev is not blank */
  1691.                end  /* Do */
  1692.                else do
  1693.                   BRANCH = '   '; XSAVT.J = 0          /* bottom */
  1694.                end  /* Do */
  1695.             end  /* Do */
  1696.             DTREE.DRV.I = BRANCH DTREE.DRV.I
  1697.           end
  1698.        end /* do */
  1699.  
  1700.        do WS = 1 to XI; SAVT.WS = XTEMP.WS; end
  1701.        DTREE.DRV.I = '   '||DTREE.DRV.I
  1702.     end /* do */
  1703.     DTREE.DRV.0 = PTREE.DRV.0; DTREE.DRV.1 = ' '||RTREE
  1704.   end   /* End of B I G if/then/do/end block */
  1705.   /* Positioning */
  1706.   do TNR = 1 to PTREE.DRV.0
  1707.      II = IDX.DRV.TNR
  1708.      if CURRENT = PTREE.DRV.II||'\' then leave
  1709.   end /* do */
  1710.   if TNR > PTREE.DRV.0 then TNR = 1
  1711.   TST = TNR - ((ROW - 9) % 2); if TST < 1 then TST = 1
  1712. return
  1713.  
  1714. FSORT: procedure expose FNAME. FILE. BYTES. TYPE. FIDX. FSORTKEY FSORTORD
  1715.  
  1716.     if FSORTKEY = '初期化' then do
  1717.        do I = 1 to FIDX.0
  1718.           FIDX.I = I
  1719.        end /* do */
  1720.        return                      /* Return with original oreder */
  1721.     end  /* Do */
  1722.  
  1723.     do I = 0 to FIDX.0             /* Copy the previous index */
  1724.        II = FIDX.I; CI.II = I      /* to make stable sort.    */
  1725.     end /* do */
  1726.  
  1727.     /*  SORT routine (COM-SORT-11)  */
  1728.     GAP = FIDX.0                           /* initial GAP value */
  1729.     do until (SW = 0) & (GAP = 1)          /* SW=0 means no change occured */
  1730.        GAP = trunc(GAP / 1.3)              /* 1.3 : GAP shrink factor */
  1731.        select                              /* Modify the GAP */
  1732.           when GAP = 0  then GAP = 1       /* Equivalent to bubble sort */
  1733.           when GAP = 9  then GAP = 11
  1734.           when GAP = 10 then GAP = 11
  1735.           otherwise nop
  1736.        end  /* select */
  1737.        SW = 0
  1738.        TOP = FIDX.0 - GAP
  1739.        do I = 1 to TOP
  1740.           J = I + GAP
  1741.           II = FIDX.I; IJ = FIDX.J           /* Indexing */
  1742.           select
  1743.              when FSORTKEY = '名  前' then do
  1744.                parse upper value FNAME.II with LEFT '.' .
  1745.                parse upper value FNAME.IJ with RIGHT '.' .
  1746.              end  /* Do */
  1747.              when FSORTKEY = 'タ イ プ' then do
  1748.                parse upper value FNAME.II with . '.' LEFT .
  1749.                parse upper value FNAME.IJ with . '.' RIGHT .
  1750.              end  /* Do */
  1751.              when FSORTKEY = '時  間' then do
  1752.                LEFT  = subword(FILE.II,words(FILE.II)-2)
  1753.                RIGHT = subword(FILE.IJ,words(FILE.IJ)-2)
  1754.              end  /* Do */
  1755.              when FSORTKEY = 'サ イ ズ' then do
  1756.                LEFT  = BYTES.II
  1757.                RIGHT = BYTES.IJ
  1758.              end  /* Do */
  1759.              otherwise do
  1760.                say ' エラー発生 !'; return
  1761.              end
  1762.           end  /* select */
  1763.           if FSORTORD = 'R' then do        /*  vvvvvvvvvvvvv  2nd sort key */
  1764.              if LEFT < RIGHT | (LEFT = RIGHT & CI.II < CI.IJ) then do
  1765.                 FIDX.I = IJ; FIDX.J = II; SW = 1    /* Swap */
  1766.              end  /* Do */
  1767.           end  /* Do */
  1768.           else do
  1769.              if LEFT > RIGHT | (LEFT = RIGHT & CI.II > CI.IJ) then do
  1770.                 FIDX.I = IJ; FIDX.J = II; SW = 1    /* Swap */
  1771.              end  /* Do */
  1772.           end  /* Do */
  1773.        end /* do */
  1774.     end /* do */
  1775.     /* End of sort routine */
  1776. return
  1777.  
  1778. MSGANDYN: procedure expose ROW COL CCLR. CUL CUR CV CH CLL CLR
  1779.   parse pull MSG ; parse pull msg1; parse pull msg2 ;parse pull msg3
  1780.   parse pull msg4; parse pull msg5 ;parse pull msg6 ;parse pull msg7
  1781.   parse pull msg8; parse pull msg9
  1782.   X = ((ROW - 3) % 2) + 8 ; Y = (COL - 50) % 2
  1783.   C1 = CCLR.12; C2 = CCLR.1; SP = 0
  1784.     call GOTOXY X-6 Y
  1785.     XX = charout(,CCLR.18||CUL|| copies(ch,49)||CUR)
  1786.    call GOTOXY X-5 Y
  1787.    XX = charout(,CCLR.18||CV CCLR.20 left('∬',2)CCLR.17||left(msg7,45)||,
  1788.    CCLR.18||CV||CCLR.9||' ')
  1789.     call GOTOXY X-4 Y
  1790.     XX = charout(,CCLR.18||CV center('',47) CV||CCLR.9||' ')
  1791.     call GOTOXY X-3 Y
  1792.     XX = charout(,CCLR.18||CV CCLR.1 left(msg6,7)CCLR.17 left(MSG,38) CCLR.18||CV||CCLR.9||' ')
  1793.     call GOTOXY X-2 Y
  1794.     XX = charout(,CCLR.18||CV copies(' ',47) CV||CCLR.9||' ')
  1795.     do forever
  1796.     call GOTOXY X-1 Y
  1797.     XX = charout(,CCLR.18||CV CCLR.1 center('',12) C1 center(msg9,6) CCLR.18 right('',1),
  1798.          C2 center(msg8,8) CCLR.18 center('',10) CCLR.18 CV||CCLR.9||' ')
  1799.     call GOTOXY X  Y
  1800.     XX = charout(,CCLR.18||CV center('',47) CV||CCLR.9||' ')
  1801.     call GOTOXY X+1 Y
  1802.     XX = charout(,CCLR.18||CLL||copies(CH,49)||CLR||CCLR.9||' ')
  1803.     call GOTOXY X+2 Y+1
  1804.     XX = charout(,CCLR.9||center('',51))
  1805.     parse upper value sysgetkey('NOECHO') with KK
  1806.     select
  1807.       when KK = 'E0'X then SP = 1
  1808.       when SP = 0 & (KK = 'Y' | KK = 'N')  then leave
  1809.       when KK = '00'X then XX = sysgetkey('NOECHO')  /* discard */
  1810.       when SP = 1 & (KK= '4D'X | KK = '4B'X) then do /* RIGHT ARROW */
  1811.          SP = 0; TEMP = C1; C1 = C2; C2 = TEMP
  1812.       end  /* Do */
  1813.       when SP = 1 & (KK = '4B'X | KK = '4D'X) then do /* LEFT ARROW */
  1814.          SP = 0; TEMP = C2; C2 = C1; C1 = TEMP
  1815.       end  /* Do */
  1816.       when SP = 0 & KK = '0D'X then do
  1817.          if C1 = CCLR.12 then KK = 'Y'
  1818.          else KK = 'N'
  1819.          leave
  1820.       end  /* Do */
  1821.       when SP = 0 & KK = '1B'X then leave
  1822.       otherwise nop
  1823.     end
  1824.     if KK = 'Y' | KK = 'N' | KK = '1B'X then leave
  1825.   end
  1826.   if KK <> 'Y' then KK = '1B'X
  1827. return KK
  1828.  
  1829. BROWSE:
  1830.   arg FN ; push '処理中'
  1831.   call RUNMSG
  1832.   if VIEWER ='' then do
  1833.       XX = charout(,CCLR.24);       /* add by Shumann */
  1834.      call CLS
  1835.      'more <' FILENAME(FN)
  1836.      XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  1837.   end  /* Do */
  1838.   else do
  1839.      '@'VIEWER FILENAME(FN)
  1840.      if RC <> 0 then do
  1841.         say ' エラー発生 !    RC =' RC
  1842.         XX = charout(,' Enter キーで FD2eT の画面に戻ります.'); pull XX
  1843.      end  /* Do */
  1844.   end  /* Do */
  1845.    XX = charout(,CCLR.24);       /* add by Shumann */
  1846.   call CLS
  1847.   call DISPFRAME
  1848.   call DISPFILE
  1849.   call DISPINFO
  1850. return
  1851.  
  1852. GETDISP:
  1853.    push 'ディレクトリ読込中'
  1854.    XX = charout(,CCLR.24);       /* add by Shumann */
  1855.    call CLS; call DISPFRAME; call RUNMSG; call GETFILES
  1856.    if SAVDIR = CURRENT then do
  1857.       if SAVFNAME = FNAME.SAVNR then do
  1858.          NR = SAVNR; FST = SAVFST
  1859.       end  /* Do */
  1860.    end  /* Do */
  1861.    call DISPFILE
  1862.    call DISPINFO
  1863. return
  1864.  
  1865. RUNMSG: procedure expose CUL CH CUR CV CLL CLR CCLR. ROW COL
  1866.   parse pull msg1
  1867.   X = ((ROW - 3) % 2) + 5 ; Y = (COL - 35) % 2
  1868.   KK = left(CURRENT,1)
  1869.   call GOTOXY X-2 Y
  1870.   XX = charout(,CCLR.18||CUL||copies(CH,35)||CUR)
  1871.   call GOTOXY X-1 Y
  1872.   XX = charout(,CCLR.18||CV||center('',34)CCLR.18 CV||CCLR.9||' ')
  1873.   call GOTOXY X   Y
  1874.   XX = charout(,CCLR.18||CV||CCLR.17 center(msg1,34)CCLR.18||CV||CCLR.9||' ')
  1875.   call GOTOXY X+1 Y
  1876.   XX = charout(,CCLR.18||CV||CCLR.17 center('',34)CCLR.18||CV||CCLR.9||' ')
  1877.   call GOTOXY X+2 Y
  1878.   XX = charout(,CCLR.18||CLL||copies(CH,35)||CLR||CCLR.9||' ')
  1879.   call GOTOXY X+3 Y+1; XX = charout(,CCLR.9||center('',37))
  1880. return
  1881.  
  1882. CMDEXEC: procedure expose HIST. CUL CH CUR CV CLL CLR CCLR. ROW COL
  1883.    parse pull RES
  1884.    HR = HIST.0 + 1; HIST.0 = HR; HIST.HR = RES
  1885.    do forever
  1886.      parse upper value right(strip(RES),5) with EXT '"'
  1887.      parse value right(EXT,4) with '.' EXT
  1888.      if EXT='CMD' | EXT='EXE' | EXT='COM' | EXT='BAT' then MODE = 1
  1889.      else MODE = 0
  1890.     push '';push '   Esc:中断                   ↑:コマンド・ヒストリー '
  1891.     push '実行するコマンドを指定してください.'
  1892.     push 'プログラムの実行'
  1893.     push ' '
  1894.     push '  '; push RES
  1895.      call MSGANDGET MODE; KEY = result
  1896.      parse pull RES
  1897.      select
  1898.         when KEY = '48'X then do      /* up arrow */
  1899.            HR = HR - 1; if HR < 1 then HR = HIST.0
  1900.            RES = HIST.HR
  1901.         end  /* Do */
  1902.         when KEY = '50'X then do      /* down arrow */
  1903.            HR = HR + 1; if HR > HIST.0 then HR = 1
  1904.            RES = HIST.HR
  1905.         end  /* Do */
  1906.         otherwise leave
  1907.      end
  1908.    end
  1909.    if KEY = '1B'X then RES = ''
  1910.    HR = HIST.0; H = HR - 1
  1911.    if (strip(HIST.H) \= strip(RES)) & (strip(RES) \= '') then HIST.HR = RES
  1912.    else HIST.0 = HR - 1
  1913.    push RES
  1914. return KEY
  1915.  
  1916. CMDEXECM: procedure expose HIST. CUL CH CUR CV CLL CLR CCLR. ROW COL
  1917.    parse pull RES
  1918.    HR = HIST.0 + 1; HIST.0 = HR; HIST.HR = RES
  1919.    do forever
  1920.      parse upper value right(strip(RES),5) with EXT '"'
  1921.      parse value right(EXT,4) with '.' EXT
  1922.      if EXT='CMD' | EXT='EXE' | EXT='COM' | EXT='BAT' then MODE = 1
  1923.      else MODE = 0
  1924.     push 'Enter:OS/2プロンプト画面 ';push '   Esc:中断                   ↑:コマンド・ヒストリー '
  1925.     push '実行するコマンドを指定してください.'
  1926.     push 'コマンドの実行'
  1927.     push ' '
  1928.     push '  '; push RES
  1929.      call MSGANDGET MODE; KEY = result
  1930.      parse pull RES
  1931.      select
  1932.         when KEY = '48'X then do      /* up arrow */
  1933.            HR = HR - 1; if HR < 1 then HR = HIST.0
  1934.            RES = HIST.HR
  1935.         end  /* Do */
  1936.         when KEY = '50'X then do      /* down arrow */
  1937.            HR = HR + 1; if HR > HIST.0 then HR = 1
  1938.            RES = HIST.HR
  1939.         end  /* Do */
  1940.         otherwise leave
  1941.      end
  1942.    end
  1943.    if KEY = '1B'X then RES = ''
  1944.    HR = HIST.0; H = HR - 1
  1945.    if (strip(HIST.H) \= strip(RES)) & (strip(RES) \= '') then HIST.HR = RES
  1946.    else HIST.0 = HR - 1
  1947.    push RES
  1948. return KEY
  1949.  
  1950. MSGANDGET: procedure expose CUL CH CUR CV CLL CLR CCLR. ROW COL HIST.
  1951.    arg MODE .
  1952.    /*  MODE 1 : Puts cursor right end              */
  1953.    /*       2 : No history support (Up/Down arrow) */
  1954.    parse pull TEMP; parse pull MSG; parse pull msg1; parse pull msg2
  1955.    parse pull msg3; parse pull msg4; parse pull msg5
  1956.    X = ((ROW - 3) % 2) + 6; L = length(msg2)
  1957.    W = COL- 18; Z = W - L
  1958.    call GOTOXY X-5 8
  1959.    XX = charout(,CCLR.18||CUL||copies(CH,col-18)CUR)
  1960.    call GOTOXY X-4 8
  1961.    XX = charout(,CCLR.18||CV CCLR.20 left('∬',2)CCLR.17||left(msg2,col-23) CCLR.18||Cv||CCLR.9||' ')
  1962.    call GOTOXY X-3 8
  1963.    XX = charout(,CCLR.18||CV||CCLR.10 right(msg5,COL-19)CCLR.18||CV||CCLR.9||' ')
  1964.    call GOTOXY X-2 8
  1965.    XX = charout(,CCLR.18||CV CCLR.1 left(msg1,7)CCLR.17 left(MSG,COL-28)CCLR.18||CV||CCLR.9||' ')
  1966.    call GOTOXY X-1 8
  1967.    XX = charout(,CCLR.18||CV CCLR.1 left(msg3,COL-21) CCLR.18||CV||CCLR.9||' ')
  1968.    call GOTOXY X   8
  1969.    XX=charout(,CCLR.18||CV CCLR.11||left(TEMP,COL-20)||CCLR.18 CV||CCLR.9||' ')
  1970.    call GOTOXY X+1 8
  1971.    XX = charout(,CCLR.18||CV left(' ',COL-19)||CV||CCLR.9||' ')
  1972.    call GOTOXY X+2 8
  1973.    XX = charout(,CCLR.18||CV CCLR.10 center(msg4,COL-21) CCLR.18||CV||CCLR.9||' ')
  1974.    call GOTOXY X+3 8
  1975.    XX = charout(,CCLR.18||CLL||CH 'INS' copies(CH,COL-24)||CLR||CCLR.9||' ')
  1976.    call GOTOXY X+4 9; XX = charout(,CCLR.9||copies(' ',COL-16))
  1977.    call GOTOXY X   10; XX = charout(, CCLR.11)
  1978.    if MODE = 1 then call GOTOXY X length(strip(TEMP,'T'))+11
  1979.    SP = 0; INS = 1; KJ1 = ''; KJST = ''
  1980.    KPOS = length(TEMP); KJ = 0
  1981.    do I = 1 to KPOS
  1982.       if KJ = 1 then do
  1983.          KJST = KJST||'0'; KJ = 0
  1984.       end  /* Do */
  1985.       else do
  1986.          if KJTEST(substr(TEMP,I,1)) = 1 then KJ = 1
  1987.          KJST = KJST||'1'
  1988.       end  /* Do */
  1989.    end /* do */
  1990.    RES = TEMP
  1991.    parse value syscurpos() with XP YP
  1992.    do forever
  1993.       if YP < 9 then YP = 9
  1994.       if YP > COL-12 then YP = COL-12
  1995.       if substr(KJST,COL-8,1) = 0 then KJADJ = 1
  1996.       else KJADJ = 0
  1997.       RES = left(RES,COL-20-KJADJ); KJST = left(KJST,COL-20-KJADJ)
  1998.       if substr(KJST,YP-8,1) = 0 then YP = YP - 1
  1999.       call gotoxy X 10; say RES
  2000.       call gotoxy XP+1 YP+1
  2001.       call syscurstate 'ON'
  2002.       KEY = sysgetkey('NOECHO')
  2003.       call syscurstate 'OFF'
  2004.       select
  2005.          when KEY = 'E0'X then SP = 1           /* exp key */
  2006.          when KEY = '00'X then SP = 2           /* alt key */
  2007.          when SP = 0 & KJTEST(KEY) = 1 then do  /* Kanji */
  2008.            SP = 3; KJ1 = KEY
  2009.          end
  2010.          when SP = 0 & KEY = '0A'X then leave   /* LF */
  2011.          when SP = 0 & KEY = '0D'X then leave   /* CR */
  2012.          when SP = 0 & KEY = '1B'X then leave   /* ESC */
  2013.          when SP = 1 & KEY = '48'X & MODE<>2 then leave   /* up arrow */
  2014.          when SP = 1 & KEY = '50'X & MODE<>2 then leave   /* down arrow */
  2015.          when SP = 0 & KEY = '09'X then do      /* TAB */
  2016.             YP = YP + 8
  2017.          end  /* Do */
  2018.          when SP = 2 & KEY = '0F'X then do      /* Shift + TAB */
  2019.             SP = 0; YP = YP - 8; if YP < 4 then YP = 4
  2020.          end  /* Do */
  2021.          when SP = 1 & KEY = '52'X then do      /* INS */
  2022.             INS = \INS; SP = 0
  2023.             call GOTOXY X+3 10; XX = charout(,CCLR.18)
  2024.             if INS = 1 then XX = charout(,' INS ')
  2025.             else XX = charout(,copies(CH,5))
  2026.             call GOTOXY XP+1 YP+1; XX = charout(,CCLR.11)
  2027.          end  /* Do */
  2028.          when SP = 1 & KEY = '53'X then do      /* DEL */
  2029.             if substr(KJST,YP-7,1) = 0 then KJADJ = 1
  2030.             else KJADJ = 0
  2031.             RES = left(RES,YP-9)||substr(RES,YP-7+KJADJ)
  2032.             KJST = left(KJST,YP-9)||substr(KJST,YP-7+KJADJ)
  2033.             /* call GOTOXY XP+1 YP+1 */
  2034.             SP = 0
  2035.          end  /* Do */
  2036.          when SP = 1 & KEY = '4D'X then do      /* Right arrow */
  2037.             YP = YP + 1; SP = 0
  2038.             if substr(KJST,YP-8,1) = 0 then YP = YP + 1
  2039.          end
  2040.          when SP = 1 & KEY = '4B'X then do      /* Left arrow */
  2041.             SP = 0; YP = YP - 1; if YP < 4 then YP = 4
  2042.          end
  2043.          when (SP = 2 & KEY = '9B'X) | (SP = 1 & KEY = '73'X) then do
  2044.             YP = 9; SP = 0
  2045.          end
  2046.          when (SP = 2 & KEY = '9D'X) | (SP = 1 & KEY = '74'X) then do
  2047.             YP = length(strip(RES,T))+5
  2048.             SP = 0
  2049.          end
  2050.          when SP = 0 & KEY = '08'X then do     /* BS */
  2051.             YPKJ = YP - 10
  2052.             if YPKJ >= 0 then do
  2053.               if substr(KJST,YPKJ+1,1) = 0 then KJADJ = 1
  2054.               else KJADJ = 0
  2055.               RES = left(RES,YPKJ-KJADJ)||substr(RES,YPKJ+2)
  2056.               KJST = left(KJST,YPKJ-KJADJ)||substr(KJST,YPKJ+2)
  2057.               YP = YP - KJADJ - 1
  2058.             end
  2059.          end  /* Do */
  2060.          when SP = 1 then SP = 0
  2061.          when SP = 2 then SP = 0
  2062.          when SP = 0 | SP = 3 then do
  2063.             if SP = 3 then do
  2064.                KJSP = 1; KJSTAT = '10'
  2065.             end
  2066.             else do
  2067.                KJSP = 0; KJSTAT = '1'
  2068.             end
  2069.             SP = 0; YPKJ = YP - 9
  2070.             if INS = 1 then do
  2071.                RES = left(RES,YPKJ)||KJ1||KEY||substr(RES,YP-8)
  2072.                KJST = left(KJST,YPKJ)||KJSTAT||substr(KJST,YP-8)
  2073.             end
  2074.             else do
  2075.                if substr(KJST,YP-7,1) = 0 then KJADJ = 1
  2076.                else KJADJ = 0
  2077.                RES = left(RES,YPKJ)||KJ1||KEY||substr(RES,YP-7+KJADJ)
  2078.                KJST = left(KJST,YPKJ)||KJSTAT||substr(KJST,YP-7+KJADJ)
  2079.             end  /* Do */
  2080.             YP = YP + 1 + KJSP; KJ1 = ''
  2081.          end  /* Do */
  2082.          otherwise
  2083.       end  /* select */
  2084.    end /* do */
  2085.    push RES
  2086. return KEY
  2087.  
  2088. DOWNARROW:
  2089.   SP = 0; NR = NR + 1; if NR > FCOUNT then NR = FST
  2090.   if NR >= (NX * NY + FST) then NR = FST
  2091.   call DISPFILE 'X'; call DISPINFO 'X'
  2092. return
  2093.  
  2094. SETDISPM:
  2095.   arg DISPMODE
  2096.   select
  2097.      when DISPMODE = 1 then LFILE = 45
  2098.      when DISPMODE = 2 then LFILE = 38
  2099.      when DISPMODE = 3 then LFILE = 22
  2100.      when DISPMODE = 5 then LFILE = 13
  2101.      otherwise call SETDISP 5
  2102.   end  /* select */
  2103. return
  2104.  
  2105. TITLEDISP: procedure expose CUL CH CUR CV CLL CLR CCLR. ROW COL
  2106.   X = ((ROW - 3) % 2) + 4 ; Y = (COL - 45) % 2
  2107.   KK = left(CURRENT,1)
  2108.   call GOTOXY X-4 Y
  2109.   XX = charout(,CCLR.18||CUL||copies(CH,44)||CUR)
  2110.   call GOTOXY X-3 Y
  2111.   XX = charout(,CCLR.18||CV||CCLR.10||center('FD/2 version 0.77 exTension',43)CCLR.18 CV||CCLR.9||' ')
  2112.   call GOTOXY X-2 Y
  2113.   XX = charout(,CCLR.18||CV||center('',43)CCLR.18 CV||CCLR.9||' ')
  2114.   call GOTOXY X-1 Y
  2115.   XX = charout(,CCLR.18||CV||left('',16)CCLR.20||center('∬',2)CCLR.25||center('FD',2)CCLR.17||center('2',1)CCLR.1||center('eT',2)CCLR.25||center(' O.6',4)CCLR.18||center('',16) CV||CCLR.9||' ')
  2116.   call GOTOXY X   Y
  2117.   XX = charout(,CCLR.18||CV||CCLR.17 center('',43)CCLR.18||CV||CCLR.9||' ')
  2118.   call GOTOXY X+1 Y
  2119.   XX = charout(,CCLR.18||CV||CCLR.17 center('(C)Copyright 1994,1995 by Shumann',43)CCLR.18||CV||CCLR.9||' ')
  2120.   call GOTOXY X+2 Y
  2121.   XX = charout(,CCLR.18||CV||CCLR.1 center('',43)CCLR.18||CV||CCLR.9||' ')
  2122.   call GOTOXY X+3 Y
  2123.   XX = charout(,CCLR.18||CV||CCLR.10 center('Original version',43)CCLR.18||CV||CCLR.9||' ')
  2124.   call GOTOXY X+4 Y
  2125.   XX = charout(,CCLR.18||CV||CCLR.10 center('(C)Copyright 1992,1993 by Nob_Kozawa',43)CCLR.18||CV||CCLR.9||' ')
  2126.   call GOTOXY X+5 Y
  2127.   XX = charout(,CCLR.18||CLL||copies(CH,44)||CLR||CCLR.9||' ')
  2128.   call GOTOXY X+6 Y+1; XX = charout(,CCLR.9||center('',46))
  2129. return
  2130.  
  2131. GETFILES: procedure expose CURRENT FILE. FBYTES FCOUNT TYPE. ATTR. FST NR,
  2132.                            FNAME. ROW COL CCLR. BYTES. MBYTES MCOUNT MASK. ,
  2133.                            FLM CUL CH CUR CV CLL CLR TOTAL FREE VOLID FIDX.
  2134.   parse value sysdriveinfo(left(CURRENT,2)) with . FREE TOTAL VOLID
  2135.   FILE. = ''; TYPE. = ''; FBYTES = 0; FST = 1; NR = 1; MBYTES = 0; MCOUNT = 0
  2136.   FNAME. = ''; MASK. = ' '; FLM = 0; BYTES. = 0; FIDX. = ''
  2137.   call SysFileTree CURRENT,'FILE','BT'    /* get directory information */
  2138.   FCOUNT = FILE.0; FIDX.0 = FCOUNT
  2139.   do I=1 to FCOUNT
  2140.      FIDX.I = I                              /* Initialize file index */
  2141.      parse value FILE.I with DT BYTE ATR FL
  2142.      ATTR.I = ATR; BYTES.I = BYTE
  2143.      FBYTES = FBYTES + BYTE                            /* Total Bytes */
  2144.      DT = overlay(':',overlay(' ',DT,9),12)            /* Date and Time */
  2145.      FNAME.I = filespec('name',FL)                     /* extract filename */
  2146.      if KJTEST(left(right(filespec('path',FL),2),1)) = 1 then do
  2147.         KJ = 0                                         /* DBCS process */
  2148.         do NLS = 1 to length(FL)
  2149.           if KJ = 0 then do
  2150.             NC = substr(FL,NLS,1)
  2151.             if KJTEST(NC) = 1 then KJ=1
  2152.             else if NC = '\' then DBCSPOS = NLS
  2153.           end  /* Do */
  2154.           else KJ = 0
  2155.         end /* do */
  2156.         FNAME.I = substr(FL,DBCSPOS+1)
  2157.      end  /* Do */                                /* End of DBCS process */
  2158.      LL = length(FNAME.I); if LL > FLM then FLM = LL  /* Fname length MAX */
  2159.      if substr(ATR,2,1) = 'D' then BYTE = '< DIR >'
  2160.      X = SysGetEA(FNAME.I,'.type','TYPEINFO')          /* Get Ext Attrib */
  2161.      parse var TYPEINFO 11 TYPE.I
  2162.      if TYPE.I <> '' then EA = '+'
  2163.      else EA = ' '
  2164.      FILE.I = right(BYTE,10)||EA||' '||DT||' '||ATR
  2165.   end
  2166.   if FLM < 12 then FLM = 12                      /* Minmum FLM is 12 (8.3) */
  2167. return
  2168.  
  2169. DISPINFO: procedure expose COL CCLR. CURRENT TYPE. FILE. FBYTES MBYTES,
  2170.                            FCOUNT MCOUNT NR FNAME. TOTAL FREE VOLID FIDX.
  2171. arg OPT
  2172.   INR = FIDX.NR
  2173.   FI = 82 - COL; if FI < 1 then FI = 1 ; ver = SysOS2Ver() ;info = SysDriveMap()
  2174.   TY = COL - 43; if TY < 0 then TY = 0  ; Y = (COL-9) % 4
  2175.   call GOTOXY 4 12                                   /* File info: */
  2176.   XX = charout(,CCLR.1||left(left(FNAME.INR,Y+1)||substr(FILE.INR,FI),COL-30))
  2177.   call GOTOXY 4 COL-19; XX = charout(,CCLR.24||right(MCOUNT,4))      /* XX Marked */
  2178.   call GOTOXY 4 COL-11; XX = charout(,CCLR.24||right(MBYTES,10))     /* Marked XX */
  2179.   call GOTOXY 5 16    ; XX = charout(,CCLR.24||left(TYPE.INR,TY))     /* Ext Attr: XX */
  2180.   call GOTOXY 6 COL-9 ; XX = charout(,CCLR.1||right('J'ver,8))  /* OS/2 version */
  2181.   call GOTOXY 6 19    ; XX = charout(,CCLR.1||left(info,Y+18))       /* drive info */
  2182.   if OPT = '' then do
  2183.     CU = COL - 26; if CU < 0 then CU = 0
  2184.     call GOTOXY 3 7     ; XX = charout(,CCLR.25||left(CURRENT,CU))   /* Path=XX */
  2185.     call GOTOXY 3 COL-19; XX = charout(,CCLR.1||right(FCOUNT,4))    /* XX Files */
  2186.     call GOTOXY 3 COL-11; XX = charout(,CCLR.1||right(FBYTES,10))   /* Files XX */
  2187.     Y = (COL - 9) % 4   ;YY = (COL-9) % 7
  2188.     call GOTOXY 2 18; XX = charout(,CCLR.1||right(TOTAL,Y-6))        /* Total:XX */
  2189.     call GOTOXY 2 18+Y; XX = charout(,CCLR.24||right(TOTAL-FREE,Y-6)) /* Used:XX */
  2190.     call GOTOXY 2 18+Y+Y; XX = charout(,CCLR.1||right(FREE,Y-6))     /* Free:XX */
  2191.     call GOTOXY 2 17+Y*3; XX = charout(,CCLR.20||left(strip(VOLID),YY+1)) /* VOL:XX */
  2192.   end
  2193. return
  2194.  
  2195. DISPITREE: procedure expose COL CCLR. CURRENT PTREE. TATTR. DRV TREE. ,
  2196.                             TNR IDX. TOTAL FREE VOLID TREELS.
  2197.   arg OPT
  2198.   II = IDX.DRV.TNR
  2199.   FI = COL - 34; if FI < 0 then FI = 0 ; TY = COL - 43; if TY < 0 then TY = 0
  2200.   call GOTOXY 4 13
  2201.   XX = charout(CCLR.24||left(left(TREE.DRV.II,16)||'  '||,
  2202.                subword(TREE.DRV.II,4,1),FI))
  2203.   CU = COL - 22; if CU < 0 then CU = 0
  2204.   call GOTOXY 3 7; XX = charout(,CCLR.25||left(PTREE.DRV.II,CU))  /* Path=XX */
  2205.   if OPT = '' then do
  2206.     call GOTOXY 4 COL-19; XX = charout(,CCLR.24||copies(' ',4))   /* XX Marked */
  2207.     call GOTOXY 4 COL-11; XX = charout(,CCLR.24||copies(' ',10))  /* Marked XX */
  2208.     call GOTOXY 5 16
  2209.     XX = charout(,CCLR.25||left(' >> ディレクトリ・ツリー表示 <<',TY))
  2210.     call GOTOXY 3 COL-19; XX = charout(,CCLR.1||copies(' ',4))   /* XX Files */
  2211.     call GOTOXY 3 COL-11; XX = charout(,CCLR.1||copies(' ',10))  /* Files XX */
  2212.     Y = (COL - 9) % 4   ;YY = (COL-9) % 5
  2213.     call GOTOXY 2 18; XX = charout(,CCLR.1||right(TOTAL,Y-6))    /* Total:XX */
  2214.     call GOTOXY 2 18+Y; XX = charout(,CCLR.24||right(TOTAL-FREE,Y-6)) /* Used:XX */
  2215.     call GOTOXY 2 18+Y+Y; XX = charout(,CCLR.1||right(FREE,Y-6))     /* Free:XX */
  2216.     call GOTOXY 2 17+Y*3; XX = charout(,CCLR.20||left(strip(VOLID),YY-3)) /* VOL:XX */
  2217.   end
  2218. return
  2219.  
  2220. DISPFRAME: procedure expose ROW COL CCLR.0 CCLR.1 CCLR.2 CCLR.20, /* Draw frame */
  2221.                 CCLR.17 CCLR.25 cclr.24 VER CUL CH CUR CV CVL CVR CLL CLR TITLE
  2222.   call SysCurState 'OFF'
  2223.   YY = COL - 3
  2224.   call GOTOXY 1 1
  2225.   Z=charout(,CCLR.1||CUL||copies(CH,YY)||CUR||'0D'X||'0A'X)          /**/
  2226.   Z=charout(,CV||CCLR.1||copies(' ',YY)||CCLR.1||CV||'0D'X||'0A'X)   /*ドライブ      */
  2227.   Z=charout(,CV||CCLR.1||copies(' ',YY)||CCLR.1||CV||'0D'X||'0A'X)   /*パス =       */
  2228.   Z=charout(,CV||CCLR.1||copies(' ',YY)||CCLR.1||CV||'0D'X||'0A'X)   /*ファイル情報   */
  2229.   Z=charout(,CV||CCLR.1||copies(' ',YY)||CCLR.1||CV||'0D'X||'0A'X)   /*拡張属性情報*/
  2230.   Z=charout(,CV||CCLR.1||copies(' ',YY)||CCLR.1||CV||'0D'X||'0A'X)   /*拡張属性情報*/
  2231.   Z=charout(,CVL||copies(CH,YY)||CCLR.1||CVR||'0D'X||'0A'X)          /**/
  2232.   do I = 9 to ROW                                                    /* File area  */
  2233.     Z=charout(,CV||CCLR.24||copies(' ',YY)||CCLR.1||CV||'0D'X||'0A'X) /* File area  */
  2234.   end /* do */                                                       /* File area  */
  2235.   X = charout(,CLL||copies(CH,YY)||CCLR.1||CLR)                      /**/
  2236.   call GOTOXY 2 2; Z = charout(,CCLR.2||' ページ')
  2237.   call GOTOXY 2 13; Z = charout(,'トータル:')
  2238.   Y = (COL - 9) % 4
  2239.   call GOTOXY 2 13+Y; Z = charout(,'使用:')
  2240.   call GOTOXY 2 13+Y+Y; Z = charout(,'空き:')
  2241.   call GOTOXY 2 13+Y*3; Z = charout(,'VOL:')
  2242.   call GOTOXY 3 2; Z = charout(,' パス=')
  2243.   call GOTOXY 4 2; Z = charout(,' ファイル情報:')
  2244.   call GOTOXY 5 2; Z = charout(,' 拡張属性情報:')
  2245.   call GOTOXY 3 COL-15; Z = charout(,'ファイル')
  2246.   call GOTOXY 4 COL-15; Z = charout(,'*マーク')
  2247.   call GOTOXY 6 COL-27; Z = charout(,' OS/2バージョン情報:')
  2248.   call GOTOXY 6 2; Z = charout(,' 接続ドライブ情報:')
  2249.   TL = length(TITLE); Y = (YY- 3 - TL)%2; if Y < 1 then Y = 1
  2250.   if TL > YY then TL = YY
  2251.   call GOTOXY ROW Y*2; Z = charout(,CCLR.20||left('∬',2)CCLR.25||left('FD',2)||,
  2252.                  CCLR.17||left('2',1)CCLR.1||left('eT',2)CCLR.25 left(ver,4))
  2253.   call GOTOXY ROW 5; X = charout(,CCLR.17||left(' F1:ヘルプ',8))
  2254. return
  2255.  
  2256. SETCOLOR: procedure expose CCLR.
  2257.   arg NUM
  2258.   do I = 1 to NUM
  2259.      parse upper value CCLR.I with X
  2260.      XX = '1B'X||'[0;'; P = 2
  2261.      if left(CCLR.I,1) = 'H' then XX = XX||'1;'
  2262.      else P = 1
  2263.      call GETC substr(X,P,2); XX = XX||result
  2264.      call GETC substr(X,P+2,2)
  2265.      if result <> '' then result = ';'||(result + 10)
  2266.      XX = XX||result||'m'
  2267.      CCLR.I = XX
  2268.   end /* do */
  2269. return
  2270.  
  2271. GETC: procedure
  2272.   arg CC
  2273.   select
  2274.      when CC = 'BK' then VL = 30
  2275.      when CC = 'RE' then VL = 31
  2276.      when CC = 'GR' then VL = 32
  2277.      when CC = 'YE' then VL = 33
  2278.      when CC = 'BL' then VL = 34
  2279.      when CC = 'PU' then VL = 35
  2280.      when CC = 'TU' then VL = 36
  2281.      when CC = 'WH' then VL = 37
  2282.      when CC = 'RV' then VL = 7
  2283.      otherwise VL = ''
  2284.   end  /* select */
  2285. return VL
  2286.  
  2287. SETPARM:
  2288.   /* ALT code table */
  2289.   ALTT. = '' ; ALTT.1E='A'; ALTT.30='B'; ALTT.2E='C'; ALTT.20='D'
  2290.   ALTT.12='E'; ALTT.21='F'; ALTT.22='G'; ALTT.23='H'; ALTT.17='I'
  2291.   ALTT.24='J'; ALTT.25='K'; ALTT.26='L'; ALTT.32='M'; ALTT.31='N'
  2292.   ALTT.18='O'; ALTT.19='P'; ALTT.10='Q'; ALTT.13='R'; ALTT.1F='S'
  2293.   ALTT.14='T'; ALTT.16='U'; ALTT.2F='V'; ALTT.11='W'; ALTT.2D='X'
  2294.   ALTT.15='Y'; ALTT.2C='Z'
  2295.   /* Code page test. Thanks Altair☆ san */
  2296.   options exmode
  2297.   if filespec('N','表') = '表' then do
  2298.      CUL = '1'x; CH = '6'x; CUR ='2'X             /*     */
  2299.      CV = '5'x                                    /*   */
  2300.      CVL = '19'x; CVR = '17'x                     /*    */
  2301.      CLL = '3'X; CLR = '4'X                       /*    */
  2302.   end  /* Do */
  2303.   else do
  2304.      CUL = 'C9'x; CH = 'CD'x; CUR ='BB'x          /*  ノ ヘ サ */
  2305.      CV = 'BA'x                                   /*  コ */
  2306.      CVL = 'CC'x; CVR = 'B9'x                     /*  フ ケ */
  2307.      CLL = 'C8'x; CLR = 'BC'x                     /*  ネ シ */
  2308.   end  /* Do */
  2309.   options noexmode
  2310. return
  2311.  
  2312. DISPFILE: procedure expose FST ROW COL FILE. LFILE TYPE. DISPMODE ATTR. LL,
  2313.                            LBL FLM CCLR. NX NY NR LNR FNAME. MASK. LFL,
  2314.                            FCOUNT FIDX. INR
  2315. arg OPT
  2316.   if NR < 1 then NR = 1                   /* NR adjust in case of no-files */
  2317.   INR = FIDX.NR
  2318.   if OPT <> '' then do                    /* partial update */
  2319.     call DISPFILEX NR
  2320.     call DISPFILEX LNR
  2321.   end  /* Do */
  2322.   else do                                  /* full update */
  2323.     NY = (COL-3) % LFILE; if NY < 1 then NY = 1
  2324.     LL = (COL-3) % NY; NYR = (COL-3) // LL; NX = ROW - 8
  2325.     LBL = format(NYR,,0); TBL = NYR - LBL
  2326.     PP = (NR%(NX*NY))+1||'/'||(format((FCOUNT-1)/(NX*NY)+0.5,,0))
  2327.     Q = (COL - 9) % 4
  2328.     call GOTOXY 2 8; Z = charout(,CCLR.1||left(PP,5))  /* ディスプレイ・ページ表示 */
  2329.     if FLM < (COL-3)/2 then LFL = FLM + 1
  2330.     else LFL = format((COL - 3) / 2,,0)
  2331.     XLINE. = CCLR.24||COPIES(' ',LBL)
  2332.     do YY = 0 to NY - 1
  2333.       do XX = 0 to ROW - 9
  2334.         I = FST + XX + YY * (ROW - 8)
  2335.         call BLDLINE I
  2336.         XLINE.XX = XLINE.XX||result
  2337.       end
  2338.     end /* do */
  2339.     do X = 8 to ROW - 1
  2340.        call GOTOXY X 2
  2341.        XX = X - 8
  2342.        Z = charout(,XLINE.XX||copies(' ',TBL))
  2343.     end
  2344.   end /* do */
  2345.   LNR = NR                                 /* Lagging NR */
  2346. return
  2347.  
  2348. DISPFILEX: procedure expose INR DISPMODE LFILE FILE. TYPE. COL LL LBL,
  2349.                             ATTR. ROW FST CCLR. FNAME. MASK. LFL FIDX.
  2350.   arg I .
  2351.   XX = (I - FST) // (ROW - 8); YY = (I - FST) % (ROW - 8)
  2352.   call GOTOXY 8+XX LBL+(LL*YY)+2
  2353.   call BLDLINE I
  2354.   Z = charout(,result)
  2355. return
  2356.  
  2357. BLDLINE: procedure expose LL MASK. FILE. FNAME. TYPE. COL LFL LFILE ATTR. ,
  2358.                           INR CCLR. DISPMODE FCOUNT FST FIDX.
  2359. arg J .
  2360.   I = FIDX.J
  2361.   if I <= FCOUNT & '' <> I then do
  2362.     if DISPMODE = 1 then LINE = left(MASK.I||FNAME.I,LFL) FILE.I TYPE.I
  2363.     else LINE = left(MASK.I||left(FNAME.I,12)||substr(FILE.I,3), LFILE)
  2364.     if length(LINE) > COL - 3 then LINE = left(LINE,COL-3)
  2365.     select
  2366.       when substr(ATTR.I,5)='S'   & INR <> I then AT = CCLR.3
  2367.       when substr(ATTR.I,3,1)='H' & INR <> I then AT = CCLR.4
  2368.       when substr(ATTR.I,4,1)='R' & INR <> I then AT = CCLR.5
  2369.       when substr(ATTR.I,2,1)='D' & INR <> I then AT = CCLR.6
  2370.       when substr(ATTR.I,5)='S'   & INR = I then AT = CCLR.13
  2371.       when substr(ATTR.I,3,1)='H' & INR = I then AT = CCLR.14
  2372.       when substr(ATTR.I,4,1)='R' & INR = I then AT = CCLR.15
  2373.       when substr(ATTR.I,2,1)='D' & INR = I then AT = CCLR.16
  2374.       otherwise do
  2375.          if INR <> I then AT = CCLR.7
  2376.          else AT = CCLR.19
  2377.       end
  2378.     end  /* select */
  2379.   end  /* Do */
  2380.   else do
  2381.      LINE = ''; AT = CCLR.24
  2382.   end  /* Do */
  2383. return AT||left(LINE,LL)
  2384.  
  2385. CLS: procedure                           /* Clear screen */
  2386.   X = charout(,'1B'x||'[2J')
  2387. return
  2388.  
  2389. GOTOXY: procedure                        /* Move the cursor */
  2390. arg X Y
  2391.   /* Z = syscurpos(X, Y) */
  2392.   Z = charout(,'1B'X||'['||X||';'||Y||'H')
  2393. return
  2394.  
  2395. KJTEST: procedure
  2396. arg CHR
  2397.   if (('80'X<=CHR)&(CHR<='9F'X))|(('E0'X<=CHR)&(CHR<='FF'X)) then KJ = 1
  2398.   else KJ = 0
  2399. return KJ
  2400.  
  2401. SETHELP: procedure expose HLP.
  2402. arg OPT
  2403.    HLP. = ''; I = 0
  2404.    if OPT = 'TREE' then do
  2405.      I=I+1; HLP.I = '                           【コマンド一覧】'
  2406.      I=I+1; HLP.I = ''
  2407.      I=I+1; HLP.I = '  ↑,↓    : 上,下へスクロール            PgUp,PgDn: 前ページ,次ページへ移動'
  2408.      I=I+1; HLP.I = '  \,Home   : ツリー冒頭のディレクトリへ移動  End      : ツリー末尾のディレクトリへ移動'
  2409.      I=I+1; HLP.I = '  Enter    : ディレクトリに入る           F        : ディレクトリの検索'
  2410.      I=I+1; HLP.I = '  L        : ドライブの変更            Q,EsC    : ディレクトリ・ツリー表示の終了'
  2411.      I=I+1; HLP.I = '  R        : カレント・ディレクトリの表示      W        : ディレクトリ情報のファイル化'
  2412.      I=I+1; HLP.I = '                                                  →「FD2eTREE.DAT」'
  2413.      I=I+1; HLP.I = '  Alt+アルファベット : 指定したアルファベットで始まるディレクトリへカーソルを移動'
  2414.      I=I+1; HLP.I = ' '
  2415.      I=I+1; HLP.I = ' '
  2416.      I=I+1; HLP.I = '                           【コマンド解説】'
  2417.      I=I+1; HLP.I = ' '
  2418.      I=I+1; HLP.I = '  ↑,↓ /↑矢印キーで上に,↓矢印キーで下にスクロールします.'
  2419.      I=I+1; HLP.I = ''
  2420.      I=I+1; HLP.I = '  PgUp,PgDn /PgUpで前ページへ,PgDnで次ページへカーソルを移動します.'
  2421.      I=I+1; HLP.I = ''
  2422.      I=I+1; HLP.I = '  \,Home /ツリー冒頭のディレクトリへカーソルを移動します.'
  2423.      I=I+1; HLP.I = ''
  2424.      I=I+1; HLP.I = '  End /ツリー末尾のディレクトリへカーソルを移動します. '
  2425.      I=I+1; HLP.I = ''
  2426.      I=I+1; HLP.I = '  Enter /カーソルを合わせたディレクトリの中に入ります.'
  2427.      I=I+1; HLP.I = ''
  2428.      I=I+1; HLP.I = '  F /指定したディレクトリにカーソルを移動します.'
  2429.      I=I+1; HLP.I = '       ■検索したいディレクトリ名を入力すると,検索した後,カーソルを指'
  2430.      I=I+1; HLP.I = '         定したディレクトリへ移動します.'
  2431.      I=I+1; HLP.I = '      ■元の画面に戻るには,[L]キーを押した後に[Enter]キーを押し'
  2432.      I=I+1; HLP.I = '         てください. '
  2433.      I=I+1; HLP.I =  ''
  2434.      I=I+1; HLP.I = '  L /ドライブを変更します.'
  2435.      I=I+1; HLP.I = '       ■移動したいドライブ名を入力した後,[ENTER]キーを押すと,指'
  2436.      I=I+1; HLP.I = '         定したドライブに移動します.'
  2437.      I=I+1; HLP.I = '       ■[Esc]キーで中断します.'
  2438.      I=I+1; HLP.I =  ''
  2439.      I=I+1; HLP.I = '  Q ,Esc /ツリー表示を終了します. '
  2440.      I=I+1; HLP.I = ''
  2441.      I=I+1; HLP.I = '  R /カレントディレクトリにカーソルを移動します.'
  2442.      I=I+1; HLP.I = '       ■ツリー表示を実行するときに入っていたディレクトリ(カレント・ディレク'
  2443.      I=I+1; HLP.I = '         トリ)へカーソルを移動します.'
  2444.      I=I+1; HLP.I = ''
  2445.      I=I+1; HLP.I = '  W /ディレクトリの情報をファイル化します.  '
  2446.      I=I+1; HLP.I = '       ■画面に表示されたドライブに「FD2eTREE.DAT」という名前'
  2447.      I=I+1; HLP.I = '         で出力します. '
  2448.      I=I+1; HLP.I = ''
  2449.      I=I+1; HLP.I = '  Alt+アルファベット /指定したアルファベットで始まるディレクトリへカーソルを移動します.'
  2450.      I=I+1; HLP.I = '       ■[Alt]キーを押しながら,任意のアルファベット・キーを押すと,そのア'
  2451.      I=I+1; HLP.I = '         ルファベットで始まるディレクトリへ,カーソルが移動します.'
  2452.      HLP.0 = I 38                           /* Count and length */
  2453.    end  /* Do */
  2454.    else do
  2455.      I=I+1; HLP.I = '                           【コマンド一覧】'
  2456.      I=I+1; HLP.I = ' '
  2457.      I=I+1; HLP.I = '  1    : ファイルの1列表示            2    : ファイルの2列表示'
  2458.      I=I+1; HLP.I = '  3    : ファイルの3列表示            5    : ファイルの5列表示'
  2459.      I=I+1; HLP.I = '  A    : ファイル属性の変更           E    : ファイルの編集'
  2460.      I=I+1; HLP.I = '  C    : ファイルの複写               Alt+C: ファイル/ディレクトリの複写'
  2461.      I=I+1; HLP.I = '  D    : 通常ファイル/ディレクトリの削除   Alt+D: 属性変更ファイル/ディレクトリの削除'
  2462.      I=I+1; HLP.I = '  F    : ファイル/ディレクトリの検索       Alt+F: ファイルの検索/ファイルのマーク'
  2463.      I=I+1; HLP.I = '  H    : 削除ファイル解除画面呼出し   K    : ディレクトリの作成'
  2464.      I=I+1; HLP.I = '  L    : ドライブの変更             M    : ファイル/ディレクトリの移動'
  2465.      I=I+1; HLP.I = '  N    : ファイル/ディレクトリの名前変更   P    : ファイルの圧縮(LHA互換)'
  2466.      I=I+1; HLP.I = '  Q    : FD2eTの強制終了          R    : プログラムの実行'
  2467.      I=I+1; HLP.I = '  S    : ファイルの並び替え           T    : ディレクトリ・ツリーの表示'
  2468.      I=I+1; HLP.I = '  U    : 圧縮ファイルの解凍           V    : ファイルの閲覧/編集'
  2469.      I=I+1; HLP.I = '  X    : コマンドの実行'
  2470.      I=I+1; HLP.I = '  \    : ルート・ディレクトリに戻る        BS   : 親ディレクトリに戻る'
  2471.      I=I+1; HLP.I = '  Esc  : FD2eTの終了              Space: カレント・ファイルのマーク/マーク解除'
  2472.      I=I+1; HLP.I = '  Home : 全ファイルのマーク/マーク解除      End  : 全ファイルのマーク/マーク解除'
  2473.      I=I+1; HLP.I = '  <   : 画面先頭ファイルへ           >   : 画面末尾ファイルへ'
  2474.      I=I+1; HLP.I = '  PgUp : 前画面,先頭ファイルへ        PgDn : 次画面,先頭ファイルへ'
  2475.      I=I+1; HLP.I = '  Enter: エディタの起動 /INFファイル閲覧 /圧縮ファイル内容の一覧 /ディレクトリに入る'
  2476.      I=I+1; HLP.I = '  Ctrl+Enter: ファイルの閲覧/編集/プログラムの実行 '
  2477.      I=I+1; HLP.I = ''
  2478.      I=I+1; HLP.I = ''
  2479.      I=I+1; HLP.I = ''
  2480.      I=I+1; HLP.I = '                           【コマンド解説】'
  2481.      I=I+1; HLP.I = '  '
  2482.      I=I+1; HLP.I = '  1 /ファイルを1列表示にします.'
  2483.      I=I+1; HLP.I = '       ■左から,ファイル名,容量,日付,時間,ファイルの属性が表示されます.'
  2484.      I=I+1; HLP.I = '       ■ディレクトリの場合は,容量のかわりに < DIR > が表示されます.'
  2485.      I=I+1; HLP.I = ' '
  2486.      I=I+1; HLP.I = '  2 /ファイルを2列表示にします.'
  2487.      I=I+1; HLP.I = '       ■左から,ファイル名,容量,日付,時間が表示されます. '
  2488.      I=I+1; HLP.I = '       ■ディレクトリの場合は,容量のかわりに < DIR > が表示されます.'
  2489.      I=I+1; HLP.I = '  '
  2490.      I=I+1; HLP.I = '  3 /ファイルを3列表示にします. '
  2491.      I=I+1; HLP.I = '       ■左から,ファイル名,容量が表示されます.  '
  2492.      I=I+1; HLP.I = '       ■ディレクトリの場合は,容量のかわりに < DIR > が表示されます.'
  2493.      I=I+1; HLP.I = '  '
  2494.      I=I+1; HLP.I = '  5 /ファイルを5列表示にします'
  2495.      I=I+1; HLP.I = '       ■ファイルとディレクトリ名だけが表示されます.'
  2496.      I=I+1; HLP.I = '  '
  2497.      I=I+1; HLP.I = '  A /ファイルの属性を変更します.'
  2498.      I=I+1; HLP.I = '      ■目的のアルファベット・キーを直接押すか,カーソルを移動させて,目的の選'
  2499.      I=I+1; HLP.I = '        択肢で[Enter]キーを押すことで実行されます.'
  2500.      I=I+1; HLP.I = ''
  2501.      I=I+1; HLP.I = '  C /ファイルを複写します.'
  2502.      I=I+1; HLP.I = '      ■複写先に同一ファイルがある場合は,確認を求めず上書きします.'
  2503.      I=I+1; HLP.I = '      ■また,ドライブを指定して,[Ctrl]キー+[Enter]キーを押すと,指定 '
  2504.      I=I+1; HLP.I = '        したドライブのディレクトリ・ツリー表示になりますので,そこで複写先 '
  2505.      I=I+1; HLP.I = '        にカーソルを移動し,あるいは[F]キーで直接複写先のディレクトリを呼'
  2506.      I=I+1; HLP.I = '        び出し,[Enter]キーを押すと複写されます.'
  2507.      I=I+1; HLP.I = ''
  2508.      I=I+1; HLP.I = '  Alt+C /ファイルとディレクトリ・ツリーを複写します.'
  2509.      I=I+1; HLP.I = '      ■コマンドの呼出しは,[Alt]キーを押しながら,[C]キーを押します.'
  2510.      I=I+1; HLP.I = '      ■別ドライブへのディレクトリ・ツリーごとの複写もできます.'
  2511.      I=I+1; HLP.I = '      ■複写先に同一ファイルや同一ディレクトリがある場合は,確認を求めず'
  2512.      I=I+1; HLP.I = '        上書きします.'
  2513.      I=I+1; HLP.I = '      ■同一ディレクトリを指定した場合は,複写は行ないません.'
  2514.      I=I+1; HLP.I = '      ■また,宛先に存在しないディレクトリを指定した場合は,あらたに'
  2515.      I=I+1; HLP.I = '        ディレクトリを作成します.  '
  2516.      I=I+1; HLP.I = '      ■他のディレクトリへ複写する場合,ツリー表示からの実行もできます.'
  2517.      I=I+1; HLP.I = '        カーソルを複写先となるドライブやディレクトリに移動させて,[Enter]'
  2518.      I=I+1; HLP.I = '        キーを押すだけです. '
  2519.      I=I+1; HLP.I = '      ■また,ドライブを指定して,[Ctrl]キー+[Enter]キーを押すと,指定 '
  2520.      I=I+1; HLP.I = '        したドライブのディレクトリ・ツリー表示になりますので,そこで複写先 '
  2521.      I=I+1; HLP.I = '        にカーソルを移動し,あるいは[F]キーで直接複写先のディレクトリを呼'
  2522.      I=I+1; HLP.I = '        び出し,[Enter]キーを押すと複写されます.'
  2523.      I=I+1; HLP.I = ' '
  2524.      I=I+1; HLP.I = '  D /通常ファイルとディレクトリ・ツリーを削除します.'
  2525.      I=I+1; HLP.I = '      ■削除は[Y]キーを押すか,[Y:する]にカーソルの合った状態で,[Ent'
  2526.      I=I+1; HLP.I = '        er]キーを押します.'
  2527.      I=I+1; HLP.I = '      ■削除を中止する場合は,[N]キーを押すか,[N:しない]にカーソルの'
  2528.      I=I+1; HLP.I = '        合った状態で,[Enter]キーを押します.'
  2529.      I=I+1; HLP.I = '      ■ファイル属性の変更されたものは,削除できません.'
  2530.      I=I+1; HLP.I = '      ■ディレクトリの中に属性の変更されたファイルが含まれていると削除'
  2531.      I=I+1; HLP.I = '        削除できません.'
  2532.      I=I+1; HLP.I = ' '
  2533.      I=I+1; HLP.I = '  Alt+D /属性変更ファイルとディレクトリ・ツリーを削除します.'
  2534.      I=I+1; HLP.I = '      ■コマンドの呼出しは,[Alt]キーを押しながら,[D]キーを押します.'
  2535.      I=I+1; HLP.I = '      ■ファイル属性が変更されたものでも削除できます.'
  2536.      I=I+1; HLP.I = '      ■ディレクトリの中に属性の変更されたファイルが含まれていても削除'
  2537.      I=I+1; HLP.I = '        削除できます.'
  2538.      I=I+1; HLP.I = ' '
  2539.      I=I+1; HLP.I = '  E /ファイルの閲覧と編集をします.'
  2540.      I=I+1; HLP.I = '      ■エディタには、PM用の拡張エディタ(EPM.EXE)が指定されています.'
  2541.      I=I+1; HLP.I = ' '
  2542.      I=I+1; HLP.I = '  F /ファイルを検索します. '
  2543.      I=I+1; HLP.I = '      ■検索したいファイル名を入力すると,カレント・ディレクトリのみを検索し,'
  2544.      I=I+1; HLP.I = '        目的のファイルだけを画面上に表表示します.'
  2545.      I=I+1; HLP.I = '      ■また,ワイルド・カーソも使用できますので,「*.BAT」といった具'
  2546.      I=I+1; HLP.I = '        合に指定すると,拡張子に[BAT]をもつファイルのみが画面上に'
  2547.      I=I+1; HLP.I = '        表示されます. '
  2548.      I=I+1; HLP.I = '      ■元の画面に戻るには,[L]キーを押した後に[Enter]キーを押して'
  2549.      I=I+1; HLP.I = '        ください.'
  2550.      I=I+1; HLP.I = ' '
  2551.      I=I+1; HLP.I = '  Alt+F /ファイルを検索し, * マークをつけます. '
  2552.      I=I+1; HLP.I = '      ■コマンドの呼出しは,[Alt]キーを押しながら,[F]キーを押します.'
  2553.      I=I+1; HLP.I = '      ■検索したいファイル名を入力し,[Enter]キーを押すと,カレント・ディレ'
  2554.      I=I+1; HLP.I = '        クトリの中が検索され,目的のファイルに * 印がつきます.'
  2555.      I=I+1; HLP.I = '      ■また,ワイルド・カードも使用できますので,[*.BAT]といった具合'
  2556.      I=I+1; HLP.I = '        合に指定すると,拡張子に[BAT]をもつファイルに, * マークがつき'
  2557.      I=I+1; HLP.I = '        ます.'
  2558.      I=I+1; HLP.I = '      ■元の画面に戻るには,[L]キーを押したあとに[Enter]キーを押し'
  2559.      I=I+1; HLP.I = '        てください.  '
  2560.      I=I+1; HLP.I = ' '
  2561.      I=I+1; HLP.I = '  H /削除したファイルの削除解除の画面を呼び出します.'
  2562.      I=I+1; HLP.I = '       ■なにも入力せずに,[Enter]キーを押すと,現在のカレント・ディレクト'
  2563.      I=I+1; HLP.I = '         リの全体(すべてのサブ・ディレクトリを含む)が解除対象になりま'
  2564.      I=I+1; HLP.I = '         す.'
  2565.      I=I+1; HLP.I = '       ■また,入力ボックスで指定することによって,他のドライブ,ディレ'
  2566.      I=I+1; HLP.I = '         クトリを個別に解除設定できます. '
  2567.      I=I+1; HLP.I = ' '
  2568.      I=I+1; HLP.I = '  K /あらたにディレクトリを作成します.'
  2569.      I=I+1; HLP.I = '       ■入力ボックスにディレクトリ名をタイプすることで作成されます.'
  2570.      I=I+1; HLP.I = ' '
  2571.      I=I+1; HLP.I = '  L /ドライブを変更します.'
  2572.      I=I+1; HLP.I = '       ■移動したいドライブ名を入力したあと,[ENTER]キーを押すと,指'
  2573.      I=I+1; HLP.I = '         定したドライブに移動します.'
  2574.      I=I+1; HLP.I = '       ■[Enter]キーで中断します. '
  2575.      I=I+1; HLP.I = ' '
  2576.      I=I+1; HLP.I = '  M /ファイルとディレクトリ・ツリーを移動します.'
  2577.      I=I+1; HLP.I = '       ■他のドライブへの移動に限って,元のファイルを削除するかどうか'
  2578.      I=I+1; HLP.I = '         問い合わせてきます.'
  2579.      I=I+1; HLP.I = '       ■また,同一ディレクトリ内での移動で,移動先のディレクトリを指定し'
  2580.      I=I+1; HLP.I = '         た場合,元のディレクトリの名前が変更されるだけとなります.'
  2581.      I=I+1; HLP.I = '       ■ツリー表示からの実行もできます.カーソルを移動先となるドライブ'
  2582.      I=I+1; HLP.I = '         のディレクトリに移動させて,[Enter]キーを押すだけです.  '
  2583.      I=I+1; HLP.I = ' '
  2584.      I=I+1; HLP.I = '  N /ファイル名を変更します.'
  2585.      I=I+1; HLP.I = ' '
  2586.      I=I+1; HLP.I = '  P /ファイルを圧縮します. '
  2587.      I=I+1; HLP.I = '       ■圧縮先のパス名(ドライブ,ディレクトリ)と圧縮ファイル名を指定した後,'
  2588.      I=I+1; HLP.I = '         [Enter]キーを押すと実行されます.'
  2589.      I=I+1; HLP.I = ' '
  2590.      I=I+1; HLP.I = '  Q /「FD2eT」を強制終了します. '
  2591.      I=I+1; HLP.I = '       ■終了後は,「FD2eT」を起動した時のディレクトリ(カレント・ディレクトリ)'
  2592.      I=I+1; HLP.I = '         に戻ります.'
  2593.      I=I+1; HLP.I = ' '
  2594.      I=I+1; HLP.I = '  R /プログラムを実行します. '
  2595.      I=I+1; HLP.I = '       ■[X]キーとほぼ同じ機能ですが,こちらはファイルにカーソルを合わせ'
  2596.      I=I+1; HLP.I = '         ると,そのファイル名を取り込みますので,ファイル名の先頭に実行'
  2597.      I=I+1; HLP.I = '         形式のファイル(*.EXE,*.CMD,*.COM,*.BAT)名を入力し,[ENTER]'
  2598.      I=I+1; HLP.I = '         キーを押せば実行されます.'
  2599.      I=I+1; HLP.I = '       ■逆に,実行ファイルにカーソルを合わせて,[ENTER]キーを押すと,実行'
  2600.      I=I+1; HLP.I = '         ファイルの半角後にカーソルの移動した状態が表示されます.そこか'
  2601.      I=I+1; HLP.I = '         ら続けてファイル名を入力し,[ENTER]キーを押すと実行されます. '
  2602.      I=I+1; HLP.I = '       ■また,それまで実行したコマンドの内容を一時的に記憶します.'
  2603.      I=I+1; HLP.I = '         ただし,いったん「FD2eT」を終了すると,記憶した内容は初'
  2604.      I=I+1; HLP.I = '         期化されて,すべて消えてしまいます.'
  2605.      I=I+1; HLP.I = ' '
  2606.      I=I+1; HLP.I = '  S /ファイル,ディレクトリを並び替えます. '
  2607.      I=I+1; HLP.I = '       ■ファイル名・ファイルのタイプ(拡張子)・時間(タイムスタンプ)・ファイルのサイ'
  2608.      I=I+1; HLP.I = '         ズ(バイト数)別に並べ替えることができます.'
  2609.      I=I+1; HLP.I = '       ■さらに並べ替えの順序を昇順,降順から選択できます.'
  2610.      I=I+1; HLP.I = '         実行の仕方は,目的の並べ替えの種類や順序を直接アルファベッ'
  2611.      I=I+1; HLP.I = '         トを押すことで選択実行するか,カーソルを移動させ選択した位'
  2612.      I=I+1; HLP.I = '         置で[Enter]キーを押すことで実行するかのどちらかです.'
  2613.      I=I+1; HLP.I = ' '
  2614.      I=I+1; HLP.I = '  T /ディレクトリ・ツリーを表示します.'
  2615.      I=I+1; HLP.I = '       ■ツリー表示状態で[W]キーを押すと,ディレクトリ情報が「FD2eTREE.D'
  2616.      I=I+1; HLP.I = '         AT」という名前で,画面に表示されたドライブに出力されます.'
  2617.      I=I+1; HLP.I = ' '
  2618.      I=I+1; HLP.I = '  U /圧縮ファイルを解凍します.  '
  2619.      I=1+I; HLP.I = '       ■「OS/2」用の[UNZIP.EXE]は解凍先として,あらたにディレクト'
  2620.      I=I+1; HLP.I = '         リを作りますが,[LH32.EXE]は作りません.ですから[LH32.E'
  2621.      I=I+1; HLP.I = '         XE]の場合は,解凍先として既存のディレクトリを指定してくだい.'
  2622.      I=I+1; HLP.I = '       ■解凍時に,なにも指定しない場合は,現在いるカレント・ディレクトリ'
  2623.      I=I+1; HLP.I = '         にファイルを解凍します.'
  2624.      I=I+1; HLP.I = '       ■また,ツリー表示からの実行もできます.[Ctrl]キー+[Enter]キー'
  2625.      I=I+1; HLP.I = '         でツリー表示になりので,目的のディレクトリにカーソルを移動するか,'
  2626.      I=I+1; HLP.I = '         [F]キーで検索するかして,そこで[Enter]キーを押してくださ'
  2627.      I=I+1; HLP.I = '         い.そのディレクトリに解凍されます.   '
  2628.      I=I+1; HLP.I = '       ■ただし,[LH32.EXE]はツリー表示からの実行に対応していませ'
  2629.      I=I+1; HLP.I = '         ん.他の[LHA]互換アーカイバでは,実行できるものもあります.'
  2630.      I=I+1; HLP.I = ' '
  2631.      I=I+1; HLP.I = '  V /ファイルの閲覧と編集をします. '
  2632.      I=I+1; HLP.I = '       ■「FD2eT」では,全画面&窓用のエディタ「T2.EXE」を初期設定'
  2633.      I=I+1; HLP.I = '         しています. DOS用のエディタに慣れた方には重宝と思います.'
  2634.      I=I+1; HLP.I = ' '
  2635.      I=I+1; HLP.I = '  X /コマンドを実行します. '
  2636.      I=I+1; HLP.I = '       ■実行形式のファイル(*.EXE,*.CMD,*.COM,*.BAT)を入力し,[Ent'
  2637.      I=I+1; HLP.I = '         er]キーを押すと起動します.'
  2638.      I=I+1; HLP.I = '       ■なにも入力せずに[Enter]キーを押すと,「OS/2」のプロンプト画'
  2639.      I=I+1; HLP.I = '         面に切り変わります.  '
  2640.      I=I+1; HLP.I = '       ■「FD2eT」の画面に戻るには[EXIT]と入力してください. '
  2641.      I=I+1; HLP.I = '       ■また,それまで実行したコマンド内容を一時的に記憶します.'
  2642.      I=I+1; HLP.I = '         ただし,いったん「FD2eT」を終了すると,記憶した内容は'
  2643.      I=I+1; HLP.I = '         初期化されて,すべて消えてしまいます.'
  2644.      I=I+1; HLP.I = '  '
  2645.      I=I+1; HLP.I = '  \  /ルート・ディレクトリに戻ります. '
  2646.      I=I+1; HLP.I = '  '
  2647.      I=I+1; HLP.I = '  BS /親ディレクトリに戻ります.  '
  2648.      I=I+1; HLP.I = ' '
  2649.      I=I+1; HLP.I = '  Space /カレント・ファイルのマークとマーク解除をします.'
  2650.      I=I+1; HLP.I = '       ■キーを押すとカーソルの合ったファイルに * 印がつき,もう一度押す'
  2651.      I=I+1; HLP.I = '         と消えます. '
  2652.      I=I+1; HLP.I = '  '
  2653.      I=I+1; HLP.I = '  Home /全ファイルのマークとマーク解除をします.'
  2654.      I=I+1; HLP.I = '       ■キーを押すとすべてのファイルに * 印がつき,もう一度押すと消'
  2655.      I=I+1; HLP.I = '         えます.すでに * 印がついている場合は, * 印を消します.'
  2656.      I=I+1; HLP.I = ' '
  2657.      I=I+1; HLP.I = '  End /全ファイルのマークとマーク解除をします.'
  2658.      I=I+1; HLP.I = '       ■キーを押すとすべてのファイルに * 印がつき,もう一度押すと消'
  2659.      I=I+1; HLP.I = '         えます.すでに * 印がついている場合は, * 印を消します.'
  2660.      I=I+1; HLP.I = ' '
  2661.      I=I+1; HLP.I = '  Esc  /「FD2eT」を終了します(中断もできます).'
  2662.      I=I+1; HLP.I = '  '
  2663.      I=I+1; HLP.I = '  Enter■ファイルにカーソルを合わせてキーを押すと,全画面用エディタ「T2.EXE」'
  2664.      I=I+1; HLP.I = '         を起動します. '
  2665.      I=I+1; HLP.I = '       ■INF(*.INF)ファイルの場合は,PM用のINF専用エディタを起動しま'
  2666.      I=I+1; HLP.I = '         すので,PM画面でファイルを閲覧できます.'
  2667.      I=I+1; HLP.I = '       ■ディレクトリにカーソルがある場合,そのディレクトリの中に入ります. '
  2668.      I=I+1; HLP.I = '       ■また,圧縮ファイルの場合(*.ZIP、*.LZH、*.ZOO)は, 圧縮内容'
  2669.      I=I+1; HLP.I = '         (圧縮されたファイルの一覧)が表示されます.  '
  2670.      I=I+1; HLP.I = ' '
  2671.      I=I+1; HLP.I = '  Ctrl+Enter /ファイルの閲覧と編集をします.'
  2672.      I=I+1; HLP.I = '       ■エディタにはPM用の拡張エディタ(EPM.EXE)が指定されています.'
  2673.      I=I+1; HLP.I = '       ■また,カーソルを合わせた実行形式のファイル(*.EXE,*.CMD,*.COM,'
  2674.      I=I+1; HLP.I = '         *.BAT)を起動します.'
  2675.      I=I+1; HLP.I = ' '
  2676.      I=I+1; HLP.I = '  < /カーソルを画面先頭のファイルに移動します. '
  2677.      I=I+1; HLP.I = ' '
  2678.      I=I+1; HLP.I = '  > /カーソルを画面末尾のファイルに移動します.   '
  2679.      I=I+1; HLP.I = '  '
  2680.      I=I+1; HLP.I = '  PageUp /カーソルを全ファイルの先頭に移動します. '
  2681.      I=I+1; HLP.I = '  '
  2682.      I=I+1; HLP.I = '  PageDown /カーソルを次ページの先頭に移動します. '
  2683.      I=I+1; HLP.I = '       ■ただし,一画面に全ファイルが表示されている場合は,先頭ファイル'
  2684.      I=I+1; HLP.I = '         に移動します.'
  2685.      HLP.0 = I 37                            /* Count and length */
  2686.    end
  2687. return
  2688.  
  2689. DISPHELP: procedure expose COL ROW CCLR. CUL CUR CH CV CLL CLR HLP.
  2690.    parse value HLP.0 with CC LL
  2691.    YPOS =( COL - 71) % 2
  2692.    if YPOS < 0 then do; YPOS = 2; LL = COL - 5; end
  2693.    P = 1; LL1 = (LL - 35) % 2; LL2 = LL - LL1 + 16
  2694.    do until P > CC
  2695.       call GOTOXY 8 YPOS
  2696.       Z = charout(,CCLR.18||CUL||copies(CH,LL1)||CCLR.20||left('∬',2)||CCLR.17'コマンドの説明' CCLR.18||,
  2697.                    copies(CH,LL2-40) CCLR.25||right('●入力の仕方 *ドライブ→X:\ *ディレクトリ→X',37)CCLR.18 copies(CH,1)||CUR)
  2698.       call GOTOXY 9 YPOS
  2699.       Z = charout(,CCLR.18||CV||center('',LL2+18)||CV||CCLR.9||' ')
  2700.       do XX = 10 to (ROW - 4)
  2701.          call GOTOXY XX YPOS
  2702.          X = charout(,CCLR.18||CV||CCLR.1||left(HLP.P,LL+32)||CCLR.18 CV||CCLR.9||' ')
  2703.          P = P + 1
  2704.       end /* do */
  2705.       call GOTOXY ROW-3 YPOS
  2706.       X = charout(,CCLR.18||CV||center(' ',LL+33)||CV||CCLR.9||' ')
  2707.       call GOTOXY ROW-2 YPOS
  2708.       X = charout(,CCLR.18||CLL||copies(CH,LL1)CCLR.10 left('Esc:中断',8) CCLR.18||copies(CH,LL+22)||CLR||CCLR.9||' ')
  2709.       if P < (CC + 1) then do
  2710.           call GOTOXY ROW-2 YPOS+LL+24; X = charout(,CCLR.10 'キー:次頁 ')
  2711.       end  /* Do */
  2712.       call GOTOXY ROW-1 YPOS+1; X = charout(,CCLR.9||copies(' ',LL+35))
  2713.       KEY = sysgetkey('NOECHO')
  2714.       if KEY = '00'X | KEY = 'E0'X then KEY = sysgetkey('NOECHO')
  2715.       if KEY = '1B'X then leave
  2716.    end
  2717. return
  2718.