home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 3 / FREEWARE.BIN / ms_dos / dsort / dstoptn.pre < prev    next >
Text File  |  1980-01-02  |  23KB  |  802 lines

  1.     page    96,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§              ディレクトリエントリ  ソート  ユーティリティ                §
  5. ;§                                                                          §
  6. ;§                                     DSORT.EXE  Ver1.11    §
  7. ;§                                                                          §
  8. ;§                   Copyright (C) by 福地 邦雄 1991. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     .MODEL  SMALL,C
  11. ;
  12.     public  options,usageout,dirlist,dirfind,strcopywild
  13.     extrn   sweep:word,sortexec:word,recursive:word,dirgather:word
  14.     extrn   dta:dword,srchname:dword,namebuff:dword,namebuffsiz:word
  15.     extrn   dirtype:word,fattype:word,attribute:word,clustcount:word
  16.     extrn   driveno:word,clustsize:word,fatsize:word,dirsize:word
  17.     extrn   fatbuff:word,dirbuff:word,sortbuff:word,sortcount:word
  18.     extrn   drvinf:byte,clustsect:word,subsearch:word
  19.     extrn   sortfuncs:word,subchain:word,wildcard:byte,pathbuff:byte
  20.     extrn   usagemsg:byte,_msgsize:abs
  21.     extrn   abort:near
  22.     extrn   errorno:word
  23. ;
  24.     PUBLIC  setsortfunc,setsortobj,cmpdummy,cmpdirf,cmpfull,cmpname
  25.     PUBLIC  cmpextn,cmpsize,cmpdate,cmptime,strncmp,chrtypes,pathsep
  26. ;
  27. REVERSE equ 1
  28. NORMAL  equ 0
  29. TAIL    equ 1
  30. HEAD    equ 0
  31. YES     equ 1
  32. NO      equ 0
  33. TAB     equ 9
  34. CR      equ 0dh
  35. LF      equ 0ah
  36. DEFAULT equ 031h
  37. ARCHIVE equ 020h
  38. SUBDIR  equ 010h
  39. VOLUME  equ 008h
  40. HIDDEN  equ 004h
  41. SYSTEM  equ 002h
  42. RDONLY  equ 001h
  43. ;
  44.     .code
  45. ;
  46. ;------------------------------------------------------------------------------
  47. ;
  48. ;   options
  49. ;       オプション指定の評価とディレクトリのリストを取る
  50. ;
  51. ;   TYPE    near call
  52. ;   IN  AX アーギュメント数
  53. ;       SS:BP アーギュメントポインタリストの先頭アドレス
  54. ;   OUT 特になし
  55. ;   保存レジスタ    ds
  56. ;
  57. ;------------------------------------------------------------------------------
  58. ;
  59. options proc
  60. ;
  61.     cld
  62.     push    ax
  63.     mov     ah,2fh                  ; Disk Transfer Address 取得
  64.     int     21h
  65.     lea     bx,[bx+1eh]             ; DTAのファイル名オフセット
  66.     mov     word ptr dta,bx
  67.     mov     word ptr dta+2,es
  68.     pop     bx
  69.     mov     sortfuncs,offset _text:cmpdummy ; ダミーのソート比較関数セット
  70.     mov     word ptr sortfuncs+2,NORMAL
  71.     mov     si,offset sortfuncs+4
  72.     mov     attribute,DEFAULT       ; ソート対象属性のデフォルトセット
  73.     @do until
  74.         les     di,[bp]
  75.         @cbegin
  76.         @case (byte ptr es:[di],=,'-'),S
  77.             call    setsortfunc
  78.         @case (byte ptr es:[di],=,'+'),S
  79.             call    setsortobj
  80.         @other
  81.             mov     word ptr srchname,di    ; ディレクトリ名リストの作成
  82.             mov     word ptr srchname+2,es
  83.             call    dirlist
  84.         @cend
  85.         add     bp,4                ; 次のアーギュメントへ
  86.         dec     bx
  87.     @doend (zf,on)
  88.     @if (si,=,offset sortfuncs+4)
  89.         mov     word ptr [si],offset cmpfull    ; デフォルトの比較関数セット
  90.         mov     word ptr [si+2],NORMAL
  91.         lea     si,[si+4]
  92.     @ifend
  93.     not     attribute               ; ソート対象属性を反転させたものを使う
  94.     mov     word ptr [si],0         ; ソート比較関数リストのエンドマーク
  95.     les     di,namebuff             ; ディレクトリ名リストのエンドマーク
  96.     mov     word ptr es:[di],0
  97.     @if (word ptr es:[0],=,0)
  98.         jmp     usageout            ; ディレクトリ無しの時、ヘルプ表示
  99.     @ifend
  100.     ret
  101. ;
  102. options endp
  103. ;
  104. ;------------------------------------------------------------------------------
  105. ;
  106. ;   usageout
  107. ;       ヘルプメッセージを表示して終了
  108. ;
  109. ;   TYPE    near call
  110. ;   IN  なし
  111. ;   OUT なし
  112. ;   保存レジスタ    なし
  113. ;
  114. ;------------------------------------------------------------------------------
  115. ;
  116. usageout    proc
  117. ;
  118.     mov     errorno,1
  119.     mov     dx,offset usagemsg
  120.     mov     cx,_msgsize
  121.     jmp     abort
  122. ;
  123. usageout    endp
  124. ;
  125. ;------------------------------------------------------------------------------
  126. ;
  127. ;   setsortfunc
  128. ;       ソート機能指定オプションの評価と、比較関数リストの作成
  129. ;
  130. ;   TYPE    near call
  131. ;   IN      AL アーギュメント文字
  132. ;           DS:SI 比較関数リストアドレス
  133. ;   OUT     SI += 4 
  134. ;   保存レジスタ    bx,cx,dx,di,bp,ds,es
  135. ;
  136. ;------------------------------------------------------------------------------
  137. ;
  138. setsortfunc proc
  139. ;
  140.     inc     di
  141.     @do repeat
  142.         mov     al,es:[di]
  143.         inc     di
  144.         @if (al,=,0)
  145.             @doexit
  146.         @ifend
  147.         @if (al,>=,'a'),S           ; 昇順
  148.             mov     word ptr [si+2],NORMAL
  149.             sub     al,'a'-'A'
  150.         @else                       ; 降順
  151.             mov     word ptr [si+2],REVERSE
  152.         @ifend
  153.         @cbegin
  154.         @case (al,=,'D'),S          ; 最終更新日付
  155.             mov     ax,offset _text:cmpdate
  156.         @case (al,=,'E'),S          ; 拡張子 3バイト
  157.             mov     ax,offset _text:cmpextn
  158.         @case (al,=,'F'),S          ; フルネーム 11バイト
  159.             mov     ax,offset _text:cmpfull
  160.         @case (al,=,'N'),S          ; ファイル名 8バイト
  161.             mov     ax,offset _text:cmpname
  162.         @case (al,=,'S'),S          ; ファイルサイズ
  163.             mov     ax,offset _text:cmpsize
  164.         @case (al,=,'T'),S          ; 最終更新時刻
  165.             mov     ax,offset _text:cmptime
  166.         @other
  167.             jmp     usageout
  168.         @cend
  169.         mov     [si],ax
  170.         lea     si,[si+4]
  171.     @doend
  172.     ret
  173. ;
  174. setsortfunc endp
  175. ;
  176. ;------------------------------------------------------------------------------
  177. ;
  178. ;   setsortobj
  179. ;       ソート対象選択オプション評価
  180. ;
  181. ;   TYPE    near call
  182. ;   IN  AL アーギュメント文字
  183. ;   OUT なし
  184. ;   保存レジスタ    AX以外
  185. ;
  186. ;------------------------------------------------------------------------------
  187. ;
  188. setsortobj  proc
  189. ;
  190.     inc     di
  191.     @do repeat
  192.         mov     al,es:[di]
  193.         inc     di
  194.         @if (al,=,0)
  195.             @doexit
  196.         @ifend
  197.         @if (al,>=,'a'),S           ; 先頭に
  198.             mov     dirgather,HEAD
  199.             sub     al,'a'-'A'
  200.         @else                       ; 末尾に
  201.             mov     dirgather,TAIL
  202.         @ifend
  203.         @cbegin
  204.         @case (al,=,'G'),S          ; ディレクトリの扱い
  205.             mov     sortfuncs,offset _text:cmpdirf
  206.             mov     ax,dirgather
  207.             mov     sortfuncs+2,ax
  208.         @case (al,=,'T'),S          ; 再帰呼び出し
  209.             mov     recursive,YES
  210.         @case (al,=,'N'),S          ; ソート無し
  211.             mov     sortexec,NO
  212.         @case (al,=,'F'),S          ; 掃き寄せ無し
  213.             mov     sweep,NO
  214.         @case (al,=,'A'),S          ; アーカイブ属性
  215.             xor     attribute,ARCHIVE
  216.         @case (al,=,'D'),S          ; ディレクトリ
  217.             xor     attribute,SUBDIR
  218.         @case (al,=,'V'),S          ; ボリュームラベル
  219.             xor     attribute,VOLUME
  220.         @case (al,=,'S'),S          ; システムファイル
  221.             xor     attribute,SYSTEM
  222.         @case (al,=,'H'),S          ; 隠しファイル
  223.             xor     attribute,HIDDEN
  224.         @case (al,=,'R'),S          ; 読み出しのみ可能
  225.             xor     attribute,RDONLY
  226.         @other
  227.             jmp     usageout
  228.         @cend
  229.     @doend
  230.     ret
  231. ;
  232. setsortobj  endp
  233. ;
  234. ;------------------------------------------------------------------------------
  235. ;
  236. ;   cmpdummy
  237. ;       ダミー比較ルーチン 必ず = で終了
  238. ;
  239. ;   TYPE    near call
  240. ;   IN  なし
  241. ;   OUT AX=0 ZERO FLAG=1
  242. ;   保存レジスタ    AX以外
  243. ;
  244. ;------------------------------------------------------------------------------
  245. ;
  246. cmpdummy    proc
  247. ;
  248.     xor     ax,ax
  249.     ret
  250. ;
  251. cmpdummy    endp
  252. ;
  253. ;------------------------------------------------------------------------------
  254. ;
  255. ;   cmpdirf
  256. ;       ディレクトリ属性比較
  257. ;
  258. ;   TYPE    near call
  259. ;   IN      DS:SI エントリ1アドレス
  260. ;           ES:DI エントリ2アドレス
  261. ;   OUT     AX ディレクトリ:通常= -1  通常:ディレクトリ= 1  その他 0
  262. ;   保存レジスタ    AX以外
  263. ;
  264. ;------------------------------------------------------------------------------
  265. ;
  266. cmpdirf proc
  267. ;
  268.     mov     al,[si+0bh]             ; 属性バイトの取り出し
  269.     mov     ah,[di+0bh]
  270.     and     ax,01010h
  271.     cmp     al,ah
  272.     ja      dirfhead                ; Dir:File
  273.     jb      dirftail                ; File:Dir
  274.     xor     ax,ax                   ; 同じ属性
  275.     ret
  276. dirfhead:
  277.     mov     ax,-1
  278.     ret
  279. dirftail:
  280.     mov     ax,1
  281.     ret
  282. ;
  283. cmpdirf endp
  284. ;
  285. ;------------------------------------------------------------------------------
  286. ;
  287. ;   cmpfull
  288. ;       フルネーム比較
  289. ;
  290. ;   TYPE    near call
  291. ;   IN      DS:SI エントリ1アドレス
  292. ;           ES:DI エントリ2アドレス
  293. ;   OUT     AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  294. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  295. ;
  296. ;------------------------------------------------------------------------------
  297. ;
  298. cmpfull proc
  299. ;
  300.     mov     cx,11
  301.     call    strncmp
  302.     ret
  303. ;
  304. cmpfull endp
  305. ;
  306. ;------------------------------------------------------------------------------
  307. ;
  308. ;   cmpname
  309. ;       ファイル名比較
  310. ;
  311. ;   TYPE    near call
  312. ;   IN      DS:SI エントリ1アドレス
  313. ;           ES:DI エントリ2アドレス
  314. ;   OUT     AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  315. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  316. ;
  317. ;------------------------------------------------------------------------------
  318. ;
  319. cmpname proc
  320. ;
  321.     mov     cx,8
  322.     call    strncmp
  323.     ret
  324. ;
  325. cmpname endp
  326. ;
  327. ;------------------------------------------------------------------------------
  328. ;
  329. ;   cmpextn
  330. ;       拡張子比較
  331. ;
  332. ;   TYPE    near call
  333. ;   IN      DS:SI エントリ1アドレス
  334. ;           ES:DI エントリ2アドレス
  335. ;   OUT     AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  336. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  337. ;
  338. ;------------------------------------------------------------------------------
  339. ;
  340. cmpextn proc    uses bx si di
  341. ;
  342.     lea     si,[si+8]               ; 拡張子位置
  343.     lea     di,[di+8]
  344.     mov     cx,3
  345.     call    strncmp
  346.     ret
  347. ;
  348. cmpextn endp
  349. ;
  350. ;------------------------------------------------------------------------------
  351. ;
  352. ;   cmpsize
  353. ;       ファイルサイズ比較
  354. ;
  355. ;   TYPE    near call
  356. ;   IN  DS:SI エントリ1アドレス
  357. ;       ES:DI エントリ2アドレス
  358. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  359. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  360. ;
  361. ;------------------------------------------------------------------------------
  362. ;
  363. cmpsize proc
  364. ;
  365.     mov     ax,[si+1ch]             ; エントリ1のファイルサイズ4バイト
  366.     mov     cx,[si+1eh]
  367.     cmp     cx,[di+1eh]             ; エントリ2と比較
  368.     ja      sizeabove
  369.     jb      sizebelow
  370.     cmp     ax,[di+1ch]
  371.     ja      sizeabove
  372.     jb      sizebelow
  373.     xor     ax,ax
  374.     ret
  375. sizeabove:
  376.     mov     ax,1
  377.     ret
  378. sizebelow:
  379.     mov     ax,-1
  380.     ret
  381. ;
  382. cmpsize endp
  383. ;
  384. ;------------------------------------------------------------------------------
  385. ;
  386. ;   cmpdate
  387. ;       最終更新日付比較
  388. ;
  389. ;   TYPE    near call
  390. ;   IN  DS:SI エントリ1アドレス
  391. ;       ES:DI エントリ2アドレス
  392. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  393. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  394. ;
  395. ;------------------------------------------------------------------------------
  396. ;
  397. cmpdate proc
  398. ;
  399.     mov     ax,[si+18h]
  400.     cmp     ax,[di+18h]
  401.     ja      dateabove
  402.     jb      datebelow
  403.     xor     ax,ax
  404.     ret
  405. dateabove:
  406.     mov     ax,1
  407.     ret
  408. datebelow:
  409.     mov     ax,-1
  410.     ret
  411. ;
  412. cmpdate endp
  413. ;
  414. ;------------------------------------------------------------------------------
  415. ;
  416. ;   cmptime
  417. ;       最終更新時刻比較
  418. ;
  419. ;   TYPE    near call
  420. ;   IN  DS:SI エントリ1アドレス
  421. ;       ES:DI エントリ2アドレス
  422. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  423. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  424. ;
  425. ;------------------------------------------------------------------------------
  426. ;
  427. cmptime proc
  428. ;
  429.     mov     ax,[si+16h]
  430.     cmp     ax,[di+16h]
  431.     ja      timeabove
  432.     jb      timebelow
  433.     xor     ax,ax
  434.     ret
  435. timeabove:
  436.     mov     ax,1
  437.     ret
  438. timebelow:
  439.     mov     ax,-1
  440.     ret
  441. ;
  442. cmptime endp
  443. ;
  444. ;------------------------------------------------------------------------------
  445. ;
  446. ;   strncmp
  447. ;       文字列比較 漢字対応 漢字はANKより大きい
  448. ;
  449. ;   TYPE    near call
  450. ;   IN  CX 比較サイズ
  451. ;       DS:SI エントリ1アドレス
  452. ;       ES:DI エントリ2アドレス
  453. ;   OUT AX エントリ1<エントリ2= -1  エントリ1=エントリ2= 0  エントリ1>エントリ2= 1
  454. ;   保存レジスタ    bx,dx,si,di,bp,ds,es
  455. ;
  456. ;------------------------------------------------------------------------------
  457. ;
  458. strncmp proc    uses bx si di
  459. ;
  460.     cld
  461.     @do until
  462.         dec     cx
  463.         mov     ax,[si]             ; エントリ1 1文字取得
  464.         inc     si
  465.         call    chrtypes
  466.         @if (zf,off)
  467.             dec     cx
  468.             inc     si
  469.         @ifend
  470. ;
  471.         mov     bx,ax
  472.         mov     ax,[di]             ; エントリ2 1文字取得
  473.         inc     di
  474.         call    chrtypes
  475.         @if (zf,off)
  476.             inc     di
  477.         @ifend
  478.         cmp     bx,ax               ; 比較
  479.         ja      strabove
  480.         jb      strbelow
  481.         or      cx,cx
  482.     @doend (zf,on),or,(sf,on)
  483. ;
  484.     xor     ax,ax
  485. streturn:
  486.     ret
  487. ;
  488. strabove:
  489.     mov     ax,1
  490.     jmp     streturn
  491. strbelow:
  492.     mov     ax,-1
  493.     jmp     streturn
  494. ;
  495. strncmp endp
  496. ;
  497. ;------------------------------------------------------------------------------
  498. ;
  499. ;   chrtypes
  500. ;       漢字判定
  501. ;
  502. ;   TYPE    near call
  503. ;   IN  AX 文字コード AL=第一バイト
  504. ;   OUT AX 判定後コード ANK:AH=0
  505. ;       ZERO FLAG AHのTEST結果
  506. ;   保存レジスタ    AX以外
  507. ;
  508. ;------------------------------------------------------------------------------
  509. ;
  510. chrtypes    proc
  511. ;
  512.     cmp     al,081h
  513.     jb      chrank
  514.     cmp     al,0a0h
  515.     jb      chrsjis
  516.     cmp     al,0e0h
  517.     jb      chrank
  518.     cmp     al,0fch
  519.     jbe     chrsjis
  520. chrank:
  521.     xor     ah,ah
  522.     ret
  523. chrsjis:
  524.     xchg    ah,al
  525.     test    ah,ah
  526.     ret
  527. ;
  528. chrtypes    endp
  529. ;
  530. ;------------------------------------------------------------------------------
  531. ;
  532. ;   dirlist
  533. ;       全てのディレクトリ名を検索して、そのパス名をバッファに格納する
  534. ;       ワイルドカード対応  FUNCTION    4EH,4FH
  535. ;
  536. ;   TYPE    near call
  537. ;   IN  検索情報構造体
  538. ;   OUT ディレクションフラグ アップ方向
  539. ;   保存レジスタ    bp,ds
  540. ;
  541. ;------------------------------------------------------------------------------
  542. ;
  543. dirlist    proc uses bx si
  544.         local copysiz,fnamsiz,saveds
  545. ;
  546.     mov     saveds,ds               ;DS セーブ
  547.     les     di,srchname             ;パス名の長さと、最終位置を獲得
  548.     mov     cx,0ffffh
  549.     cld
  550.     xor     al,al
  551.   repne scasb
  552.     not     cx
  553.     dec     cx
  554.     mov     fnamsiz,cx
  555.     mov     di,word ptr srchname
  556.     call    pathsep                 ; パス名中の最後の'\'位置を獲得
  557.     mov     copysiz,cx              ; バッファへの共通コピーサイズをセット
  558.     mov     di,word ptr srchname
  559.     mov     dx,es:[di]
  560.     @cbegin
  561.     @case (zf,on)                   ; セパレータなし
  562.         @if (dx,=,'.'),or,(dx,=,'..')   ; カレント/親?
  563.             jmp parentdir
  564.         @ifend
  565.     @case (fnamsiz,=,1),and,(dl,=,'\'),S ; ルート指定か?
  566.         mov     ah,19h              ; カレントドライブ取得
  567.         int     21h
  568.         add     al,'A'              ; ドライブ名作成
  569.         mov     ah,':'
  570.         jmp     rootpath
  571.     @case (cx,=,2),S                ; カレント/親 指定か?
  572.         @if (dh,=,':')
  573.             @if (fnamsiz,=,2)
  574.                 sub     namebuffsiz,4   ; ディレクトリ名バッファサイズチェック
  575.                 @if (cf,on)
  576.                     add     namebuffsiz,4
  577.                     jmp     srchout
  578.                 @ifend
  579.                 cld
  580.                 les     di,namebuff
  581.                 mov     ax,dx           ; ドライブ名
  582.                 stosw
  583.                 mov     ax,'.'          ; カレントディレクトリ指定
  584.                 stosw
  585.                 mov     word ptr namebuff,di    ; 新オフセット設定
  586.                 jmp     srchout
  587.             @ifend
  588.             @if (fnamsiz,<=,4)
  589.                 mov ax,es:[di+2]
  590.                 @if (ax,=,'.'),or,(ax,=,'..')
  591.                     jmp parentdir
  592.                 @ifend
  593.             @ifend
  594.         @ifend
  595.     @case (fnamsiz,=,3),and,(word ptr es:[di+1],=,'\:'),S ; ルート指定か?
  596.         mov     ax,dx
  597. rootpath:
  598.         sub     namebuffsiz,3       ; バッファ残りサイズ確認
  599.         @if (cf,on)
  600.             add     namebuffsiz,3
  601.             jmp     srchout
  602.         @ifend
  603.         cld
  604.         les     di,namebuff         ; ドライブ名のみセット
  605.         stosw
  606.         xor     al,al
  607.         stosb
  608.         mov     word ptr namebuff,di
  609.         jmp     srchout
  610.     @cend
  611. ;
  612.     mov     ah,4eh                  ;最初のファイル名検索ファンクション
  613.     mov     cx,037h                 ;ボリュームラベル以外すべて
  614.     lds     dx,srchname
  615.     int     21h
  616.     @do while,(cf,off)
  617.         mov     ds,saveds           ; DS 復元
  618.         les     di,dta
  619.         @if (byte ptr es:[di-9],on,10h) ;ディレクトリかどうかのチェック
  620.             mov     dx,es:[di]      ; 再帰処理のさいに '.' '..' を外す
  621.             @if (subsearch,=,YES)
  622.                 @if (dx,=,'.'),or,(dx,=,'..')
  623.                     jmp     skipperiod
  624.                 @ifend
  625.             @ifend
  626.             mov     cx,13           ;DTA上のファイル名から、長さを獲得
  627.             xor     al,al
  628.             cld
  629.           repne scasb
  630.             sub     cx,13
  631.             neg     cx
  632.             mov     fnamsiz,cx      ;ファイル名長さをセーブ
  633.             add     cx,copysiz      ;残りバッファサイズのチェックと更新
  634.             sub     namebuffsiz,cx
  635.             @if (cf,on)
  636.                 add     namebuffsiz,cx  ;不足
  637.                 jmp     short   srchout
  638.             @ifend
  639.             les     di,namebuff     ;共通パス名のコピー
  640.             lds     si,srchname
  641.             mov     cx,copysiz
  642.           rep   movsb
  643.             mov     ds,saveds       ;ファイル名のコピー
  644.             lds     si,dta
  645.             mov     cx,fnamsiz
  646.             rep     movsb
  647.             mov     ds,saveds
  648.             mov     word ptr namebuff,di    ;新オフセットの設定
  649.         @ifend
  650. skipperiod:
  651.         mov     ah,4fh              ;次のファイル名検索ファンクション
  652.         lds     dx,srchname
  653.         mov     cx,037h
  654.         int     21h                 ;見つかればパス名セーブ
  655.     @doend
  656.     mov ds,saveds
  657. srchout:
  658.     ret
  659. ;
  660. parentdir:
  661.     cld                             ; パス名長さを調べる
  662.     les     di,srchname
  663.     xor     ax,ax
  664.     mov     cx,-1
  665.   repne scasb
  666.     not     cx
  667.     sub     namebuffsiz,cx
  668.     @if (cf,on)
  669.         add     namebuffsiz,cx      ;不足
  670.         jmp     short   srchout
  671.     @ifend
  672.     les     di,namebuff             ;ファイル名のコピー
  673.     lds     si,srchname
  674.   rep movsb
  675.     mov     ds,saveds               ; DS 復元
  676.     mov     word ptr namebuff,di    ;新オフセットの設定
  677.     jmp     short   srchout
  678. ;
  679. dirlist    endp
  680. ;
  681. ;------------------------------------------------------------------------------
  682. ;
  683. ;   pathsep
  684. ;       パス名を調べて一番最後の':'か'\'までのバイト数を通知する
  685. ;
  686. ;   TYPE    near call
  687. ;   IN  CX      パス名長さ
  688. ;       ES:DI   パス名の先頭アドレス
  689. ;   OUT CX & ZERO FLAG 最後の':'or'\'までのバイト数 及び 0か?
  690. ;       DIR FLAG アップ方向
  691. ;   保存レジスタ    bx,si,bp,ds,es
  692. ;
  693. ;------------------------------------------------------------------------------
  694. ;
  695. pathsep     proc
  696. ;
  697.     @if (cx,/=,0)                   ; 0 でない時
  698.         push    cx                  ; 長さをセーブ
  699.         xor     dx,dx               ; 位置を初期化
  700.         @do until
  701.             mov     al,es:[di]      ; 文字獲得
  702.             inc     di
  703.             @cbegin
  704.             @case (al,=,':'),or,(al,=,'\'),S ; セパレータならば位置を記憶
  705.                 mov     dx,cx
  706.             @case (al,<,81h),or,(al,>,0fch),S ; α/N なにもしない
  707.             @case (al,>=,0a0h),and,(al,<=,0dfh),S ; カナ なにもしない
  708.             @other                  ; 漢字 第二バイト分を進める
  709.                 inc     di
  710.                 dec     cx          ; 残り0なら終了
  711.                 jz      analysend
  712.             @cend
  713.             dec     cx              ; 残り0なら終了
  714.         @doend (zf,on)
  715. analysend:
  716.         pop     cx                  ; パス名長を復元
  717.         @if (dx,/=,0),S             ; セパレータが有った時
  718.             dec     dx              ; DX にはパス名最後からのオフセット
  719.             sub     cx,dx           ; 先頭からのオフセットに直す
  720.         @else
  721.             xor     cx,cx           ; セパレータが無い時は0
  722.         @ifend
  723.     @ifend
  724.     ret
  725. ;
  726. pathsep     endp
  727. ;
  728. ;------------------------------------------------------------------------------
  729. ;
  730. ;   dirfind
  731. ;       パス名をもとにディレクトリかを調べ、ディレクトリの開始クラスタ
  732. ;       と、存在するドライブ番号を通知する
  733. ;
  734. ;   TYPE    near call
  735. ;   IN  ES:DI パス名の先頭アドレス
  736. ;   OUT AX ディレクトリの開始クラスタ番号
  737. ;       DL ドライブ番号
  738. ;       CARRY FLAG ディレクトリ属性 0:DIR 1:OTHERまたはルートでファイル無し
  739. ;   保存レジスタ    bp,ds
  740. ;
  741. ;------------------------------------------------------------------------------
  742. ;
  743. dirfind     proc
  744. ;
  745.     call    strcopywild             ; 検索用パス名の作成
  746. ;
  747.     mov     ah,2fh                  ; DTA 取得
  748.     int     21h
  749. ;
  750.     mov     ah,4eh                  ; ファイル検索
  751.     mov     cx,3fh
  752.     int     21h
  753.     @if (cf,off)                    ; 見つかった
  754.         mov     ax,es:[bx+0fh]      ; ディレクトリの開始クラスタ取得
  755.         xor     dx,dx
  756.         mov     dl,es:[bx]          ; ディレクトリのドライブ番号取得
  757.     @ifend
  758.     ret
  759. ;
  760. dirfind     endp
  761. ;
  762. ;------------------------------------------------------------------------------
  763. ;
  764. ;   strcopywild
  765. ;       指定されたパス名をPATHBUFFにコピーし、ワイルドカードを付加する
  766. ;
  767. ;   TYPE    near call
  768. ;   IN  ES:DI パス名の先頭アドレス
  769. ;   OUT PATHBUFF
  770. ;       ES:DI PATHBUFFのアドレス
  771. ;   保存レジスタ    bp,ds
  772. ;
  773. ;------------------------------------------------------------------------------
  774. ;
  775. strcopywild proc
  776. ;
  777.     cld                             ; パス名長さを調べる
  778.     mov     cx,-1
  779.     xor     ax,ax
  780.     mov     si,di
  781.   repne     scasb
  782.     not     cx
  783.     dec     cx
  784.     mov     ax,ds                   ; パス名をPATHBUFFにコピー
  785.     mov     dx,es
  786.     mov     ds,dx
  787.     mov     es,ax
  788.     mov     di,offset pathbuff
  789.     mov     dx,di
  790.     rep     movsb
  791.     mov     ds,ax                   ; ワイルドカード指定を付加
  792.     mov     cx,5
  793.     mov     si,offset wildcard
  794.     rep     movsb
  795. ;
  796.     mov     di,offset pathbuff
  797.     ret
  798. ;
  799. strcopywild endp
  800. ;
  801.     end
  802.