Estex-DSS/SHELL/Commands/DIR.ASM
2024-05-03 05:01:10 +10:00

959 lines
18 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
;;;; [ ] ¯®¤¤¥à¦ª  ¯ à ¬¥â஢
; § ­ã«ï¥¬ ¢á¥ ¯ à ¬¥âàë ­  áâ àâ¥
xor a
ld (read_disk_info.full),a
ld (.key_p),a
; ¢ë¯®«­ï¥¬/­ áâà ¨¢ ¥¬ ¢á¥ ­ ©¤¥­­ë¥ ¯ à ¬¥âàë ¢ áâப¥
LD C,256-3 ;!HARDCODE ¤«¨­  áâப¨ á ª®¬ ­¤®©
.parse: ld hl,cmd_dir_options
call RUN_OPTION
jr nc,.end_opt
jp (hl)
.end_opt: ; ¢ë¢®¤¨¬ áâப㠮 à áçñ⥠᢮¡®¤­®£® ¬¥áâ  â ª, ç⮡ ®­  § âñà« áì
ld a,(read_disk_info.full)
and a
jr z,.skip
LD DE,MAIN_MSG.CALCULATING
CALL MESSAGE
.skip: ld c,Dss.CurDisk ; ã§­ âì ⥪. ¤¨áª
RST ToDSS
ADD A,"A"
ld (root_path),a ; ­®¬¥à ¤¨áª 
SUB "A"
call read_disk_info ; ¯à®ç¨â âì ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª 
;
pop de
xor a
ld h,a
ld l,a
ld (FILES),hl
ld (dir_number),hl
ld (S_LOW),hl
ld (S_MED),hl
ld (S_HIGH),a
;
ex de,hl
ld de,work_buffer1 ; 80
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
RST ToDSS
;
ld a,(work_buffer1)
or a
jr nz,.skipMask ; § ¤ ­  ¬ áª  ¨¬¥­
;
ld hl,mask_fname ; "*.*"
ld de,work_buffer1
call copy_string
; [ ] 1/10/23
.skipMask: ld hl,work_buffer1 ; ¨¬ï ä ©« 
ld de,work_buffer1 ; 80 ¡ãä¥à
ld a,FAT_ATTR.NoVolID ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ )
ld bc,Dss.F_First.FATname ; f_first (ä®à¬ â 11)
RST ToDSS
JR C,.Dir_Empty ;R14
CALL Print_Header
;
LD A,32-5 ; ª®«¨ç¥á⢮ áâப ¤® ®¦¨¤ ­¨ï ª« ¢¨è¨ (á ¢ëç¥â®¬ § £®«®¢ª ) ;!HARDCODE
PUSH AF
; 横« ¢ë¢®¤  ᯨ᪠ ä ©«®¢/¯ ¯®ª
.loop: POP AF
.key_p+1: and #ff
dec a
jr nz,.skip_wait
ld de,MAIN_MSG.PAUSE
call MESSAGE ; ¢ë¢¥á⨠áâபã
ld c,Dss.WaitKey
rst ToDSS
dec d
ld de,MAIN_MSG.DIR_ESCAPE
jp z,MESSAGE ; § ª®­ç¨âì ¯® ESC
;jr nz,.skip_esc
;xor a
;ld (.key_p),a ; ®â¬¥­ï¥¬ ESC
.skip_esc: ld a,32-1
.skip_wait: PUSH AF
ld hl,work_buffer1+33 ; 80
;push af
;ld de,33
;add hl,de
call PRNNAME
;
ld ix,work_buffer1 ; 80
ld a,(ix+32) ;  âਡãâ ⥪. § ¯¨á¨
and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ?
jr z,.Calc_Size ; ­¥â
; áç¨â ¥¬ ¯ ¯ª¨
; ­¥ áç¨â ¥¬ ¯ ¯ª®© á«ã¦¥¡­ë¥ "." ¨ ".."
ld d,(ix+33)
ld e,(ix+34)
ld hl,-('..')
add hl,de
ld a,h
or l
jr z,.next
ld hl,-('. ')
add hl,de
ld a,h
or l
jr z,.next
; 㢥«¨ç¨¢ ¥¬ áçñâ稪 ¯ ¯®ª
ld hl,(dir_number)
inc hl
ld (dir_number),hl
jr .next
;;R14
.Dir_Empty: push af
CALL Print_Header
pop af
CALL print_err_message
jr .print
;;R14
; ¯à¨¡ ¢¨âì à §¬¥à ⥪. ä ©« 
.Calc_Size: ld hl,(FILES)
inc hl
ld (FILES),hl
ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2)
ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3)
ld hl,(S_MED)
ld a,(S_HIGH)
exx
ld e,(ix+FAT_DIRECTORY_RECORD.F_SIZE)
ld d,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1)
ld hl,(S_LOW)
add hl,de
ld (S_LOW),hl
exx
adc hl,de
ld (S_MED),hl
;exx
adc a,0
ld (S_HIGH),a
;exx
.next: ld de,work_buffer1 ; 80 ¡ãä¥à
ld c,Dss.F_Next ; ¯®¨áª á«¥¤.
RST ToDSS
jp nc,.loop ; ­ § ¤ ¢ 横«, ¥á«¨ ­¥ ª®­¥æ ᯨ᪠
pop af ; ¡ « ­á á⥪ 
; „¥áïâ¨ç­ë© ¢ë¢®¤
.print: ld hl,(FILES)
ld ix,PRM3 ; ª®«¨ç¥á⢮ ä ©«®¢
call PDIGIT
;
ld a,(S_HIGH)
ld hl,(S_MED) ; áâ. à §àï¤
exx
ld hl,(S_LOW) ; ¬«. à §àï¤
;exx
;
;CALL PRINT_DWORD
CALL PRINT_5BYTES
;
; [ ] ¢ë¢®¤ ª®«¨ç¥á⢠ ¯ ¯®ª
; [x] ¢ë¢®¤ ®¡é¥£® ª®«¨ç¥á⢠ ᢮¡®¤­®£® ¬¥áâ 
ld hl,SIZE_BUFFER.high ; "000 000 000 000"
ld de,PRM1; + PRM2 ; à §¬¥à ä ©«®¢ ¢ ª â «®£¥
ld bc,SIZE_BUFFER.bytes
call ncopy_string.start ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá. SIZE_BUFFER.bytes ᨬ¢.
;
;!TEST
;ld hl,(dir_number)
;ld de,PRM3
;call hex2dec_ascii_16bit.n10000
; „¥áïâ¨ç­ë© ¢ë¢®¤
ld hl,(dir_number)
ld ix,PRM4 ; ª®«-¢® ª â «®£®¢ ¢ ª â «®£¥
call PDIGIT
;xor a
;ld (de),a
;
; full capacity
ld a,(full_space_high)
ld hl,(full_space_medium) ; áâ. à §àï¤
exx
ld hl,(full_space_low) ; ¬«. à §àï¤
CALL PRN_DISK_SIZE
; ;
ld de,MAIN_MSG.DIR_2 ; ¨­¤¥ªá " %1 file(s), %2 bytes, %3 Dir(s)"
CALL MESSAGE ; ¢ë¢¥á⨠áâபã
;
ld a,(read_disk_info.full)
and a
;ld de,MAIN_MSG.CRLF
;jp z,MESSAGE
RET Z
;
; free space
ld a,(free_space_high)
ld hl,(free_space_medium) ; áâ. à §àï¤
exx
ld hl,(free_space_low) ; ¬«. à §àï¤
;
CALL PRN_DISK_SIZE
;
ld de,MAIN_MSG.DIR_4 ; ¨­¤¥ªá " %6 bytes free"
jp MESSAGE
;
PRN_DISK_SIZE: call PRINT_5BYTES
ld hl,SIZE_BUFFER.high ; "000 000 000 000"
ld de,PRM5 ; and PRM6 ; ªã¤ 
ld bc,SIZE_BUFFER.bytes
jp ncopy_string.start ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá. SIZE_BUFFER.bytes ᨬ¢.
;
Print_Header: ; %1
ld hl,PRM1
ld a,'"'
ld (hl),a
inc hl
ld a,(screen_path) ; ¤¨áª
ld (hl),a
inc hl
ld a,'"'
ld (hl),a
inc hl
;ld (hl),":"
ld (hl),0
; %2
ld hl,serial_string ; áâப  á¥à¨©­®£® ­®¬¥à  ¤¨áª 
ld de,PRM2 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
; %3
ld hl,screen_path ; !FIXIT ¥á«¨ ¢¢¥á⨠"DIR gamez\*.*", â® ®â®¡à ¦ ¥¬ë© ¯ãâì ¢ § £®«®¢ª¥ ¡ã¤¥â ­¥¢¥à­ë¬
ld de,PRM3 ; 16 ¡ãä¥à
CALL copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;
ld de,MAIN_MSG.DIR_1 ; ¨­¤¥ªá "Volume in drive %1..."
JP MESSAGE ; ¢ë¢¥á⨠áâபã
;
; <20>®¤£®â®¢¨âì áâபã ᯨ᪠ ä ©«®¢/¯ ¯®ª
PRNNAME: dec hl
ld a,(hl)
and FAT_ATTR.DIRECTORY
call z,.set_small
inc hl
;
ld bc,8
ld de,PRM1 ; ¡ãä¥à
ldir
xor a
ld (de),a
ld de,PRM2 ; ªã¤ 
ldi
ldi
ldi
ld (de),a
ld ix,work_buffer1
call PRNSIZE ; ¢ë¢¥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
call PRNDATE ; ¢ë¢¥á⨠¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
call PRNTIME ; ¢ë¢¥á⨠¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld de,MAIN_MSG.DIR_3 ; ¨­¤¥ªá "%1 %2 %3 %4 %5"
jp MESSAGE ; ¢ë¢®¤ áâப¨
;
.set_small:
ld d,h
ld e,l
ld b,11 ;!HARDCODE ¤«¨­  ¨¬¥­¨ DOS
.loop: inc hl
ld a,(hl)
cp 'A'
jr c,.next
cp 'Z'+1
jr c,.letter
;
cp '€' ;#80
jr c,.next
cp 'Ÿ'+1 ;#9F + 1
jr nc,.next
;
.letter: or %0010'0000
ld (hl),a
.next: djnz .loop
ex de,hl
ret
; ‚뢥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
PRNSIZE: ld a,(ix+32)
ld hl,DIRIDD ; "<DIR> "
and FAT_ATTR.DIRECTORY ; ¯ ¯ª  ?
jr nz,.PRZ ; ¤ 
ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE) ; ¬«. à §àï¤
ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+1)
exx
ld l,(ix+FAT_DIRECTORY_RECORD.F_SIZE+2) ; áâ. à §àï¤
ld h,(ix+FAT_DIRECTORY_RECORD.F_SIZE+3)
exx
push ix
call MAKE_LN_32 ; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
ld hl,L32BIT_.end
ld a,(hl)
cp " "
jr nz,.not_zero
ld a,"0"
ld (hl),a
.not_zero: ld de,SIZE_BUFFER.low ; "0 000 000 000"
ld hl,L32BIT_ ; "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,SIZE_BUFFER.low ; "0 000 000 000"
pop ix
.PRZ: ld de,PRM3 ; 16 ¡ãä¥à
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
PRNDATE: ld c,(ix+FAT_DIRECTORY_RECORD.DATE)
ld b,(ix+FAT_DIRECTORY_RECORD.DATE+1)
ld hl,SIZE_BUFFER.low ; "0 000 000 000"
call MAKE_DATE ; ¢ë¢®¤ ¢ ¡ãä¥à ¤ âë
ld (hl),0
ld hl,SIZE_BUFFER.low ; "0 000 000 000"
ld de,PRM4 ; 16 ªã¤ 
; ld a,(hl)
; cp "0"
; jr nz,$+4
; ld (hl)," "
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ‘ª®¯¨à®¢ âì ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
PRNTIME: ld b,(ix+22)
ld c,(ix+23)
ld hl,SIZE_BUFFER.low ; "0 000 000 000"
call MAKE_TIME ; ᪮¯¨à. ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld (hl),0
ld hl,SIZE_BUFFER.low ; "0 000 000 000"
ld de,PRM5 ; 80 ¡ãä¥à áâப¨
; ld a,(hl)
; cp "0"
; jr nz,$+4
; ld (hl)," "
jp ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬), ¬ ªá.15 ᨬ¢.
; ¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
MAKE_TIME: srl c
rr b
srl c
rr b
srl c
rr b
srl b
srl b
ld a,c
call toNumber
ld (hl),":" ; à §¤¥«. ¢à¥¬¥­¨
inc hl
ld a,b
jr toNumber
; ¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
MAKE_DATE: ld a,c
and #1F
push bc
call toNumber
ld (hl),"." ; à §¤¥«. ¤ âë
inc hl
pop bc
ld a,c
srl b
rla
rla
rla
rla
and #0F
call toNumber
ld (hl),"." ; à §¤¥«. ¤ âë
inc hl
ld a,b
add a,80
cp 100
jr c,toNumber
.loop: sub 100
cp 100
jr nc,.loop
;
toNumber: ld c,#2F
.loop: inc c
sub 10
jr nc,.loop
add a,10
add a,"0"
ld (hl),c
inc hl
ld (hl),a
inc hl
ret
;!TODO ¯¥à¥â é¨âì ¢ procedures/math.asm
; „¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
; HL':HL - ç¨á«® ¤«ï ¯¥à¥¢®¤ 
; !FIXIT ¬®¦­® ®¡ê¥¤¥­¨âì á PDIGIT
MAKE_LN_32: CALL MAKE_LN
ld hl,L32BIT_ ; "0000000000"
JR MAKE_LN_Clean
; ¤¥áïâ¨ç­ë© 40-  à §àï¤­ë© ¢ë¢®¤
MAKE_LN_40: CALL MAKE_LN.skip_1
ld hl,L40BIT_ ; "0000000000"
;
MAKE_LN_Clean: ld de,#2030 ; " ","0"
.KILLZ: ld a,(hl)
cp e
jr nz,.KILLZ2
ld (hl),d
inc hl
jr .KILLZ
;
.KILLZ2: ld hl,L32BIT_.end ; "0"
ld a,(hl)
cp d
ret nz
ld (hl),e
ret
; ¤¥áïâ¨ç­ë© 32-å à §àï¤­ë© ¢ë¢®¤
MAKE_LN: ld ix,L32BIT_ ; "0000000000"
exx
ld de,#3B9A
exx
ld de,#CA00
; DE':DE = 1,000,000,000
call GET_DIG
.skip_1: exx
ld de,#05F5
exx
ld de,#E100
; DE':DE = 100,000,000
call GET_DIG ; 100,000,000...999,999,999
exx
ld de,#98
exx
ld de,#9680
; DE':DE = 10,000,000
call GET_DIG ; 10,000,000...99,999,999
exx
ld de,#0F
exx
ld de,#4240
; DE':DE = 1,000,000
call GET_DIG ; 1,000,000...9,999,999
exx
ld de,#01
exx
ld de,#86A0
; DE':DE = 100,000
call GET_DIG ; 100,000...999,999
exx
ld de,#00
exx
ld de,#2710
; DE':DE = 10,000
call GET_DIG ; 10,000...99,999
exx
ld de,#00
exx
ld de,#03E8
; DE':DE = 1,000
call GET_DIG ; 1,000...9,999
exx
ld de,#00
exx
ld de,#64
; DE':DE = 100
call GET_DIG ; 100..999
exx
ld de,#00
exx
ld de,#0A
; DE':DE = 10
call GET_DIG ; 10..99
ld a,l
add a,"0"
ld (ix+0),a
inc ix
ret
;
GET_DIG: xor a
.loop: inc a
sbc hl,de
exx
sbc hl,de
exx
jp nc,.loop
;
add hl,de
exx
adc hl,de
exx
dec a
add a,"0"
ld (ix+0),a
inc ix
ret
;
FILES: WORD 0
S_LOW: WORD 0
S_MED: WORD 0
S_HIGH: BYTE 0
dir_number: WORD 0
free_space_low: WORD 0
free_space_medium: WORD 0
free_space_high: BYTE 0
;
full_space_low: WORD 0
full_space_medium: WORD 0
full_space_high: BYTE 0
;
L40BIT_ db "00"
L32BIT_: db "000000000"
.end: db "0"
;
DIRIDD: db "<DIR> ",0
;
SIZE_BUFFER:
.high db "00"
.low: db "0 000 000 000",0,0
.bytes equ SIZE_BUFFER - $
;
; [x] ⥯¥àì ­¥ «¥§¥â ­ ¯àï¬ãî, ¤¥« ¥â ç¥à¥§ ­®¢ë© ¯ à ¬¥âà ä㭪樨 DskInfo
; ¨­ ï «®£¨ª  ¯®«ã祭¨ï ¬¥âª¨ ⮬  - á­ ç «  ¨é¥âáï ¢ ª®à­¥¢®© ¤¨à¥ªâ®à¨¨,
; ¥á«¨ â ¬ ­¥â, â® ¡¥àñâáï ¨§ BPB
read_disk_info: OR #80
LD HL,work_buffer
.full+1: LD B,0
LD C,Dss.DskInfo
RST ToDSS
; ” ©«®¢ ï á¨á⥬ 
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
; Œ¥âª  ¤¨áª  ¢ BPB
;
; HL':HL - ®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; DE':DE - ᢮¡®¤­ëå ª« áâ¥à®¢
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; max sector (LBA28) #0FFF'FFFF
;
EX AF,AF'
LD A,D
AND E
EXX
AND D
AND E
EXX
INC A
;JR Z,.no_full_space_option
LD (.full),A
; ;
; LD A,(.full)
; OR A
; JR Z,.no_full_space_option
EX AF,AF'
;
; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE
EXX
LD BC,0
EXX
SRL B
RR C
RRCA
JR C,.loop2
;
.loop1: SLA L
RL H
EXX
RL L
RL H
RL B
EXX
;
SLA E
RL D
EXX
RL E
RL D
RL C
EXX
;
RRCA
JP NC,.loop1
;
.loop2: SLA L
RL H
EXX
RL L
RL H
RL B
EXX
;
SLA E
RL D
EXX
RL E
RL D
RL C
EXX
;
SRL B
RR C
JP NC,.loop2
; <-- B':HL'HL, C':DE':DE
;!TODO ¢ë¢®¤¨âì ¯®«­ë© à §¬¥à ¤¨áª 
EXX
LD A,C
LD (free_space_high),A
LD (free_space_medium),DE
;
LD A,B
LD (full_space_high),A
LD (full_space_medium),HL
EXX
LD (free_space_low),DE
LD (full_space_low),HL
;
.no_full_space_option:
; 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
.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,Dss.F_First.FATname ; 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 ; «¨è­¥¥
; ¥áâì ¬¥âª 
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
;
; ¬ áª  ä ©«®¢
mask_fname: db "*.*",0
; ª®à¥­ì ¤¨áª 
root_path: db 'X:\',0
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
serial_string: db "xxxx-xxxx"
.Size equ $-serial_string
db 0 ; § ªà뢠誠
volume_string_no:
db "has no label",0
volume_string_yes:
db "has label",0
; has_not_full_info:
; db ' (?)',0
;
cmd_dir_options:; [ ] ¯ à ¬¥âà /F - ¢ë¢®¤ ª®«¨ç¥á⢠ ᢮¡®¤­®£® ¬¥áâ  ­  ¤¨áª¥ (â®à¬®§¨â, ¯®í⮬㠯 à ¬¥â஬)
DB 'f' : DW cmd_dir_freeSpace
DB 'p' : DW cmd_dir_pause
.Size EQU ($-cmd_dir_options)/3
.paramLength equ 3
;
;
cmd_dir_freeSpace:
; áâ ¢¨¬ ®¯æ¨î ¤«ï API DSS DskInfo
ld a,1
ld (read_disk_info.full),a
jp cmd_dir.parse
;
cmd_dir_pause: ld a,#ff
ld (cmd_dir.key_p),a
jp cmd_dir.parse
///////////////////////////////////////////////////////////////////////////////////////
GET_BIG_DIG: ld b,0
and a
.loop: inc b
sbc hl,de
exx
sbc hl,de
exx
sbc a,c
jp nc,.loop
;
add hl,de
;
exx
adc hl,de
exx
adc a,c
;
ex af,af'
dec b
ld a,b
add a,"0"
ld (ix+0),a
ex af,af'
inc ix
ret
; stop
PRINT_5BYTES: ld ix,L40BIT_ ; "00"
ld c,#17
exx
ld de,#4876
exx
ld de,#E800
; C:DE':DE = 100,000,000,000
call GET_BIG_DIG
;
ld c,#02
exx
ld de,#540B
exx
ld de,#E400
; C:DE':DE = 10,000,000,000
CALL GET_BIG_DIG
;
ld c,#00
exx
ld de,#3B9A
exx
ld de,#CA00
; C:DE':DE = 1,000,000,000
CALL GET_BIG_DIG
;
; DE':DE = 100,000,000
CALL MAKE_LN_40
ld hl,L32BIT_.end ; "0"
ld a,(hl)
cp " "
jr nz,.not_zero
ld a,"0"
ld (hl),a
.not_zero: ;
.exit_clean: ld de,SIZE_BUFFER.high ; "0 000 000 000"
ld hl,L40BIT_ ; "0000000000"
ldi
ldi
ld a,(hl)
ldi
cp " "
jr z,1F
ld a,"," ; à §¤. à §à冷¢
1: ld (de),a
inc de
ldi
ldi
ld a,(hl)
ldi
cp " "
jr z,1F
ld a,"," ; à §¤. à §à冷¢
1: ld (de),a
inc de
ldi
ldi
ld a,(hl)
ldi
cp " "
jr z,1F
ld a,"," ; à §¤. à §à冷¢
1: ld (de),a
inc de
ldi
ldi
ldi
scf
ret
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
;----------------------------------------------------------------------;
;<3B>à®æ¥¤ãà  ã¬­®¦¥­¨ï (16*8bit)
;<3B>  ¢å®¤: DE * C
;<3B>  ¢ë室:A:HL = १ã«ìâ â
IFUSED Mult32
Mult16X8: SUB A
LD L,A
LD H,A
CP C
RET Z
OR D
OR E
RET Z
LD A,C
LD C,#00
LD B,#08
.loop: ADD HL,HL
RLA
JR NC,.next
ADD HL,DE
ADC A,C
.next: DJNZ .loop
RET
ENDIF
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
;<3B>à®æ¥¤ãà  ã¬­®¦¥­¨ï (32bit)
;<3B>  ¢å®¤: HL:DE * BC
;<3B>  ¢ë室:HL:DE = १ã«ìâ â
IFUSED Mult32
Mult32: PUSH IX
LD IX,#0000
LD A,#20
EX DE,HL
.loop: ADD IX,IX
ADC HL,HL
RL E
RL D
JR NC,.no_add
ADD IX,BC
JR NC,no_add
INC HL
.no_add: DEC A
JR NZ,.loop
LD E,LX
LD D,HX
POP IX
RET
ENDIF
;----------------------------------------------------------------------;
;INPUT : DE * BC
;OUTPUT: HL:DE
IFUSED Mult32
Mult_16x16: LD IX,0
LD HL,0
;
LD A,B
OR C
JR Z,.exit
;
.loop: SRL B
RR C
JP NC,.no_add
ADD IX,DE
JR NC,.no_add
INC HL
;
.no_add: LD A,B
OR C
JR Z,.exit
;
SLA E
RL D
RL L
RL H
JP .loop
;
.exit: LD D,XH
LD E,XL
RET
ENDIF
///////////////////////////////////////////////////////////////////////////////////////