many bugfixes

This commit is contained in:
Anatoliy Belyanskiy 2024-04-19 03:39:02 +10:00
parent 453d3d6b68
commit beb5dd8196
15 changed files with 553 additions and 444 deletions

View File

@ -380,12 +380,16 @@ write_to_: ld a,(disk) ;
; ;
ret ret
write_to_hard_disk: write_to_hard_disk:
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
CALL write_to_ CALL write_to_
RET C RET C
; ¯à®¢¥àª  ­  <20>€Œ-¤¨áª
LD A,B
CP #80-1 ;!HARDCODE HDD number
CCF
RET NC
; ;
PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
LD A,B
LD HL,0 LD HL,0
LD IX,0 LD IX,0
LD DE,buffer LD DE,buffer
@ -414,6 +418,26 @@ write_to_hard_disk:
; ;
LD A,#80 LD A,#80
LD (HL),A LD (HL),A
;!FIXIT fat32 not supported
PUSH HL
INC HL
INC HL
INC HL
INC HL
LD A,(HL)
POP HL
CP PartitionSysTypes.FAT12
JR Z,.next
CP PartitionSysTypes.FAT16_32Mb
JR Z,.next
CP PartitionSysTypes.FAT16
JR Z,.next
CP PartitionSysTypes.FAT16_LBA
JR Z,.next
; NOT SUPPORTED FS
POP BC
SCF
RET
; ;
.next: AND A .next: AND A
SBC HL,DE SBC HL,DE

View File

@ -355,11 +355,11 @@ _TST_PROC: CALL GETMEM
; ;
; ;
LD HL,(CMDLINE) LD HL,(CMDLINE)
LD DE,CORE_BUFFERS.SECBUF+1 LD DE,CORE_BUFFERS.SECTOR_BUFFER+1
CALL SCOPYS CALL SCOPYS
LD A,#80 ;!HARDCODE cmd line size LD A,#80 ;!HARDCODE cmd line size
SUB B SUB B
LD (CORE_BUFFERS.SECBUF),A LD (CORE_BUFFERS.SECTOR_BUFFER),A
;R02 ;R02
LD SP,CORE_BUFFERS.EXEBUFF+510 ;‚áâ ¢«ï¥âáï ¢ SHARED_PAGE LD SP,CORE_BUFFERS.EXEBUFF+510 ;‚áâ ¢«ï¥âáï ¢ SHARED_PAGE
; ;
@ -441,7 +441,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR)
EX DE,HL EX DE,HL
LD XH,D LD XH,D
LD XL,E LD XL,E
LD HL,CORE_BUFFERS.SECBUF LD HL,CORE_BUFFERS.SECTOR_BUFFER
LD C,(HL) LD C,(HL)
INC C INC C
LDIR LDIR
@ -588,7 +588,8 @@ WAIT: LD A,(ErrorLevel)
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
FREE_PROCESS_MEMORY: FREE_PROCESS_MEMORY:
LD HL,MEMTAB ;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
LD BC,256 ;!HARDCODE à §¬¥à ¡«®ª  áâà ­¨æ އ“ LD BC,256 ;!HARDCODE à §¬¥à ¡«®ª  áâà ­¨æ އ“
.loop: LD A,(TASK) .loop: LD A,(TASK)
CPIR CPIR
@ -597,7 +598,8 @@ FREE_PROCESS_MEMORY:
PUSH BC PUSH BC
DEC HL DEC HL
AND A AND A
LD DE,MEMTAB ;LD DE,MEMTAB
LD DE,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
SBC HL,DE SBC HL,DE
LD A,L LD A,L
CALL RETMEM ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠CALL RETMEM ; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨

View File

@ -11,7 +11,8 @@ GETMEM: LD C,BIOS.GetMem
LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY LD A,DSS_Error.sys.NOT_ENOUGH_MEMORY
RET C RET C
LD D,#00 LD D,#00
LD HL,MEMTAB ; <20><><EFBFBD>ᨢ ᯨ᪠ <20><EFBFBD>. <20><><EFBFBD><E0A0AD> ;LD HL,MEMTAB ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
ADD HL,DE ADD HL,DE
LD A,(TASK) ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë LD A,(TASK) ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
LD (HL),A LD (HL),A

View File

@ -99,7 +99,7 @@ MKDIR:
; ;
; á®§¤ ñ¬ á«ã¦¥¡­ë¥ ª â «®£¨ "." ¨ ".." ¢ á®§¤ ­­®¬ ª â «®£¥ ; á®§¤ ñ¬ á«ã¦¥¡­ë¥ ª â «®£¨ "." ¨ ".." ¢ á®§¤ ­­®¬ ª â «®£¥
; Š€’€‹Žƒ "." ; Š€’€‹Žƒ "."
LD HL,CORE_BUFFERS.SECBUF ; ¡ãä¥à LD HL,CORE_BUFFERS.SECTOR_BUFFER ; ¡ãä¥à
LD (HL),"." ; § ¯¨áì ⥪. ª â «®£  LD (HL),"." ; § ¯¨áì ⥪. ª â «®£ 
LD BC,10*256 + ' ' ; !HARDCODE b=áç¥â稪, c=¯à®¡¥« LD BC,10*256 + ' ' ; !HARDCODE b=áç¥â稪, c=¯à®¡¥«
; ;
@ -162,26 +162,29 @@ MKDIR:
.MKD12: PUSH AF .MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤ PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à  PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
; ;
LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; IN A,(SLOT3)
LD DE,CORE_BUFFERS.SECBUF+#C000 ; PUSH AF
LD BC,1*256 + Dss.DRV.Write ; IN A,(SLOT0)
RST ToDSS.DRV ; OUT (SLOT3),A
; ;
; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000
; LD BC,1*256 + Dss.DRV.Write
; RST ToDSS.DRV
; ;
; POP AF
; OUT (SLOT3),A
CALL WRITE_SECTOR
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
; ;
POP AF LD HL,CORE_BUFFERS.SECTOR_BUFFER
OUT (SLOT3),A
;
LD HL,CORE_BUFFERS.SECBUF
; [x] optimization ; [x] optimization
LD A,(HL) LD A,(HL)
OR A OR A
JR Z,.skip_clean JR Z,.skip_clean
; ;
LD DE,CORE_BUFFERS.SECBUF+1 LD DE,CORE_BUFFERS.SECTOR_BUFFER+1
LD BC,511 ;!HARDCODE sector size LD BC,511 ;!HARDCODE sector size
LD (HL),0 LD (HL),0
LDIR LDIR

