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

@ -53,7 +53,7 @@ MKDIR:
EXX EXX
; ;
CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,MASKARE LD HL,MASKARE
LD DE,HANDBUF LD DE,HANDBUF
LD BC,11 LD BC,11
@ -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 BC,1*256 + Dss.DRV.Read ; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000
LD B,1 ; LD BC,1*256 + Dss.DRV.Read
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 "FatBuffer ", /H, CORE_BUFFERS.FatBuffer DISPLAY "CLEAR_ZONE.Size ", /H, CLEAR_ZONE.size
DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF DISPLAY "Consist: "
DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF 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.Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer
DISPLAY " EXEBUFF ", /H, 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
; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; IN B,(C)
; LD C,Dss.DRV.MediaCheck ; PUSH BC
; RST ToDSS.DRV ; IN A,(SLOT0)
; OR A ; OUT (SLOT3),A
; RET Z ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD DE,CORE_BUFFERS.SECTOR_BUFFER+#C000 ;R08
; LD C,Dss.DRV.GetBPB
; ॣ. A - ­®¬¥à ¤¨áª  ; RST ToDSS.DRV
; [ ] fat32 ; POP BC
RD_BPB: LD C,SLOT3 ; OUT (C),B
IN B,(C) CALL READ_BPB
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,79 +785,36 @@ 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
; JR NZ,.BPB_L1 ; JR NZ,.BPB_L1
; 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
@ -926,43 +910,48 @@ RD_BPB: LD C,SLOT3
SBC HL,BC SBC HL,BC
JR C,.its_FAT32 JR C,.its_FAT32
; ;
; 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
XOR A
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' ; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
LD H,L LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
JP .BPB_FAT 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
RET
;
.set_FSinfo: ;
IFN USE_FSINFO_FAT32
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,14 +20,16 @@ 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
; ;
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
@ -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,192 +518,190 @@ 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)
LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3)
LD IX,(CURRENT_SECTOR_L) LD IX,(CURRENT_SECTOR_L)
ADD IX,DE ADD IX,DE
LD DE,(CURRENT_SECTOR_H) LD DE,(CURRENT_SECTOR_H)
ADC HL,DE ADC HL,DE
LD D,XH LD D,XH
LD E,XL LD E,XL
;BPB SECTOR ;BPB SECTOR
LD IX,(OFFSECT) LD IX,(OFFSECT)
LD (IX + LOGDRV.SECTOR_OFFSET + 0),E LD (IX + LOGDRV.SECTOR_OFFSET + 0),E
LD (IX + LOGDRV.SECTOR_OFFSET + 1),D LD (IX + LOGDRV.SECTOR_OFFSET + 1),D
LD (IX + LOGDRV.SECTOR_OFFSET + 2),L LD (IX + LOGDRV.SECTOR_OFFSET + 2),L
LD (IX + LOGDRV.SECTOR_OFFSET + 3),H LD (IX + LOGDRV.SECTOR_OFFSET + 3),H
LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0) LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1) LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2) LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2)
LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3) LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3)
;SIZE DISK ;SIZE DISK
LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E
LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D
LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.ExtendedPartitionFlag+1: .ExtendedPartitionFlag+1:
LD A,0 LD A,0
OR A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï OR A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
LD A,#FF LD A,#FF
JR NZ,.not_supported ; ¥á«¨ à áè¨à¥­­ë© à §¤¥«, â® ®¡«®¬ JR NZ,.not_supported ; ¥á«¨ à áè¨à¥­­ë© à §¤¥«, â® ®¡«®¬
; ;
POP BC POP BC
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) INC A
INC A CP DSS_MAX_DRIVES_AMOUNT+1
CP DSS_MAX_DRIVES_AMOUNT+1 RET NC
RET NC LD (DRVCLC.count),A
LD (DRVCLC.count),A ;
; LD A,(DRV_NUM)
LD A,(DRV_NUM) LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A
LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM
LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE
ADD IX,DE LD (OFFSECT),IX
LD (OFFSECT),IX JP .NextPartition
JP .NextPartition ;
; .NotExtended: CP PartitionSysTypes.FAT16
.NotExtended: JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16 CP PartitionSysTypes.FAT16_LBA
JR Z,.HIGHDOS JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA CP PartitionSysTypes.FAT16_32Mb
JR Z,.HIGHDOS JR Z,.MEDIDOS
CP PartitionSysTypes.FAT16_32Mb CP PartitionSysTypes.FAT12
JR Z,.MEDIDOS JR Z,.EASYDOS
CP PartitionSysTypes.FAT12 ;[ ] fat32
JR Z,.EASYDOS CP PartitionSysTypes.FAT32
;[ ] fat32 JP Z,.FAT32_DOS
CP PartitionSysTypes.FAT32 CP PartitionSysTypes.FAT32_LBA
JP Z,.FAT32_DOS JP Z,.FAT32_DOS
CP PartitionSysTypes.FAT32_LBA ;
JP Z,.FAT32_DOS CP PartitionSysTypes.Win_Ext_LBA
; JR Z,.SubLevel
CP PartitionSysTypes.Win_Ext_LBA ;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¤¥â¥ªâ 
JR Z,.SubLevel ;OR A ;PartitionSysTypes.Empty
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¤¥â¥ªâ  ;JR NZ,NXTPART
;OR A ;PartitionSysTypes.Empty JR .NextPartition ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;JR NZ,NXTPART ;POP BC ; ¡ « ­á á⥪ 
JR .NextPartition ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ;RET
;POP BC ; ¡ « ­á á⥪  ;POP BC
;RET ;OR A
;POP BC ;RET Z
;OR A ;NODEFIN:
;RET Z ;SCF
;NODEFIN: ;RET
;SCF ;
;RET .BEGIN: IN A,(SLOT3)
; PUSH AF
.BEGIN: IN A,(SLOT3) LD A,SHARED_PAGE
PUSH AF OUT (SLOT3),A
LD A,SHARED_PAGE CALL .Start
OUT (SLOT3),A POP AF
CALL .Start OUT (SLOT3),A
POP AF RET
OUT (SLOT3),A .Start: LD IX,0
RET LD DE,0
.Start: LD IX,0 LD (EXTDOSL),DE ;R01
LD DE,0 LD (EXTDOSH),IX ;R01
LD (EXTDOSL),DE ;R01 ;
LD (EXTDOSH),IX ;R01 .LOOP: LD (CURRENT_SECTOR_L),DE
; LD (CURRENT_SECTOR_H),IX
.LOOP: LD (CURRENT_SECTOR_L),DE CALL .LOAD_SECTOR
LD (CURRENT_SECTOR_H),IX ;
CALL .LOAD_SECTOR LD HL,(PARTITION_BUFFER.MBR_SIGNATURE)
; LD DE,#AA55
LD HL,(PARTITION_BUFFER.MBR_SIGNATURE) AND A
LD DE,#AA55 SBC HL,DE
AND A ;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
SBC HL,DE ;JR NZ,NODEFIN
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢ SCF
;JR NZ,NODEFIN RET NZ
SCF ;
RET NZ 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 IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR .DOSAGA: PUSH BC
LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID)
.DOSAGA: CP PartitionSysTypes.Extended
PUSH BC JR Z,.SubLevel
LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID) CP PartitionSysTypes.Win_Ext_LBA
CP PartitionSysTypes.Extended JR NZ,.NotExtended
JR NZ,.NotExtended ;
.SubLevel: .SubLevel: PUSH IY
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 PUSH IX
PUSH IX ;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢ LD A,(.ExtendedPartitionFlag)
LD A,(.ExtendedPartitionFlag) INC A
INC A LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ;
; CALL .ParseExtended
CALL .ParseExtended ;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢ LD A,(.ExtendedPartitionFlag)
LD A,(.ExtendedPartitionFlag) DEC A
DEC A LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ;
; POP IX
POP IX POP DE
POP DE LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_L),DE LD (CURRENT_SECTOR_H),IX
LD (CURRENT_SECTOR_H),IX CALL .LOAD_SECTOR
CALL .LOAD_SECTOR POP IY
POP IY .NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
.NextPartition: ADD IY,DE
LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry POP BC
ADD IY,DE DJNZ .DOSAGA
POP BC AND A
DJNZ .DOSAGA RET
AND A ;
RET .ParseExtended: LD HL,(EXTDOSL)
.ParseExtended: LD DE,(EXTDOSH)
LD HL,(EXTDOSL) LD A,L
LD DE,(EXTDOSH) OR H
LD A,L OR E
OR H OR D
OR E LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0)
OR D LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0) LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1) LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) JP NZ,.ext_in_ext
LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) LD (EXTDOSL),DE
JP NZ,.EXTDOS2 LD (EXTDOSH),HL
LD (EXTDOSL),DE PUSH DE
LD (EXTDOSH),HL JR .set_regs
LD IX,(EXTDOSH) ;
.EXTDOS2: .ext_in_ext: LD IX,(EXTDOSL)
LD IX,(EXTDOSL) ADD IX,DE
ADD IX,DE LD DE,(EXTDOSH)
PUSH IX ADC HL,DE
LD DE,(EXTDOSH) PUSH IX
ADC HL,DE .set_regs: PUSH HL
PUSH HL POP IX
POP IX POP DE
POP DE JP .LOOP
JP .LOOP ;
; .LOAD_SECTOR: PUSH IY
.LOAD_SECTOR: LD IX,(CURRENT_SECTOR_L)
PUSH IY LD HL,(CURRENT_SECTOR_H)
LD IX,(CURRENT_SECTOR_L) LD DE,PARTITION_BUFFER
LD HL,(CURRENT_SECTOR_H) LD A,(DRV_NUM)
LD DE,PARTITION_BUFFER LD BC,1*256 + BIOS.DRV_READ
LD A,(DRV_NUM) RST ToBIOS
LD BC,1*256 + BIOS.DRV_READ POP IY
RST ToBIOS RET
POP IY
RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; ;

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
; .FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥ ; IF USE_FSINFO_FAT32
; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ;.FREE_CLUSTERS_COUNT_L WORD #FFFF
; ENDIF ;.FREE_CLUSTERS_COUNT_H WORD #FFFF
; ENDIF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.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