Estex-DSS/SHELL/Commands/DIR.ASM
2023-08-11 04:54:30 +10:00

556 lines
9.3 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
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,$+5 ; § ¤ ­  ¬ áª  ¨¬¥­
ld hl,mask_fname ; "*.*"
;ld de,T9186 ; ¡ãä¥à
ld de,work_buffer1 ; 80
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
RST ToDSS
;ld hl,T9186 ; ¨¬ï ä ©« 
;ld de,T9186 ; ¡ãä¥à
ld hl,work_buffer1 ; ¨¬ï ä ©« 
ld de,work_buffer1 ; 80 ¡ãä¥à
ld a,37h ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ )
ld bc,0*256 + Dss.F_First ; f_first (ä®à¬ â 11)
RST ToDSS
jp c,print_err_message ; ¢ë¢®¤ á®®¡é¥­¨ï
; %1
;ld a,(system_path) ; ¡ãä¥à ¯®«­®£® á¨áâ. ¯ãâ¨
;ld (T90F6),a
;ld a,":"
;ld (T90F7),a
;xor a
;ld (T90F8),a
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 ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;call print_sys_path ; ¢ë¢®¤ á¨áâ. ¯ã⨠­  íªà ­
; %3
ld hl,screen_path ; íªà ­. ¯ãâì
ld de,PRM3 ; 16 ¡ãä¥à
;ld a,(hl)
;ldi ; ᪮¯¨à. áâபã
;or a
;jr nz,$-4
call copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;
ld de,0 ; ¨­¤¥ªá "Volume in drive %1 has no label..."
call MESSAGE ; ¢ë¢¥á⨠áâபã
; 横« ¢ë¢®¤  ᯨ᪠ ä ©«®¢/¯ ¯®ª
A882C: ;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,A8866 ; ¤ 
; ¯à¨¡ ¢¨âì à §¬¥à ⥪. ä ©« 
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
A8866: ;ld de,T9186 ; à ¡. ¡ãä¥à
ld de,work_buffer1 ; 80 ¡ãä¥à
ld c,Dss.F_Next ; ¯®¨áª á«¥¤.
RST ToDSS
jr nc,A882C ; ­ § ¤ ¢ 横«
jr A8872 ; ª®­¥æ ᯨ᪠, ­  ¤¥áïâ. ¢ë¢®¤
; „¥áïâ¨ç­ë© ¢ë¢®¤
A8872: 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,A8892
ld a,"0"
ld (hl),a
A8892: 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 ; ¢ë¢¥á⨠áâபã
; <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