View File

@ -6,7 +6,8 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
RETMEM: LD E,A RETMEM: LD E,A
LD D,#00 LD D,#00
LD HL,MEMTAB ; <20><><EFBFBD>ᨢ ᯨ᪠ <20><EFBFBD>. <20><><EFBFBD><E0A0AD> ;LD HL,MEMTAB ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
ADD HL,DE ADD HL,DE
LD A,(TASK) ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë LD A,(TASK) ; ã஢¥­ì ⥪ã饩 ¯à®£à ¬¬ë
CP (HL) CP (HL)
@ -20,7 +21,8 @@ RETMEM: LD E,A
;POP DE ;POP DE
LD A,DSS_Error.sys.INVALID_MEMORY_HND LD A,DSS_Error.sys.INVALID_MEMORY_HND
RET C RET C
LD HL,MEMTAB ;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable
ADD HL,DE ADD HL,DE
XOR A XOR A
LD (HL),A LD (HL),A

View File

@ -53,32 +53,33 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
LD B,A LD B,A
LD C,Dss.DRV.Read
; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­® ; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
.read_dir_loop: ;PUSH AF .read_dir_loop: ;PUSH AF
PUSH BC PUSH BC
PUSH HL PUSH HL
PUSH IX PUSH IX
; ;
IN A,(SLOT3) ; IN A,(SLOT3)
PUSH AF ; PUSH AF
IN A,(SLOT0) ; IN A,(SLOT0)
OUT (SLOT3),A ; OUT (SLOT3),A
LD DE,CORE_BUFFERS.SECBUF+#C000 ; ;
; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000
; LD BC,1*256 + Dss.DRV.Read ; LD BC,1*256 + Dss.DRV.Read
LD B,1 ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; RST ToDSS.DRV
RST ToDSS.DRV ; POP AF
POP AF ; OUT (SLOT3),A
OUT (SLOT3),A CALL READ_SECTOR
; !FIXIT ­¥â ¯à®¢¥àª¨ ­  ®è¨¡ªã
; ;
;!HARDCODE 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à  ;!HARDCODE 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à 
LD B,16 LD B,16
LD HL,CORE_BUFFERS.SECBUF LD HL,CORE_BUFFERS.SECTOR_BUFFER
.check_dir_loop: .check_dir_loop:
LD A,(HL) LD A,(HL)
OR A OR A
JP Z,.RMD15 ;DIR EMPTY JP Z,.dir_empty
CP "." CP "."
JR Z,.next_record JR Z,.next_record
CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©«  CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©« 
@ -120,7 +121,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
.delete: POP IX .delete: POP IX
JP DEL_FN.DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï" JP DEL_FN.DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
; ;
.RMD15: POP HL .dir_empty: POP HL
POP HL POP HL
POP HL POP HL
POP HL POP HL

View File

@ -7,7 +7,8 @@
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
SETMEM: LD E,A SETMEM: LD E,A
LD D,#00 LD D,#00
LD HL,MEMTAB ;LD HL,MEMTAB
LD HL,CORE_BUFFERS.MemoryTable ; ¬ áᨢ ᯨ᪠ ¢ë¤¥«. áâà ­¨æ
ADD HL,DE ADD HL,DE
LD A,(TASK) LD A,(TASK)
CP (HL) CP (HL)

View File

