Estex-DSS/SHELL/Commands/DIR.ASM
Anatoliy Belyanskiy 83bfcf7cdd BOOT: bug fixes
2024-06-02 18:43:36 +10:00

995 lines
19 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 (Buffers.work.buffer2),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 ECHO_MESSAGE
; 23/05/24
.skip: ;LD C,Dss.CurDisk ; ã§­ âì ⥪. ¤¨áª
;RST ToDSS
;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,Buffers.work.buffer1
ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬-áâப¨
RST ToDSS
;
ld a,(Buffers.work.buffer1)
or a
;jr nz,.SkipMask ; § ¤ ­  ¬ áª  ¨¬ñ­
jr z,.NoSkipMask ; ­¥ § ¤ ­  ¬ áª  ¨¬ñ­
ld hl,Buffers.work.buffer1
ld bc,Dss.EX_Path.GET_ALL
rst ToDSS
;
and %00001100 ; ¨¬ï ¤¨áª  ¨ ¯ãâì
jr z,.SkipMask
;
ld hl,Buffers.work.buffer2+2
ld c,Dss.CurDir
rst ToDSS
ld c,Dss.CurDisk
rst ToDSS
add a,"A"
ld (Buffers.work.buffer2),a
ld a,":"
ld (Buffers.work.buffer2+1),a
;
xor a
ld hl,Buffers.work.buffer1
ld bc,256
cpir
;!FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã ¯® ä« £ã P/V
dec hl
ex de,hl
ld hl,256-1
and a
sbc hl,bc
ld b,h
ld c,l
ld a,'\' ;
ex de,hl
cpdr
;!FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã ¯® ä« £ã P/V
inc hl
ld (hl),0
inc hl
ld de,PRM1
call ncopy_string ; á®å࠭塞 ¬ áªã ä ©« 
;
ld hl,Buffers.work.buffer1
ld c,Dss.ChDir
rst ToDSS
;
ld hl,PRM1
ld de,Buffers.work.free
call ncopy_string ; ¢®ááâ ­ ¢«¨¢ ¥¬ ¬ áªã ä ©« 
;
ld a,(PRM1)
or a
jr nz,.SkipMask
;
; ¤®¡ ¢«¥­¨¥ ¬ áª¨
.NoSkipMask: ld hl,mask_fname ; "*.*"
ld de,Buffers.work.free
call copy_string
; 23/05/24
.SkipMask: LD C,Dss.CurDisk ; ã§­ âì ⥪. ¤¨áª
RST ToDSS
CALL read_disk_info ; ¯à®ç¨â âì ¬¥âªã ¨ á¥à¨©­ë© ­®¬¥à ¤¨áª 
;
CALL Print_Header
; [ ] 01/10/23
ld hl,Buffers.work.free ; ¨¬ï ä ©« 
ld de,Buffers.work.buffer1 ; 80 ¡ãä¥à
ld a,FAT_ATTR.NoVolID ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ )
ld bc,Dss.F_First.FATname ; f_first (ä®à¬ â 11)
RST ToDSS
JR C,.Dir_Empty ;R14
;
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 ECHO_MESSAGE ; ¢ë¢¥á⨠áâபã
ld c,Dss.WaitKey
rst ToDSS
dec d
ld de,MAIN_MSG.DIR_ESCAPE
jp z,ECHO_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,Buffers.work.buffer1+33 ; 80
;push af
;ld de,33
;add hl,de
call PRNNAME
;
ld ix,Buffers.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,Buffers.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] ¢ë¢®¤ ª®«¨ç¥á⢠ ¯ ¯®ª
; [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 ᨬ¢.
;
; „¥áïâ¨ç­ë© ¢ë¢®¤
ld hl,(dir_number)
ld ix,PRM4 ; ª®«-¢® ª â «®£®¢ ¢ ª â «®£¥
call PDIGIT
; 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 ECHO_MESSAGE ; ¢ë¢¥á⨠áâபã
;
; [ ] 23/05/2024
ld hl,Buffers.work.buffer2
ld c,Dss.ChDir
ld a,(hl)
or a
call nz,ToDSS
;
ld a,(read_disk_info.full)
and a
;ld de,MAIN_MSG.CRLF
;jp z,ECHO_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 ECHO_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
push hl
;
ld c,Dss.CurDisk
rst ToDSS
add a,"A"
;
pop hl
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..5
;push hl
ld hl,Buffers.work.free + 256 + 128 ; 128 - ­  ¢á直© á«ãç ©
ld c,Dss.CurDir
rst ToDSS
ld hl,PRM3
ld a,(PRM1 + 1)
ld (hl),a
inc hl
ld (hl),':'
;
ld hl,PRM3+2
ld de,PRM3+2+1
ld (hl),0
ld bc,16+16+16-1-2
ldir
;
ld hl,Buffers.work.free + 256 + 128 ; á¨áâ. ¯ãâì
ld de,PRM3 + 2 ;+PRM4..5 ; 2 + 48 ¡ ©â®¢ ¡ãä¥à
call make_short_path
;pop hl
; ld hl,Buffers.screen_path ; !FIXIT ¥á«¨ ¢¢¥á⨠"DIR gamez\*.*", â® ®â®¡à ¦ ¥¬ë© ¯ãâì ¢ § £®«®¢ª¥ ¡ã¤¥â ­¥¢¥à­ë¬
; ld de,PRM3 ;+PRM4 ; 32 ¡ ©â  ¡ãä¥à
; CALL copy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
;
ld de,MAIN_MSG.DIR_1 ; ¨­¤¥ªá "Volume in drive %1..."
JP ECHO_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,Buffers.work.buffer1
call PRNSIZE ; ¢ë¢¥á⨠¢ ¡ãä¥à ¨¬ï ä ©«  ¨ ¥£® à §¬¥à (ã ¯ ¯ª¨ <DIR>)
call PRNDATE ; ¢ë¢¥á⨠¢ ¡ãä¥à ¤ âã ä ©« /¯ ¯ª¨
call PRNTIME ; ¢ë¢¥á⨠¢ ¡ãä¥à ¢à¥¬ï ä ©« /¯ ¯ª¨
ld de,MAIN_MSG.DIR_3 ; ¨­¤¥ªá "%1 %2 %3 %4 %5"
jp ECHO_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-å à §àï¤­ë© ¢ë¢®¤
.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 ªã¤ 
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 ¡ãä¥à áâப¨
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: 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: ld a,"0"-1
AND 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
cp "0"
jr nz,.putChar
ld b,a
ld a,(ix-1)
cp " "
jr z,.putChar
ld a,b
;
.putChar: 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
;
; !TODO ¬®¦¥â ®¡®©â¨áì ®¤­¨¬ ¡ãä¥à®¬ 00 ¢¬¥áâ® ¤¢ãå?
L40BIT: db " " ; ¬ àª¥à ¤«ï ix-1
.Str: db " " ; 00
L32BIT_: db " " ; 000000000
.end: db "0"
;
DIRIDD: db "<DIR> ",0
;
SIZE_BUFFER: db " " ; ¬ àª¥à ¤«ï ix-1
.high db " " ; "00"
.low: db " ",0,0 ; "0 000 000 000",0,0
.bytes equ SIZE_BUFFER - $
;
; [x] ⥯¥àì ­¥ «¥§¥â ­ ¯àï¬ãî, ¤¥« ¥â ç¥à¥§ ­®¢ë© ¯ à ¬¥âà ä㭪樨 DskInfo
; ¨­ ï «®£¨ª  ¯®«ã祭¨ï ¬¥âª¨ ⮬  - á­ ç «  ¨é¥âáï ¢ ª®à­¥¢®© ¤¨à¥ªâ®à¨¨,
; ¥á«¨ â ¬ ­¥â, â® ¡¥àñâáï ¨§ BPB
read_disk_info: OR #80
LD HL,Buffers.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
LD (.full),A
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
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,Buffers.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: ; âãâ ¢ 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:; %6
ld hl,volume_string_no ; áâப 
ld de,PRM6 ; ªã¤ 
call ncopy_string ; ᪮¯¨à. áâபã (á ­ã«¥¬)
XOR A
LD (PRM7),A
ret
.good_label: POP HL
PUSH HL ; ⮫ª ¥¬ «¨è­¥¥
; ¥áâì ¬¥âª 
volume_label: POP DE ; á­¨¬ ¥¬ «¨è­¥¥
; %7
ld de,PRM7
ld bc,11 ;!HARDCODE ¤«¨­  ¬¥âª¨
ldir
xor a
ld (de),a
; %6
ld hl,volume_string_yes ; áâப 
ld de,PRM6 ; ªã¤ 
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
;
;---------------;
SlashMaskFname: db '\' ;
; ¬ áª  ä ©«®¢
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:; [x] ¯ à ¬¥âà /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"-1
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
cp "0"
jr nz,.putChar
ld a,(ix-1)
cp " "
jr z,.putChar
ld a,b
;
.putChar: ld (ix+0),a
ex af,af'
inc ix
ret
; stop
; A:HL':HL - ç¨á«® ¤«ï ¯¥à¥¢®¤ 
PRINT_5BYTES: ld ix,L40BIT.Str ; "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.skip_1
ld de,SIZE_BUFFER.high ; "0 000 000 000"
ld hl,L40BIT.Str ; "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
///////////////////////////////////////////////////////////////////////////////////////