Estex-DSS/DSS/API/diskINF.asm

262 lines
4.8 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.

;/////////////////////////////////////////////////////////////////////
; [ ] ­®¢ ï ¯®¤äã­ªæ¨ï á ¡¨â®¬ 7 ¢ ॣ. €
; ‚®§¢à é ¥â ¨­ä®à¬ æ¨î ®¡ ®¡é¥¬ ¨ ᢮¡®¤­®¬ ¯à®áâà ­á⢥ ¤¨áª®¢®£®
; ãáâனá⢠.
;
; ¢å®¤: A - ­®¬¥à ¤¨áª  (0=A,1=B .. 25=Z. #FF-⥪ã騩)
; <09>ਠA bit7 = 1:
; A and #7F - ­®¬¥à ¤¨áª 
; HL - ¡ãä¥à (256 ¡ ©â®¢) ¤«ï à áè¨à¥­­ëå ¤ ­­ëå:
; B != 0 - áç¨â âì ᢮¡®¤­®¥ ¬¥áâ®
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ” ©«®¢ ï á¨á⥬ 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; ‘¥à¨©­ë© ­®¬¥à ¤¨áª 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; Œ¥âª  ¤¨áª 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; 䨧¨ç¥áª¨© ­®¬¥à ¤¨áª , ­®¬¥à à §¤¥« 
; ;
; à §¬¥à ¯®«ï - 1 ¡ ©â
; § à¥§¥à¢¨à®¢ ­®
; ;
; ¢ë室: CF=0:
; A - à §¬¥à ª« áâ¥à  ¢ ᥪâ®à å
; HL':HL - ®¡é¥¥ ª®«-¢® ª« áâ¥à®¢
; DE':DE - ᢮¡®¤­ëå ª« áâ¥à®¢
; BC - à §¬¥à ᥪâ®à  ¢ ¡ ©â å
; CF=1:
; A - ª®¤ ®è¨¡ª¨, ¥á«¨ CF=1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Œ¥âª  ¤¨áª  ¯à®¢¥àï¥âáï á­ ç «  ¢ ª®à­¥¢®¬ ª â «®£¥ ¨ ¥á«¨ â ¬ ;
; ­¥â, â® ¡¥àñâáï ¬¥âª  ¨§ BPB ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;/////////////////////////////////////////////////////////////////////
DISKINF: LD C,B
LD B,1
;
CP #80
JP C,.CustomDisk
CP #FF
JR Z,.CurrentDisk
; more info
LD B,C
AND %0111'1111
PUSH HL
PUSH AF
CALL .CustomDisk
POP IX
JR C,.error
;
EX (SP),HL
PUSH DE
PUSH AF
PUSH BC
;;;;
;
EX DE,HL
LD HL,FAT_STRING ;!HARDCODE FAT FS
LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP
; 12, 16 or 32
LD A,(CORE_BUFFERS.FS_Buffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.next_prm
;
PUSH DE
DEC DE
LD A,'6'
JR Z,.put_char
; fat 32
DEC DE
LD A,'3'
.put_char: LD (DE),A
POP DE
;
.next_prm: LD HL,CORE_BUFFERS.FS_Buffer.BPB_SERIAL_NUMBER
LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP
;
; fat32
EXX
PUSH DE
PUSH HL
EXX
;LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL
PUSH IX
CALL GET_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
POP AF
PUSH DE
;LD A,XH
LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV
POP DE
; fat32
EXX
POP HL
POP DE
EXX
JR C,.error_drv
LD A,2 ;!HARDCODE ¤«¨­  ¯®«ï ü4 2 ¡ ©â : 䨧 ­®¬¥à ¤¨áª , ­®¬¥à à §¤¥«  ¤¨áª 
LD (DE),A
INC DE
EX AF,AF'
LD (DE),A ;䨧 ­®¬¥à ¤¨áª 
INC DE
LD A,C
LD (DE),A ;­®¬¥à à §¤¥«  ¤¨áª 
INC DE
;
.error_drv: EX AF,AF'
XOR A
LD (DE),A
;;;;
POP BC
POP AF
POP DE
EX AF,AF'
JR C,.error
EX AF,AF'
.error: POP HL
RET
;
CP #FF ; !FIXIT WorkDirectory
;!TEST !Current Dir
;JR Z,CURRDS ;R06
.CurrentDisk: LD A,(CORE_BUFFERS.CurrentPath)
SUB 'A'
LD HL,CORE_BUFFERS.FS_Buffer.DRIVE
CP (HL)
JR Z,.CheckFreeSpace
;
.CustomDisk: PUSH BC
CALL CHDISK ;R06
POP BC
RET C
;
.CheckFreeSpace:; ¥á«¨ GetFreeSpace ­¥ ¢ë§ë¢ ¥âáï
XOR A
OR B
LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L)
EXX
LD BC,(CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H)
EXX
CALL NZ,GetFreeSpace
;
;.FRESP2:
; A = 0 if B != 0 before .GetFreeSpace
;
LD H,B
LD L,C
LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_L),HL
EX DE,HL
EXX
LD H,B
LD L,C
LD (CORE_BUFFERS.FS_Buffer.FREE_CLUSTERS_COUNT_H),HL
EX DE,HL
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterLow)
DEC HL
; fat 32
EXX
LD HL,(CORE_BUFFERS.FS_Buffer.MaxClusterHigh)
JR NC,.skip_dec_hl
DEC HL
.skip_dec_hl: EXX
LD BC,(CORE_BUFFERS.FS_Buffer.BytesPerSector)
LD A,(CORE_BUFFERS.FS_Buffer.SectorsPerCluster)
AND A
RET
;
; [ ] 22/11/23 ¯®¤äã­ªæ¨ï á ¤®¯.¨­ä®©
.mCOPY_LOOP: LD B,0
EX DE,HL
LD (HL),C
EX DE,HL
INC DE
LDIR
RET
;
;
GetFreeSpace: LD A,1
LD (CORE_BUFFERS.FS_Buffer.UPD_FSINFO),A
LD HL,2 ; fat32 ­®¬¥à ª« áâ¥à  ®â ª®â®à®£® áç¨â âì
XOR A
; fat32
EXX
LD H,A
LD L,A
LD B,A
LD C,A
EXX
LD B,A
LD C,A
.loop_free_space:;!FIXIT
PUSH BC
EXX
PUSH BC
EXX
CALL READ_FROM_FAT
EXX
POP BC
EXX
POP BC
CP DSS_Error.sys.DISK_FULL
RET Z
; fat 32
EXX
LD A,E
OR D
EXX
OR E
OR D
JR NZ,.skip
;
INC BC
LD A,B
OR C
JR NZ,.skip
EXX
INC BC
EXX
;
.skip: INC HL
LD A,L
OR H
JR NZ,.loop_free_space
EXX
INC HL
EXX
JP .loop_free_space
;
FAT_STRING: DB 'FAT12'
;
; DE - ¡ãä¥à
GET_LABEL: PUSH DE
LD HL,.LABEL_MASK ; "\*.*" ¨¬ï ¬¥âª¨
LD A,FAT_ATTR.VOLUME_ID ;  âਡãâ ¬¥âª¨ ⮬ 
LD B,high Dss.F_First.FATname
CALL F_FIRST
POP DE
.from_BPB: LD HL,CORE_BUFFERS.FS_Buffer.BPB_LABEL
RET C
; [ ] 07/03/2025 ª®áâë«ì ¤«ï  âਡãâ  0. <20> áâ®ï« ‘ ¢¥«¨©))
LD HL,BUFFER_FIND.REC_Attr
ADD HL,DE
LD A,(HL)
OR A
SCF
JR Z,.from_BPB
;
LD HL,BUFFER_FIND.REC_Name
ADD HL,DE
RET
.LABEL_MASK: DB '\*.*',0