@ -290,7 +290,7 @@ CLEAR_BUFFER_AND_INIT_PROC:
; DS $/256+1*256-$,0 c:\bin\menu ; DS $/256+1*256-$,0 c:\bin\menu
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
MEMTAB: BLOCK 256,0 ;MEMTAB: BLOCK 256,0
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
_mInfoALIGN 256,0 _mInfoALIGN 256,0
@ -415,17 +415,32 @@ FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer
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
SECBUF EQU BUFFER ;!TODO ®â¤¥«¨âì SECBUF ®â BUFFER SECTOR_BUFFER EQU BUFFER ;!TODO ®â¤¥«¨âì SECTOR_BUFFER ®â BUFFER
MemoryTable EQU BUFFERSplace.MemoryTable
ENDMODULE ENDMODULE
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 ", /H, CORE_BUFFERS.BUFFERSplace DISPLAY "CLEAR_ZONE.start ", /H, CLEAR_ZONE.start
DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "Consist: "
DISPLAY " FM_BUF ", /H, CORE_BUFFERS.FM_BUF
DISPLAY " FM_BUF.Size: ", /H, CORE_BUFFERS.FM_BUF.Size
DISPLAY " FM_BUF.FullSize ", /H, CORE_BUFFERS.FM_BUF.FullSize
DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer DISPLAY " FatBuffer ", /H, CORE_BUFFERS.FatBuffer
DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer DISPLAY " FatBuffer.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer
DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY " EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF
DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY " Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF
DISPLAY " XSTACK ", /H, CORE_BUFFERS.XSTACK
DISPLAY " Size ", /H, CORE_BUFFERS.BUFFER - CORE_BUFFERS.XSTACK
DISPLAY " BUFFER ", /H, CORE_BUFFERS.BUFFER
DISPLAY " Size ", /H, CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFER
DISPLAY " MemoryTable ", /H, CORE_BUFFERS.MemoryTable
DISPLAY " Size ", /H, _sBuffers - (CORE_BUFFERS.MemoryTable - CORE_BUFFERS.BUFFERSplace)
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "CLEAR_ZONE.End ", /H, CLEAR_ZONE.start + CLEAR_ZONE.size
DISPLAY "--- --- --- --- --- --- --- ---" DISPLAY "--- --- --- --- --- --- --- ---"
EXPORT CORE_BUFFERS.BUFFERSplace EXPORT CORE_BUFFERS.BUFFERSplace
@ -434,8 +449,8 @@ CLEAR_ZONE.size EQU _sBuffers
EXPORT CORE_BUFFERS.EXEBUFF EXPORT CORE_BUFFERS.EXEBUFF
EXPORT CORE_BUFFERS.XSTACK EXPORT CORE_BUFFERS.XSTACK
EXPORT CORE_BUFFERS.BUFFER EXPORT CORE_BUFFERS.BUFFER
EXPORT CORE_BUFFERS.SECBUF EXPORT CORE_BUFFERS.SECTOR_BUFFER
EXPORT CORE_BUFFERS.MemoryTable
/* /*
;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;R11 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FM_BUF _sFM=$ FM_BUF _sFM=$
@ -464,16 +479,10 @@ EXEBUFF _sEXE_HEADER=$+FM_BUF.FullSize
XSTACK EQU EXEBUFF+_sEXE_HEADER+255 XSTACK EQU EXEBUFF+_sEXE_HEADER+255
BUFFER EQU XSTACK+1 BUFFER EQU XSTACK+1
SECBUF EQU BUFFER SECTOR_BUFFER EQU BUFFER
;R11 //////////////////////////////// ;R11 ////////////////////////////////
*/ */
DISPLAY "FM_BUF addr: ",/H,CORE_BUFFERS.FM_BUF
DISPLAY "FM_BUF.Size: ",/H,CORE_BUFFERS.FM_BUF.Size
DISPLAY "FM_BUF.FullSize: ",/H,CORE_BUFFERS.FM_BUF.FullSize
DISPLAY "EXEBUFF: ",/H,CORE_BUFFERS.EXEBUFF
DISPLAY "XSTACK: ",/H,CORE_BUFFERS.XSTACK
DISPLAY "BUFFER: ",/H,CORE_BUFFERS.BUFFER
;
; ;
;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < < ;> > > > > > > > > > > > > > > > BUFFERS < < < < < < < < < < < < < < < <
; ;
@ -634,7 +643,7 @@ BIN_END_ADDRESS EQU $
;R06 ;R06
;R06 BUFFER ;R06 BUFFER
;R06 SECBUF DB ". ",#10 ;R06 SECTOR_BUFFER DB ". ",#10
;R06 DW 0,0,0,0,0 ;R06 DW 0,0,0,0,0
;R06 DW #0000 ;R06 DW #0000
;R06 DW #0000 ;R06 DW #0000

View File

