This commit is contained in:
Anatoliy Belyanskiy 2024-04-13 02:17:04 +10:00
parent 8448dbef48
commit 9b975b7a88
10 changed files with 317 additions and 307 deletions

View File

@ -21,8 +21,6 @@
;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES ;R004 19-11-2002 DNS DON'T ALLOW DIR & LABEL ATTR FOR FILES
;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT ;R003 19-11-2002 DNS ADD RESET OF VOLUME LABEL ATTRIBUT
;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES ;R002 19-11-2002 DNS FIX GET/SET ATTRIBUTES
;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
;R001 16-12-1999 DNS Y2K fix ;R001 16-12-1999 DNS Y2K fix
;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS ;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS
;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR ;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR

View File

@ -36,7 +36,7 @@ DISKINF: LD C,B
LD B,1 LD B,1
; ;
CP #80 CP #80
JR C,.CustomDisk JP C,.CustomDisk
CP #FF CP #FF
JR Z,.CurrentDisk JR Z,.CurrentDisk
; more info ; more info
@ -54,26 +54,31 @@ DISKINF: LD C,B
PUSH BC PUSH BC
;;;; ;;;;
; ;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
;
EX DE,HL EX DE,HL
LD HL,CORE_BUFFERS.BootSector.ID_FAT LD HL,FAT_STRING
JR NZ,1F 1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.ID_FAT CALL .mCOPY_LOOP
1: LD C,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length ; 12, 16 or 32
LD A,(FatBuffer.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,FatBuffer.BPB_SERIAL_NUMBER
LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; ;
LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER LD HL,FatBuffer.BPB_LABEL
JR NZ,1F LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_SERIAL_NUMBER
1: LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP
;
LD HL,CORE_BUFFERS.BootSector.BPB_LABEL
JR NZ,1F
LD HL,CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.BPB_LABEL
1: LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; fat32 ; fat32
EXX EXX
@ -187,4 +192,4 @@ DISKINF: LD C,B
LDIR LDIR
RET RET
; ;
; FAT_STRING: DB 'FAT12'

View File

@ -20,17 +20,6 @@
;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" ;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE"
;--------------------------------------------------------------- ;---------------------------------------------------------------
;[BEGIN]
;//MODULE: FAT_X
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;RX01 10-02-1999 DNS UPGRADE FAT CASH
;---------------------------------------------------------------
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; HL - 11 bytes filename "FILENAMEEXT" ; HL - 11 bytes filename "FILENAMEEXT"
; DE - DOS filename "FILENAME.EXT",0 ; DE - DOS filename "FILENAME.EXT",0

View File

@ -405,7 +405,7 @@ BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM .Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size .FullSize EQU FMCOUNT*FM_BUF.Size
BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector à §­®© ¤«¨­ë
EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
XSTACK EQU BUFFERSplace.Stack.SPoint XSTACK EQU BUFFERSplace.Stack.SPoint
BUFFER EQU BUFFERSplace.Buffer BUFFER EQU BUFFERSplace.Buffer
@ -414,12 +414,13 @@ SECBUF EQU BUFFER ;!TODO
CLEAR_ZONE.size EQU _sBuffers CLEAR_ZONE.size EQU _sBuffers
ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0"
;DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "--- --- --- --- --- --- --- ---"
;DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector
;DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector
;DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector
;DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF
;DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector
DISPLAY "--- --- --- --- --- --- --- ---"
/* /*

View File

@ -5,9 +5,9 @@
;--------------------------------------------------------------- ;---------------------------------------------------------------
;Rev Date Name Description ;Rev Date Name Description
;--------------------------------------------------------------- ;---------------------------------------------------------------
;RX01 10-02-1999 DNS UPGRADE FAT CASH ;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION
;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET
;--------------------------------------------------------------- ;---------------------------------------------------------------
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£  ; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£ 
; ;
@ -69,7 +69,7 @@ SEARCH:
; ;
LD D,XH LD D,XH
LD E,XL LD E,XL
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; EXX ; EXX
; PUSH DE ; PUSH DE
; EXX ; EXX
@ -79,7 +79,7 @@ SEARCH:
EX DE,HL EX DE,HL
LD BC,HANDBUF.SIZE LD BC,HANDBUF.SIZE
LDIR LDIR
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
POP DE POP DE
; ;
EX AF,AF' EX AF,AF'
@ -88,7 +88,7 @@ SEARCH:
AND A AND A
RET RET
.next_record: .next_record:
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; EXX ; EXX
; INC DE ; INC DE
; EXX ; EXX
@ -555,7 +555,7 @@ WRT_HND: SET_PAGE_X DIRPAGE
; ;
;LD IX,DIRPAGE.buffer ;LD IX,DIRPAGE.buffer
LD HL,DIRPAGE.buffer LD HL,DIRPAGE.buffer
;!TEST 9/11/23 record index ;!TEST 9/11/23 record index
; EXX ; EXX
; LD DE,0 ; LD DE,0
; EXX ; EXX
@ -611,267 +611,278 @@ WRT_HND: SET_PAGE_X DIRPAGE
; RET Z ; RET Z
; ॣ. D - ­®¬¥à ¤¨áª  ; ॣ. A - ­®¬¥à ¤¨áª 
; [ ] fat32 ; [ ] fat32
RD_BPB: LD C,SLOT3 RD_BPB: LD C,SLOT3
IN B,(C) IN B,(C)
PUSH BC PUSH BC
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08
LD C,Dss.DRV.GetBPB LD C,Dss.DRV.GetBPB
RST ToDSS.DRV RST ToDSS.DRV
POP BC POP BC
OUT (C),B OUT (C),B
JP C,DOS_X_Error.Not_ready JP C,DOS_X_Error.Not_ready
;
LD DE,#AA55 ; ᨣ­ âãà  ;R05
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
;R05
AND A
SBC HL,DE
JP NZ,DOS_X_Error.UnknownBPB
;
; ;R08 ; [x] fat32
; LD HL,CORE_BUFFERS.SECBUF
; LD DE,CORE_BUFFERS.BootSector
; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size
; LDIR
;
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0
JP C,DOS_X_Error.UnknownBPB
; calc. first sector FAT
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
;
; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec
; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1)
; ADD HL,DE
;
;!FIXIT ¤«ï fat32 ¢â몠âì á ᥪâ®à   ªâ¨¢­®© â ¡«¨æë
LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1
LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2
;[ ] fat32
XOR A
LD B,A
LD C,A
LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32
LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32
LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables
LD (FatBuffer.SectorsPerFAT_H),A ; [ ] fat32
;
;
LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16)
LD A,E
OR D
JR NZ,.skip_high
;
LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4)
LD (FatBuffer.SectorsPerFAT_H),BC
LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32)
.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE
;
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs
CP 1
JR Z,.one_FAT
DEC A
ADD HL,DE
LD (FatBuffer.FAT2_SEC_L),HL
JR NC,.no_inc_BC
INC BC
.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC
.one_FAT: ;C_DATA1
.loop1: ADD HL,DE
JR NC,.loop1_1
INC BC
.loop1_1: DEC A
JR NZ,.loop1
;
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD DE,#AA55 ; ᨣ­ âãà  ;R05 LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector)
LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 LD A,B
;R05 AND A
AND A ;
SBC HL,DE RL C
JP NZ,DOS_X_Error.UnknownBPB RLA
;R08 RL C
LD HL,CORE_BUFFERS.SECBUF RLA
LD DE,CORE_BUFFERS.BootSector RL C
LD BC,_sBOOT_SECTOR_PARAMS ; size RLA
LDIR ;
; LD C,A
LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) LD B,0 ; BC - File handels in sectors
CP #F0 ;;;;
JP C,DOS_X_Error.UnknownBPB IF COMPILE_UNUSED_CODE
; calc. first sector FAT LD (FatBuffer.FilesPerSector),A
LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS) ENDIF
; ;
; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec EX DE,HL
; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FilesInRootDIR) ; 0 for fat32
; ADD HL,DE DEC HL ; [ ]fat32
; XOR A
LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 ;NEXTAD2
LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 .loop2: INC A
;[ ] fat32 ;!FIXIT JP Z,DOS_X_Error.UnknownBPB
XOR A SBC HL,BC
LD D,A JR NC,.loop2
LD E,A ;
LD (FatBuffer.FAT1_SEC_H),DE ; high word first sector FAT #1 EX DE,HL
LD (FatBuffer.FAT2_SEC_H),DE ; high word first sector FAT #1 LD C,A ; A - sectors in DIR
LD (FatBuffer.RootDirStartCluster_L),DE LD B,0
LD (FatBuffer.RootDirStartCluster_H),DE LD (FatBuffer.DirSizeInSectors),A
LD (FatBuffer.SectorsPerFAT_H),A
; ADD HL,BC ; Start DATA area
; LD (FatBuffer.FirstDataSector_L),HL
LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; B = 0
LD (FatBuffer.SectorsPerFAT_L),DE ;
; LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector)
LD A,(CORE_BUFFERS.BootSector.Number_of_FATs) ; amount FATs LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster)
CP 1 ;!TODO FATcacheSize
JR Z,.loop1 ; calc. cluster size
DEC A XOR 1
ADD HL,DE JR Z,.loop3.end
LD (FatBuffer.FAT2_SEC_L),HL RRA
;C_DATA1 .loop3: ADD HL,HL
.loop1: ADD HL,DE RRA
DEC A JP NC,.loop3
JR NZ,.loop1 .loop3.end: ;
; LD (FatBuffer.BytesPerCluster),HL
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR ;
LD BC,(CORE_BUFFERS.BootSector.BytesPerSector)
LD A,B
AND A
;
RL C
RLA
RL C
RLA
RL C
RLA
;
LD C,A
LD B,0 ; BC - File handels in sectors
;;;;
IF COMPILE_UNUSED_CODE IF COMPILE_UNUSED_CODE
LD (FatBuffer.FilesPerSector),A EX DE,HL
LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize
XOR A
;NEXTAD4 ;!FIXIT ®¯â¨¬¨§¨à®¢ âì ª®£¤  ¯®­ ¤®¡¨âáï
.loop4: INC A
JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE
JR NC,.loop4
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
ENDIF ENDIF
; ;
EX DE,HL ;!TODO detect fat type by clusters!
LD HL,(CORE_BUFFERS.BootSector.FilesInRootDIR) ; 0 for fat32 ; [ ] fat32
DEC HL ; [ ]fat32 LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
XOR A LD DE,FAT_STRING
;NEXTAD2 LD B,3
.loop2: INC A ;R_BPBL1
JP Z,DOS_X_Error.UnknownBPB .loop5: LD A,(DE)
SBC HL,BC CP (HL)
JR NC,.loop2 JP NZ,.IBM_DOS
; INC HL
EX DE,HL INC DE
LD C,A ; A - sectors in DIR DJNZ .loop5
LD B,0 ;FID
LD (FatBuffer.DirSizeInSectors),A .loop6: LD A,(HL)
ADD HL,BC ; Start DATA area INC HL
LD (FatBuffer.FirstDataSector_L),HL CP ' '
; B = 0 JR Z,.loop6
; ;
LD HL,(CORE_BUFFERS.BootSector.BytesPerSector) CP '1'
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;[ ] fat32
;!TODO FATcacheSize JP Z,.fat1x
; calc. cluster size CP '3'
XOR 1 JP NZ,DOS_X_Error.UnknownBPB
JR Z,.loop3.end LD A,#52 ; #52-#20 = #32 fat type
RRA LD HL,#0FFF
.loop3: ADD HL,HL LD (FatBuffer.END_CHAIN_CLUSTER_H),HL
RRA LD (FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT
JP NC,.loop3 LD H,L
.loop3.end: JR .BPB_FAT
; ;
LD (FatBuffer.BytesPerCluster),HL .fat1x: LD A,(HL)
IF COMPILE_UNUSED_CODE CP '2' ; FAT16
EX DE,HL LD HL,#0FFF
LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize JR Z,.BPB_FAT
XOR A CP '6' ; FAT12
;NEXTAD4 ;!FIXIT ®¯â¨¬¨§¨à®¢ âì ª®£¤  ¯®­ ¤®¡¨âáï JP NZ,DOS_X_Error.UnknownBPB
.loop4: INC A LD H,L
JP Z,DOS_X_Error.UnknownBPB .BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32)
SBC HL,DE LD (FatBuffer.FAT_TYPE),A
JR NC,.loop4 LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
ENDIF
;
;!TODO detect fat type by clusters!
;[ ] fat32 reset fat32 variables
LD HL,0
LD (FatBuffer.ENDCLUS_HIGH),HL
LD (FatBuffer.MaxClusterHigh),HL
;
LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
LD DE,FatBuffer.MSG
LD B,3
;R_BPBL1
.loop5: LD A,(DE)
CP (HL)
JP NZ,.IBM_DOS
INC HL
INC DE
DJNZ .loop5
;FID
.loop6: LD A,(HL)
INC HL
CP ' '
JR Z,.loop6
;
CP '1'
;[ ] fat32
JP Z,.fat1x
CP '3'
JP NZ,DOS_X_Error.UnknownBPB
LD A,#46 ; #46-#26 = 32 fat type
LD HL,#0FFF
LD (FatBuffer.ENDCLUS_HIGH),HL
LD (FatBuffer.MaxClusterHigh),HL
LD H,L
JR .BPB_FAT
;
.fat1x: LD A,(HL)
CP '2' ; FAT16
LD HL,#0FFF
JR Z,.BPB_FAT
CP '6' ; FAT12
JP NZ,DOS_X_Error.UnknownBPB
LD H,L
.BPB_FAT:
SUB #26 ; A-#26 = fat type (12, 16, 32)
LD (FatBuffer.FAT_TYPE),A
LD (FatBuffer.ENDCLUS_LOW),HL
;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨¥ ¢ëç¨á«ï¥¬®¥ ¨ á®å࠭塞®¥ ¢ FatBuffer ;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨¥ ¢ëç¨á«ï¥¬®¥ ¨ á®å࠭塞®¥ ¢ FatBuffer
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; LD HL,0 ; LD HL,0
; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track ; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track
; LD A,(CORE_BUFFERS.BootSector.HEADS) ; LD A,(CORE_BUFFERS.BootSector.HEADS)
; .BPB_L1:; calc. sector per cylinder ; .BPB_L1: ; calc. sector per cylinder
; ADD HL,BC ; ADD HL,BC
; DEC A ; DEC A
; JR NZ,.BPB_L1 ; JR NZ,.BPB_L1
; LD (FatBuffer.S_X_H),HL ; LD (FatBuffer.S_X_H),HL
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; [ ] fat32 ; [ ] fat32
LD HL,(CORE_BUFFERS.BootSector.SectorsPerDrive) LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive)
LD DE,(FatBuffer.FirstDataSector_L) LD DE,(FatBuffer.FirstDataSector_L)
LD A,H LD A,H
OR L OR L
JP NZ,.HDDSMAL JP NZ,.HDDSMAL
; ;
LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L) LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L)
LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H) LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H)
AND A AND A
SBC HL,DE SBC HL,DE
JP NC,.HDDBIG JP NC,.HDDBIG
DEC BC DEC BC
JP .HDDBIG JP .HDDBIG
; ;
.HDDSMAL:; CF = 0 .HDDSMAL: ; CF = 0
SBC HL,DE SBC HL,DE
LD BC,0 LD BC,0
.HDDBIG: LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) .HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster)
SCF SCF
.S4C01: RRA .S4C01: RRA
JR C,.S4C02 JR C,.S4C02
RR B RR B
RR C RR C
RR H RR H
RR L RR L
JP .S4C01 JP .S4C01
.S4C02: INC HL .S4C02: INC HL
LD (FatBuffer.MaxClusterLow),HL LD (FatBuffer.MaxClusterLow),HL
; ;
XOR A XOR A
LD H,A LD H,A
LD L,A LD L,A
LD (FatBuffer.CacheBlock),HL LD (FatBuffer.CacheBlock),HL
LD (FatBuffer.CacheUpdated),A LD (FatBuffer.CacheUpdated),A
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
PUSH AF PUSH AF
; [ ] fat32 ; [ ] fat32
; XOR A ; XOR A
; HL = 0 ; HL = 0
EX DE,HL EX DE,HL
; ;
CALL READ_FAT_TABLE CALL READ_FAT_TABLE
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
CALL R_CLUST CALL R_CLUST
XOR A XOR A
RET RET
;!TODO detect fat type by clusters! ;!TODO detect fat type by clusters!
.IBM_DOS: .IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE) CP #F0
CP #F0 JR C,DOS_X_Error.UnknownBPB
JR C,DOS_X_Error.UnknownBPB ; ID ram-¤¨áª  - #FA
; ID ram-¤¨áª  - #FA CP #F8 ; !FIXIT fat. ­¥ ®¡ï§ â¥«ì­® ¥á«¨ ¢¨­â, â® ­¥ FAT12
CP #F8 ; !FIXIT fat. ­¥ ®¡ï§ â¥«ì­® ¥á«¨ ¢¨­â, â® ­¥ FAT12 LD A,'2'
LD A,'2' LD HL,#0FFF
LD HL,#0FFF JP NZ,.BPB_FAT
JP NZ,.BPB_FAT ;
; LD A,'6'
LD A,'6' LD H,L
LD H,L JP .BPB_FAT
JP .BPB_FAT ;
;
DOS_X_Error: DOS_X_Error:
.UnknownBPB: .UnknownBPB: LD A,DSS_Error.sys.UNKNOWN_FORMAT
LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF
SCF RET
RET ;
.Not_ready: .Not_ready: LD A,DSS_Error.sys.NOT_READY
LD A,DSS_Error.sys.NOT_READY ; CF = 1
; CF = 1 RET
RET
; ;
; ;
;!TODO ª ¡ãä¥à ¬! ;!TODO ª ¡ãä¥à ¬!
FatBuffer: FatBuffer:
.MSG: DB 'FAT' ;.MSG: DB 'FAT'
.DRIVE: DB #FF .DRIVE: DB #FF
.FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32
.CacheBlock: DW #00 .CacheBlock: DW #00
@ -885,16 +896,21 @@ FatBuffer:
.FAT2_SEC_H: DW #0000 ; [ ] fat32 .FAT2_SEC_H: DW #0000 ; [ ] fat32
.SectorsPerFAT_L DW #0000 .SectorsPerFAT_L DW #0000
.SectorsPerFAT_H DB #00 .SectorsPerFAT_H DB #00
.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï
.RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR .RootDirFirstSector_L: DW #0000 ; MSD_CAT_SEC first sector DIR
.RootDirFirstSector_H: DW #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï
.DirSizeInSectors: DB #00 ; DIR_SEC_SIZE .DirSizeInSectors: DB #00 ; DIR_SEC_SIZE
.FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low .FirstDataSector_L: DW #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 ¡ë«® ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  .FirstDataSector_H: DW #0000 ; MSD_DAT_SEC high ; [ ] fat32 ¡ë«® ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£ 
.BytesPerCluster: DW #0000 ; CLUSTER_LEN .BytesPerCluster: DW #0000 ; CLUSTER_LEN
.ENDCLUS_LOW: DW #FFFF .END_CHAIN_CLUSTER_L: DW #FFFF
.ENDCLUS_HIGH: DW #0FFF ; [ ] fat3 .END_CHAIN_CLUSTER_H: DW #0FFF ; [ ] fat3
.MaxClusterLow: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterLow: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterHigh: DW #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;
.BytesPerSector DW #0000
.SectorsPerCluster DB #00
.BPB_SERIAL_NUMBER DW 0,0
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
IF COMPILE_UNUSED_CODE IF COMPILE_UNUSED_CODE
.FilesPerSector: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥ .FilesPerSector: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
.ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï? .ClustersPerBank: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?

View File

@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
; .Custom: ; .Custom:
; HL':HL ¨ DE':DE â ª¨¥ ¦¥ ª ª ¨ ­  ¢å®¤¥ ; HL':HL ¨ DE':DE â ª¨¥ ¦¥ ª ª ¨ ­  ¢å®¤¥
;------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------
WRITE_TO_FAT: LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à  WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ­®¬¥à ª« áâ¥à 
EXX EXX
LD DE,(FatBuffer.ENDCLUS_HIGH) ; ­®¬¥à ª« áâ¥à  LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; ­®¬¥à ª« áâ¥à 
EXX EXX
.Custom: PUSH DE .Custom: PUSH DE
EXX EXX

View File

@ -111,6 +111,7 @@
;Input: C = #08 ;Input: C = #08
; B = Subcommand ; B = Subcommand
; DE = #55AA Magic Number ; DE = #55AA Magic Number
; A = Drive
; ;
;Subcommands: #00 - Get Device Parameters ;Subcommands: #00 - Get Device Parameters
; #01 - Read track ; #01 - Read track

View File

@ -75,12 +75,12 @@
; ;
STRUCT _sBuffers STRUCT _sBuffers
.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ;
.BootSector _sBOOT_SECTOR_PARAMS ; 62 bytes ;!TODO ¯¥à¥­¥á⨠¢ ®¡« áâì ¡ãä¥à®¢ .BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32
.EXE_Header _sEXE_HEADER ; 512 bytes .EXE_Header _sEXE_HEADER ; 512 bytes
.Stack _sStack ; 256 bytes .Stack _sStack ; 256 bytes
.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF .Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF
.MemoryTable BLOCK 256,0 ; 256 bytes .MemoryTable BLOCK 256,0 ; 256 bytes
ENDS ENDS
; ;

View File

@ -1 +1 @@
949 952

View File

@ -36,9 +36,9 @@ SERVICE_SECTORS:
.FAT32.Low EQU #FFEF .FAT32.Low EQU #FFEF
FAT_TYPE: FAT_TYPE:
.x32 EQU 32 .x32 EQU #32
.x16 EQU 16 .x16 EQU #16
.x12 EQU 12 .x12 EQU #12
; define _bit (1<?((FAT_CACHE.Sectors-1) ; define _bit (1<?((FAT_CACHE.Sectors-1)
; define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128)) ; define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128))