Estex-DSS/SHELL/Commands/DIR.ASM
Anatoliy Belyanskiy 55e6b9b07d ...
2023-11-23 05:40:42 +10:00

604 lines
10 KiB
NASM
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.

;///////////////////////////////////////////////////
;
; DIR. ‚뢮¤ ᯨ᪠ ä ©«®¢ ¨ ¯ ¯®ª
;
;///////////////////////////////////////////////////
cmd_dir:
push de
ld c,Dss.CurDisk ; ã§­ âì ⥪. ¤¨áª
RST ToDSS
ADD A,"A"
ld (root_path),a ; ­®¬¥à ¤¨áª 
SUB "A"
call read_disk_info ; ¯à®ç¨â âì ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª 
pop de
ld hl,0
ld (D88DC),hl
ld (D88DE),hl
ld (D88E0),hl
ex de,hl
ld a,(hl)
or a
jr nz,1F ; § ¤ ­  ¬ áª  ¨¬¥­
ld hl,mask_fname ; "*.*"
;ld de,T9186 ; ¡ãä¥à
1: ld de,work_buffer1 ; 80
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
RST ToDSS
; [ ] 1/10/23
;
;ld hl,T9186 ; ¨¬ï ä ©« 
;ld de,T9186 ; ¡ãä¥à
ld hl,work_buffer1 ; ¨¬ï ä ©« 
ld de,work_buffer1 ; 80 ¡ãä¥à
ld a,#37 ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ )
ld bc,0*256 + Dss.F_First ; f_first (ä®à¬ â 11)
RST ToDSS
;R14
;jp c,print_err_message ; ¢ë¢®¤ á®®¡é¥­¨ï DSS_Error.sys.FILE_NOT_FOUND
JR NC,.not_empty
CP DSS_Error.sys.FILE_NOT_FOUND
JP NZ,print_err_message
SCF
JP .Print_Header
.not_empty:
CALL .Print_Header
;
; 横« ¢ë¢®¤  ᯨ᪠ ä ©«®¢/¯ ¯®ª
.loop: ;ld hl,T9186 ; à ¡. ¡ãä¥à
ld hl,work_buffer1 ; 80
ld de,33
add hl,de
call A88E2
;ld ix,T9186
ld ix,work_buffer1 ; 80
ld a,(ix+32) ;  âਡãâ ⥪. § ¯¨á¨
and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ?
jr z,.calc_size ; ­¥â
; 㢥«¨ç¨¢ ¥¬ áçñâ稪 ¯ ¯®ª
ld hl,(dir_number)
inc hl
ld (dir_number),hl
jr .next
; ¯à¨¡ ¢¨âì à §¬¥à ⥪. ä ©« 
.calc_size:
ld hl,(D88DC)
inc hl
ld (D88DC),hl
ld e,(ix+30)
ld d,(ix+31)
ld hl,(D88E0)
exx
ld e,(ix+28)
ld d,(ix+29)
ld hl,(D88DE)
add hl,de
exx
adc hl,de
exx
ld (D88DE),hl
exx
ld (D88E0),hl
.next: ld de,work_buffer1 ; 80 ¡ãä¥à
ld c,Dss.F_Next ; ¯®¨áª á«¥¤.
RST ToDSS
jr nc,.loop ; ­ § ¤ ¢ 横«, ¥á«¨ ­¥ ª®­¥æ ᯨ᪠
; „¥áïâ¨ç­ë© ¢ë¢®¤
.print: ld hl,(D88DC)
ld ix,PRM1 ; ¡ãä¥à
call A8964
ld hl,(D88DE) ; ¬«. à §àï¤
exx
ld hl,(D88E0) ; áâ. à §àï¤
exx
call A8A8F ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
ld hl,T8B37 ; "0"
ld a,(hl)
cp " "
jr nz,.not_zero
ld a,"0"
ld (hl),a
.not_zero:
ld de,T8B46 ; "0 000 000 000"
ld hl,T8B2E ; "0000000000"
ld a,(hl)
ldi
cp " "
jr z,$+4
ld a,"," ; à §¤. à §à冷¢
ld (de),a
inc de
ldi
ldi
ld a,(hl)
ldi
cp " "
jr z,$+4
ld a,"," ; à §¤. à §à冷¢
ld (de),a
inc de
ldi
ldi
ld a,(hl)
ldi
cp " "
jr z,$+4
ld a,"," ; à §¤. à §à冷¢
ld (de),a
inc de
ldi
ldi
ldi
­¥¤®¤¥« ­®
ld hl,T8B46 ; "0 000 000 000"
ld de,PRM2 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
ld de,9 ; ¨­¤¥ªá " %1 file(s) %2 bytes"
jp MESSAGE ; ¢ë¢¥á⨠áâபã
;R14
.Print_Header:
PUSH AF
;
; %1
ld a,(screen_path) ; ¤¨áª
ld hl,PRM1
ld (hl),a
inc hl
ld (hl),":"
inc hl
ld (hl),0
; %2
ld hl,serial_string ; áâப  á¥à¨©­®£® ­®¬¥à  ¤¨áª 
ld de,PRM2 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;
;R14
POP AF
ld hl,screen_path
JR NC,.not_empty_2
;
ld a,(screen_path)
LD (.str),A
ld hl,.str ; íªà ­. ¯ãâì
; %3
.not_empty_2:
;
ld de,PRM3 ; 16 ¡ãä¥à
CALL copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;
ld de,0 ; ¨­¤¥ªá "Volume in drive %1 has no label..." ;!HARDCODE ­®¬¥à áâப¨ MSG0
JP MESSAGE ; ¢ë¢¥á⨠áâபã
.str: DZ 'X:\ is empty' ;R14 ;!FIXIT
;
; <20>®¤£®â®¢¨âì áâபã ᯨ᪠ ä ©«®¢/¯ ¯®ª
A88E2: ld bc,8
ld de,PRM1 ; ¡ãä¥à
ldir
xor a
ld (de),a
ld de,PRM2 ; ªã¤ 
ldi
ldi
ldi
ld (de),a
;ld ix,T9186
ld ix,work_buffer1
call A89A4 ; ¢ë¢¥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
call A89FA ; ¢ë¢¥á⨠¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
call A8A19 ; ¢ë¢¥á⨠¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld de,10 ; ¨­¤¥ªá "%1 %2 %3 %4 %5"
jp MESSAGE ; ¢ë¢®¤ áâப¨
; ‚뢥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
A89A4: ld a,(ix+32)
ld hl,T8B38 ; "<DIR> "
and 10h ; ¯ ¯ª  ?
jr nz,A89F4 ; ¤ 
ld l,(ix+28) ; ¬«. à §àï¤
ld h,(ix+29)
exx
ld l,(ix+30) ; áâ. à §àï¤
ld h,(ix+31)
exx
push ix
call A8A8F ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
ld hl,T8B37
ld a,(hl)
cp " "
jr nz,A89CD
ld a,"0"
ld (hl),a
A89CD: ld de,T8B46 ; "0 000 000 000"
ld hl,T8B2E ; "0000000000"
ldi
ld a," "
ld (de),a
inc de
ldi
ldi
ldi
ld (de),a
inc de
ldi
ldi
ldi
ld (de),a
inc de
ldi
ldi
ldi
ld hl,T8B46 ; "0 000 000 000"
pop ix
A89F4: ld de,PRM3 ; 16 ¡ãä¥à
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
A89FA: ld b,(ix+25)
ld c,(ix+24)
ld hl,T8B46 ; "0 000 000 000"
call A8A53 ; ¢ë¢®¤ ¢ ¡ãä¥à ¤ âë
ld (hl),0
ld hl,T8B46 ; "0 000 000 000"
ld de,PRM4 ; 16 ªã¤ 
ld a,(hl)
cp "0"
jr nz,$+4
ld (hl)," "
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
A8A19: ld b,(ix+22)
ld c,(ix+23)
ld hl,T8B46 ; "0 000 000 000"
call A8A38 ; ᪮¯¨à. ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld (hl),0
ld hl,T8B46 ; "0 000 000 000"
ld de,PRM5 ; 80 ¡ãä¥à áâப¨
ld a,(hl)
cp "0"
jr nz,$+4
ld (hl)," "
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
A8A38: srl c
rr b
srl c
rr b
srl c
rr b
srl b
srl b
ld a,c
call A8A7E
ld (hl),":" ; à §¤¥«. ¢à¥¬¥­¨
inc hl
ld a,b
jr A8A7E
; ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
A8A53: ld a,c
and 1Fh
push bc
call A8A7E
ld (hl),"." ; à §¤¥«. ¤ âë
inc hl
pop bc
ld a,c
srl b
rla
rla
rla
rla
and 0Fh
call A8A7E
ld (hl),"." ; à §¤¥«. ¤ âë
inc hl
ld a,b
add a,80
cp 100
jr c,A8A7E
A8A75: sub 100
cp 100
jr nc,A8A75
A8A7E: ld c,2Fh
inc c
sub 10
jr nc,$-3
add a,10
add a,"0"
ld (hl),c
inc hl
ld (hl),a
inc hl
ret
; „¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
A8A8F: ld ix,T8B2E ; "0000000000"
exx
ld de,3B9Ah
exx
ld de,0CA00h
call A8B15 ; 1,000,000,000
exx
ld de,05F5h
exx
ld de,0E100h
call A8B15 ; 100,000,000...999,999,999
exx
ld de,98h
exx
ld de,9680h
call A8B15 ; 10,000,000...99,999,999
exx
ld de,0Fh
exx
ld de,4240h
call A8B15 ; 1,000,000...9,999,999
exx
ld de,1
exx
ld de,86A0h
call A8B15 ; 100,000...999,999
exx
ld de,0
exx
ld de,10000
call A8B15 ; 10,000...99,999
exx
ld de,0
exx
ld de,1000
call A8B15 ; 1,000...9,999
exx
ld de,0
exx
ld de,100
call A8B15 ; 100..999
exx
ld de,0
exx
ld de,10
call A8B15 ; 10..99
ld a,l
add a,"0"
ld (ix+0),a
inc ix
ld hl,T8B2E ; "0000000000"
ld de,2030h ; " ","0"
A8B04: ld a,(hl)
cp e
jr nz,A8B0D
ld (hl),d
inc hl
jr A8B04
;
A8B0D: ld hl,T8B37 ; "0"
ld a,(hl)
cp d
ret nz
ld (hl),e
ret
A8B15: xor a
A8B16: inc a
sbc hl,de
exx
sbc hl,de
exx
jp nc,A8B16
add hl,de
exx
adc hl,de
exx
dec a
add a,"0"
ld (ix+0),a
inc ix
ret
;
D88DC: dw 0
D88DE: dw 0
D88E0: dw 0
;
T8B2E: db "000000000"
T8B37: db "0"
T8B38: db "<DIR> ",0
T8B46: db "0 000 000 000",0
db 0
;
;!FIXIT ¯¥à¥­¥á⨠¢ DSS - FN #04: GET_BPB
; ¯à®ç¨â âì BPB ¤¨áª 
read_disk_info:
OR #80
LD HL,work_buffer
LD BC,Dss.DskInfo
RST ToDSS
; ” ©«®¢ ï á¨á⥬ 
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
; Œ¥âª  ¤¨áª  ¢ BPB
; parse
LD D,0
LD HL,work_buffer
; âãâ ¢ HL ¤«¨­  ¯®«ï "” ©«®¢ ï á¨á⥬ "
LD E,(HL)
ADD HL,DE
INC HL
; ¤«¨­  ¯®«ï "‘¥à¨©­ë© ­®¬¥à ¤¨áª "
LD A,(HL)
LD E,A
ADD HL,DE
INC HL
PUSH HL ; 㪠§ â¥«ì ­  ¤«¨­ã ¯®«ï "Œ¥âª  ¤¨áª "
CP 4 ;!HARDCODE ¤«¨­  ¯®«ï á¥à¨©­®£® ­®¬¥à 
JR NZ,unknown_serial
DEC HL
; áâ à襥 á«®¢® á¥à¨©­¨ª 
LD D,(HL)
DEC HL
LD E,(HL)
DEC HL
PUSH HL
EX DE,HL
ld de,serial_string ; xxxx-xxxx
call hex16
POP HL
;
ld a,"-"
ld (de),a
INC DE
; ¬« ¤è¥¥ á«®¢® á¥à¨©­¨ª 
LD A,(HL)
DEC HL
LD L,(HL)
LD H,A
call hex16
;
; Œ¥âª  ¤¨áª 
; ld a,(disk) ; ­®¬¥à ¤¨áª 
; cp 2 ; ¬¥­ìè¥ "C:" ?
; jr nc,get_inf_data1 ; ¬¥âª  ¢ BPB
.get_label:
; ¨é¥¬ ¬¥âªã ¢ ª®à­¥ ”‘ à §¤¥« 
; ãáâ. ª®à¥­ì ¤¨áª 
ld hl,root_path ; "x:\",0
ld c,Dss.ChDir
RST ToDSS
; ¯®¨áª ¬¥âª¨
ld hl,mask_fname ; "*.*" ¨¬ï ¬¥âª¨
ld de,work_buffer1 ; ªã¤ 
ld a,FAT_ATTR.VOLUME_ID ;  âਡãâ ¬¥âª¨ ⮬ 
ld bc,0*256 + Dss.F_First ; f_first, ä®à¬ â 11
RST ToDSS
push af
call restore_path ; ¢®ááâ. ⥪. ¯ãâì
pop af
;jr c,no_volume_label ; ¬¥âª¨ ­¥â ¤¨à४â®à¨¨
ld hl,work_buffer1+33 ; ­ ç «® ¬¥âª¨ ¢ ¡ãä¥à¥ f_first
jr nc,volume_label ; ¬¥âª  ¢ ª®à­¥¢®¬ ª â «®£¥
; ¡¥àñ¬ ¬¥âªã ¨§ BPB
; âãâ ¢ HL ¤«¨­  ¯®«ï "Œ¥âª  ¤¨áª "
POP hl
LD A,(HL)
INC HL
AND A
jr z,.no_volume_label ; ¤ 
PUSH HL
LD B,A
LD A,' '
;
.loop: CP (HL)
JR NZ,.good_label
INC HL
DJNZ .loop
POP HL ; á­¨¬ ¥¬ «¨è­¥¥
; ­¥â ¬¥âª¨
.no_volume_label:
; %4
ld hl,volume_string_no ; áâப 
ld de,PRM4 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
XOR A
LD (PRM5),A
ret
.good_label:
POP HL
PUSH HL ; «¨è­¥¥
;!FIXIT ᤥ« âì ç¥à¥§  à£ã¬¥­âë %1-%9
; ¥áâì ¬¥âª 
volume_label:
pop DE ; «¨è­¥¥
; %5
ld de,PRM5
ld bc,11 ;!HARDCODE ¤«¨­  ¬¥âª¨
ldir
xor a
ld (de),a
; %4
ld hl,volume_string_yes ; áâப 
ld de,PRM4 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
ret
;
; ¥á«¨ ­¥ 㤠«®áì ¯à®ç¨â âì á¥à¨©­ë© ­®¬¥à ¤¨áª  ¨«¨ ä®à¬ â ­¥¨§¢¥á⥭
unknown_serial:
; á¥à¨©­ë© ­®¬¥à ¤¨áª  - ­¥¨§¢¥á⥭ ;!HARDCODE ­¨¦¥
LD HL,serial_string
LD A,'?'
LD B,serial_string.Size
.loop: LD (HL),A
INC HL
DJNZ .loop
LD HL,serial_string+4
LD (HL),'-'
;POP HL ; «¨è­¥¥
JP read_disk_info.get_label
;
; ‚뢮¤ HL ¢ hex-ä®à¬ â¥
; de=¡ãä¥à
; hl=ç¨á«®
hex16: ld a,h
call hex8
ld a,l
; ¢ë¢®¤ "a"
hex8: push af
rrca
rrca
rrca
rrca
call .num
pop af
;
.num: and %0000'1111
add a,#90
daa
adc a,#40
daa
ld (de),a
inc de
ret
; ¬ áª  ä ©«®¢
mask_fname:
db "*.*",0
; ª®à¥­ì ¤¨áª 
root_path:
db 'X:\',0
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
serial_string:
db "xxxx-xxxx"
.Size equ $-serial_string
db 0 ; § ªà뢠誠
volume_string_no: ;!FIXIT ᤥ« âì ç¥à¥§ PRM
db "has no label",0
volume_string_yes:
db "has label",0