@ -10,10 +10,65 @@
;--------------------------------------------------------------- ;---------------------------------------------------------------
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; á¡à á뢠¥â §­ ç¥­¨ï ᢮¡®¤­ëå ¨ ¯¥à¢®£® ᢮¡®¤­®£® ᥪâ®à®¢ ­  "­¥®¯à¥¤¥«¥­®"
RESET_FSInfo: LD A,(CORE_BUFFERS.FatBuffer.RESET_FSINFO)
OR A
RET Z
;
CALL READ_FSinfo
;
LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT
LD B,8 ; 2 x DWORD
LD A,#FF
;
.fsinfo_loop: LD (HL),A
INC HL
DJNZ .fsinfo_loop
;
XOR A
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A
JR WRITE_FSinfo
; ;
; <20>à®ç¨â âì BPB ¢ SECTOR_BUFFER
READ_BPB: LD C,Dss.DRV.GetBPB
JR RW_SECTOR
;
; ‡ ¯¨á âì FSinfo ¨§ SECTOR_BUFFER
WRITE_FSinfo: LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector)
LD HL,0
; ‡ ¯¨á âì ᥪâ®à ¨§ SECTOR_BUFFER
; ‚室: HL:IX = Logical Block (sector)
WRITE_SECTOR: LD BC,1*256 + Dss.DRV.Write
JR RW_SECTOR
;
; <20>à®ç¨â âì FSinfo ¢ SECTOR_BUFFER
READ_FSinfo:
LD IX,(CORE_BUFFERS.FatBuffer.FSINFO_Sector)
LD HL,0
; <20>à®ç¨â âì ᥪâ®à ¢ SECTOR_BUFFER
; ‚室: HL:IX = Logical Block (sector)
READ_SECTOR: LD BC,1*256 + Dss.DRV.Read
;
RW_SECTOR: IN A,(SLOT3)
PUSH AF
IN A,(SLOT0)
OUT (SLOT3),A
;
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000
RST ToDSS.DRV
EX AF,AF'
;
POP AF
OUT (SLOT3),A
EX AF,AF'
RET
;
; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN ; [ ] 㤠«¥­¨¥ § ¯¨á¨ LFN
; ;
; ¢å®¤: IX = ⥪ãé ï § ¯¨áì ¢ áâà ­¨æ¥ á ª â «®£®¬ FAT ; ¢å®¤: IX = ⥪ãé ï § ¯¨áì ¢ áâà ­¨æ¥ á ª â «®£®¬ FAT ¤«ï ª®â®à®©
; ¤«ï ª®â®à®© ­ ¤® 㤠«¨âì § ¯¨á¨ LFS ; ­ ¤® 㤠«¨âì § ¯¨á¨ LFS
DELETE_LFN_RECORDS: DELETE_LFN_RECORDS:
PUSH IX PUSH IX
LD A,XH LD A,XH
@ -40,7 +95,6 @@ DELETE_LFN_RECORDS:
.beyond_boundaries: ; !TODO ¯®¤£à㧪  ¤à㣮© ç á⨠ª â «®£ . ¯®ª  § £«ã誠 .beyond_boundaries: ; !TODO ¯®¤£à㧪  ¤à㣮© ç á⨠ª â «®£ . ¯®ª  § £«ã誠
POP IX POP IX
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
@ -360,10 +414,10 @@ FINDDIR:
CHECK_ROOT_CLUSTER: CHECK_ROOT_CLUSTER:
EX DE,HL EX DE,HL
LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005 LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L) ;R005
LD A,L LD A,L
OR H OR H
LD HL,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H) LD HL,(CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H)
OR L OR L
OR H OR H
EX DE,HL EX DE,HL
@ -372,22 +426,14 @@ CHECK_ROOT_CLUSTER:
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨ ; ¢å®¤: HL - ¨¬ï ¤¨à¥ªâ®à¨¨
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
; !FIXIT «®¢¨âáï ¤¢®©­®¥ ®¡à é¥­¨¥ ¯à¨ ®âªàë⨨ ª®à­ï ¤¨áª , ­ ¯à¨¬¥à
OPENDIR: LD IY,CORE_BUFFERS.FM_BUF OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
LD A,(HL) LD A,(HL)
OR A OR A
JR NZ,.SUBDIR JR NZ,.SUBDIR
.REROOT: ; fat32 ;
; EX DE,HL .REROOT: LD DE,0
; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),DE
; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),DE
; LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
; LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL
; EX DE,HL
LD DE,0
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),DE
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),DE
CALL LOADDIR CALL LOADDIR
; CF=0 ; CF=0
LD HL,WorkDirectory LD HL,WorkDirectory
@ -430,13 +476,12 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
.SUBDIR3: CALL FINDDIR .SUBDIR3: CALL FINDDIR
RET C RET C
EX DE,HL EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; fat32 LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL ; fat32
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),IY ; fat32 LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),IY ; fat32
LD HL,#4000 ;!HARDCODE LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL LD (CORE_BUFFERS.FM_BUF.FS_REC.F_SIZE),HL
;EX DE,HL ;-------------; EX DE,HL
; JP LOADDIR ; JP LOADDIR
;--------------;
; <20>à®ç¨â âì ᯨ᮪ ª â «®£  ; <20>à®ç¨â âì ᯨ᮪ ª â «®£ 
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
LOADDIR: ;!TODO optimize LOADDIR: ;!TODO optimize
@ -449,14 +494,9 @@ LOADDIR: ;!TODO optimize
JR NZ,.LoadRootDir JR NZ,.LoadRootDir
; fat32 ; fat32
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
; CALL .read_dir
; LD HL,0
; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
; LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
; RET
; ;
.read_dir: LD HL,DIRPAGE.buffer ; ªã¤  .read_dir: LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,#4000 ; ᪮«ìª® LD DE,#4000 ; ᪮«ìª®
@ -467,7 +507,7 @@ LOADDIR: ;!TODO optimize
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ;
.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤ .LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO ¢®§¬®¦­®, 墠â¨â LD HL,0
LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à  LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£  LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£ 
@ -522,9 +562,9 @@ SAVEDIR: ;!TODO optimize
JR NZ,.SaveRootDir JR NZ,.SaveRootDir
; fat32 ; fat32
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL LD (CORE_BUFFERS.FM_BUF.FS_REC.FIRST_CLUSTER_H),HL
; ;
.save_dir: LD HL,DIRPAGE.buffer .save_dir: LD HL,DIRPAGE.buffer
; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory ; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
@ -537,7 +577,7 @@ SAVEDIR: ;!TODO optimize
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ;
.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) .SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ;!TODO ¢®§¬®¦­®, 墠â¨â LD HL,0
LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L)
LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors
@ -611,60 +651,44 @@ WRT_HND: SET_PAGE_X DIRPAGE
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ­¥ ¨á¯®«ì§ã¥âáï ; [x] fat32 ;!TEST
; TESTDSK: ;????? ¢®§¬®¦­®, çâ® âãâ «®£¨ç­¥¥, 祬 ¢ ­ ç «¥ OPENDSK, ¥á«¨ ¡ã¤¥â à ¡®â âì Dss.DRV.Open RD_BPB: ; LD C,SLOT3
; IN B,(C)
; PUSH BC
; IN A,(SLOT0)
; OUT (SLOT3),A
; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD C,Dss.DRV.MediaCheck ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08
; LD C,Dss.DRV.GetBPB
; RST ToDSS.DRV ; RST ToDSS.DRV
; OR A ; POP BC
; RET Z ; OUT (C),B
CALL READ_BPB
; ॣ. A - ­®¬¥à ¤¨áª 
; [ ] fat32
RD_BPB: LD C,SLOT3
IN B,(C)
PUSH BC
IN A,(SLOT0)
OUT (SLOT3),A
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08
LD C,Dss.DRV.GetBPB
RST ToDSS.DRV
POP BC
OUT (C),B
JP C,DOS_X_Error.Not_ready JP C,DOS_X_Error.Not_ready
; ;
LD DE,#AA55 ; ᨣ­ âãà  ;R05 LD DE,#AA55 ; ᨣ­ âãà  ;R05
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
;R05 ;R05
AND A AND A
SBC HL,DE SBC HL,DE
JP NZ,DOS_X_Error.UnknownBPB JP NZ,DOS_X_Error.UnknownBPB
; ;
; ;R08 ; [x] fat32 ; ;R08 ; [x] fat32
; LD HL,CORE_BUFFERS.SECBUF ; LD HL,CORE_BUFFERS.SECTOR_BUFFER
; LD DE,CORE_BUFFERS.BootSector ; LD DE,CORE_BUFFERS.BootSector
; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size
; LDIR ; LDIR
; ;
LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE) LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.DRIVE_TYPE)
CP #F0 CP #F0
JP C,DOS_X_Error.UnknownBPB JP C,DOS_X_Error.UnknownBPB
; ;
;!TODO ¯à®¢¥à¨âì ¯® ¬¥âª¥ à §¤¥« , çâ® íâ® FAT, ¯®â®¬ ®¯à¥¤¥«ïâì ª ª®© FAT LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BytesPerSector)
;
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BytesPerSector)
LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL
LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerCluster) LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerCluster)
LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A
; calc. first sector FAT ; calc. first sector FAT
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
;
; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec
; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1)
; ADD HL,DE
;
;!FIXIT ¤«ï fat32 ¢â몠âì á ᥪâ®à   ªâ¨¢­®© â ¡«¨æë ;!FIXIT ¤«ï fat32 ¢â몠âì á ᥪâ®à   ªâ¨¢­®© â ¡«¨æë
LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2
@ -675,22 +699,21 @@ RD_BPB: LD C,SLOT3
LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables ;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
;LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables
LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32
; ;
; ;
LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT16) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
LD A,E LD A,E
OR D OR D
JR NZ,.skip_high JR NZ,.skip_high
; ;
LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32 + 2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2)
LD A,C LD A,C
LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A
LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerFAT32) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT32)
.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE .skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE
; ;
LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) ; amount FATs LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs
CP 1 CP 1
JR Z,.one_FAT JR Z,.one_FAT
DEC A DEC A
@ -727,7 +750,7 @@ RD_BPB: LD C,SLOT3
ENDIF ENDIF
; ;
EX DE,HL EX DE,HL
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32
; [ ]fat32 ;!TEST ; [ ]fat32 ;!TEST
LD A,H LD A,H
OR L OR L
@ -762,64 +785,21 @@ RD_BPB: LD C,SLOT3
JP NC,.loop3 JP NC,.loop3
.loop3.end: ; .loop3.end: ;
LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL
;
IF COMPILE_UNUSED_CODE
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 (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
ENDIF
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
; LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
; LD DE,FAT_STRING
; 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'
; JP Z,.fat1x
; CP '3'
; JP NZ,DOS_X_Error.UnknownBPB
; LD A,#52 ; #52-#20 = #32 fat type
; LD HL,#0FFF
; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL
; LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT
; 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 #20 ; A-#20 = fat type (#12, #16, #32)
; LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A
; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL
;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨¥ ¢ëç¨á«ï¥¬®¥ ¨ á®å࠭塞®¥ ¢ FatBuffer
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;!TODO ­¥ ¨á¯®«ì§ã¥âáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer
; 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 (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
;
; LD HL,0 ; LD HL,0
; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track ; LD BC,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track
; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS) ; LD A,(CORE_BUFFERS.SECTOR_BUFFER + _sBOOT_SECTOR_PARAMS.HEADS)
;.BPB_L1: ; calc. sector per cylinder ;.BPB_L1: ; calc. sector per cylinder
; ADD HL,BC ; ADD HL,BC
; DEC A ; DEC A
@ -827,14 +807,14 @@ RD_BPB: LD C,SLOT3
; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL ; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; [ ] fat32 ; [ ] fat32
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.SectorsPerDrive) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerDrive)
LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L)
LD A,H LD A,H
OR L OR L
JP NZ,.HDDSMAL JP NZ,.HDDSMAL
; ;
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L)
LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H)
PUSH BC ; Total Sectors high PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low PUSH HL ; Total Sectors low
AND A AND A
@ -862,7 +842,11 @@ RD_BPB: LD C,SLOT3
; ;
.loop7_exit: INC HL .loop7_exit: INC HL
LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL
LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC LD A,L
OR H
JR NZ,.no_inc_bc
INC BC
.no_inc_bc: LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC
; ;
XOR A XOR A
LD H,A LD H,A
@ -876,7 +860,7 @@ RD_BPB: LD C,SLOT3
LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L)
; DE:HL = SectorsPerFAT ; DE:HL = SectorsPerFAT
; ;
LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.Number_of_FATs) LD A,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.Number_of_FATs)
LD B,A LD B,A
DEC A DEC A
JR Z,.loop_mul_end JR Z,.loop_mul_end
@ -894,7 +878,7 @@ RD_BPB: LD C,SLOT3
JR NC,.no_inc_DE JR NC,.no_inc_DE
INC DE INC DE
.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT .no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RESERVED_SECTORS) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
ADD HL,BC ADD HL,BC
JR NC,.no_inc_de JR NC,.no_inc_de
INC DE INC DE
@ -929,40 +913,45 @@ RD_BPB: LD C,SLOT3
; It's FAT16 ; It's FAT16
LD HL,#FFFF LD HL,#FFFF
LD A,FAT_TYPE.x16 LD A,FAT_TYPE.x16
.Set_SN: EXX .set_vars: EXX
LD HL,0 LD HL,0
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL
LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.LABEL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),HL
LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.LABEL
EXX EXX
LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER)
LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2)
JR .BPB_FAT JR .SET_VARS
; ;
.its_FAT12: LD HL,#0FFF .its_FAT12: LD HL,#0FFF
LD A,FAT_TYPE.x12 LD A,FAT_TYPE.x12
JR .Set_SN JR .set_vars
; ;
.its_FAT32: EXX .its_FAT32: EXX
LD HL,CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.LABEL LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL
EXX EXX
; ;
LD HL,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL
LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.RootDirStartCluster+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC
CALL ClusterToSector CALL ClusterToSector
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC
; ;
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector)
LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL
;
LD A,FAT_TYPE.x32 LD A,FAT_TYPE.x32
LD HL,#0FFF LD HL,#0FFF
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL
LD H,L LD H,L
LD DE,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER)
LD BC,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2)
; ;
.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A .SET_VARS: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL
LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),DE
LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),BC
@ -970,32 +959,98 @@ RD_BPB: LD C,SLOT3
LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL LD DE,CORE_BUFFERS.FatBuffer.BPB_LABEL
LD BC,11 ;!HARDCODE LD BC,11 ;!HARDCODE
LDIR LDIR
;
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
PUSH AF PUSH AF
LD DE,0 LD DE,0
CALL READ_FAT_TABLE CALL READ_FAT_TABLE
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
CALL R_CLUST ;
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR Z,.set_FSinfo
;
LD HL,#0001
LD (G_CLUST.low),HL
DEC L
LD (G_CLUST.high),HL
XOR A XOR A
RET RET
;!TODO detect fat type by clusters!
.IBM_DOS: LD A,(CORE_BUFFERS.SECBUF + BOOT_SECTOR.DRIVE_TYPE)
CP #F0
JR C,DOS_X_Error.UnknownBPB
; ID ram-¤¨áª  - #FA
CP #F8 ; !FIXIT fat. ­¥ ®¡ï§ â¥«ì­® ¥á«¨ ¢¨­â, â® ­¥ FAT12
LD A,'2'
LD HL,#0FFF
JP NZ,.BPB_FAT
; ;
LD A,'6' .set_FSinfo: ;
LD H,L IFN USE_FSINFO_FAT32
JP .BPB_FAT CALL READ_FSinfo
; !FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã
; ;
LD A,#FF
; ¯à®¢¥àª  ®¤­®© ¨§ á®â­¨ áà ­ëå ᨣ­ âãà
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE)
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2)
LD BC,#7272
SBC HL,BC
JR NZ,.error_sig
EX DE,HL
LD DE,#6141
SBC HL,DE
JR NZ,.error_sig
;
LD HL,CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT
LD B,8 ; 2 x DWORD
LD A,#FF
;
.fsinfo_loop: AND (HL)
INC HL
DJNZ .fsinfo_loop
;
.error_sig: XOR #FF
LD (CORE_BUFFERS.FatBuffer.RESET_FSINFO),A
;
XOR A
LD H,A
LD L,2
LD (G_CLUST.low),HL
LD L,H
LD (G_CLUST.high),HL
RET
ELSE
CALL READ_FSinfo
; !FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã
;
; ¯à®¢¥àª  ®¤­®© ¨§ á®â­¨ áà ­ëå ᨣ­ âãà
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE)
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2)
LD BC,#7272
SBC HL,BC
JR NZ,.error_sig
EX DE,HL
LD DE,#6141
SBC HL,DE
JR NZ,.error_sig
; !FIXIT ᤥ« âì ¯à®¢¥àªã ª« áâ¥à®¢ ­  ¢ «¨¤­®áâì (­¥ ¡®«ìè¥ ¬ ªá¨¬ «ì­®£® ¤«ï à §¤¥« )
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER)
LD (G_CLUST.low),HL
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2)
LD (G_CLUST.high),HL
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL
XOR A
RET
.error_sig: LD HL,#FFFF
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_L),HL
LD (CORE_BUFFERS.FatBuffer.FREE_CLUSTERS_COUNT_H),HL
XOR A
LD H,A
LD L,2
LD (G_CLUST.low),HL
LD L,H
LD (G_CLUST.high),HL
RET
ENDIF
;;;;;;;;
; --> BC:HL - Cluster ; --> BC:HL - Cluster
; <-- BC:HL - Sector ; <-- BC:HL - Sector

