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

340 lines
8.1 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.

; ‘ª ­¨à®¢ ­¨¥ ¯ ¯ª¨
;
; „«ï ¢à¥¬. ¡ãä¥à  ¢ë¤¥«ï¥âáï 1 áâà ­¨æ  ¯ ¬ïâ¨. <20>®á«¥ ®âà ¡®âª¨ ¯à®æ¥¤ãàë,
; áâà ­¨æ  ®á¢®¡®¦¤ ¥âáï.
; Œ ªá. £«ã¡¨­  ¢«®¦¥­­®á⨠¯ ¯®ª à ¢­  20-⨠(¬®¦­® ¯®áâ ¢¨âì ¤à㣮¥).
; „«ï ¬ áᨢ  í«¥¬¥­â®¢ ¨á¯®«ì§ã¥âáï æ¥« ï ¡ ­ª , ¢¬¥é îé ï 1024
; (16*1024=4000h) í«¥¬¥­â®¢. ޡ饥 ç¨á«® ¯ ¯®ª, ®âá«¥¦¨¢ ¥¬®¥ ¯à®æ¥¤ãன,
; ®à£ ­¨ç¨¢ ¥âáï à §¬¥à®¬ í⮣® ¬ áᨢ .
;
; <20>¥à¥¤ ¢ë§®¢®¬ ¯à®æ¥¤ãàë, ­¥®¡å®¤¨¬® ãáâ ­®¢¨âì ¤¨áª ¨ ¯ãâì.
;
max_depth equ 20+1 ; ¬ ªá. ç¨á«® ¢«®¦¥­­®á⨠¯ ¯®ª
;-----------------------------------------------------------
; ‘ª ­¨à®¢ ­¨¥ ¯ ¯ª¨
; ¢ë室: NC - ­®à¬ «ì­®¥ § ¢¥à襭¨¥
; C - ®¯¥à æ¨ï ¯à¥à¢ ­  ¯®«ì§®¢ â¥«¥¬ (A=0FFh)
;-----------------------------------------------------------
ScanTree:
ld (tree_stack),sp
ld bc,3135h ; ®ç¨áâ¨âì ¡ãä¥à á¨áâ. ª« ¢ë
rst 10h
ld sp,work_buffer+512 ; á⥪ ¯à®æ¥¤ãàë
in a,(SLOT3)
ld (tree_page),a ; á®åà. ¯®àâ
; ¢ë¤¥«¨âì 1 áâà. ¯®¤ ¢à¥¬. ¡ãä¥à
ld bc,01C2h
rst 08h
ld (tmppage+1),a ; á®åà. ¤¥áªà. áâà.
jr nc,$+9 ; ¡¥§ ®è¨¡®ª
xor a
ld (tmppage+1),a
ld a,(page_dial_screen) ; ¨á¯. ¤«ï ¢à¥¬. ¡ãä¥à 
out (SLOT3),a
xor a
ld l,a
ld h,a
ld (depth_tree),a ; á¡à. ­®¬¥à ã஢­ï ¢«®¦¥­¨©
ld (count_dirs),hl ; á¡à. ç¨á«® ¯ ¯®ª
ld (count_files),hl ; á¡à. ç¨á«® ä ©«®¢
ld (size_files),hl ; á¡à. à §¬¥à ä ©«®¢
ld (size_files+2),hl
push hl ; ⥪. í«¥¬¥­â (ª®à¥­ì) ¢ á⥪
ld (cur_tree_adr+1),hl ; ¨­¨â. ï祩ªã
ld hl,LC000+16 ; ­ ç «® ¡ãä¥à  í«¥¬¥­â®¢ ¢«®¦¥­¨©
ld (end_tree),hl ; ­ ç «® á«¥¤. 16-⨠¡ ©â­®£® í«¥¬¥­â 
ld b,16 ; à §¬¥à í«¥¬¥­â  ¢«®¦¥­¨©
ld (hl),a ; a=0
inc hl
djnz $-2
call scan_cur_level ; ᪠­¨à. ®¤­®£® ã஢­ï + á⮯ª  í«¥¬.
jr nc,tree_exit ; ­¥â ¯ ¯®ª
; ¢®©â¨ ¢ ¯ ¯ªã á«¥¤. ã஢­ï
tree_loop:
push hl ;  ¤à¥á áâ à®£® í«¥¬¥­â  (¯®á«¥ LoadDIR)
ld c,31h ; ®¯à®á á¨áâ. ª« ¢ë
rst 10h
call nz,abort_tree_scan ; ¢ë¢¥á⨠®ª­® "¯à¥àë¢. ®¯¥à æ¨¨"
pop hl
ld a,(depth_tree) ; ­®¬¥à ⥪. ã஢­ï ¢«®¦¥­¨©
inc a
cp max_depth+1 ; 20+1 ¬ ªá. ç¨á«® ¢«®¦¥­¨© ¯ ¯®ª
jr c,tree_depth_ok
tree_depth_err:
ld a,EDEPTH ; 36 ª®¤ "᫨誮¬ ¡®«ìè ï ¢«®¦¥­­®áâì ¯ ¯®ª"
jr tree_abort1
;
tree_depth_ok:
ld (depth_tree),a
ld de,(count_dirs) ; ⥪. ç¨á«® ¯ ¯®ª
bit 2,d ; >= 1024 ¯ ¯®ª (> 1 ¡ ­ª¨ í«¥¬¥­â®¢)
jr nz,tree_depth_err ; ®è¨¡ª , ¢ë©â¨
push hl ; ⥪. ¨¬ï ¯ ¯ª¨ ¢ á⥪
ld a,(hl)
or a
jr z,dirs_end ; ­¥â ¢«®¦¥­¨©, ¢¥à­ãâìáï ¢ ­ ç. ã஢¥­ì
ld (cur_tree_adr+1),hl ; ¨¬ï ¯ ¯ª¨ ⥪. ã஢­ï
ld c,1Dh ; ãáâ. ¯ãâì ­  ¯ ¯ªã ⥪. ã஢­ï
rst 10h
call scan_cur_level ; ᪠­¨à. ®¤­®£® ã஢­ï + á⮯ª  í«¥¬.
jr c,tree_loop ; ¥áâì ¯ ¯ª¨
; ¢¥à­ãâìáï ­  ¯à¥¤. ã஢¥­ì
dirs_end:
ld c,31h ; ®¯à®á á¨áâ. ª« ¢ë
rst 10h
call nz,abort_tree_scan ; ¢ë¢¥á⨠®ª­® "¯à¥àë¢. ®¯¥à æ¨¨"
pop hl ; ⥪. í«¥¬¥­â ¨§ á⥪ 
ld a,h
or l
jr z,tree_exit ; ¢ áâ à⮢®© ¯ ¯ª¥
push hl ; hl= ¤à¥á ¨¬¥­¨ ¯ ¯ª¨
ld a,(scan_mode) ; ०¨¬ à ¡®âë ¯à®æ¥¤ãàë
cp 2 ; ãáâ.  âਡã⮢ ¯ ¯ª¨
jr nz,dirs_end1
;call attrib_folder;
ds 3;
jr dirs_end2
dirs_end1:
cp 3 ; 㤠«¥­¨¥ ¯ ¯ª¨
jr c,dirs_end2
call delete_folder; ; a=3,4 㤠«¥­¨¥/¯¥à¥­®á ¯ ¯ª¨
jr dirs_end3
dirs_end2:
ld hl,parent_level ; ".."
ld c,1Dh ; ãáâ. ¯ãâì
rst 10h
dirs_end3:
ld hl,depth_tree ; ­®¬¥à ⥪. ã஢­ï ¢«®¦¥­¨©
dec (hl)
pop hl
ld de,16-1 ; à §¬¥à í«¥¬¥­â  ¢«®¦¥­¨© - 1
add hl,de
ld a,(hl)
inc hl
inc a
jr nz,tree_loop
jr dirs_end ; ­ § ¤ ¢ 横«
;
tree_abort:
ld a,EUABORT ; 37 ª®¤ "®¯¥à æ¨ï ¯à¥à¢ ­  ¯®«ì§®¢ â¥«¥¬"
tree_abort1:
scf
jr $+3
tree_exit:
xor a ; a=Ok ¨ á¡à. CF
push af
tmppage:ld a,0 ; ¤¥áªà. áâà.
or a
ld bc,01C3h ; ®á¢®¡. 1 áâà. ¯ ¬ïâ¨
call nz,0008h
db 3Eh ; ld a,..
tree_page:
db 0
out (SLOT3),a ; ¢®ááâ. ¯®àâ
pop af ; ¢®§¢à. ª®¤ ¯à®æ¥¤ãàë
db 31h ; ld sp,..
tree_stack:
dw 0 ; á®åà. á⥪
ret
;-------------------------------------------------
; ‘ª ­¨à®¢ âì ®¤¨­ ã஢¥­ì
; ¢ë室: C - ¥áâì ¯ ¯ª¨
; NC - ­¥â ¯ ¯®ª
; hl= ¤à¥á áâ à®£® í«¥¬¥­â 
;-------------------------------------------------
scan_cur_level:
ld de,(end_tree)
push de ; á®åà.  ¤à¥á áâ à®£® í«¥¬¥­â 
ld ix,0 ; áç¥â稪 ¯ ¯®ª
ld hl,scan_mask ; ¨¬ï ä ©«  (è ¡«®­ ¯®¨áª )
ld de,work_buffer ; à ¡. ¡ãä¥à
push ix
push de
ld a,37h ; ¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ 
ld bc,0119h ; f_first 8.3
rst 10h
pop hl
pop ix
jr c,scan_level_exit ; ­¥ ­ ©¤¥­®
scan_level_loop:
call tree_record ; ¤«ï ¯ ¯®ª á®§¤. á⮯ªã í«¥¬¥­â®¢
jr c,scan_level_exit ; ®è¨¡ª , ¢ë室 §  £à ­¨æã ¡ ­ª¨
push ix
ld de,work_buffer ; à ¡. ¡ãä¥à
push de
ld c,1Ah ; f_next
rst 10h
pop hl
pop ix
jr nc,scan_level_loop ; ­ § ¤ ¢ 横«
scan_level_exit:
ld hl,(end_tree) ; ­ ç «® á«¥¤. í«¥¬¥­â 
dec hl
ld (hl),-1 ; +xF ¢ ª®­¥æ ¯à¥¤.
db 0DDh
ld c,l ; ld bc,ix
db 0DDh
ld b,h
ld hl,(count_dirs) ; ⥪. ç¨á«® ¯ ¯®ª
add hl,bc ; + ç¨á«® ¯ ¯®ª ¯à®áª ­¨à. ã஢­ï
ld (count_dirs),hl
pop hl ; ¢®ááâ.  ¤à¥á áâ à®£® í«¥¬¥­â 
ld a,c
or b
ret z ; ­¥â ¯ ¯®ª
; á®åà. ¢ ¯¥à¢®¬ í«¥¬¥­â¥ ¢ +0D..0E  ¤à¥á ¯®á«. í«¥¬¥­â 
cur_tree_adr:
ld de,0 ;  ¤à¥á ⥪. ¨¬¥­¨ ¯ ¯ª¨
ld a,e
or d
jr z,scan_level_exit1
ex de,hl
ld bc,0Dh ; ᬥé. ï祩ª¨  ¤à¥á  ¯®á«. í«¥¬¥­â 
add hl,bc
ld (hl),e ; á®åà.  ¤à¥á ¯®á«. í«¥¬¥­â 
inc hl
ld (hl),d
ex de,hl
scan_level_exit1:
scf ; ¥áâì á«¥¤. ã஢¥­ì
ret
;-------------------------------------------------
; Ž¡à ¡®âª  ­ ©¤¥­­®© § ¯¨á¨.
; „«ï ¯ ¯®ª - á®§¤ ¥â á⮯ªã í«¥¬¥­â®¢.
; ¢å®¤: hl=à ¡. ¡ãä¥à § ¯¨á¨
; ¢ë室: ¯à¨ ®è¨¡ª¥ CF, ¢ë室 §  £à ­¨æã ¡ ­ª¨
;-------------------------------------------------
; í«¥¬¥­â: +00..0C - ¨¬ï ¯ ¯ª¨ (á ­ã«¥¬)
; +0D..0E -  ¤à¥á ¯®á«. í«¥¬¥­â  (¢ § ¯¨á¨ ¯¥à¢®£® í«¥¬¥­â )
;-------------------------------------------------
tree_record:
ld a,(work_buffer+32) ;  âਡãâ ­ ©¤. § ¯¨á¨
bit 4,a ; ¯ ¯ª  ?
jr nz,ins_tree_item ; ¤ 
; ­ ©¤¥­ ä ©«
ld a,(scan_mode) ; ०¨¬ à ¡®âë ¯à®æ¥¤ãàë
or a ; a=0 ᪠­¨à. ¯ ¯ªã
jr z,tree_record_next
dec a ; a=1 ª®¯¨à. ¯ ¯ªã
;jp z,copy_file
dec a ; a=2 ãáâ.  âਡ. ä ©«®¢ ¯ ¯ª¨
;jp z,attrib_file
dec a ; a=3 㤠«¥­¨¥ ¯ ¯ª¨
jp z,delete_file
dec a ; a=4 ¯¥à¥­®á ¯ ¯ª¨
;jp z,move_file
or a ; á¡à. CF
ret
; ++®¡ê¥¬ ä ©«®¢
tree_record_next:
ld de,(work_buffer+28) ; ¬«. à §àï¤
ld hl,(size_files)
add hl,de
ld (size_files),hl
ld de,(work_buffer+30) ; áâ. à §àï¤
ld hl,(size_files+2)
adc hl,de
ld (size_files+2),hl
; ++ç¨á«® ä ©«®¢
ld hl,(count_files)
inc hl
ld (count_files),hl
or a ; á¡à. CF
ret
; ­ ©¤¥­  ¯ ¯ª 
ins_tree_item:
ex de,hl
ld hl,(end_tree) ; ­ ç «® ­®¢®£® í«¥¬¥­â 
ld bc,16 ; à §¬¥à í«¥¬¥­â 
add hl,bc
sbc hl,bc
ex de,hl
ret c ; §  ¯à¥¤¥«®¬ ¡ ­ª¨ (> 0FFFFh)
ld bc,33
add hl,bc
ld a,(hl) ;+33 ¨¬ï ä ©« 
cp "." ; ".", ".."
ret z
inc ix ; ++ç¨á«® ¯ ¯®ª
ld c,16 ; à §¬¥à í«¥¬¥­â  ¢«®¦¥­¨©
xor a
ldi
cp (hl)
jr nz,$-3 ; ᪮¯¨à. ¢ í«¥¬¥­â ¨¬ï ¯ ¯ª¨
ld b,c ; ®¡­ã«¨âì ®áâ â®ª í«¥¬¥­â 
ld (de),a
inc de
djnz $-2
ld (end_tree),de ; ­ ç «® á«¥¤. 16-⨠¡ ©â­®£® í«¥¬¥­â 
ld a,(scan_mode) ; ०¨¬ à ¡®âë ¯à®æ¥¤ãàë
cp 1 ; ª®¯¨à. ¯ ¯ª¨
;jp z,create_folder
cp 4 ; move ¯ ¯ª¨
;jp z,create_folder;
or a ; á¡à. CF
ret
;-------------------------------------------------
; ‚뢮¤ ®ª­  ¯à¥à뢠­¨ï ®¯¥à æ¨¨
;-------------------------------------------------
abort_tree_scan:
ld bc,3135h ; ®ç¨áâ¨âì ¡ãä¥à á¨áâ. ª« ¢ë
rst 10h
ld hl,dial_abort ; ®¯¨á â¥«ì ®ª­ 
call DialogEr
cp evCommand ; ᮡë⨥ "ª®¬ ­¤ "
ret nz
ld a,(hl) ;+1 what
cp cmOkey ; Yes
jp z,tree_abort ; ¢ë©â¨ ¨§ ¯à®æ¥¤ãàë
ret
; <20>¥¦¨¬ à ¡®âë ¯à®æ¥¤ãàë:
; 0 - ᪠­¨à®¢ ­¨¥ ¯ ¯ª¨
; 1 - ª®¯¨à®¢ ­¨¥ ¯ ¯ª¨
; 2 - ãáâ.  âਡã⮢ ä ©«®¢ ¯ ¯ª¨
; 3 - 㤠«¥­¨¥ ¯ ¯ª¨
; 4 - ¯¥à¥­®á ¯ ¯ª¨
scan_mode:
db 0
; è ¡«®­ ¯®¨áª  (â ª¦¥ ¨á¯. ¤«ï ¯®¨áª  ¬¥âª¨ ⮬ )
scan_mask:
db "*.*",0
; ¢¥àå­¨© ã஢¥­ì
parent_level:
db "..",0
; ­®¬¥à ⥪. ã஢­ï ¢«®¦¥­¨©
depth_tree:
db 0
; ­ ç «® á«¥¤. 16-⨠¡ ©â­®£® í«¥¬¥­â 
end_tree:
dw 0
; ç¨á«® ¯ ¯®ª
count_dirs:
dw 0
; ç¨á«® ä ©«®¢ ¯ ¯ª¨
count_files:
dw 0
; ®¡é. à §¬¥à ä ©«®¢ ¯ ¯ª¨
size_files:
dw 0 ; ¬«. à §àï¤
dw 0 ; áâ. à §àï¤