Estex-DSS/SHELL/Commands/DIR.ASM
2023-10-06 00:31:46 +10:00

571 lines
9.4 KiB
NASM
Raw Blame History

;///////////////////////////////////////////////////
;
; DIR. ‚뢮¤ ᯨ᪠ ä ©«®¢ ¨ ¯ ¯®ª
;
;///////////////////////////////////////////////////
cmd_dir: push de
ld c,Dss.CurDisk ; ã§­ âì ⥪. ¤¨áª
RST ToDSS
ld (disk+1),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 10h ; ¯ ¯ª  ?
jr nz,.next ; ¤ 
; ¯à¨¡ ¢¨âì à §¬¥à ⥪. ä ©« 
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,T9186 ; à ¡. ¡ãä¥à
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
;
; <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:
disk: ld a,0 ; á®åà. ­®¬¥à ¤¨áª 
ld c,1 ; open device
rst 18h
jr c,get_inf_data_err ;!FIXIT ­¥â ®¡à ¡®â稪  ®è¨¡ª
ld a,(disk+1)
ld de,work_buffer ; ¡ãä¥à
ld c,4 ; get BPB
rst 18h
push af
ld a,(disk+1) ; ­®¬¥à ¤¨áª 
ld c,2 ; close device
rst 18h
pop af
jr c,get_inf_data_err ;!FIXIT ­¥â ®¡à ¡®â稪  ®è¨¡ª¨
;
get_inf_data_err:
;
; ‘¥à¨©­ë© ­®¬¥à «®£. ¤¨áª 
ld hl,(work_buffer+41) ; áâ.ç áâì
ld de,serial_string ; xxxx-xxxx
call hex16
ld a,"-"
ld (de),a
inc de
ld hl,(work_buffer+39) ; ¬«.ç áâì
call hex16
;
; Œ¥âª  ¤¨áª 
ld a,(disk+1) ; ­®¬¥à ¤¨áª 
cp 2 ; ¬¥­ìè¥ "C:" ?
jr nc,get_inf_data1 ; ¬¥âª  ¢ BPB
; floppy, ¬¥âª  - ª ª § ¯¨áì ä ©« 
ld c,Dss.ChDisk ; ãáâ. ¤¨áª
RST ToDSS
; ãáâ. ª®à¥­ì ¤¨áª 
ld hl,root_path ; "\",0
ld c,Dss.ChDir
RST ToDSS
; ¯®¨áª ¬¥âª¨
ld hl,mask_fname ; "*.*" ¨¬ï ¬¥âª¨
ld de,work_buffer1 ; ªã¤ 
ld a,8 ;  âਡãâ ¬¥âª¨ ⮬ 
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 volume_label
;
get_inf_data1: ;!FIXIT â ª â ¬ ¯à®¡¥«ë áâ®ïâì ¬®£ãâ, ¥á«¨ ¬¥âª  ª®à®ç¥ 11 ᨬ¢®«®¢
ld hl,work_buffer+53 ; ª®­¥æ ¬¥âª¨ ¢ BPB
ld a,(hl)
cp " " ; ¥áâì ¬¥âª  ?
ld hl,work_buffer+43 ; ­ ç «® ¬¥âª¨ ¢ BPB
jr nz,volume_label ; ¤ 
;!FIXIT ᤥ« âì ç¥à¥§  à£ã¬¥­âë %1-%9
; ­¥â ¬¥âª¨
no_volume_label: ;!FIXIT ᤥ« âì ç¥à¥§ PRM %4
ld hl,volume_string1 ; "has no label "
ld de,MSG0.volume_string ; ªã¤ 
ld bc,14
ldir
ret
;!FIXIT ᤥ« âì ç¥à¥§  à£ã¬¥­âë %1-%9
; ¥áâì ¬¥âª 
volume_label:
ex de,hl
ld hl,MSG0.volume_string ; ªã¤ 
ld (hl),"i"
inc hl
ld (hl),"s"
inc hl
ld (hl)," "
inc hl
ex de,hl
; ᪮¯¨à. ¨¬ï ¬¥âª¨
ld bc,11 ; ¬ ªá. ¤«¨­  ¬¥âª¨
ld a,(hl)
cp " "+1
jr nc,$+6
inc hl
dec c
jr $-7
ld a,11
sub c
ldir
ld b,a
or a ; ¤«¨­  ¬¥âª¨ 11 ᨬ¢. ?
ret z ; ¤ 
; ¤®¯®«­¨âì 墮áâ. ¯à®¡¥« ¬¨
ld (de),a
inc de
djnz $-2
ret
; ‚뢮¤ HL ¢ hex-ä®à¬ â¥
; de=¡ãä¥à
; hl=ç¨á«®
hex16: ld a,h
call hex8
ld a,l
; ¢ë¢®¤ "a"
hex8: push af
rrca
rrca
rrca
rrca
call $+4
pop af
and 0Fh
add a,90h
daa
adc a,40h
daa
ld (de),a
inc de
ret
; ¬ áª  ä ©«®¢
mask_fname:
db "*.*",0
; ª®à¥­ì ¤¨áª 
root_path:
db '\',0
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
serial_string:
db "xxxx-xxxx",0
volume_string1: ;!FIXIT ᤥ« âì ç¥à¥§ PRM
db "has no label " ; 14