View File

@ -13,15 +13,6 @@
;RX01 10-02-1999 DNS UPGRADE FAT CASH ;RX01 10-02-1999 DNS UPGRADE FAT CASH
;--------------------------------------------------------------- ;---------------------------------------------------------------
; [x] fat32 ;!TEST
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
R_CLUST: LD HL,#0001
LD (G_CLUST.low),HL
DEC L
LD (G_CLUST.high),HL
RET
; ;
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢ ; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ;!TODO ¯à®¢¥à¨âì ¯¥à¥¡®à ª« áâ¥à®¢
@ -29,12 +20,14 @@ R_CLUST: LD HL,#0001
; HL' - áâ à訩 ­®¬¥à ᢮¡®¤­®£® ª« áâ¥à  ; HL' - áâ à訩 ­®¬¥à ᢮¡®¤­®£® ª« áâ¥à 
G_CLUST: ; G_CLUST: ;
.low+1: LD HL,#0001 .low+1: LD HL,#0001
EXX
.high+1: LD HL,#0000
EXX
.loop: INC HL ; ­®¬¥à ª« áâ¥à  .loop: INC HL ; ­®¬¥à ª« áâ¥à 
LD A,L LD A,L
OR H OR H
; [x] fat32 ; [x] fat32
EXX EXX
.high+1: LD HL,#0000
JR NZ,.no_inc JR NZ,.no_inc
INC HL INC HL
.no_inc: EXX .no_inc: EXX
@ -125,12 +118,11 @@ CHECK_CLUSTER_IS_SMALLER:
EX DE,HL EX DE,HL
EXX EXX
LD A,DSS_Error.sys.DISK_FULL LD A,DSS_Error.sys.DISK_FULL
;RET C RET C
RET NZ ; ¥á«¨ CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, â® ª« áâ¥à ª®à४â­ë© RET NZ
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à  ; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL .low: EX DE,HL
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
; CF = 0
SBC HL,DE SBC HL,DE
EX DE,HL EX DE,HL
LD A,DSS_Error.sys.DISK_FULL LD A,DSS_Error.sys.DISK_FULL
@ -246,6 +238,24 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
; ;
; [x] fat32 ;!TEST ; [x] fat32 ;!TEST
;
; !TODO optimize
; ¯à¨ § ¯¨á¨ ¢ ªíè §­ ç¥­¨ï ®â¬¥ç âì ç¥à¥§ OR ¢ ï祩ª¥ FatBuffer.SectorOfCacheBlock
; ¡¨â ᮮ⢥âáâ¢ãî騩 ªãáªã ¢ áâà ­¨æ¥ ªíè , ª®â®àë© ¡ë« ¨§¬¥­ñ­ ¨ ¯®â®¬ ᪨¤ë¢ âì ­  ¤¨áª
; ⮫쪮 ⥠ªã᪨, ª®â®àë¥ ¡ë«¨ ¨§¬¥­¥­ë.
; |--------------------|
; | bit | adresses |
; |-----|--------------|
; | 0 | #0000..#07FF |
; | 1 | #0800..#0FFF |
; | 2 | #1000..#17FF |
; | 3 | #1800..#1FFF |
; | 4 | #2000..#27FF |
; | 5 | #2800..#2FFF |
; | 6 | #3000..#37FF |
; | 7 | #3800..#3FFF |
; |--------------------|
;
;------------------------------------------------------------------------------------------------ ;------------------------------------------------------------------------------------------------
; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  ; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì ; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
@ -447,7 +457,10 @@ WRITE_FAT_TABLE:
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª ; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) .Start: LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
CALL Z,RESET_FSInfo
LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock)
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
CALL GET_SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT
; B=0, C:HL - ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ­ ç «® ¡«®ª  ; B=0, C:HL - ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ­ ç «® ¡«®ª 
@ -465,10 +478,9 @@ WRITE_FAT_TABLE:
.next: ADD HL,DE ;+ SIZE CASH (16 SECTORS) .next: ADD HL,DE ;+ SIZE CASH (16 SECTORS)
JR NC,.no_inc JR NC,.no_inc
INC C INC C
.no_inc: ; C:HL ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ª®­¥æ ¡«®ª 
; ;
; C:HL ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ª®­¥æ ¡«®ª  ; ª®­¥æ ¡«®ª  ¢ë室¨â §  ¯à¥¤¥«ë â ¡«¨æë?
;
.no_inc: ; ª®­¥æ ¡«®ª  ¢ë室¨â §  ¯à¥¤¥«ë â ¡«¨æë?
LD B,E ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè LD B,E ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H)
LD (.sub_A),A LD (.sub_A),A
@ -569,7 +581,7 @@ GET_FAT32_CELL:
LD H,A LD H,A
LD A,C LD A,C
; ;
LD B,FAT_CACHE.Degree_32 ; 4 ᤢ¨£  LD B,FAT_CACHE.Degree ; 4 ᤢ¨£ 
.loop_block: .loop_block:
RLCA ; << H RLCA ; << H
RL L ; << L' RL L ; << L'

