File-Manager/MOD1/SORT.ASM
2025-04-04 00:37:36 +10:00

448 lines
9.6 KiB
NASM
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; Shell-Metzner  «£®à¨â¬ á®àâ¨à®¢ª¨
;
;-------------------------------------------------
; ‘®àâ¨à®¢ª  ᯨ᪠ ¯ ­¥«¨ (¢ë§®¢ ¨§ ®¡®«®çª¨)
; ¢å®¤: c = ¡ãª¢  á®àâ¨à®¢ª¨ (n/x/d/s/u)
;-------------------------------------------------
sorting_list:
call test_show_panels ; â¥áâ ­  ०¨¬ ¢ª«. ¯ ­¥«¥©
ret z ; ¢ëª«.
ld hl,(all_files) ; ç¨á«® ä ©«®¢ ¨ ¯ ¯®ª
ld a,l
or h
ret z
ld a,(format_mode) ; 䮬 â  ªâ. ¯ ­¥«¨
and form_trd ; trd/scl spectrum
ret nz
ld hl,(sort_type) ; ⨯ á®àâ.  ªâ. ¯ ­¥«¨
ld a,h
xor 1 ; ¨­¢¥àá¨ï á®àâ¨à®¢ª¨
ld h,a
ld a,l
cp c ; ­®¢ë© = áâ à®¬ã ?
jr z,$+4 ; ¨­¢¥àá¨ï ०¨¬  á®àâ¨à®¢ª¨
ld h,0 ; á¡à. á®àâ¨à®¢ªã ¢ ""
ld l,c
ld (sort_type),hl
call sorting ; à §¤¥«ì­ë© ᯨ᮪ 㪠§ â¥«¥© + á®àâ. ᯨ᪠
jp A20FC ; ®¡­®¢¨âì ᯨ᮪
;-----------------------------------------------------------
; ‘®§¤ ­¨¥ à §¤¥«ì­®£® ᯨ᪠ 㪠§ â¥«¥© ¨ á®àâ¨à®¢ª 
; ᯨ᪮¢ ¯ ¯®ª ¨ ä ©«®¢.
;
; ¢å®¤: de=ª®«-¢® § ¯¨á¥© ᯨ᪠
;-----------------------------------------------------------
sorting:ld de,(all_files) ; ç¨á«® ä ©«®¢ ¨ ¯ ¯®ª
ld a,e
or d
ret z
call make_array_pointer ; á®§¤ âì à §¤¥«ì­ë© ᯨ᮪ 㪠§ â¥«¥©
ld hl,sort_type+1
ld a,(hl) ; 00/01 /
or a
ld a,0D2h ; "jp nc,.."
jr z,$+4
ld a,0DAh ; "jp c,.."
ld (sort_mode),a ; / á®àâ¨à®¢ª 
dec hl
ld a,(hl) ; hl=sort_type
cp "n" ; name
jr z,sort_name
cp "x" ; extension
jr z,sort_ext
cp "d" ; date
jr z,sort_date
cp "s" ; size
jr z,sort_size
jr unsorted_list ; á®§¤ âì ®¡é¨© ᯨ᮪ 㪠§ â¥«¥©
; ‘®àâ¨à®¢ª  ¯ ¯®ª
sort_folders:
ld de,(all_folders) ; ç¨á«® ¯ ¯®ª ¢ ᯨ᪥
ld hl,(directory) ; ­ ç «® ᯨ᪠ 㪠§ â¥«¥© ¯ ¯®ª
ld c,(hl)
inc hl
ld b,(hl)
dec hl
ld a,(bc) ;+0 ¨¬ï ä ©« 
cp "." ; ".." ¯¥à¢ ï § ¯¨áì ?
jr nz,$+5 ; ­¥â
dec de ; --ç¨á«® ¯ ¯®ª
inc hl ; ­  á«¥¤. 㪠§ â¥«ì
inc hl
jp metzner_sort
; Ctrl+F3. ‘®àâ¨à®¢ª  ¯® ¨¬¥­¨
sort_name:
ld hl,cmp_names ; ¯à®æ¥¤ãà  áà ¢­¥­¨ï
sort__: ld (sort_func+1),hl
call sort_folders ; á®àâ¨à®¢ª  ¯ ¯®ª
ld hl,(all_files) ; ç¨á«® § ¯¨á¥© ᯨ᪠
ld de,(all_folders) ; ç¨á«® ¯ ¯®ª ᯨ᪠
and a
sbc hl,de
ex de,hl ; de=ç¨á«® ä ©«®¢ ¢ ᯨ᪥
ld hl,(directory+2) ; ­ ç «® ᯨ᪠ 㪠§ â¥«¥© ä ©«®¢
jp metzner_sort ; á®àâ¨à®¢ª 
; Ctrl+F4. ‘®àâ¨à®¢ª  ¯® à áè¨à¥­¨î
sort_ext:
ld hl,cmp_extensions ; ¯à®æ¥¤ãà  áà ¢­¥­¨ï
jr sort__
; Ctrl+F5. ‘®àâ¨à®¢ª  ¯® ¤ â¥
sort_date:
ld hl,cmp_date ; ¯à®æ¥¤ãà  áà ¢­¥­¨ï
jr sort__
; Ctrl+F6. ‘®àâ¨à®¢ª  ¯® à §¬¥àã
sort_size:
ld hl,cmp_size ; ¯à®æ¥¤ãà  áà ¢­¥­¨ï
jr sort__
; Ctrl+F7. <20>¥§ á®àâ¨à®¢ª¨.
unsorted_list:
ld a,(cash_left_dir) ; ¡ ­ª  ª â «®£   ªâ. ¯ ­¥«¨
out (SLOT3),a ; ¯®¤ª«. áâà ­¨æã ª â «®£ 
ld iy,0C000h ; ­ ç «® ᪠­¨à㥬®© ¯ ¯ª¨
ld hl,(directory) ; ­ ç «® ¡ãä¥à  ᯨ᪠  ¤à¥á®¢
ld bc,32 ; ms-dos § ¯¨áì
ld a,(format_mode) ; ä®à¬ â  ªâ. ¯ ­¥«¨
and form_trd ; trd/scl spectrum
jr z,$+5
unsorted_spec: ; <- ¯¥à¥å®¤ ¨§ "make_array_pointer"
ld bc,16 ; spec-§ ¯¨áì
; á®§¤ âì ®¡é. ᯨ᮪ 㪠§ â¥«¥©
ld de,(all_files) ; ç¨á«® ä ©«®¢ ¨ ¯ ¯®ª ¢ ᯨ᪥
unsorted_loop:
db 0FDh
ld a,l
ld (hl),a
inc hl
db 0FDh
ld a,h
ld (hl),a
inc hl
add iy,bc ; ­  á«¥¤. § ¯¨áì
dec de
ld a,e
or d
jp nz,unsorted_loop
ret
;-----------------------------------------------------------
; ‘®§¤ ­¨¥ ¬ áᨢ  㪠§ â¥«¥© ­  § ¯¨á¨ ᯨ᪠
;
; ¢å®¤: de = ª®«-¢® § ¯¨á¥© ᯨ᪠
; ¢ë室: directory+2 - ᮤ¥à¦¨â ­ ç «® ᯨ᪠ ä ©«®¢
; all_folders - ᮤ¥à¦¨â ç¨á«® ¯ ¯®ª ¢ ᯨ᪥
; NZ - ᯥª-ᯨ᮪
;-----------------------------------------------------------
make_array_pointer:
ld iy,0C000h ; ­ ç «® ᪠­¨à㥬®£® ª â «®£ 
ld a,(cash_left_dir) ; ¡ ­ª  ª â «®£   ªâ. ¯ ­¥«¨
out (SLOT3),a ; ¯®¤ª«. áâà ­¨æã ª â «®£ 
ld hl,(directory) ; ­ ç «® ᯨ᪠ 㪠§ â¥«¥©
ld a,(format_mode) ; ä®à¬ â  ªâ. ¯ ­¥«¨
and form_trd ; trd/scl spectrum
jr z,make_msdos_list
; ᯥª-ᯨ᮪
ld a,"u"
ld (sort_type),a ; ãáâ. ०¨¬ "unsort"
ld bc,0
ld (all_folders),bc ; ç¨á«® ¯ ¯®ª ¢ ᯨ᪥
ld (directory+2),hl ; ­ ç «® ᯨ᪠ ä ©«®¢
jr unsorted_spec ; á®§¤ âì ®¡é. ᯨ᮪ 㪠§ â¥«¥©
; á®§¤ âì à §¤¥«ì­ë© ᯨ᮪ 㪠§ â¥«¥©
make_msdos_list:
exx
ld bc,32 ; ms-dos § ¯¨áì
exx
; á®§¤ âì 㪠§ â¥«¨ ­  ¯ ¯ª¨
ld a,0CAh ; "jp z,"
call make_flist1__ ; á®§¤ âì ᯨ᮪ ¯ ¯®ª
ld (all_folders),bc ; ç¨á«® ¯ ¯®ª ¢ ᯨ᪥
ld (directory+2),hl ; ­ ç «® ᯨ᪠ ä ©«®¢
; á®§¤ âì 㪠§ â¥«¨ ­  ä ©«ë
ld iy,0C000h ; ­ ç «® ᪠­¨à㥬®£® ª â «®£ 
ld de,(all_files) ; ç¨á«® ä ©«®¢ ¨ ¯ ¯®ª
ld a,0C2h ; "jp nz,"
;
make_flist1__:
ld (make_flist_code),a
ld bc,0 ; áç¥â稪 ç¨á«  ¯ ¯®ª/ä ©«®¢
make_flist_loop:
bit 4,(iy+11) ;+11  âਡãâ ä ©« 
make_flist_code:
jp z,make_flist_next
db 0FDh
ld a,l
ld (hl),a
inc hl
db 0FDh
ld a,h
ld (hl),a
inc hl
inc bc ; ++ç¨á«® ¯ ¯®ª/ä ©«®¢
make_flist_next:
exx
add iy,bc ; ­  á«¥¤. ms-dos § ¯¨áì
exx
dec de
ld a,e
or d
jp nz,make_flist_loop
ret
;-------------------------------------------------
; ‘®àâ¨à®¢ª  ᯨ᪠. Shell-Metzner  «£®à¨â¬.
; <20> ¡®â ¥â á 㪠§ â¥«ï¬¨ ­  § ¯¨á¨.
;
; ¢å®¤: hl= ¤à¥á ¬ áᨢ  㪠§ â¥«¥©
; de=ª®«-¢® § ¯¨á¥© ¢ ᯨ᪥
;-------------------------------------------------
metzner_sort:
ld (sort_base+1),hl ;  ¤à¥á ¬ áᨢ 
ld (sort_count+1),de ; ª®«-¢® í«¥¬¥­â®¢ (­¥ ¨§¬.)
ld (sort_count1),de ; (áç¥â稪)
; à §¤¥«¨âì ⥪. ç¨á«® í«¥¬¥­â®¢ ­  2
sort_divide:
db 21h ; ld hl,..
sort_count1:
dw 0 ; ⥪. ª®«-¢® í«¥¬¥­â®¢ / 2
and a
ld a,h
rra
ld h,a
ld a,l
rra
ld l,a
ld a,l
or h
ret z ; ¢á¥ í«¥¬¥­âë ®âá®àâ¨à®¢ ­ë
ld (sort_count1),hl ;6,3,1,0 ⥪. ª®«-¢® í«¥¬¥­â®¢ / 2
ex de,hl
sort_count:
ld hl,0 ;12 (count) ª®«-¢® í«¥¬¥­â®¢
and a
sbc hl,de ; sreclen = sort_count - sort_count1
ld (sreclen+1),hl ;6,9,11
ld hl,1
ld (sortv1),hl
ld (sstadr),hl
dec l
add hl,de
add hl,de
ld (sortv2),hl ;+42,+21,+0B ᬥé. ¤® á¥à¥¤¨­ë ⥪. ¬ áᨢ 
ex de,hl
sort_base:
ld hl,0 ; ­ ç «® ¬ áᨢ 
;
sort_ndone:
ld (sortv4),hl ;  ¤à¥á á«¥¤. § ¯¨á¨ 1-© ¯®«®¢¨­ë ¬ áᨢ  
ld (sortv3),hl
ex de,hl
add hl,de ; ᬥé.¤® á¥à¥¤¨­ë ¬ áᨢ  +  ¤à¥á á«¥¤. § ¯¨á¨
ex de,hl ; de= ¤à¥á á«¥¤. § ¯¨á¨ 2-© ¯®«®¢¨­ë ¬ áᨢ  
sort_compre:
ld (srtptr2+1),de
ld (srtptr1+1),hl
; à § ¤à¥á æ¨ï de ¨ hl
ld a,(de)
ld c,a
inc de
ld a,(de)
ld d,a
ld e,c
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
ld (srtptr3+1),hl
ld (srtptr4+1),de
;
sort_func:
call cmp_extensions ; ⥪. ¯/¯ á®àâ¨à®¢ª¨
jp z,noswap_items ; í«¥¬¥­âë à ¢­ë
sort_mode:
jp nc,noswap_items ; nc/c ⨯ / á®àâ¨à®¢ª¨
; ®¡¬¥­ïâì  ¤à¥á  㪠§ â¥«¥©
srtptr2:ld de,0 ;  ¤à¥á § ¯¨á¨ 2-© ¯®«®¢¨­ë ᯨ᪠
srtptr1:ld hl,0 ;  ¤à¥á § ¯¨á¨ 1-© ¯®«®¢¨­ë ᯨ᪠
ld a,(de)
ld c,a
ld a,(hl)
ld (de),a
ld (hl),c
inc de
inc hl
ld a,(de)
ld c,a
ld a,(hl)
ld (de),a
ld (hl),c
;
ld hl,(sort_count1) ;6,3,1 ⥪. ª®«-¢® í«¥¬¥­â®¢ / 2
ld a,h
cpl
ld d,a
ld a,l
cpl
ld e,a
db 21h ; ld hl,..
sortv1: dw 0
add hl,de ;-7, -4, -2
jp nc,noswap_items
inc hl
ld (sortv1),hl ; ¯®à浪. ­®¬¥à  § ¯¨á¥©
db 11h ; ld de,..
sortv3: dw 0 ; ⥪. § ¯¨áì 1-© ¯®«®¢¨­ë ¬ áᨢ 
ld hl,(sortv2) ;+42,+21,+0B ᬥé. ¤® á¥à¥¤¨­ë ⥪. ¬ áᨢ 
ld a,e
sub l
ld l,a
ld a,d
sbc a,h
ld h,a
ld (sortv3),hl ;  ¤à¥á  § ¯¨á¥©
jp sort_compre ; áà ¢­¨âì í«¥¬¥­âë (de ¨ hl)
;
noswap_items:
db 21h ; ld hl,..
sstadr: dw 0 ; ®â 1
inc hl ; ++incr
ld (sstadr),hl ;
ld (sortv1),hl
ex de,hl
sreclen:ld hl,0 ;6,9,11 (sreclen) ¤«¨­  í«¥¬¥­â 
and a
sbc hl,de ; cmp sreclen ¨ incr
jp c,sort_divide
db 21h
sortv4: dw 0 ;  ¤à¥á á«¥¤. § ¯¨á¨ 1-© ¯®«®¢¨­ë ¬ áᨢ 
inc hl ; ­  á«¥¤. 㪠§ â¥«ì
inc hl
db 11h ; ld de,..
sortv2: dw 0 ;+42,+21,+0B ᬥé. ¤® á¥à¥¤¨­ë ⥪. ¬ áᨢ 
jp sort_ndone
;-------------------------------------------------
; ‘à ¢­¨âì ¨¬¥­ 
;
; in: hl= ¤à¥á § ¯¨á¨ 1-© ¯®«®¢¨­ë ¬ áᨢ 
; de= ¤à¥á § ¯¨á¨ 2-© ¯®«®¢¨­ë ¬ áᨢ 
; out: z - à ¢­ë
; nz - ­¥ à ¢­ë
;-------------------------------------------------
cmp_names:
ld b,11 ; ¯®«­®¥ ¨¬ï
srtptr3:ld hl,0
srtptr4:ld de,0
cmp__: ld a,(de) ; 2-ï ¯®«®¢¨­  ¬ áᨢ 
cp "_"
jp z,cmp1__
or 00100000b
cp "ð" ; 240
jp nz,cmp1__
inc a ; 241 = "ñ"
cmp1__: ld c,(hl) ; 1-ï ¯®«®¢¨­  ¬ áᨢ 
cp "_"
jp z,cmp2__
set 5,c
cp "ð" ; 240
jp nz,cmp2__
inc c ; 241 = "ñ"
cmp2__: sub c
ret nz ; í«¥¬¥­âë ­¥ à ¢­ë
inc hl
inc de
djnz cmp__
ret
;-------------------------------------------------
; ‘à ¢­¨âì à áè¨à¥­¨ï
;
; in: hl= ¤à¥á § ¯¨á¨ 1-© ¯®«®¢¨­ë ¬ áᨢ 
; de= ¤à¥á § ¯¨á¨ 2-© ¯®«®¢¨­ë ¬ áᨢ 
; out: z - à ¢­ë
; nz - ­¥ à ¢­ë
;-------------------------------------------------
cmp_extensions:
ld bc,8 ; ᬥé. ¤® í«¥¬. áà ¢­¥­¨ï
ex de,hl
add hl,bc ; ᬥé. ¤® ï祥ª áà ¢­¥­¨ï
ex de,hl
add hl,bc ; ᬥé. ¤® ï祥ª áà ¢­¥­¨ï
ld b,3 ; ¤«¨­  í«¥¬. áà ¢­¥­¨ï
ecmp__: ld a,(de) ; 2-ï ¯®«®¢¨­  ¬ áᨢ 
cp "_"
jp z,ecmp1__
or 00100000b
cp "ð" ; 240
jp nz,ecmp1__
inc a ; 241 = "ñ"
ecmp1__:ld c,(hl) ; 1-ï ¯®«®¢¨­  ¬ áᨢ 
cp "_"
jp z,ecmp2__
set 5,c
cp "ð" ; 240
jp nz,ecmp2__
inc c ; 241 = "ñ"
ecmp2__:sub c
ret nz ; í«¥¬¥­âë ­¥ à ¢­ë
inc hl
inc de
djnz ecmp__
; í«¥¬¥­âë ᮢ¯ ¤ îâ
ld b,8 ; ¤«¨­  í«¥¬. áà ¢­¥­¨ï
jp srtptr3 ; áà ¢­¨âì ¨¬¥­ 
;-------------------------------------------------
; ‘à ¢­¨âì ¤ âë/à §¬¥àë
;
; in: hl= ¤à¥á ª®­æ  § ¯¨á¨ (1-ï ¯®«®¢¨­  ¬ áᨢ )
; de= ¤à¥á ª®­æ  § ¯¨á¨ (2-ï ¯®«®¢¨­  ¬ áᨢ )
; out: z - à ¢­ë
; nz - ­¥ à ¢­ë
;-------------------------------------------------
cmp_date:
ld bc,25 ; ᬥé. ­  ª®­¥æ ¤ âë
jp $+6
cmp_size:
ld bc,31 ; ᬥé. ­  ª®­¥æ à §¬¥à 
ex de,hl
add hl,bc ; + ᬥé. ¤® ï祥ª áà ¢­¥­¨ï
ex de,hl
add hl,bc ; + ᬥé. ¤® ï祥ª áà ¢­¥­¨ï
ld b,4 ; ¤«¨­  í«¥¬. áà ¢­¥­¨ï
ld a,(de) ; 2-ï ¯®«®¢¨­  ¬ áᨢ 
sub (hl) ; 1-ï ¯®«®¢¨­  ¬ áᨢ 
ret nz ; í«¥¬¥­âë ­¥ à ¢­ë
dec hl
dec de
djnz $-5
; í«¥¬¥­âë ᮢ¯ ¤ îâ
jp cmp_names ; áà ¢­¨âì ¨¬¥­