View File

@ -281,7 +281,6 @@ DRVCLC: ; INC A
; .TBL_Entry EQU 16 ; .TBL_Entry EQU 16
; .Size EQU $-LOGDRV ; .Size EQU $-LOGDRV
;!TODO § ¬¥­¨âì PUSH ­  EXX?
SELHDD: PUSH DE SELHDD: PUSH DE
PUSH BC PUSH BC
PUSH HL PUSH HL
@ -519,10 +518,10 @@ CHECKH: PUSH IY
;------------------------------[ PARTIT ]------------------------------; ;------------------------------[ PARTIT ]------------------------------;
DEFINE_PARTITIONS: DEFINE_PARTITIONS:
.FAT32_DOS: .FAT32_DOS: ;
.EASYDOS: .EASYDOS: ;
.MEDIDOS: .MEDIDOS: ;
.HIGHDOS: .HIGHDOS: ;
LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0) LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2)
@ -559,8 +558,7 @@ DEFINE_PARTITIONS:
PUSH BC PUSH BC
LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
SUB B SUB B
.not_supported: .not_supported: LD (IX + LOGDRV.PARTITION_RECORD_NUM),A
LD (IX + LOGDRV.PARTITION_RECORD_NUM),A
; ;
;!TEST <09>®¤áâà å®¢ª  ®â ¯¥à¥¯®«­¥­¨ï â ¡«¨æë LOGDRV ;!TEST <09>®¤áâà å®¢ª  ®â ¯¥à¥¯®«­¥­¨ï â ¡«¨æë LOGDRV
LD A,(DRVCLC.count) LD A,(DRVCLC.count)
@ -576,8 +574,7 @@ DEFINE_PARTITIONS:
LD (OFFSECT),IX LD (OFFSECT),IX
JP .NextPartition JP .NextPartition
; ;
.NotExtended: .NotExtended: CP PartitionSysTypes.FAT16
CP PartitionSysTypes.FAT16
JR Z,.HIGHDOS JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA CP PartitionSysTypes.FAT16_LBA
JR Z,.HIGHDOS JR Z,.HIGHDOS
@ -634,13 +631,14 @@ DEFINE_PARTITIONS:
; ;
LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR
LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
.DOSAGA: .DOSAGA: PUSH BC
PUSH BC
LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID)
CP PartitionSysTypes.Extended CP PartitionSysTypes.Extended
JR Z,.SubLevel
CP PartitionSysTypes.Win_Ext_LBA
JR NZ,.NotExtended JR NZ,.NotExtended
.SubLevel: ;
PUSH IY .SubLevel: PUSH IY
LD DE,(CURRENT_SECTOR_L) LD DE,(CURRENT_SECTOR_L)
LD IX,(CURRENT_SECTOR_H) LD IX,(CURRENT_SECTOR_H)
PUSH DE PUSH DE
@ -662,15 +660,14 @@ DEFINE_PARTITIONS:
LD (CURRENT_SECTOR_H),IX LD (CURRENT_SECTOR_H),IX
CALL .LOAD_SECTOR CALL .LOAD_SECTOR
POP IY POP IY
.NextPartition: .NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
ADD IY,DE ADD IY,DE
POP BC POP BC
DJNZ .DOSAGA DJNZ .DOSAGA
AND A AND A
RET RET
.ParseExtended: ;
LD HL,(EXTDOSL) .ParseExtended: LD HL,(EXTDOSL)
LD DE,(EXTDOSH) LD DE,(EXTDOSH)
LD A,L LD A,L
OR H OR H
@ -680,23 +677,23 @@ DEFINE_PARTITIONS:
LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
JP NZ,.EXTDOS2 JP NZ,.ext_in_ext
LD (EXTDOSL),DE LD (EXTDOSL),DE
LD (EXTDOSH),HL LD (EXTDOSH),HL
LD IX,(EXTDOSH) PUSH DE
.EXTDOS2: JR .set_regs
LD IX,(EXTDOSL) ;
.ext_in_ext: LD IX,(EXTDOSL)
ADD IX,DE ADD IX,DE
PUSH IX
LD DE,(EXTDOSH) LD DE,(EXTDOSH)
ADC HL,DE ADC HL,DE
PUSH HL PUSH IX
.set_regs: PUSH HL
POP IX POP IX
POP DE POP DE
JP .LOOP JP .LOOP
; ;
.LOAD_SECTOR: .LOAD_SECTOR: PUSH IY
PUSH IY
LD IX,(CURRENT_SECTOR_L) LD IX,(CURRENT_SECTOR_L)
LD HL,(CURRENT_SECTOR_H) LD HL,(CURRENT_SECTOR_H)
LD DE,PARTITION_BUFFER LD DE,PARTITION_BUFFER

View File

@ -75,7 +75,6 @@
; ;
STRUCT _sFatBuffer STRUCT _sFatBuffer
;.MSG: BYTE 'FAT'
.DRIVE: BYTE #FF .DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 .FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32
.CacheBlock: WORD #0000 .CacheBlock: WORD #0000
@ -99,15 +98,18 @@
.END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3 .END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;
.BytesPerSector WORD #0000 .BytesPerSector WORD #0000
.SectorsPerCluster BYTE #00 .SectorsPerCluster BYTE #00
.FSINFO_Sector WORD #01
.BPB_SERIAL_NUMBER DWORD #00000000 .BPB_SERIAL_NUMBER DWORD #00000000
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS .BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
; IF COMPILE_UNUSED_CODE .RESET_FSINFO BYTE 0
; IF USE_FSINFO_FAT32
;.FREE_CLUSTERS_COUNT_L WORD #FFFF
;.FREE_CLUSTERS_COUNT_H WORD #FFFF
; ENDIF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥ ;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
; ENDIF
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï))) ;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
ENDS ENDS
@ -121,7 +123,7 @@
;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 ;.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 & SECTOR_BUFFER
.MemoryTable BLOCK 256,0 ; 256 bytes .MemoryTable BLOCK 256,0 ; 256 bytes
ENDS ENDS
; ;

View File

@ -1 +1 @@
952 954

View File

@ -27,7 +27,7 @@
;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥ ;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE _FAT32_ENABLE 1 ;!TODO ¯®ª  ­¥¤®¤¥« ­® DEFINE USE_FSINFO_FAT32 0 ; ­¥¤®¤¥« ­®. ­ã¦­® «¨?
SERVICE_SECTORS: SERVICE_SECTORS:
.FAT12 EQU #0FEF .FAT12 EQU #0FEF

@ -1 +1 @@
Subproject commit 73f764ccd1ab8de8dea7eef3b4f5cd27e2ea8dab Subproject commit 62170ee7bc7dabe6fd55b94e89826ca510a60097