Preparing for FAT32

This commit is contained in:
Anatoliy Belyanskiy 2024-03-12 03:50:25 +10:00
parent ac928f6fc0
commit 0312779217
32 changed files with 1088 additions and 817 deletions

View File

@ -348,26 +348,26 @@ NX2: LD HL,(BOOT+510)
SCF SCF
RET NZ RET NZ
LD IY,BOOT ;Analysing Block Parametr BIOS LD IY,BOOT ;Analysing Block Parametr BIOS
LD A,(IY+_sBOOT_SEC.ID_FORM) LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0 CP #F0
RET C RET C
LD HL,0 ;calc. first sector FAT LD HL,0 ;calc. first sector FAT
LD (DIR_FRH),HL LD (DIR_FRH),HL
LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec
LD D,(IY+_sBOOT_SEC.RESERVE+1) LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1)
ADD HL,DE ADD HL,DE
LD (FAT_FRM),HL ;first sector FAT LD (FAT_FRM),HL ;first sector FAT
LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ;sectors in FAT
LD D,(IY+_sBOOT_SEC.S_P_F+1) LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1)
LD A,(BOOT.FAT_NUM) ;amount FATs LD A,(BOOT.FAT_NUM) ;amount FATs
C_DATA1: ADD HL,DE C_DATA1: ADD HL,DE
DEC A DEC A
JR NZ,C_DATA1 JR NZ,C_DATA1
LD (DIR_FRM),HL ;first sector DIR LD (DIR_FRM),HL ;first sector DIR
EX DE,HL EX DE,HL
LD L,(IY+_sBOOT_SEC.F_P_DIR) ;Number file handel LD L,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ;Number file handel
LD H,(IY+_sBOOT_SEC.F_P_DIR+1) LD H,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1)
ADD HL,HL ADD HL,HL
ADD HL,HL ADD HL,HL
ADD HL,HL ADD HL,HL
@ -381,8 +381,8 @@ C_DATA1: ADD HL,DE
ADD HL,DE ADD HL,DE
LD (DAT_FRM),HL ;First sector data LD (DAT_FRM),HL ;First sector data
LD C,(IY+_sBOOT_SEC.B_P_S) ;Size sector LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ;Size sector
LD B,(IY+_sBOOT_SEC.B_P_S+1) LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1)
LD HL,0 LD HL,0
LD A,(BOOT.S_P_C) LD A,(BOOT.S_P_C)
NEXTAD3: NEXTAD3:
@ -437,7 +437,7 @@ BPB_FAT
XOR A XOR A
RET RET
IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0 CP #F0
RET C RET C
CP #F8 CP #F8
@ -724,7 +724,7 @@ MASKARE DB "SYSTEM DOS"
FATMSG DB "FAT" FATMSG DB "FAT"
; Area for boot sector [512Bytes] ; Area for boot sector [512Bytes]
BOOT _sBOOT_SEC = $ BOOT _sBOOT_SECTOR_PARAMS = $
; BOOT EQU $ ; BOOT EQU $
; ID_NAME EQU BOOT+#03 ; +03 DOS NAME ; ID_NAME EQU BOOT+#03 ; +03 DOS NAME

View File

@ -357,7 +357,7 @@ write_to_: ld a,(disk) ;
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS RST ToBIOS
POP BC POP BC
LD HL,(buffer + _sBOOT_SEC.RESERVE) LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
LD DE,04 ;!HARDCODE ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1) LD DE,04 ;!HARDCODE ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1)
AND A AND A
SBC HL,DE SBC HL,DE

View File

@ -31,7 +31,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23
CALL .OPENATR ;R002 CALL .OPENATR ;R002
RET C RET C
;!TEST ;[x] 16/11/23 optimize get attribute ;!TEST ;[x] 16/11/23 optimize get attribute
LD A,(HANDBUF+_sFM.ATTRIBUT) LD A,(HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT)
;LD B,(IY+_sFM.ATTRIBUT) ;LD B,(IY+_sFM.ATTRIBUT)
;PUSH BC ;PUSH BC
;CALL CLOSE ;CALL CLOSE
@ -56,7 +56,7 @@ ATTRIB: ;!TEST Current Dir ;[x] 15/10/23
RET C RET C
SET 7,(IY+_sFM.ACCESS_MODE) SET 7,(IY+_sFM.ACCESS_MODE)
RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit RES 3,B ;CLEAR LABEL ATTR ;R003 ;!HARDCODE attribute bit
LD (IY+_sFM.ATTRIBUT),B LD (IY+_sFM.FS_REC.ATTRIBUT),B
PUSH BC PUSH BC
CALL CLOSE_FN CALL CLOSE_FN
.error: POP BC .error: POP BC

View File

@ -31,8 +31,8 @@ CLOSE_FN:
LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER),E
LD (IY+_sFM.DIR_CLUSTER+1),D LD (IY+_sFM.DIR_CLUSTER+1),D
; [x] 15/11/2023 -bug with bad clusters ;!TEST ; [x] 15/11/2023 -bug with bad clusters ;!TEST
LD (IY+_sFM.ST_CLUSTER),E LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),E
LD (IY+_sFM.ST_CLUSTER+1),D LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),D
; ;
CALL LOADDIR CALL LOADDIR
.TMP+1: LD A,0 .TMP+1: LD A,0

View File

@ -13,13 +13,22 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23
POP BC POP BC
POP HL POP HL
RET C RET C
LD A,C LD A,C ;
; ;
CALL .Prepare CALL .Prepare
RET C RET C
CALL SEARCH.File CALL SEARCH.File
CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
JR .DO ;CALL NC,DEL_FN.DELETE ;FILE EXIST RECREAT
CALL NC,.FILE_EXISTS_DEL ;FILE EXIST RECREAT
CP DSS_Error.sys.FILE_NOT_FOUND
JR Z,.DO
SCF
RET
.FILE_EXISTS_DEL:
CALL DEL_FN.DELETE
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET
; ;
.NEW_FN: .NEW_FN:
AND FAT_ATTR.NoVolID ; [x] 2/12/23 ˘ŕĽŹĽ­­ëŠ ä¨Şá ¤Ťď volume ID AND FAT_ATTR.NoVolID ; [x] 2/12/23 ˘ŕĽŹĽ­­ëŠ ä¨Şá ¤Ťď volume ID
@ -36,10 +45,17 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23
CALL .Prepare CALL .Prepare
RET C RET C
CALL SEARCH.File CALL SEARCH.File
LD A,DSS_Error.sys.FILE_EXISTS ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
CCF ; LD A,DSS_Error.sys.FILE_EXISTS
RET C ; CCF
; RET C
JR NC,.FILE_EXISTS
CP DSS_Error.sys.FILE_NOT_FOUND
SCF
RET NZ
; ;
;
;no_file_found
.DO: LD HL,MASKARE .DO: LD HL,MASKARE
LD DE,HANDBUF LD DE,HANDBUF
LD BC,11 LD BC,11
@ -89,6 +105,12 @@ CREATE: ;!TEST Current Dir ;[x] 15/10/23
; LD HL,TMPNAME ; LD HL,TMPNAME
; LD DE,MASKARE ; LD DE,MASKARE
JP MASK JP MASK
;
; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
.FILE_EXISTS:
LD A,DSS_Error.sys.FILE_EXISTS
CCF
RET
; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00 ; INPUT: HL - "C:\DIR1\DIR2\filename.ext",#00
; OUTPUT: A - FM ; OUTPUT: A - FM
CREAT_N EQU CREATE.NEW_FN CREAT_N EQU CREATE.NEW_FN

View File

@ -26,26 +26,27 @@ DEL_FN: ;!TEST
CALL LOADDIR CALL LOADDIR
CALL SEARCH.File CALL SEARCH.File
RET C RET C
;JP .DELETE
; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï" ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
.DELETE: SET_PAGE_X DIRPAGE .DELETE:
LD (IX+_sFM.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©«  SET_PAGE_X DIRPAGE
LD E,(IX+_sFM.ST_CLUSTER) ; ü ¯¥à¢®£® ª« áâ¥à  LD (IX + _sFAT_DIRECTORY_RECORD.NAME),#E5 ; ¯à¨§­ ª 㤠«¥­¨ï ä ©« 
LD D,(IX+_sFM.ST_CLUSTER+1) ; [ ] fat32
LD E,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L) ; ü ¯¥à¢®£® ª« áâ¥à 
LD D,(IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
; ;
OUT (SLOT3),A OUT (SLOT3),A
LD A,E LD A,E
OR D OR D
JP Z,SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª JP Z,SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
.loop: EX DE,HL ; hl=­®¬¥à ª« áâ¥à  .loop: EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH DE ; ­®¬¥à á«¥¤. ª« áâ¥à  PUSH DE ; ­®¬¥à á«¥¤. ª« áâ¥à 
PUSH AF PUSH AF
LD DE,#0000 ; ­®¬¥à ª« áâ¥à  LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP AF POP AF
POP DE POP DE
JP NC,.loop JP NC,.loop
CALL WR_FAT ;!FIXIT ¬®¦¥â ­¥ ­ã¦­  âãâ? ’ ¬ ¤ «ìè¥ ¡ã¤¥â CALL WRITE_FAT_TABLE ;!FIXIT ¬®¦¥â ­¥ ­ã¦­  âãâ? ’ ¬ ¤ «ìè¥ ¡ã¤¥â
JP SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª JP SAVEDIR ; á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
; ;

View File

@ -14,10 +14,10 @@ GET_D_T:
CALL SET_FM CALL SET_FM
RET C RET C
; ¢à¥¬ï/¤ âã ¨§ áâàãªâãàë ¤¥áªà. ; ¢à¥¬ï/¤ âã ¨§ áâàãªâãàë ¤¥áªà.
LD E,(IY+_sFM.TIME) ; ¢à¥¬ï LD E,(IY+_sFM.FS_REC.TIME) ; ¢à¥¬ï
LD D,(IY+_sFM.TIME+1) ; LD D,(IY+_sFM.FS_REC.TIME+1) ;
LD C,(IY+_sFM.DATE) ; ¤ â  LD C,(IY+_sFM.FS_REC.DATE) ; ¤ â 
LD B,(IY+_sFM.DATE+1) ; LD B,(IY+_sFM.FS_REC.DATE+1) ;
CALL RMKTIME ; à áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã CALL RMKTIME ; à áª®¤¨à®¢ âì ¢à¥¬ï/¤ âã
AND A AND A
RET RET

View File

@ -6,6 +6,13 @@
; ;
; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0 ; INPUT: HL - "C:\DIR\DIR\DIR_NAME",0
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;error
MKDIR.DIR_EXISTS:
LD A,DSS_Error.sys.DIR_EXISTS
CCF
RET
MKDIR: ;!TEST Current Dir ;[x] 15/10/23 MKDIR: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL PUSH HL
CALL DIR_PATH_CHECK CALL DIR_PATH_CHECK
@ -28,16 +35,22 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23
;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£  ;CALL LOADDIR ; ¯à®ç¨â âì ᯨ᮪ ª â «®£ 
; ;
CALL SEARCH.Dir ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª  CALL SEARCH.Dir ; ¯®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ¤¨áª 
LD A,DSS_Error.sys.DIR_EXISTS ; [x] fixed a bug with incorrect search when there were too many files in the directory 12/03/2024
CCF ; LD A,DSS_Error.sys.DIR_EXISTS
RET C ; ª â «®£ ­ ©¤¥­ ; CCF
; RET C ; ª â «®£ ­ ©¤¥­
JR NC,.DIR_EXISTS
CP DSS_Error.sys.FILE_NOT_FOUND
SCF
RET NZ
; ;
CALL G_CLUST CALL G_CLUST
RET C RET C
PUSH HL PUSH HL
LD DE,(FatBuffer.ENDCLUS) ; ­®¬¥à ª« áâ¥à  ; [ ] fat32
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à 
CALL WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
LD HL,MASKARE LD HL,MASKARE
LD DE,HANDBUF LD DE,HANDBUF
LD BC,11 LD BC,11
@ -80,7 +93,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23
;CALL SAVEDIR ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª ;CALL SAVEDIR ; ¨ á¡à®á¨âì ª¥è ª â «®£  ­  ¤¨áª
LD HL,CORE_BUFFERS.SECBUF ; ¡ãä¥à LD HL,CORE_BUFFERS.SECBUF ; ¡ãä¥à
LD (HL),"." ; § ¯¨áì ⥪. ª â «®£  LD (HL),"." ; § ¯¨áì ⥪. ª â «®£ 
LD BC,10*256 + ' ' ; b=áç¥â稪, c=¯à®¡¥« LD BC,10*256 + ' ' ; !HARDCODE b=áç¥â稪, c=¯à®¡¥«
; ;
.loop3: INC HL .loop3: INC HL
LD (HL),C LD (HL),C
@ -110,11 +123,12 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23
JP Z,.MKD04 JP Z,.MKD04
LD IX,HANDBUF LD IX,HANDBUF
XOR A XOR A
LD (IX+_sFM.ST_CLUSTER),A ; [ ] fat32
LD (IX+_sFM.ST_CLUSTER+1),A LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),A
LD DE,HANDBUF+11 ; ï祩ª   âਡã⮢ ä ©«  LD (IX+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1),A
LD DE,HANDBUF + _sFAT_DIRECTORY_RECORD.ATTRIBUT ; ï祩ª   âਡã⮢ ä ©« 
.MKD04: EX DE,HL .MKD04: EX DE,HL
LD BC,HANDBUF.SIZE-11 LD BC,HANDBUF.SIZE - _sFAT_DIRECTORY_RECORD.ATTRIBUT
LDIR LDIR
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A

View File

@ -6,6 +6,8 @@
; A=0 ç⥭¨¥/§ ¯¨áì ; A=0 ç⥭¨¥/§ ¯¨áì
; A=1 ç⥭¨¥ ; A=1 ç⥭¨¥
; A=2 § ¯¨áì ; A=2 § ¯¨áì
; ;!TODO A=3 § ¯¨áì ¡¥§ «¨è­¨å á®åà ­¥­¨© ªíè  FAT
; ;!TODO A=4 § ¯¨á âì ªíè FAT
; ¢ë室: CF=0, A - ¤¥áªà¨¯â®à ä ©« . ; ¢ë室: CF=0, A - ¤¥áªà¨¯â®à ä ©« .
; CF=1, A - ª®¤ ®è¨¡ª¨. ; CF=1, A - ª®¤ ®è¨¡ª¨.
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@ -18,23 +20,26 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23
;JR .start ;JR .start
;!FIXIT ᤥ« âì ª ª ¢ mkdir ¨«¨ rmdir? ;!FIXIT ᤥ« âì ª ª ¢ mkdir ¨«¨ rmdir?
;R008 ; ;R008 ;
;OPEN: ;
;LD (.TMP),A ; enter point from CREATE
.start: CALL GETWORD .start: CALL GETWORD
RET C RET C
CALL MASK ; enter point from OPEN_FN CALL MASK
RET C RET C
.FILE: CALL SEARCH.File ; enter point from EXEC .FILE: CALL SEARCH.File ; enter point from EXEC, CREATE
RET C RET C
;!TEST 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
PUSH DE ; á®å࠭塞 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS (¯®«ã祭 ¨§ SEARCH)
;R002 ; ;R002 ;
.FM: CALL GET_FM ; enter point from ATTRIB .FM: CALL GET_FM ; enter point from ATTRIB
RET C RET C
LD A,C LD A,C
EX AF,AF' EX AF,AF'
EXX ;!TEST 㪠§ â¥«ì ­  § ¯¨áì ¢ ª â «®£¥ FS
POP DE
; EXX
LD (IY+_sFM.HANDLE),E LD (IY+_sFM.HANDLE),E
LD (IY+_sFM.HANDLE+1),D LD (IY+_sFM.HANDLE+1),D
EXX ; EXX
;
LD D,YH LD D,YH
LD E,YL LD E,YL
LD HL,HANDBUF LD HL,HANDBUF
@ -45,11 +50,11 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23
LD A,(TASK) LD A,(TASK)
LD (IY+_sFM.TASK_NUM),A LD (IY+_sFM.TASK_NUM),A
XOR A XOR A
; ; [ ] fat32
LD (IY+_sFM.KnownCluster_L),A LD (IY+_sFM.KnownCluster_L),A
LD (IY+_sFM.KnownCluster_H),A LD (IY+_sFM.KnownCluster_L+1),A
LD (IY+_sFM.KnownOffset_L),A LD (IY+_sFM.KnownOffset_L),A
LD (IY+_sFM.KnownOffset_H),A LD (IY+_sFM.KnownOffset_L+1),A
; ;
LD (IY+_sFM.F_POSITION),A LD (IY+_sFM.F_POSITION),A
LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+1),A
@ -57,10 +62,12 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23
LD (IY+_sFM.F_POSITION+3),A LD (IY+_sFM.F_POSITION+3),A
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A LD (IY+_sFM.DRIVE),A
LD HL,CORE_BUFFERS.FM_BUF+_sFM.ST_CLUSTER ; [ ] fat32
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_L
LD E,(HL) LD E,(HL)
INC HL INC HL
LD D,(HL) LD D,(HL)
; [ ] fat32
LD (IY+_sFM.DIR_CLUSTER),E LD (IY+_sFM.DIR_CLUSTER),E
LD (IY+_sFM.DIR_CLUSTER+1),D LD (IY+_sFM.DIR_CLUSTER+1),D
EX AF,AF' EX AF,AF'

View File

@ -16,19 +16,7 @@ READ: LD (.R_POINT),HL
CALL OPENDSK CALL OPENDSK
JP C,.ERR_1 JP C,.ERR_1
;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å ;<3B> áçñâ ᬥ饭¨ï ¢ ᥪâ®à å
; LD C,(IY+_sFM.F_POSITION) LD H,0 ;!HARDCODE max file size = 8 gb
; LD E,(IY+_sFM.F_POSITION+1)
; LD A,E
; AND #01
; LD B,A
; LD D,(IY+_sFM.F_POSITION+2)
; LD L,(IY+_sFM.F_POSITION+3)
; LD H,0
; OR A
; RR L
; RR D
; RR E
LD H,0 ;
LD L,(IY+_sFM.F_POSITION+3) LD L,(IY+_sFM.F_POSITION+3)
LD D,(IY+_sFM.F_POSITION+2) LD D,(IY+_sFM.F_POSITION+2)
LD E,(IY+_sFM.F_POSITION+1) LD E,(IY+_sFM.F_POSITION+1)
@ -43,7 +31,6 @@ READ: LD (.R_POINT),HL
;HL:DE FP (in sectors) ;HL:DE FP (in sectors)
;BC FP residue (in bytes) ;BC FP residue (in bytes)
; ;
;LD A,B
OR C OR C
JP NZ,.ROV1 JP NZ,.ROV1
.ROV4: POP BC .ROV4: POP BC
@ -53,7 +40,7 @@ READ: LD (.R_POINT),HL
LD (.SECTORH),HL LD (.SECTORH),HL
LD (.SECTORL),DE LD (.SECTORL),DE
.R_POINT+2: LD IX,0 .R_POINT+2: LD IX,0
CALL BLOK_RD CALL BLOCK_READ
JP C,.ERR_1 JP C,.ERR_1
LD DE,(.R_POINT) LD DE,(.R_POINT)
.PointerOnBuffer+1: .PointerOnBuffer+1:
@ -84,7 +71,7 @@ READ: LD (.R_POINT),HL
PUSH AF PUSH AF
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
CALL BLOK_RD CALL BLOCK_READ
POP BC POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
@ -110,6 +97,7 @@ READ: LD (.R_POINT),HL
.COD+1: LD A,0 .COD+1: LD A,0
OR A OR A
RET RET
;
.ROV1: PUSH BC .ROV1: PUSH BC
PUSH HL PUSH HL
PUSH DE PUSH DE
@ -119,21 +107,23 @@ READ: LD (.R_POINT),HL
PUSH AF PUSH AF
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
CALL BLOK_RD CALL BLOCK_READ
POP BC POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
POP HL POP HL
JP C,.ERR_3 JP C,.ERR_3
; inc HL:DE
LD BC,1 LD BC,1
ADD HL,BC ADD HL,BC
EX DE,HL EX DE,HL
POP HL POP HL
LD C,B LD C,B
ADC HL,BC ADC HL,BC
;
EXX EXX
POP DE POP DE
LD HL,512 ;!HARDCODE LD HL,512 ;!HARDCODE sector size!
AND A AND A
SBC HL,DE SBC HL,DE
LD B,H LD B,H
@ -181,13 +171,13 @@ TSTSIZE:
.no_inc_hl: .no_inc_hl:
EXX ;HL':HL - NEW FP EXX ;HL':HL - NEW FP
; ;
LD C,(IY+_sFM.F_SIZE) LD C,(IY+_sFM.FS_REC.F_SIZE)
LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW LD B,(IY+_sFM.FS_REC.F_SIZE+1) ;SIZE LOW
AND A AND A
SBC HL,BC SBC HL,BC
EXX EXX
LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH LD C,(IY+_sFM.FS_REC.F_SIZE+2) ;SIZE HIGH
LD B,(IY+_sFM.F_SIZE+3) LD B,(IY+_sFM.FS_REC.F_SIZE+3)
SBC HL,BC SBC HL,BC
EXX EXX
RET C ;OK READ ALL RET C ;OK READ ALL

View File

@ -37,68 +37,76 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
CALL LOADDIR CALL LOADDIR
CALL SEARCH.Dir CALL SEARCH.Dir
RET C RET C
LD HL,(HANDBUF+_sFM.ST_CLUSTER) ; [ ] fat32
LD HL,(HANDBUF+_sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
PUSH IX PUSH IX
.RMD17: PUSH HL .RMD17: PUSH HL
CALL NSECTOR CALL NSECTOR
LD A,(CORE_BUFFERS.BootSector.S_P_C) LD A,(CORE_BUFFERS.BootSector.S_P_C)
.RMD12: PUSH AF ; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
.read_dir_loop:
PUSH AF
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.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Read LD BC,1*256 + Dss.DRV.Read
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
RST ToDSS.DRV RST ToDSS.DRV
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
;
LD B,16 ;!HARDCODE 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à  ;!HARDCODE 16 * 32 = 512; 32 - à §¬¥à § ¯¨á¨, 512 - à §¬¥à áç¨â ­­®£® ᥪâ®à 
LD B,16
LD HL,CORE_BUFFERS.SECBUF LD HL,CORE_BUFFERS.SECBUF
.RMD10: LD A,(HL) .check_dir_loop:
LD A,(HL)
OR A OR A
JP Z,.RMD15 ;DIR EMPTY JP Z,.RMD15 ;DIR EMPTY
CP "." CP "."
JR Z,.RMD14 JR Z,.next_record
CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©«  CP #E5 ;!HARDCODE ¡ ©â 㤠«¥­¨ï ä ©« 
JR Z,.RMD14 JR Z,.next_record
LD DE,11 ;!HARDCODE ᬥé. ¤® ¡ ©â   âਡã⮢ LD DE,_sFAT_DIRECTORY_RECORD.ATTRIBUT ; ᬥé. ¤® ¡ ©â   âਡã⮢
ADD HL,DE ADD HL,DE
LD A,(HL) LD A,(HL)
SBC HL,DE SBC HL,DE
;BIT 3,A AND FAT_ATTR.VOLUME_ID
AND %0000'1000
JP Z,.error ;DIR NOT EMPTY JP Z,.error ;DIR NOT EMPTY
.RMD14: LD DE,#0020 .next_record:
LD DE,#0020
ADD HL,DE ADD HL,DE
DJNZ .RMD10 DJNZ .check_dir_loop
;
POP IX POP IX
POP HL POP HL
INC IX INC IX
LD A,XH LD A,XH
OR XL OR XL
JR NZ,.RMD11 JR NZ,.no_inc_hl
INC HL INC HL
.RMD11: POP AF .no_inc_hl:
POP AF
DEC A DEC A
JR NZ,.RMD12 JR NZ,.read_dir_loop
;
POP HL ; ­®¬¥à ª« áâ¥à  POP HL ; ­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
EX DE,HL ; hl=­®¬¥à á«¥¤. ª« áâ¥à  EX DE,HL ; hl=­®¬¥à á«¥¤. ª« áâ¥à 
JR NC,.RMD17 ; ­¥ ª®­¥æ 楯®çª¨ JR NC,.RMD17 ; ­¥ ª®­¥æ 楯®çª¨
.RMD18: POP IX .delete:
POP IX
JP DEL_FN.DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï" JP DEL_FN.DELETE ; ¯®¬¥â¨âì § ¯¨áì ª ª "㤠«¥­­ ï"
.RMD15: POP IX .RMD15: POP IX
POP HL POP HL
POP AF POP AF
POP HL POP HL
JR .RMD18 JR .delete
;
.error: POP IX .error: POP IX
POP HL POP HL
POP AF POP AF

View File

@ -25,6 +25,12 @@ SCANDRV:
LD A,Dss.DRV.RescanDRV LD A,Dss.DRV.RescanDRV
LD C,Dss.DRV.RescanDRV LD C,Dss.DRV.RescanDRV
RST ToDSS.DRV RST ToDSS.DRV
; 能恥丞<E681A5> <20> 株芋芥 boot disk lost
LD HL,.BOOT_DSK_LOST
LD E, +(80-.BOOT_DSK_LOST.size)/2 ; coord X
LD BC,.BOOT_DSK_LOST.size
JP C,KERNEL_PANIC
;
LD (LDRIVE),A LD (LDRIVE),A
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 4. ­  ¢á直© á«ãç © ¯¥à¥ç¨â뢠¥¬ ¤¨à४â®à¨î ; 4. ­  ¢á直© á«ãç © ¯¥à¥ç¨â뢠¥¬ ¤¨à४â®à¨î
@ -47,6 +53,10 @@ SCANDRV:
RET PO RET PO
EI EI
RET RET
;
.BOOT_DSK_LOST:
DZ "Boot drive lost o_O"
.BOOT_DSK_LOST.size EQU $-.BOOT_DSK_LOST
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
;/////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////
; ;

View File

@ -20,10 +20,10 @@ PUT_D_T:
POP BC POP BC
POP DE POP DE
RET C RET C
LD (IY+_sFM.TIME),E LD (IY + _sFM.FS_REC.TIME),E
LD (IY+_sFM.TIME+1),D LD (IY + _sFM.FS_REC.TIME+1),D
LD (IY+_sFM.DATE),C LD (IY + _sFM.FS_REC.DATE),C
LD (IY+_sFM.DATE+1),B LD (IY + _sFM.FS_REC.DATE+1),B
SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; ãáâ. ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©«  SET 7,(IY + _sFM.ACCESS_MODE) ;R006 ; ãáâ. ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©« 
AND A AND A
RET RET

View File

@ -15,12 +15,12 @@ WRITE.RD_ONLY:
; HL - ADDRESS ; HL - ADDRESS
; DE - SIZE ; DE - SIZE
; A - FM ; A - FM
WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§¡ëâ®ç­ë¥ ¢ë§®¢ë WR_FAT WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§¡ëâ®ç­ë¥ ¢ë§®¢ë WRITE_FAT_TABLE
CALL .Start CALL .Start
PUSH AF PUSH AF
LD A,(FatCache.Update) LD A,(FatCache.Update)
OR A OR A
CALL NZ,WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª CALL NZ,WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
POP AF POP AF
RET RET
; ;
@ -33,7 +33,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
AND FAT_ATTR.READ_ONLY AND FAT_ATTR.READ_ONLY
JR NZ,.RD_ONLY JR NZ,.RD_ONLY
SET 7,(IY + _sFM.ACCESS_MODE) SET 7,(IY + _sFM.ACCESS_MODE)
SET 5,(IY+_sFM.ATTRIBUT) SET 5,(IY + _sFM.FS_REC.ATTRIBUT)
LD A,(IY + _sFM.DRIVE) LD A,(IY + _sFM.DRIVE)
CALL OPENDSK CALL OPENDSK
JR C,.ERR1 JR C,.ERR1
@ -96,7 +96,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
PUSH AF PUSH AF
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
CALL BLOK_RD CALL BLOCK_READ
POP BC POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
@ -138,10 +138,10 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
LD H,(IY + _sFM.F_POSITION+1) LD H,(IY + _sFM.F_POSITION+1)
LD C,(IY + _sFM.F_POSITION+2) LD C,(IY + _sFM.F_POSITION+2)
LD B,(IY + _sFM.F_POSITION+3) LD B,(IY + _sFM.F_POSITION+3)
LD (IY+_sFM.F_SIZE+0),L LD (IY + _sFM.FS_REC.F_SIZE+0),L
LD (IY+_sFM.F_SIZE+1),H LD (IY + _sFM.FS_REC.F_SIZE+1),H
LD (IY+_sFM.F_SIZE+2),C LD (IY + _sFM.FS_REC.F_SIZE+2),C
LD (IY+_sFM.F_SIZE+3),B LD (IY + _sFM.FS_REC.F_SIZE+3),B
AND A AND A
RET RET
; ;
@ -154,7 +154,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
PUSH AF PUSH AF
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
CALL BLOK_RD CALL BLOCK_READ
POP BC POP BC
LD C,SLOT3 LD C,SLOT3
OUT (C),B OUT (C),B
@ -163,7 +163,7 @@ WRITE: ;!TEST ;!TODO 5/12/23 ; [ ]
EXX EXX
POP DE POP DE
JP C,.ERR1 JP C,.ERR1
LD HL,512 ;!HARDCODE LD HL,512 ;!HARDCODE sector size!
AND A AND A
SBC HL,DE SBC HL,DE
LD B,H LD B,H

View File

@ -57,15 +57,15 @@ DISKINF:; [ ] 22/11/23
; ;
EX DE,HL EX DE,HL
LD HL,CORE_BUFFERS.BootSector.ID_FAT LD HL,CORE_BUFFERS.BootSector.ID_FAT
LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length LD A,8 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; ;
LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER
LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER LD A,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; ;
LD HL,CORE_BUFFERS.BootSector.BPB_LABEL LD HL,CORE_BUFFERS.BootSector.BPB_LABEL
LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL LD A,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; ;
PUSH DE PUSH DE
@ -113,16 +113,14 @@ DISKINF:; [ ] 22/11/23
RET C RET C
; ;
.CheckFreeSpace: .CheckFreeSpace:
;
XOR A XOR A
OR B OR B
CALL NZ,.CURRDS CALL NZ,.CURRDS
; ;
; ;.FRESP2:
.FRESP2:
LD D,B LD D,B
LD E,C LD E,C
LD HL,(FAT_Max_Cluster) LD HL,(FAT_Max_Cluster_L)
DEC HL DEC HL
LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD BC,(CORE_BUFFERS.BootSector.B_P_S)
LD A,(CORE_BUFFERS.BootSector.S_P_C) LD A,(CORE_BUFFERS.BootSector.S_P_C)
@ -133,7 +131,7 @@ DISKINF:; [ ] 22/11/23
LD HL,2 LD HL,2
LD BC,0 LD BC,0
.FRESP: PUSH BC .FRESP: PUSH BC
CALL R_F_FAT CALL READ_FROM_FAT
POP BC POP BC
CP DSS_Error.sys.DISK_FULL CP DSS_Error.sys.DISK_FULL
RET Z RET Z

View File

@ -43,7 +43,7 @@ FM_BUF: _sFM
; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à ; ­  ¢ë室¥ ¡¥§ ®è¨¡®ª IY 㪠§ë¢ ¥â ­  ä ©«®¢ë© ¬ ­¨¯ã«ïâ®à
MACRO _mFM_FIND MACRO _mFM_FIND
CP FMCOUNT CP FMCOUNT+1
JR NC,ABS_FM JR NC,ABS_FM
PUSH DE PUSH DE
@ -75,7 +75,7 @@ RES_FM: _mFM_FIND
SCF SCF
RET Z RET Z
XOR A XOR A
LD (IY+0),A LD (IY + _sFM.FS_REC.NAME),A
RET RET
; ;
GET_FM: LD B,FMCOUNT GET_FM: LD B,FMCOUNT
@ -84,7 +84,7 @@ GET_FM: LD B,FMCOUNT
LD DE,CORE_BUFFERS.FM_BUF.Size LD DE,CORE_BUFFERS.FM_BUF.Size
.loop: ADD IY,DE .loop: ADD IY,DE
INC C INC C
LD A,(IY+0) LD A,(IY + _sFM.FS_REC.NAME)
OR A OR A
RET Z RET Z
DJNZ .loop DJNZ .loop
@ -138,10 +138,10 @@ MOVE_FP:
LD E,B LD E,B
JP .DO JP .DO
;from End File ;from End File
.B_end: LD C,(IY+_sFM.F_SIZE) .B_end: LD C,(IY + _sFM.FS_REC.F_SIZE)
LD B,(IY+_sFM.F_SIZE+1) LD B,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY+_sFM.F_SIZE+2) LD E,(IY + _sFM.FS_REC.F_SIZE+2)
LD D,(IY+_sFM.F_SIZE+3) LD D,(IY + _sFM.FS_REC.F_SIZE+3)
JP .DO JP .DO
;from Current Position ;from Current Position
.F_current: .F_current:
@ -164,14 +164,14 @@ MOVE_FP:
; CY - FILE POINTER > SIZE ; CY - FILE POINTER > SIZE
; NC - FILE POINTER < SIZE ; NC - FILE POINTER < SIZE
MOVE_CP: MOVE_CP:
LD L,(IY+_sFM.F_SIZE) LD L,(IY + _sFM.FS_REC.F_SIZE)
LD H,(IY+_sFM.F_SIZE+1) LD H,(IY + _sFM.FS_REC.F_SIZE+1)
LD E,(IY + _sFM.F_POSITION) LD E,(IY + _sFM.F_POSITION)
LD D,(IY + _sFM.F_POSITION+1) LD D,(IY + _sFM.F_POSITION+1)
AND A AND A
SBC HL,DE SBC HL,DE
LD L,(IY+_sFM.F_SIZE+2) LD L,(IY + _sFM.FS_REC.F_SIZE+2)
LD H,(IY+_sFM.F_SIZE+3) LD H,(IY + _sFM.FS_REC.F_SIZE+3)
LD E,(IY + _sFM.F_POSITION+2) LD E,(IY + _sFM.F_POSITION+2)
LD D,(IY + _sFM.F_POSITION+3) LD D,(IY + _sFM.F_POSITION+3)
SBC HL,DE SBC HL,DE

View File

@ -216,24 +216,19 @@ OPENDSK:;!TEST DRV.Open
POP BC POP BC
JP C,.error JP C,.error
;[ ] 29/02/2024 fix "open drive error" ;[ ] 29/02/2024 fix "open drive error"
IF TEST_FEATURE
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD D,A LD D,A
PUSH DE PUSH DE
ENDIF
; ;
LD A,B LD A,B
LD (FatBuffer.DRIVE),A LD (FatBuffer.DRIVE),A
; ;
CALL RD_BPB CALL RD_BPB
;[ ] 29/02/2024 fix "open drive error" ;[ ] 29/02/2024 fix "open drive error"
IF TEST_FEATURE
POP DE POP DE
LD A,D LD A,D
JR C,.error_disk JR C,.error_disk
ELSE ; RET C
RET C
ENDIF
; ;
.exit: LD A,(LDRIVE) .exit: LD A,(LDRIVE)
AND A AND A
@ -244,19 +239,28 @@ OPENDSK:;!TEST DRV.Open
LD A,DSS_Error.sys.NOT_READY LD A,DSS_Error.sys.NOT_READY
RET RET
;[ ] 29/02/2024 fix "open drive error" ;[ ] 29/02/2024 fix "open drive error"
IF TEST_FEATURE
.error_disk: .error_disk:
CALL OPENDSK.force CALL OPENDSK.force
LD A,(BOOTDSK.NUM)
CALL C,OPENDSK.force
; ¯à®¢¥àª  ­  ®è¨¡ªã
LD HL,.NOT_READY
LD E, +(80-.NOT_READY.size)/2 ; coord X
LD BC,.NOT_READY.size
JP C,KERNEL_PANIC
;
LD A,DSS_Error.sys.NOT_READY LD A,DSS_Error.sys.NOT_READY
SCF SCF
RET RET
ENDIF ;
.NOT_READY: DZ "Boot drive not ready..."
.NOT_READY.size EQU $-.NOT_READY
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
OPENDIR:;!TEST ;[x] some optimize OPENDIR:;[x] some optimizations
;XOR A ;XOR A
;CALL SET_FM ;CALL SET_FM
LD IY,CORE_BUFFERS.FM_BUF LD IY,CORE_BUFFERS.FM_BUF
@ -266,11 +270,12 @@ OPENDIR:;!TEST ;[x] some optimize
JR NZ,.SUBDIR JR NZ,.SUBDIR
.REROOT1: .REROOT1:
LD DE,0 LD DE,0
;!TEST ;[x] some optimize ;[x] some optimizations
;LD (IY+_sFM.ST_CLUSTER),E ;LD (IY+_sFM.FIRST_CLUSTER_L),E
;LD (IY+_sFM.ST_CLUSTER+1),D ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D
; [ ] fat32
EX DE,HL EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL
EX DE,HL EX DE,HL
; ;
CALL LOADDIR CALL LOADDIR
@ -284,11 +289,12 @@ OPENDIR:;!TEST ;[x] some optimize
.SUBDIR: .SUBDIR:
CP "." CP "."
JR NZ,.SUBDIR2 JR NZ,.SUBDIR2
;!TEST ;[x] some optimize ;!TEST ;[x] some optimizations
;LD A,(IY+_sFM.ST_CLUSTER) ;R005 ;LD A,(IY+_sFM.FIRST_CLUSTER_L) ;R005
LD A,(CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER) ;R005 ; [ ] fat32
LD A,(CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L) ;R005
; ;
OR (IY+_sFM.ST_CLUSTER+1) ;R005 OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1) ;R005
JR NZ,.SUDI1 ;R005 JR NZ,.SUDI1 ;R005
INC HL ;R005 INC HL ;R005
LD A,(HL) ;R005 LD A,(HL) ;R005
@ -314,16 +320,16 @@ OPENDIR:;!TEST ;[x] some optimize
.SUBDIR3: .SUBDIR3:
CALL FINDDIR CALL FINDDIR
RET C RET C
;!TEST ;[x] some optimize ;!TEST ;[x] some optimizations
;LD (IY+_sFM.ST_CLUSTER),E ;LD (IY+_sFM.FIRST_CLUSTER_L),E
;LD (IY+_sFM.ST_CLUSTER+1),D ;LD (IY+_sFM.FIRST_CLUSTER_L+1),D
;LD DE,#4000 ;!HARDCODE ;LD DE,#4000 ;!HARDCODE
;LD (IY+_sFM.F_SIZE),E ;LD (IY+_sFM.F_SIZE),E
;LD (IY+_sFM.F_SIZE+1),D ;LD (IY+_sFM.F_SIZE+1),D
EX DE,HL EX DE,HL
LD (CORE_BUFFERS.FM_BUF + _sFM.ST_CLUSTER),HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL ; [ ] fat32
LD HL,#4000 ;!HARDCODE LD HL,#4000 ;!HARDCODE
LD (CORE_BUFFERS.FM_BUF + _sFM.F_SIZE),HL LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.F_SIZE),HL
EX DE,HL EX DE,HL
; ;
JP LOADDIR JP LOADDIR
@ -335,7 +341,6 @@ OPENDIR:;!TEST ;[x] some optimize
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; .custom:
; <20>८¡à §®¢ âì ¨¬ï 8.3 -> 11 ä®à¬ â ; <20>८¡à §®¢ âì ¨¬ï 8.3 -> 11 ä®à¬ â
; ¢å®¤: hl = 8.3 ¨¬ï ; ¢å®¤: hl = 8.3 ¨¬ï
; de = ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â  ; de = ¡ãä¥à ¨¬¥­¨ 11 ᨬ¢. ä®à¬ â 

View File

@ -232,33 +232,9 @@ PORTAL.out_MAIN: ;
; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --; ; = -- = -- = -- = -- = = -- = -- = = -- = -- = = -- = -- = -- = -- = --;
; ;
/*
STRUCT _sBOOT_SEC
.JMP: BLOCK 3,0 ; +#00 "JMP"
.ID_NAME: TEXT 8,{"DSS_1.7","0"} ; +#03 DOS NAME - DB "DSS_1.70"
; Block Parameters BIOS
.B_P_S: WORD #200 ; +#0B BYTE PER SECTOR
.S_P_C: BYTE 2 ; +#0D SECTORS PER CLUSTER
.RESERVE: WORD 1 ; +#0E RESERVE SECTORS
.FAT_NUM: BYTE 2 ; +#10 AMOUNT FATS
.F_P_DIR: WORD 112 ; +#11 FILES IN DIRECTORY
.S_P_D: WORD 1440 ; +#13 ALL SECTORS ON DISK
.ID_FORM: BYTE #F0 ; +#15 ID FORMAT
.S_P_F: WORD 2 ; +#16 SIZE FAT IN SECTORS
.S_P_T: WORD 9 ; +#18 SECTOR PER TRACK
.HEADS: WORD 2 ; +#1A AMOUNT SIDES
.HIDDEN: DWORD 0 ; +#1C HIDDEN SECTORS
.BPB_BIG_TOTAL_SECTORS: DWORD 0 ; +#20 BIG TOTAL SECTOR
.BPB_PHISICAL_DRIVE_NUMBER: WORD #80 ; +#24 PHISICAL DRIVE NUMBER
.BPB_EXT_BOOT_RECORD_SIGNATURE: BYTE #29 ; +#26 EXTENDED BOOT RECORD SIGNATURE
.BPB_SERIAL_NUMBER: DWORD 0 ; +#27 VOLUME SERIAL NUMBER
.BPB_LABEL: TEXT 11,{"NO NAME"," "} ; +#2B DISK LABEL
.ID_FAT: TEXT 8,{"FAT16"," "} ; +#36 FILE SYSTEM ID ( BPB_FS_ID )
ENDS
*/
;R01 ;R01
; Area for boot sector BootSector. ; Area for boot sector BootSector.
;BootSector _sBOOT_SEC ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" } ;BootSector _sBOOT_SECTOR_PARAMS ,{ "DSS_","0"+VERS,".",MODF/10+"0",MODF-(MODF/10)*10+"0" }
; end boot sector ; end boot sector
;R01 ;R01
@ -451,7 +427,7 @@ ADRST10: ;DS 512 ;,0
INCLUDE "EXECUTE.ASM" INCLUDE "EXECUTE.ASM"
INCLUDE "INTMOUSE.ASM" INCLUDE "INTMOUSE.ASM"
INCLUDE "Procedures.asm" INCLUDE "Procedures.asm"
INCLUDE "Kernel_Panic.asm"
;!FIXIT ª ¡ãä¥à ¬ ;!FIXIT ª ¡ãä¥à ¬
; Œ áᨢ «®£. ­®¬¥à®¢ ¡ ­®ª à áè¨à¥­¨ï DSS ; Œ áᨢ «®£. ­®¬¥à®¢ ¡ ­®ª à áè¨à¥­¨ï DSS
@ -490,7 +466,7 @@ BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM .Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size .FullSize EQU FMCOUNT*FM_BUF.Size
BootSector _sBOOT_SEC = BUFFERSplace.BootSector BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector
EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
XSTACK EQU BUFFERSplace.Stack.SPoint XSTACK EQU BUFFERSplace.Stack.SPoint
BUFFER EQU BUFFERSplace.Buffer BUFFER EQU BUFFERSplace.Buffer

View File

@ -151,7 +151,8 @@ PATH_PR EQU 2 ;%00000100
EXTN_PR EQU 1 ;%00000010 EXTN_PR EQU 1 ;%00000010
NAM_PR EQU 0 ;%00000001 NAM_PR EQU 0 ;%00000001
EX_PATH: EXX EX_PATH:
EXX
LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! ¨á¯®«ì§ã¥âáï ®¡é¨© ¡ãä¥à LD HL,NM_PATH_A ;BUILT-IN BUFFER FOR PATH ;!!!!! ¨á¯®«ì§ã¥âáï ®¡é¨© ¡ãä¥à
LD (NM_PATH),HL LD (NM_PATH),HL
LD HL,NM_NAME_A LD HL,NM_NAME_A
@ -163,7 +164,6 @@ EX_PATH: EXX
EXX EXX
INC B INC B
DEC B DEC B
;JR Z,EX_GET_ALL
JR Z,EX_FULL ;0 ; à §®¡à âì áâபã JR Z,EX_FULL ;0 ; à §®¡à âì áâபã
DEC B DEC B
JR Z,EX_GET_DRIVE ;1 ; ¢ë¤¥«¨âì ¨¬ï ¤¨áª  JR Z,EX_GET_DRIVE ;1 ; ¢ë¤¥«¨âì ¨¬ï ¤¨áª 
@ -222,10 +222,6 @@ EX_GET_TYPE
LD (NM_EXTN),DE LD (NM_EXTN),DE
JR EX_FULL JR EX_FULL
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
; EX_GET_ALL
; JR EX_FULL
; ‚뤥«¨âì ¤¨áª, ¯ãâì, ä ©« ¨ à áè. ; ‚뤥«¨âì ¤¨áª, ¯ãâì, ä ©« ¨ à áè.
EX_GET_ALL_EX: EX_GET_ALL_EX:
EX DE,HL EX DE,HL

View File

@ -12,7 +12,7 @@
; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£  ; <20>®¨áª § ¯¨á¨ ª â «®£  ¢ ᯨ᪥ ª â «®£ 
; ;
; ¢å®¤: a =  âਡãâ § ¯¨á¨ ; ¢å®¤: a =  âਡãâ § ¯¨á¨
; ¢ë室: de'=¨­¤¥ªá § ¯¨á¨ ¢ ᯨ᪥ ª â «®£  ; ¢ë室: de = ¨­¤¥ªá § ¯¨á¨ ¢ ᯨ᪥ ª â «®£ 
; (HANDBUF) = file's direcory record ; (HANDBUF) = file's direcory record
; CF - ª â «®£ ­¥ ­ ©¤¥­ ; CF - ª â «®£ ­¥ ­ ©¤¥­
SEARCH: SEARCH:
@ -63,21 +63,23 @@ SEARCH:
INC HL INC HL
INC DE INC DE
DJNZ .loop_compare DJNZ .loop_compare
;
LD D,XH
LD E,XL
;[x] 9/11/23 ®¯â¨¬¨§ æ¨ï ¤«ï ¨­¤¥ªá  § ¯¨á¨ ¢ ᯨ᪥ ª â «®£  (¢®§¬®¦­® ¯®­ ¤®¡¨âáï ¢¥à­ãâì) ;[x] 9/11/23 ®¯â¨¬¨§ æ¨ï ¤«ï ¨­¤¥ªá  § ¯¨á¨ ¢ ᯨ᪥ ª â «®£  (¢®§¬®¦­® ¯®­ ¤®¡¨âáï ¢¥à­ãâì)
EXX
; LD D,XH ; LD D,XH
; LD E,XL ; LD E,XL
LD D,XH PUSH IX
LD E,XL
EXX
LD D,XH
LD E,XL
EXX EXX
; ;
LD HL,HANDBUF LD HL,HANDBUF
EX DE,HL EX DE,HL
LD BC,HANDBUF.SIZE LD BC,HANDBUF.SIZE
LDIR LDIR
;POP AF ;[x] 9/11/23 ®¯â¨¬¨§ æ¨ï ¤«ï ¨­¤¥ªá  § ¯¨á¨ ¢ ᯨ᪥ ª â «®£  (¢®§¬®¦­® ¯®­ ¤®¡¨âáï 㤠«¨âì)
POP DE
;
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
@ -174,13 +176,13 @@ FINDDIR:
PUSH AF PUSH AF
LD IX,DIRPAGE.buffer LD IX,DIRPAGE.buffer
.big_loop: .big_loop:
LD A,(IX+00) LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME)
OR A OR A
JR Z,.error JR Z,.error
CP #E5 CP #E5
JR Z,.next_step JR Z,.next_step
LD A,(IX+11) ;!HARDCODE LD A,(IX + _sFAT_DIRECTORY_RECORD.ATTRIBUT)
AND #10 ;!HARDCODE AND FAT_ATTR.DIRECTORY
JR Z,.next_step JR Z,.next_step
LD HL,MASKARE LD HL,MASKARE
LD D,XH LD D,XH
@ -197,10 +199,10 @@ FINDDIR:
INC DE INC DE
DJNZ .loop DJNZ .loop
; ;
LD A,(IX+0) LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME)
CP "." CP "."
JP NZ,.ADDSPEC JP NZ,.ADDSPEC
LD A,(IX+1) ;!HARDCODE LD A,(IX + _sFAT_DIRECTORY_RECORD.NAME + 1)
CP "." CP "."
JP NZ,.IT_DIR JP NZ,.IT_DIR
LD HL,WorkDirectory LD HL,WorkDirectory
@ -287,9 +289,9 @@ FINDDIR:
; .MM3: LD (HL),0 ; .MM3: LD (HL),0
; ; JP IT_DIR ; ; JP IT_DIR
; ;
.IT_DIR: .IT_DIR: ; [ ] fat32
LD E,(IX+_sFM.ST_CLUSTER) LD E,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L)
LD D,(IX+_sFM.ST_CLUSTER+1) LD D,(IX + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L+1)
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
AND A AND A
@ -337,19 +339,14 @@ LOADDIR:
; LD (HL),L ; LD (HL),L
; LDIR ; LDIR
; ;
;
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à
;
;LD D,(IY+_sFM.ST_CLUSTER+1) ; de=­®¬¥à ¯¥à¢®£® ª« áâ¥à 
;LD E,(IY+_sFM.ST_CLUSTER)
;LD A,D
;OR E
; ­®¬¥à ¯¥à¢®£® ª« áâ¥à  ; ­®¬¥à ¯¥à¢®£® ª« áâ¥à 
LD A,(IY+_sFM.ST_CLUSTER) ; [ ] fat32
OR (IY+_sFM.ST_CLUSTER+1) LD A,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
; OR (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
JP Z,.LROTDIR ; root ?? JP Z,.LROTDIR ; root ??
;
LD HL,DIRPAGE.buffer ; ªã¤  LD HL,DIRPAGE.buffer ; ªã¤ 
LD DE,#4000 ; ᪮«ìª® LD DE,#4000 ; ᪮«ìª®
XOR A ; ¤¥áªà¨¯â®à XOR A ; ¤¥áªà¨¯â®à
@ -362,17 +359,10 @@ LOADDIR:
LD HL,(FatBuffer.DIR_FRH) ; áâ. à §àï¤ LD HL,(FatBuffer.DIR_FRH) ; áâ. à §àï¤
LD IX,(FatBuffer.DIR_FRL) ; ­®¬¥à «®£. ᥪâ®à  LD IX,(FatBuffer.DIR_FRL) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(FatBuffer.DIR_S_S) LD A,(FatBuffer.DIR_S_S)
;!TEST
LD B,32 ; !HARDCODE 16384/(sector 512). à §¬¥à root-ª â «®£  LD B,32 ; !HARDCODE 16384/(sector 512). à §¬¥à root-ª â «®£ 
CP B CP B
JR NC,.RTD1 JR NC,.RTD1
LD B,A ; ç¨á«® ᥪâ®à®¢ LD B,A ; ç¨á«® ᥪâ®à®¢
;LD B,32 ; !HARDCODE 16384/(sector 512). à §¬¥à root-ª â «®£ 
;SUB B
;JR NC,.RTD1
;ADD A,B
;LD B,A ; ç¨á«® ᥪâ®à®¢
;
.RTD1: LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  .RTD1: LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢ LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
@ -453,13 +443,15 @@ SAVEDIR:
; ;
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A LD (IY+_sFM.DRIVE),A
LD D,(IY+_sFM.ST_CLUSTER) ;[ ] fat32
LD E,(IY+_sFM.ST_CLUSTER+1) LD D,(IY+_sFM.FS_REC.FIRST_CLUSTER_L)
LD E,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,D LD A,D
OR E OR E
JP Z,.SROTDIR JP Z,.SROTDIR
LD HL,DIRPAGE.buffer LD HL,DIRPAGE.buffer
; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory ; à §¬¥à ᯨ᪠ ª â «®£  size_cash_directory
;!FIXIT ¥á«¨ ®­  ­ã¦­ , â® ¯à®¢¥à¨âì ­  ¡ £¨ (­ ¯à¨¬¥à, à §¬¥à ¤¨à४â®à¨¨ ¬¥­ìè¥ ¯à¨ ®âªàë⨨ ¨ ¡®«ìè¥ ¯®á«¥ ¯à ¢®ª)
.DIRSIZE+1: .DIRSIZE+1:
LD DE,0 LD DE,0
XOR A XOR A
@ -489,23 +481,21 @@ SAVEDIR:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; !FIXIT çñâ ­¥ ¨á¯®«ì§ã¥âáï ; ­¥ ¨á¯®«ì§ã¥âáï
IF COMPILE_UNUSED_CODE ; TESTDSK: ;????? ¢®§¬®¦­®, çâ® âãâ «®£¨ç­¥¥, 祬 ¢ ­ ç «¥ OPENDSK, ¥á«¨ ¡ã¤¥â à ¡®â âì Dss.DRV.Open
TESTDSK: ;????? ¢®§¬®¦­®, çâ® âãâ «®£¨ç­¥¥, 祬 ¢ ­ ç «¥ OPENDSK, ¥á«¨ ¡ã¤¥â à ¡®â âì Dss.DRV.Open ; LD A,(FatBuffer.DRIVE)
LD A,(FatBuffer.DRIVE) ; LD C,Dss.DRV.MediaCheck
LD C,Dss.DRV.MediaCheck ; RST ToDSS.DRV
RST ToDSS.DRV ; OR A
OR A ; RET Z
RET Z
ENDIF
; ॣ. D - ­®¬¥à ¤¨áª  ; ॣ. D - ­®¬¥à ¤¨áª 
RD_BPB: LD C,SLOT3 RD_BPB: LD C,SLOT3
IN B,(C) IN B,(C)
PUSH BC PUSH BC
IN A,(SLOT0) IN A,(SLOT0)
OUT (SLOT3),A OUT (SLOT3),A
LD A,(FatBuffer.DRIVE) ;¢ë§®¢ RD_BPB ¬®¦¥â ¢ ¤ «ì­¥©è¥¬ ¯®­ ¤®¡¨âìáï, ¯ã᪠© ®­  á ¬  ¤®áâ ñâ ¯¥à¥¬¥­­ãî DRIVE LD A,(FatBuffer.DRIVE)
;R08 ;R08
;LD DE,BOOT+#C000 ;LD DE,BOOT+#C000
LD DE,CORE_BUFFERS.SECBUF+#C000 LD DE,CORE_BUFFERS.SECBUF+#C000
@ -519,7 +509,7 @@ RD_BPB: LD C,SLOT3
//PUSH IY ; ¯®ª  ¡¥§ ¨­¤¥ªá­®£®, ­® ¬®¦¥â ¯à¨£®¤¨âìáï //PUSH IY ; ¯®ª  ¡¥§ ¨­¤¥ªá­®£®, ­® ¬®¦¥â ¯à¨£®¤¨âìáï
LD DE,#AA55 ; ᨣ­ âãà  ;R05 LD DE,#AA55 ; ᨣ­ âãà  ;R05
LD HL,(CORE_BUFFERS.SECBUF+510) ;R08 ;R07 LD HL,(CORE_BUFFERS.SECBUF+_sBOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
;R05 ;R05
AND A AND A
SBC HL,DE SBC HL,DE
@ -527,38 +517,38 @@ RD_BPB: LD C,SLOT3
;R08 ;R08
LD HL,CORE_BUFFERS.SECBUF LD HL,CORE_BUFFERS.SECBUF
LD DE,CORE_BUFFERS.BootSector LD DE,CORE_BUFFERS.BootSector
LD BC,_sBOOT_SEC ; size LD BC,_sBOOT_SECTOR_PARAMS ; size
LDIR LDIR
; ;
//LD IY,BootSector ; ¯®ª  ¡¥§ ¨­¤¥ªá­®£®, ­® ¬®¦¥â ¯à¨£®¤¨âìáï //LD IY,BootSector ; ¯®ª  ¡¥§ ¨­¤¥ªá­®£®, ­® ¬®¦¥â ¯à¨£®¤¨âìáï
//LD A,(IY+_sBOOT_SEC.ID_FORM) //LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
LD A,(CORE_BUFFERS.BootSector.ID_FORM) LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE)
CP #F0 CP #F0
JP C,DOS_X_Error.UnknownBPB JP C,DOS_X_Error.UnknownBPB
;!TEST ;!TEST
;LD HL,0 ; calc. first sector FAT ;LD HL,0 ; calc. first sector FAT
;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec ;LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec
;LD D,(IY+_sBOOT_SEC.RESERVE+1) ;LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1)
;ADD HL,DE ;ADD HL,DE
//LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec //LD L,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec
//LD H,(IY+_sBOOT_SEC.RESERVE+1) //LD H,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1)
LD HL,(CORE_BUFFERS.BootSector.RESERVE) LD HL,(CORE_BUFFERS.BootSector.RESERVED_SECTORS)
; ;
; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec
; LD D,(IY+_sBOOT_SEC.HIDDEN+1) ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1)
; ADD HL,DE ; ADD HL,DE
;LD (FatBuffer.FAT_FRM),HL ; first sector FAT ;LD (FatBuffer.FAT_FRM),HL ; first sector FAT
LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1
LD (FatBuffer.FAT2_XX),HL LD (FatBuffer.FAT2_XX),HL
//LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT //LD E,(IY+_sBOOT_SECTOR_PARAMS.S_P_F) ; sectors in FAT
//LD D,(IY+_sBOOT_SEC.S_P_F+1) //LD D,(IY+_sBOOT_SECTOR_PARAMS.S_P_F+1)
LD DE,(CORE_BUFFERS.BootSector.S_P_F) LD DE,(CORE_BUFFERS.BootSector.S_P_F)
@ -577,8 +567,8 @@ RD_BPB: LD C,SLOT3
AND A AND A
; CF = 0 ; CF = 0
//LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sectors //LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sectors
//LD B,(IY+_sBOOT_SEC.B_P_S+1) //LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1)
LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD BC,(CORE_BUFFERS.BootSector.B_P_S)
; RL C ; RL C
; RL B ; RL B
@ -591,19 +581,23 @@ RD_BPB: LD C,SLOT3
; LD A,C ; LD A,C
;;;; ;;;;
LD A,B LD A,B
;
RL C RL C
RLA RLA
;
RL C RL C
RLA RLA
;
RL C RL C
RLA RLA
;
LD C,A LD C,A
LD B,0 ; BC - File handels in sectors LD B,0 ; BC - File handels in sectors
;;;; ;;;;
LD (FatBuffer.F_P_S),A LD (FatBuffer.F_P_S),A
//LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel //LD E,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR) ; Number file handel
//LD D,(IY+_sBOOT_SEC.F_P_DIR+1) //LD D,(IY+_sBOOT_SECTOR_PARAMS.F_P_DIR+1)
LD DE,(CORE_BUFFERS.BootSector.F_P_DIR) LD DE,(CORE_BUFFERS.BootSector.F_P_DIR)
EX DE,HL EX DE,HL
@ -628,19 +622,19 @@ RD_BPB: LD C,SLOT3
;LD H,B ; âãâ ¢ B ­®«ì ¤®«¦¥­ ¡ëâì ;LD H,B ; âãâ ¢ B ­®«ì ¤®«¦¥­ ¡ëâì
;LD L,B ;LD L,B
;LD C,(IY+_sBOOT_SEC.B_P_S) ; Size sector ;LD C,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector
;LD B,(IY+_sBOOT_SEC.B_P_S+1) ;LD B,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1)
//LD L,(IY+_sBOOT_SEC.B_P_S) ; Size sector //LD L,(IY+_sBOOT_SECTOR_PARAMS.B_P_S) ; Size sector
//LD H,(IY+_sBOOT_SEC.B_P_S+1) //LD H,(IY+_sBOOT_SECTOR_PARAMS.B_P_S+1)
LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector LD HL,(CORE_BUFFERS.BootSector.B_P_S) ; Size sector
LD A,(CORE_BUFFERS.BootSector.S_P_C) ;!TODO FATcacheSize LD A,(CORE_BUFFERS.BootSector.S_P_C)
;!TODO FATcacheSize
;NEXTAD3 ;NEXTAD3
; .loop3: ADD HL,BC ; calc. cluster size ; .loop3: ADD HL,BC ; calc. cluster size
; DEC A ; DEC A
; JR NZ,.loop3 ; JR NZ,.loop3
;!TODO ¯à®¢¥à¨âì ¯à ¢¨«ì­® «¨ áç¨â ¥â
XOR 1 ; calc. cluster size XOR 1 ; calc. cluster size
JR Z,.loop3.end JR Z,.loop3.end
RRA RRA
@ -649,7 +643,6 @@ RD_BPB: LD C,SLOT3
JP NC,.loop3 JP NC,.loop3
.loop3.end: .loop3.end:
; ;
LD (FatBuffer.CLU_LEN),HL LD (FatBuffer.CLU_LEN),HL
EX DE,HL EX DE,HL
LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize LD HL,#3FFF ;!HARDCODE ;!TODO FATcacheSize
@ -663,6 +656,12 @@ RD_BPB: LD C,SLOT3
;ENDIF ;ENDIF
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;!TODO detect fat type by clusters!
;[ ] fat32 reset fat32 variables
LD HL,0
LD (FatBuffer.ENDCLUS_HIGH),HL
LD (FAT_Max_Cluster_H),HL
;
LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £  LD HL,CORE_BUFFERS.BootSector.ID_FAT ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
LD DE,FatBuffer.MSG LD DE,FatBuffer.MSG
LD B,3 LD B,3
@ -678,10 +677,25 @@ RD_BPB: LD C,SLOT3
INC HL INC HL
CP ' ' CP ' '
JR Z,.loop6 JR Z,.loop6
;
CP '1' CP '1'
IF _FAT32_ENABLE
JP Z,.fat1x
;[ ] fat32
CP '2'
JP NZ,DOS_X_Error.UnknownBPB JP NZ,DOS_X_Error.UnknownBPB
LD A,(HL) LD A,#46 ; #46-#26 = 32 fat type
LD HL,#0FFF
LD (FatBuffer.ENDCLUS_HIGH),HL
LD (FAT_Max_Cluster_H),HL
LD H,#FF
JR .BPB_FAT
;
ELSE
JP NZ,DOS_X_Error.UnknownBPB
ENDIF
;
.fat1x: LD A,(HL)
CP '6' ; FAT16 CP '6' ; FAT16
LD HL,#FFFF LD HL,#FFFF
JR Z,.BPB_FAT JR Z,.BPB_FAT
@ -689,8 +703,9 @@ RD_BPB: LD C,SLOT3
JP NZ,DOS_X_Error.UnknownBPB JP NZ,DOS_X_Error.UnknownBPB
LD HL,#0FFF LD HL,#0FFF
.BPB_FAT: .BPB_FAT:
LD (FatBuffer.FAT_TYP),A SUB #26 ; A-#26 = fat type (12, 16, 32)
LD (FatBuffer.ENDCLUS),HL LD (FatBuffer.FAT_TYPE),A
LD (FatBuffer.ENDCLUS_LOW),HL
;!TODO ­¥ ¨á¯®«ì§ãîâáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer ;!TODO ­¥ ¨á¯®«ì§ãîâáï §­ ç¥­¨ï ¢ëç¨á«ï¥¬ë¥ ¨ á®åà ­ï¥¬ë¥ ¢ FatBuffer
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
@ -698,8 +713,8 @@ RD_BPB: LD C,SLOT3
LD HL,0 LD HL,0
//LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track //LD C,(IY+_sBOOT_SECTOR_PARAMS.S_P_T) ; Sector per track
//LD B,(IY+_sBOOT_SEC.S_P_T+1) //LD B,(IY+_sBOOT_SECTOR_PARAMS.S_P_T+1)
LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track LD BC,(CORE_BUFFERS.BootSector.S_P_T) ; Sector per track
LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £  LD A,(CORE_BUFFERS.BootSector.HEADS) ;!!!!!   ¥á«¨ IY ¨á¯®«ì§ã¥âáï ¤«ï ¯¥à¥¬¥­­®£® BootSector, â® ¡ã¤¥â ¡ £ 
@ -712,28 +727,27 @@ RD_BPB: LD C,SLOT3
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
LD DE,(FatBuffer.DAT_FRL) LD DE,(FatBuffer.DAT_FRL)
; LD E,(IY+_sBOOT_SEC.HIDDEN) ;Hidden sec ; LD E,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN) ;Hidden sec
; LD D,(IY+_sBOOT_SEC.HIDDEN+1) ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1)
; AND A ; AND A
; SBC HL,DE ; SBC HL,DE
; EX DE,HL ; EX DE,HL
//LD L,(IY+_sBOOT_SEC.S_P_D) //LD L,(IY+_sBOOT_SECTOR_PARAMS.S_P_D)
//LD H,(IY+_sBOOT_SEC.S_P_D+1) //LD H,(IY+_sBOOT_SECTOR_PARAMS.S_P_D+1)
LD HL,(CORE_BUFFERS.BootSector.S_P_D) LD HL,(CORE_BUFFERS.BootSector.S_P_D)
LD A,H LD A,H
OR L OR L
JP NZ,.HDDSMAL JP NZ,.HDDSMAL
; ;
//LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) //LD L,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS)
//LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) //LD H,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+1)
LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS) LD HL,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_L)
//LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2)
//LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3)
LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS+2)
//LD C,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+2)
//LD B,(IY+_sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS+3)
LD BC,(CORE_BUFFERS.BootSector.BPB_BIG_TOTAL_SECTORS_H)
AND A AND A
SBC HL,DE SBC HL,DE
JP NC,.HDDBIG JP NC,.HDDBIG
@ -753,45 +767,37 @@ RD_BPB: LD C,SLOT3
RR L RR L
JP .S4C01 JP .S4C01
.S4C02: INC HL .S4C02: INC HL
LD (FAT_Max_Cluster),HL LD (FAT_Max_Cluster_L),HL
//POP IY //POP IY
; LD DE,FAT XOR A
; LD HL,0 LD H,A
; LD IX,(FAT_FRM) LD L,A
; LD B,3 LD (FatCache.Block),HL
; LD A,(DRIVE) LD (FatCache.Update),A
; LD C,Dss.DRV.Read
; RST ToDSS.DRV
; JP C,RDERR1
LD HL,0
LD (FatCache),HL
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
PUSH AF PUSH AF
XOR A XOR A
CALL READ_FAT CALL READ_FAT_TABLE
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
CALL R_CLUST CALL R_CLUST
XOR A XOR A
RET RET
;!TODO detect fat type by clusters!
.IBM_DOS: .IBM_DOS:
LD A,(CORE_BUFFERS.BootSector.ID_FORM) LD A,(CORE_BUFFERS.BootSector.DRIVE_TYPE)
CP #F0 CP #F0
JR C,DOS_X_Error.UnknownBPB JR C,DOS_X_Error.UnknownBPB
;????? ­ ¤® «¨ ¨§¬¥­¨âì? ; ID ram-¤¨áª  - #FA
// OR 2 CP #F8 ; !FIXIT ­¥ ®¡ï§ â¥«ì­® ¥á«¨ ¢¨­â, â® ­¥ FAT12
// CP #FA ; ID ram-¤¨áª 
CP #F8 ;   ¥á«¨ ­¥ F8?
;?????
LD A,'6' LD A,'6'
LD HL,#FFFF LD HL,#FFFF
JP Z,.BPB_FAT JP Z,.BPB_FAT
;
LD A,'2' LD A,'2'
LD HL,#0FFF LD HL,#0FFF
JP .BPB_FAT JP .BPB_FAT
@ -813,7 +819,8 @@ FatBuffer:
.MSG: DB 'FAT' .MSG: DB 'FAT'
.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï))) .READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
.BLOCK: DB #00 .BLOCK: DB #00
.DIR_CLU: DW #0000 .DIR_CLU_L: DW #0000
.DIR_CLU_H: DW #0000 ; fat32
.DRIVE: DB #FF .DRIVE: DB #FF
.FAT_FRM: .FAT_FRM:
.FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT .FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT
@ -823,15 +830,19 @@ FatBuffer:
.F_P_S: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥ .F_P_S: DB #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
.DIR_S_S: DB #00 ; DIR_SEC_SIZE .DIR_S_S: DB #00 ; DIR_SEC_SIZE
.DAT_FRL: DW #0000 ; MSD_DAT_SEC low .DAT_FRL: DW #0000 ; MSD_DAT_SEC low
;.DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï .DAT_FRH: DW #0000 ; MSD_DAT_SEC high ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï
.CLU_LEN: .CLU_LEN:
.B_P_C: DW #0000 ; CLUSTER_LEN .B_P_C: DW #0000 ; CLUSTER_LEN
.C_P_B: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï? .C_P_B: DB #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) .FAT_TYPE: DB #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ;!TODO fat32
.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï? .S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
.ENDCLUS: DW #FFFF .ENDCLUS_LOW: DW #FFFF
.ENDCLUS_HIGH: DW #FFFF ; !TODO for fat32
; ;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ;
INCLUDE "FAT12_16.ASM" INCLUDE "FAT12_16.ASM"
IF _FAT32_ENABLE
INCLUDE "FAT32.ASM"
ENDIF
; ;

View File

@ -14,15 +14,26 @@
;--------------------------------------------------------------- ;---------------------------------------------------------------
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï ; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
R_CLUST LD HL,#0001 ; [ ] fat32
R_CLUST:
LD HL,#0001
LD (G_CLUST.num),HL LD (G_CLUST.num),HL
RET RET
.FAT32: WORD 0
; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à ; ­ ©â¨ ¯¥à¢ë© ᢮¡®¤­ë© ª« áâ¥à
; [ ] fat32
G_CLUST: G_CLUST:
.num+1: LD HL,#0001 .num+1: LD HL,#0001
.loop: INC HL ; ­®¬¥à ª« áâ¥à  .loop: INC HL ; ­®¬¥à ª« áâ¥à 
CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  ; [x] fat32
IF _FAT32_ENABLE
LD A,(FatBuffer.FAT_TYPE)
XOR 32
CALL Z,SET_FAT32.CHECK_INC_HIGH_CLUSTER
ENDIF
;
CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
CP DSS_Error.sys.DISK_FULL CP DSS_Error.sys.DISK_FULL
SCF SCF
RET Z ; ®è¨¡ª  ? RET Z ; ®è¨¡ª  ?
@ -30,10 +41,11 @@ G_CLUST:
OR E OR E
JR NZ,.loop JR NZ,.loop
LD (G_CLUST.num),HL LD (G_CLUST.num),HL
XOR A ; XOR A
RET RET
; HL - CLUSTER ; HL - CLUSTER
; [ ] fat32
INC_FAT: INC_FAT:
PUSH HL PUSH HL
CALL G_CLUST CALL G_CLUST
@ -41,22 +53,21 @@ INC_FAT:
RET C RET C
; ;
PUSH HL PUSH HL
PUSH HL ; PUSH HL
EX DE,HL ; hl=­®¬¥à ª« áâ¥à  ; EX DE,HL ; hl=­®¬¥à ª« áâ¥à 
.loop: CALL R_F_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  ; .loop: CALL READ_FROM_FAT ; ¯à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; EX DE,HL
; JR NC,.loop ; ­¥ ª®­¥æ 楯®çª¨
EX DE,HL EX DE,HL
JR NC,.loop ; ­¥ ª®­¥æ 楯®çª¨ ; POP DE ; ­®¬¥à ª« áâ¥à 
EX DE,HL CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP DE ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!FIXIT <­¥â ª®­âà®«ï ®è¨¡ª¨> ;!FIXIT <­¥â ª®­âà®«ï ®è¨¡ª¨>
; ;
;
POP HL POP HL
LD DE,(FatBuffer.ENDCLUS) ; ­®¬¥à ª« áâ¥à  LD DE,(FatBuffer.ENDCLUS_LOW) ; ­®¬¥à ª« áâ¥à 
CALL W_T_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  CALL WRITE_TO_FAT ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WR_FAT? ;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;CALL WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª ;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
; ;
AND A AND A
RET RET
@ -65,66 +76,74 @@ INC_FAT:
;----------------------------------------------------------- ;-----------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à  ; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl = ­®¬¥à ª« áâ¥à  ; ¢å®¤: hl = ­®¬¥à ª« áâ¥à 
; de = <E28099>˜…… á«®¢® ­®¬¥à  ª« áâ¥à  (⮫쪮 ¤«ï FAT32)
; ¢ë室: hl = ­®¬¥à ª« áâ¥à  ; ¢ë室: hl = ­®¬¥à ª« áâ¥à 
; de = ­®¬¥à á«¥¤. ª« áâ¥à  ; de = ­®¬¥à á«¥¤. ª« áâ¥à  (¥á«¨ 0, â® ª« áâ¥à hl ᢮¡®¤¥­)
; CF - ª®­¥æ 楯®çª¨ ; CF - ª®­¥æ 楯®çª¨
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb ;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb
;----------------------------------------------------------- ;-----------------------------------------------------------
R_F_FAT: ;[ ] fat32
EX DE,HL READ_FROM_FAT:
LD HL,(FAT_Max_Cluster) ;[x] fat32
AND A PUSH DE
LD A,(FatBuffer.FAT_TYPE)
XOR 32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD HL,(FAT_Max_Cluster_H) ; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
JP .high
;
.low: EX DE,HL
LD HL,(FAT_Max_Cluster_L)
.high: ; 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
;[x] fat32
POP DE
;
RET C RET C
SET_PAGE_X FATPAGE SET_PAGE_X FATPAGE
PUSH HL PUSH HL
PUSH AF PUSH AF
LD A,(FatBuffer.FAT_TYP) LD A,(FatBuffer.FAT_TYPE)
CP "2" ; fat12 CP 16 ; fat16
JR Z,R_F_F12 JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à ; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
R_F_F16: .FAT16: CALL GET_FAT16_CELL
CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à  LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL INC HL
LD D,(HL) LD D,(HL)
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
;!TODO #FFF7 - ª« áâ¥à á ª®áïªç­ë¬¨ ᥪâ®à ¬¨ ;!TODO #FFF7 - ª« áâ¥à á ª®áïç­ë¬¨ ᥪâ®à ¬¨
LD HL,#FFEF ;!HARDCODE LD HL,#FFEF ;!HARDCODE
XOR A ; DssErr.sys.NO_ERROR XOR A ; DssErr.sys.NO_ERROR
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL POP HL
RET RET
; ;
R_F_F12: .FAT12: CALL GET_FAT12_CELL
CALL GET_FAT12_CELL
LD E,(HL) LD E,(HL)
INC HL INC HL
LD D,(HL) LD D,(HL)
JR C,R_F_F01 JR C,.Correct_1
LD A,D LD A,D
AND #0F AND #0F
LD D,A LD D,A
JP R_F_F02 JR .Correct_2
; ;
R_F_F01: .Correct_1:
LD A,E LD A,E
AND #F0 AND #F0
RR D ; ¢¯à ¢® ­  4 ¡¨âa DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RRA
RR D
RRA
RR D
RRA
RR D RR D
RRA RRA
EDUP
LD E,A LD E,A
R_F_F02: .Correct_2:
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
LD HL,#0FEF LD HL,#0FEF
@ -132,20 +151,21 @@ R_F_F02:
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL POP HL
RET RET
.FAT32: ; [ ] fat32
CALL GET_FAT32_CELL
DI
HALT
;----------------------------------------------------------- ;-----------------------------------------------------------
; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à  ; ‡ ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
; ¢å®¤: de = ­®¬¥à ª« áâ¥à  ; ¢å®¤: hl = ­®¬¥à ª« áâ¥à  ¢ ª®â®àë© § ¯¨á âì
; hl = ? ­®¬¥à ¯¥à¢®£® ª« áâ¥à  ; de = ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; ¢ë室: hl = ? ­®¬¥à á«¥¤. ª« áâ¥à  ; ¢ë室: â ª®© ¦¥ ª ª ¨ ¢å®¤
; de = ­®¬¥à ª« áâ¥à 
; in: HL - CLUSTER
; out: DE - (CLUSTER)
;----------------------------------------------------------- ;-----------------------------------------------------------
W_T_FAT: ; [ ] fat32
WRITE_TO_FAT:
PUSH DE PUSH DE
EX DE,HL EX DE,HL
LD HL,(FAT_Max_Cluster) LD HL,(FAT_Max_Cluster_L)
AND A AND A
SBC HL,DE SBC HL,DE
EX DE,HL EX DE,HL
@ -161,30 +181,12 @@ W_T_FAT:
;LD A,1 ;LD A,1
;LD (FatCache.Update),A ;LD (FatCache.Update),A
; ;
LD A,(FatBuffer.FAT_TYP) LD A,(FatBuffer.FAT_TYPE)
CP "2" ; fat12 CP 16 ; fat16
JR Z,W_T_F12 JR C,.FAT12
W_T_F16: JR NZ,.FAT32
PUSH DE ;
; LD A,H .FAT16: PUSH DE
; LD B,H
; ;AND #0F
; AND FAT_CACHE.Size_Mask_16
; LD H,A
; LD A,B
; ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
; DUP FAT_CACHE.Degree_16
; RRCA
; EDUP
; ;AND #0F
; AND FAT_CACHE.Part_Mask_16
; ;
; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ;!HARDCODE fat16 - à §¬¥à § ¯¨á¨ FAT
; LD BC,(FatCache) ; C - BLOCK FAT IN CASH
; CP C
; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT
; LD DE,FATPAGE.cache
; ADD HL,DE ; ­  ï祩ªã FAT
CALL GET_FAT16_CELL CALL GET_FAT16_CELL
POP DE POP DE
LD (HL),E ; á®åà. ¢ ª¥è¥ FAT-  LD (HL),E ; á®åà. ¢ ª¥è¥ FAT- 
@ -194,18 +196,17 @@ W_T_F16:
POP HL POP HL
OUT (SLOT3),A OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD ; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
LD A,1
LD (FatCache.Update),A
;
XOR A XOR A
INC A
LD (FatCache.Update),A
; CF = 0
RET RET
; ;
; fat12 .FAT12: ;!FIXIT ¯¥à¥¤¥« âì ­  ¯¥à¥¬¥­­ë¥ FAT_CACHE
W_T_F12: ;!FIXIT ¯¥à¥¤¥« âì ­  ¯¥à¥¬¥­­ë¥ FAT_CACHE
PUSH DE PUSH DE
CALL GET_FAT12_CELL CALL GET_FAT12_CELL
POP DE POP DE
JR C,W_T_F01 ; ­®¬¥à ­¥çñâ­ë© JR C,.Correct_1 ; ­®¬¥à ­¥çñâ­ë©
LD (HL),E LD (HL),E
INC HL INC HL
LD A,(HL) LD A,(HL)
@ -216,30 +217,19 @@ W_T_F12: ;!FIXIT
POP HL POP HL
OUT (SLOT3),A OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD ; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
LD A,1 XOR A
INC A
LD (FatCache.Update),A LD (FatCache.Update),A
; ; CF = 0
AND A
RET RET
; .Correct_1:
W_T_F01:; ¢«¥¢® ­  4 ¡¨âa ; ¢«¥¢® ­  4 ¡¨âa
;SLA E EX DE,HL
;LD A,E ADD HL,HL
;RL D ADD HL,HL
;RLA ADD HL,HL
;RL D ADD HL,HL
;RLA EX DE,HL
;RL D
;RLA
;RL D
;LD E,A
;
ex de,hl
add hl,hl
add hl,hl
add hl,hl
add hl,hl
ex de,hl
; ;
LD A,(HL) LD A,(HL)
AND #0F AND #0F
@ -251,26 +241,34 @@ W_T_F01:;
POP HL POP HL
OUT (SLOT3),A OUT (SLOT3),A
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD ; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
LD A,1 XOR A
INC A
LD (FatCache.Update),A LD (FatCache.Update),A
;
AND A
RET
; LD A,1
; LD (FatCache.Update),A
; AND A
; CF = 0
RET
.FAT32: ; [ ] fat32
DI
HALT
;RX01 ;RX01
;RE_FAT: ;RE_FAT:
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-  ; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
; A - NEW FAT BLOCK ; A - NEW FAT BLOCK
READ_FAT: READ_FAT_TABLE:
PUSH HL PUSH HL
PUSH AF PUSH AF
LD A,(FatCache.Update) LD A,(FatCache.Update)
OR A OR A
CALL NZ,WR_FAT.Start CALL NZ,WRITE_FAT_TABLE.Start
POP AF POP AF
LD L,A LD L,A
LD H,0 XOR A
LD (FatCache),HL LD H,A ;!FIXIT fat32 - ã ä â32 ¡«®ª®¢ ¬®¦¥â ¡ëâì ¢ «®¬
LD (FatCache.Block),HL
LD (FatCache.Update),A
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT ;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree_16 DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2 ADD HL,HL ;x2
@ -284,7 +282,7 @@ READ_FAT:
;LD IX,0 ;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à  ;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
; ;
LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32 LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING
LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª  LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
@ -293,15 +291,17 @@ READ_FAT:
RET RET
; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª ; <20>®¤ª«îç¨âì ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
WR_FAT: SET_PAGE_X FATPAGE WRITE_FAT_TABLE:
SET_PAGE_X FATPAGE
PUSH AF PUSH AF
CALL .Start ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª CALL .Start ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
RET RET
; ‡ ¯¨áì ª¥è  (¢á¥£®?) FAT-  ­  ¤¨áª ; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD HL,(FatCache) .Start: LD HL,(FatCache.Block)
LD H,0 ;
;LD H,0
;FAT BLOCK * 16 = SECTOR OF FAT ;FAT BLOCK * 16 = SECTOR OF FAT
DUP FAT_CACHE.Degree_16 DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2 ADD HL,HL ;x2
@ -348,14 +348,17 @@ WR_FAT: SET_PAGE_X FATPAGE
LD DE,(FatBuffer.FAT2_XX) LD DE,(FatBuffer.FAT2_XX)
ADD HL,DE ADD HL,DE
EX DE,HL EX DE,HL
;
LD XH,D LD XH,D
LD XL,E LD XL,E
;LD IX,0 ;
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à  LD HL,0
; CF = ADD HL,DE
; [ ] fat32 - ¢â®à ï â ¡«¨æ  ä â ¬®¦¥â ¦¥ ã¥å âì ¤ «ìè¥ 16-¡¨â «®£¨ç¥áª®£® ᥪâ®à ?
IF _FAT32_ENABLE
RL L
ENDIF
; ;
LD DE,FATPAGE.cache LD DE,FATPAGE.cache
LD HL,0
LD A,(FatBuffer.DRIVE) LD A,(FatBuffer.DRIVE)
LD C,Dss.DRV.Write LD C,Dss.DRV.Write
RST ToDSS.DRV RST ToDSS.DRV
@ -386,9 +389,9 @@ GET_FAT16_CELL:
AND FAT_CACHE.Part_Mask_16 AND FAT_CACHE.Part_Mask_16
; ;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FatCache) ; C - BLOCK FAT IN CASH LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
CP C CP C
CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT-  LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT ADD HL,DE ; ­  ï祩ªã FAT
RET RET
@ -399,24 +402,21 @@ GET_FAT16_CELL:
GET_FAT12_CELL: GET_FAT12_CELL:
LD D,H LD D,H
LD E,L LD E,L
RR H SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
PUSH AF ; á®åà. ä« £ PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5 ADD HL,DE ; CLUSTER * 1.5
; ;
;IF COMPILE_UNUSED_CODE IF FAT_CACHE.Size < #2000
;!FIXIT ®¯â¨¬¨§¨à®¢ âì ;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,H LD A,H
LD B,H LD B,H
; ;
AND #1F AND #1F
;AND FAT_CACHE.Size_Mask_16 ;AND FAT_CACHE.Size_Mask_16
; ;
LD H,A LD H,A
LD A,B LD A,B
; ;
RLCA RLCA
RLCA RLCA
@ -427,11 +427,10 @@ GET_FAT12_CELL:
AND #07 AND #07
;AND FAT_CACHE.Part_Mask_16 ;AND FAT_CACHE.Part_Mask_16
; ;
LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH
LD BC,(FatCache) ; C - BLOCK FAT IN CASH
CP C CP C
CALL NZ,READ_FAT ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT-  CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
;ENDIF ENDIF
; ;
LD DE,FATPAGE.cache LD DE,FATPAGE.cache
ADD HL,DE ADD HL,DE
@ -441,8 +440,8 @@ GET_FAT12_CELL:
; in: HL - CLUSTER ; in: HL - CLUSTER
; out: HL:IX - SECTOR ; out: HL:IX - SECTOR
NSECTOR: NSECTOR:;[x] fat32
LD DE,0 ;!FIXIT for FAT32 LD DE,(FAT_Max_Cluster_H)
DEC HL DEC HL
DEC HL DEC HL
LD A,(CORE_BUFFERS.BootSector.S_P_C) LD A,(CORE_BUFFERS.BootSector.S_P_C)
@ -470,53 +469,58 @@ NSECTOR:
RET RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
;[ ] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
MACRO _GetSavedCluster exit_to MACRO _GetSavedCluster exit_to
LD E,(IY+_sFM.KnownCluster_L) LD E,(IY+_sFM.KnownCluster_L)
LD D,(IY+_sFM.KnownCluster_H) LD D,(IY+_sFM.KnownCluster_L+1)
LD A,D LD A,D
INC B
OR E OR E
JR Z,exit_to JR Z,exit_to
DEC B
; ;
PUSH DE PUSH DE
PUSH HL PUSH HL
PUSH BC PUSH BC
LD E,(IY+_sFM.KnownOffset_L) LD E,(IY+_sFM.KnownOffset_L)
LD D,(IY+_sFM.KnownOffset_H) LD D,(IY+_sFM.KnownOffset_L+1)
LD A,D LD A,D
OR E OR E
JR Z,.noOptimization_1 JR Z,.noOptimization_1
; ;
POP HL POP HL
AND A
SBC HL,DE SBC HL,DE
JR C,.noOptimization_2 JR C,.noOptimization_2
; ;
LD C,L LD C,L
LD B,H LD B,H
POP HL
POP DE POP DE
POP HL
; ;
EX DE,HL INC B
JP exit_to JP exit_to
.noOptimization_1: .noOptimization_1:
POP BC POP BC
.noOptimization_2: .noOptimization_2:
POP HL POP HL
POP DE POP DE
INC B
JP exit_to JP exit_to
ENDM ENDM
;
;[ ] fat32
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
MACRO _SaveGetedCluster MACRO _SaveGetedCluster
LD (IY+_sFM.KnownCluster_L),L LD (IY+_sFM.KnownCluster_L),L
LD (IY+_sFM.KnownCluster_H),H LD (IY+_sFM.KnownCluster_L+1),H
POP BC POP BC
LD (IY+_sFM.KnownOffset_L),C LD (IY+_sFM.KnownOffset_L),C
LD (IY+_sFM.KnownOffset_H),B LD (IY+_sFM.KnownOffset_L+1),B
ENDM ENDM
;; ;;
BLOK_RD.ECL2: BLOCK_READ.ECL2:
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
POP BC POP BC
; ;
@ -528,19 +532,20 @@ BLOK_RD.ECL2:
;READ SECTORS OF FILE ;READ SECTORS OF FILE
;HL:DE - FP (in sectors) ;HL:DE - FP (in sectors)
; B - Amount sectors ; B - Amount sectors
BLOK_RD: PUSH BC BLOCK_READ:
PUSH BC
LD (READ.PointerOnBuffer),IX LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER
LD C,A LD C,A
LD B,0 ;!FIXIT LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK ;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV_for_SPC CALL DIV_for_SPC
;!FIXIT ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - à §¤¥« ­¥ ¡®«ìè¥ 2Gb ; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb
LD B,XH LD B,XH
LD C,XL LD C,XL
PUSH HL ;RESIDUE PUSH HL ;RESIDUE
LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER
LD H,(IY+_sFM.ST_CLUSTER+1) LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,H LD A,H
OR L OR L
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
@ -551,15 +556,18 @@ BLOK_RD: PUSH BC
_GetSavedCluster .enter_loop1 _GetSavedCluster .enter_loop1
; ;
.loop1: PUSH BC .loop1: PUSH BC
CALL R_F_FAT CALL READ_FROM_FAT
POP BC POP BC
JR C,.ECL2 ;RY01 JR C,.ECL2 ;RY01
EX DE,HL EX DE,HL
DEC BC ; DEC BC
.enter_loop1: .enter_loop1:
LD A,B ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å ; LD A,B ; - ᬥ饭¨¥ ¢­ãâਠ䠩«  ¢ ª« áâ¥à å
OR C ; OR C
JR NZ,.loop1 ; JR NZ,.loop1
INC B
DEC BC
DJNZ .loop1
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
_SaveGetedCluster _SaveGetedCluster
; ;
@ -619,7 +627,7 @@ BLOK_RD: PUSH BC
.BLOKRD7: .BLOKRD7:
EX DE,HL EX DE,HL
PUSH BC PUSH BC
CALL R_F_FAT CALL READ_FROM_FAT
POP BC POP BC
JR C,.ECL1 ;RY01 JR C,.ECL1 ;RY01
EX DE,HL EX DE,HL
@ -674,12 +682,12 @@ BLOK_WR:
LD B,0 LD B,0
;HL:DE / BC => DE:IX HL-OSTATOK ;HL:DE / BC => DE:IX HL-OSTATOK
CALL DIV_for_SPC CALL DIV_for_SPC
; [ ] fat32. ¤ «¥¥ § â®çª  ­  â®, çâ® ¢ DE ¢á¥£¤  0 - ä ©« ­¥ ¡®«ìè¥ 2Gb
LD B,XH LD B,XH
LD C,XL LD C,XL
PUSH HL ;RESIDUE PUSH HL ;RESIDUE
LD L,(IY+_sFM.ST_CLUSTER) ;START CLUSTER LD L,(IY+_sFM.FS_REC.FIRST_CLUSTER_L) ;START CLUSTER
LD H,(IY+_sFM.ST_CLUSTER+1) LD H,(IY+_sFM.FS_REC.FIRST_CLUSTER_L+1)
LD A,H LD A,H
OR L OR L
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
@ -690,35 +698,40 @@ BLOK_WR:
PUSH BC PUSH BC
CALL G_CLUST CALL G_CLUST
JP C,.Error JP C,.Error
LD (IY+_sFM.ST_CLUSTER),L LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L),L
LD (IY+_sFM.ST_CLUSTER+1),H LD (IY+_sFM.FS_REC.FIRST_CLUSTER_L+1),H
LD DE,(FatBuffer.ENDCLUS) LD DE,(FatBuffer.ENDCLUS_LOW)
CALL W_T_FAT CALL WRITE_TO_FAT
PUSH HL PUSH HL
;!TEST ;!TODO 2/12/23 [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WR_FAT? ;!TEST ;!TODO 2/12/23 [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;CALL WR_FAT ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª ;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
; ;
POP HL POP HL
POP BC POP BC
INC B
JP .WR2 JP .WR2
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
.GetSavedCluster: .GetSavedCluster:
_GetSavedCluster .WR2 _GetSavedCluster .WR2
; ;
.loop: PUSH BC .loop: PUSH BC
CALL R_F_FAT CALL READ_FROM_FAT
JR NC,.WRB JR NC,.WRB
PUSH HL PUSH HL
CALL INC_FAT CALL INC_FAT
POP HL POP HL
JP C,.Error JP C,.Error
CALL R_F_FAT CALL READ_FROM_FAT
.WRB: POP BC .WRB: POP BC
EX DE,HL EX DE,HL
; DEC BC
.WR2:
; LD A,B
; OR C
; JR NZ,.loop
INC B
DEC BC DEC BC
.WR2: LD A,B DJNZ .loop
OR C
JR NZ,.loop
;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE ;[x] GET/SAVE CLUSTER NUMBER BEFORE/AFTER READ/WRITE
_SaveGetedCluster _SaveGetedCluster
@ -778,13 +791,13 @@ BLOK_WR:
RET Z RET Z
.WR7: EX DE,HL .WR7: EX DE,HL
PUSH BC PUSH BC
CALL R_F_FAT CALL READ_FROM_FAT
JR NC,.WR9 JR NC,.WR9
PUSH HL PUSH HL
CALL INC_FAT CALL INC_FAT
POP HL POP HL
JR C,.ErrorFull JR C,.ErrorFull
CALL R_F_FAT CALL READ_FROM_FAT
.WR9: POP BC .WR9: POP BC
EX DE,HL EX DE,HL
PUSH HL PUSH HL
@ -825,10 +838,11 @@ BLOK_WR:
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
FatCache: WORD #0000 FatCache: ;WORD #0000
.Block EQU FatCache .Block WORD #0000 ;EQU FatCache
.Update EQU FatCache+1 .Update BYTE 0 ;EQU FatCache+1
FAT_Max_Cluster: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) FAT_Max_Cluster_L: WORD #0FF0 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
FAT_Max_Cluster_H: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;//MODULE: FAT_X ;//MODULE: FAT_X
;[END] ;[END]
@ -838,7 +852,7 @@ FAT_Max_Cluster: WORD #0FF0 ;
;; HL - CLUSTER ;; HL - CLUSTER
;; DE - (CLUSTER) ;; DE - (CLUSTER)
; ;
;R_F_FAT EX DE,HL ;READ_FROM_FAT EX DE,HL
; LD HL,(FAT_Max_Cluster) ; LD HL,(FAT_Max_Cluster)
; AND A ; AND A
; SBC HL,DE ; SBC HL,DE
@ -859,7 +873,7 @@ FAT_Max_Cluster: WORD #0FF0 ;
; DEC A ; DEC A
; LD BC,(FatCache) ; A - ELEMENT OF CASH ; LD BC,(FatCache) ; A - ELEMENT OF CASH
; CP C ; CP C
; CALL NZ,READ_FAT ; CALL NZ,READ_FAT_TABLE
; LD DE,FAT ; LD DE,FAT
; ADD HL,DE ; ADD HL,DE
; LD E,(HL) ; LD E,(HL)
@ -895,7 +909,7 @@ FAT_Max_Cluster: WORD #0FF0 ;
; ;
; ;
;WR_FAT LD HL,(FatCache) ;WRITE_FAT_TABLE LD HL,(FatCache)
; LD H,0 ; LD H,0
; LD (FatCache),HL ; LD (FatCache),HL
; LD E,L ; LD E,L

138
DSS/FS/FAT/FAT32.asm Normal file
View File

@ -0,0 +1,138 @@
;!TODO fat32
;=======================================================================
;BPB
;LD (FatBuffer.FAT2_XX),HL
;LD (FatBuffer.DIR_FRL),HL ; first sector DIR
;BPB32
;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 <20>¥à¢ë© ª« áâ¥à ª®à­¥¢®£® ª â «®£  (®¡ëç­® 2) 4 ¡ ©â 
;FAT Max Cluster
;LD (FAT_Max_Cluster_L),HL
;=======================================================================
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; ª®áâ뫨
MODULE SET_FAT32
; ‚•Ž„: HL - ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¯®á«¥ ¨­ªà¥¬¥­â 
; ‚›•Ž„: HL - ª ª ¨ ¢å®¤
; DE - áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¯®á«¥ ¨­ªà¥¬¥­â 
CHECK_INC_HIGH_CLUSTER:
LD DE,(R_CLUST.FAT32)
;
LD A,H
OR L
RET NZ
;
INC DE
; !FIXIT ¯à®¢¥àïâì ¯¥à¥¯®«­¥­¨¥?
RET
ENDMODULE
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;¢å®¤: DE:HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL:
;[ ] fat32
DI
HALT
LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FatCache.Block) ; BC - BLOCK FAT IN CASH
CP C
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
/*
; <20>à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
; A - NEW FAT BLOCK
READ_FAT32:
PUSH HL
PUSH AF
LD A,(FatCache.Update)
OR A
CALL NZ,WRITE_FAT_TABLE.Start
POP AF
LD L,A
XOR A
LD H,A ;!FIXIT fat32
LD (FatCache.Block),HL
LD (FatCache.Update),A
;FAT BLOCK ^ FAT_CACHE.Degree = SECTOR OF FAT
DUP FAT_CACHE.Degree_16
ADD HL,HL ;x2
EDUP
LD DE,(FatBuffer.FAT_FRM)
ADD HL,DE
EX DE,HL
;
LD XH,D
LD XL,E
;LD IX,0
;ADD IX,DE ; ­®¬¥à «®£. ᥪâ®à 
;
LD HL,0 ; áâ. à §àï¤ ; HL:IX - SECTOR FAT FOR READING ;!TODO FAT32
LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
RST ToDSS.DRV
POP HL
RET
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL:
LD A,H
LD B,H
;AND #0F
AND FAT_CACHE.Size_Mask_16
LD H,A
LD A,B
; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES)
DUP FAT_CACHE.Degree_16
RRCA
EDUP
;AND #0F
AND FAT_CACHE.Part_Mask_16
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
LD BC,(FatCache.Block) ; C - BLOCK FAT IN CASH
CP C
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
R_F_F16:
CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
POP AF
OUT (SLOT3),A
;!TODO #FFF7 - ª« áâ¥à á ª®áïªç­ë¬¨ ᥪâ®à ¬¨
LD HL,#FFEF ;!HARDCODE
XOR A ; DssErr.sys.NO_ERROR
SBC HL,DE ; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
POP HL
RET
*/
;

75
DSS/Kernel_Panic.asm Normal file
View File

@ -0,0 +1,75 @@
MACRO PRINT_LINE_KERNEL_PANIC txtString, txtStringSize, txtColor, coordY
LD HL,txtString
LD DE,#A000
LD BC,txtStringSize
LD A,C
LDIR
;
LD DE,coordY*256 + (80-txtStringSize)/2 ;X=0, Y=15
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
LD HL,#A000
LD DE,0*256 + txtColor
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
ENDM
;-----------------------[]
; HL - á®®¡é¥­¨¥
; E - ª®®à¤¨­ â  X ­  ⥪á⮢®¬ íªà ­¥
; BC - ¤«¨­  á®®¡é¥­¨ï
KERNEL_PANIC:
DI
;
PUSH DE
PUSH HL
PUSH BC
;
LD E,1
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS
;
LD HL,#2050
LD DE,0
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
RST ToBIOS
;
LD A,1
OUT (SCREEN_SWITCH),A ; set scr-2
;
PRINT_LINE_KERNEL_PANIC .kernel_panic, .kernel_panic.size, +(COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.RED), 13
PRINT_LINE_KERNEL_PANIC .press_CAD, .press_CAD.size, +(COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE), 18
;
POP BC
POP HL
LD DE,#A000
LD A,C
LDIR
;
POP DE
LD D,15
LD C,BIOS.LP_SET_PLACE
RST ToBIOS
;
LD HL,#A000
LD DE,0*256 + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE
LD B,A
LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS
;
.loop: DI
HALT
JR .loop
.print_line:
RET
;
.kernel_panic: DZ "KERNEL PANIC!"
.kernel_panic.size EQU $-.kernel_panic
;
.press_CAD: DZ "Press Ctrl+Alt+Del or RESET."
.press_CAD.size EQU $-.press_CAD
;-----------------------[]

View File

@ -112,7 +112,9 @@ ReScanDRV:
_CALC_DEVICE_ENTRY OLD_TABLES.DEVICE _CALC_DEVICE_ENTRY OLD_TABLES.DEVICE
LD A,(HL) LD A,(HL)
INC A INC A
JP Z,ERROR_BOOTDRV_DIES SCF
;JP Z,ERROR_BOOTDRV_DIES
RET Z
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
; 6. § ¬¥­ï¥¬ ­®¢ë¥ â ¡«¨æë ­  ¬®¤¨ä¨æ¨à®¢ ­­ë¥ áâ àë¥ ; 6. § ¬¥­ï¥¬ ­®¢ë¥ â ¡«¨æë ­  ¬®¤¨ä¨æ¨à®¢ ­­ë¥ áâ àë¥
@ -127,6 +129,7 @@ ReScanDRV:
;7. ¢ë室 ;7. ¢ë室
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
LD A,(DRV_PAGE.LDRIVE) LD A,(DRV_PAGE.LDRIVE)
AND A
RET RET
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -;
@ -274,42 +277,42 @@ Find_Record:
;-----------------------[] ;-----------------------[]
;-----------------------[] ;-----------------------[]
ERROR_BOOTDRV_DIES: ; ERROR_BOOTDRV_DIES:
DI ; DI
LD E,1 ; LD E,1
LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default ; LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default
RST ToBIOS ; RST ToBIOS
; ; ;
LD HL,#2050 ; LD HL,#2050
LD DE,0 ; LD DE,0
LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN ; LD BC,256*COLORS.CGA.PAPER.BLUE + BIOS.LP_CLS_WIN
RST ToBIOS ; RST ToBIOS
; ; ;
LD A,1 ; LD A,1
OUT (SCREEN_SWITCH),A ; set scr-2 ; OUT (SCREEN_SWITCH),A ; set scr-2
; ; ;
LD HL,.ERROR_MSG ; LD HL,.ERROR_MSG
LD DE,#A000 ; LD DE,#A000
LD BC,.ERROR_MSG.size ; LD BC,.ERROR_MSG.size
LD A,C ; LD A,C
LDIR ; LDIR
; ; ;
LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16 ; LD DE,16*256 + (80-.ERROR_MSG.size)/2 ;X=0, Y=16
LD C,BIOS.LP_SET_PLACE ; LD C,BIOS.LP_SET_PLACE
RST ToBIOS ; RST ToBIOS
; ; ;
LD HL,#A000 ; LD HL,#A000
LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE ; LD DE,0*256 + COLORS.CGA.FLASH + COLORS.CGA.PAPER.BLUE + COLORS.CGA.INC.WHITE
LD B,A ; LD B,A
LD C,BIOS.LP_PRINT_LINE3 ; LD C,BIOS.LP_PRINT_LINE3
RST ToBIOS ; RST ToBIOS
; ; ;
.loop: DI ; .loop: DI
HALT ; HALT
JR .loop ; JR .loop
; ; ;
.ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET." ; .ERROR_MSG: DZ "Kernel panic! Boot disk lost. Press Ctrl+Alt+Del or RESET."
.ERROR_MSG.size EQU $-.ERROR_MSG ; .ERROR_MSG.size EQU $-.ERROR_MSG
;-----------------------[] ;-----------------------[]
@ -449,7 +452,7 @@ KILL_FM:;
CP C CP C
JR NZ,.skip JR NZ,.skip
XOR A XOR A
LD (IY+_sFM.NAME),A ; £à®å ¥¬ ¬ ­¨¯ã«ïâ®à LD (IY+_sFM.FS_REC.NAME),A ; £à®å ¥¬ ¬ ­¨¯ã«ïâ®à
.skip: DJNZ .loop_fm .skip: DJNZ .loop_fm
; ;
POP AF POP AF

View File

@ -171,7 +171,7 @@
; IDE0 EQU #0C1C0 ; IDE0 EQU #0C1C0
; IDE1 EQU #0C1C8 ; IDE1 EQU #0C1C8
PART EQU #C000 PARTITION_BUFFER _sBOOT_SECTOR = #C000 ; EQU #C000 _sBOOT_SECTOR
HDDRIVE INC C HDDRIVE INC C
DEC C DEC C
@ -245,7 +245,7 @@ NX_DVCI: PUSH BC
LD C,BIOS.DRV_DETECT LD C,BIOS.DRV_DETECT
RST ToBIOS RST ToBIOS
;JR C,.NO_DRIVE ;JR C,.NO_DRIVE
CALL NC,PARTIT CALL NC,DEFINE_PARTITIONS.BEGIN
POP BC POP BC
INC C INC C
JR C,NX_DVCI JR C,NX_DVCI
@ -515,35 +515,39 @@ CHECKH: PUSH IY
POP IY POP IY
RET RET
;----------------- ;------------------------------[ PARTIT ]------------------------------;
EASYDOS: DEFINE_PARTITIONS:
MEDIDOS: .FAT32_DOS:
HIGHDOS: .EASYDOS:
LD E,(IY+08) .MEDIDOS:
LD D,(IY+09) .HIGHDOS:
LD L,(IY+10) LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD H,(IY+11) LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD IX,(CURSECL) LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
LD IX,(CURRENT_SECTOR_L)
ADD IX,DE ADD IX,DE
LD DE,(CURSECH) 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
LD IX,(OFFSECT) LD IX,(OFFSECT)
LD (IX+LOGDRV.SECTOR_OFFSET+0),E ;BPB SECTOR 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+12) LD E,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 0)
LD D,(IY+13) LD D,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 1)
LD L,(IY+14) LD L,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 2)
LD H,(IY+15) LD H,(IY + _sMBR_PARTITION_RECORD.Size_LBA + 3)
LD (IX+LOGDRV.SIZE_IN_SECTORS+0),E ;SIZE DISK ;SIZE DISK
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
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 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
@ -551,7 +555,7 @@ ExtendedPartitionFlag+1:
; ;
POP BC POP BC
PUSH BC PUSH BC
LD A,4 ;!HARDCODE MBR: 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
@ -568,32 +572,29 @@ ExtendedPartitionFlag+1:
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 NXTPART JP .NextPartition
; NXTPART:
; LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry
; ADD IY,DE
; POP BC
; DJNZ DOSAGA
; AND A
; RET
; ;
NOEXTDS: .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
CP PartitionSysTypes.FAT16_32Mb CP PartitionSysTypes.FAT16_32Mb
JR Z,MEDIDOS JR Z,.MEDIDOS
CP PartitionSysTypes.FAT12 CP PartitionSysTypes.FAT12
JR Z,EASYDOS JR Z,.EASYDOS
;[ ] fat32
CP PartitionSysTypes.FAT32
JP Z,.FAT32_DOS
CP PartitionSysTypes.FAT32_LBA
JP Z,.FAT32_DOS
;
CP PartitionSysTypes.Win_Ext_LBA CP PartitionSysTypes.Win_Ext_LBA
JR Z,SUBLEV JR Z,.SubLevel
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¤¥â¥ªâ  ;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¤¥â¥ªâ 
;OR A ;PartitionSysTypes.Empty ;OR A ;PartitionSysTypes.Empty
;JR NZ,NXTPART ;JR NZ,NXTPART
JR NXTPART ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï JR .NextPartition ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;POP BC ; ¡ « ­á á⥪  ;POP BC ; ¡ « ­á á⥪ 
;RET ;RET
;POP BC ;POP BC
@ -603,27 +604,24 @@ NOEXTDS:
;SCF ;SCF
;RET ;RET
; ;
.BEGIN: IN A,(SLOT3)
PARTIT: IN A,(SLOT3)
PUSH AF PUSH AF
LD A,SHARED_PAGE LD A,SHARED_PAGE
OUT (SLOT3),A OUT (SLOT3),A
CALL PARTIT1 CALL .Start
POP AF POP AF
OUT (SLOT3),A OUT (SLOT3),A
RET RET
.Start: LD IX,0
PARTIT1:
LD IX,0
LD DE,0 LD DE,0
LD (EXTDOSL),DE ;R01 LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01 LD (EXTDOSH),IX ;R01
PARTIT2:
LD (CURSECL),DE
LD (CURSECH),IX
CALL LOADSEC
; ;
LD HL,(PART+510) ;!HARDCODE Signature word .LOOP: LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_H),IX
CALL .LOAD_SECTOR
;
LD HL,(PARTITION_BUFFER.MBR_SIGNATURE)
LD DE,#AA55 LD DE,#AA55
AND A AND A
SBC HL,DE SBC HL,DE
@ -632,59 +630,59 @@ PARTIT2:
SCF SCF
RET NZ RET NZ
; ;
LD IY,PART+#01BE ;!HARDCODE MBR: Offset of partition table in the MBR LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR
LD B,4 ;!HARDCODE MBR: Number of entries in the partition table LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
DOSAGA: PUSH BC .DOSAGA:
LD A,(IY+4) PUSH BC
LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID)
CP PartitionSysTypes.Extended CP PartitionSysTypes.Extended
JR NZ,NOEXTDS JR NZ,.NotExtended
SUBLEV: PUSH IY .SubLevel:
LD DE,(CURSECL) PUSH IY
LD IX,(CURSECH) LD DE,(CURRENT_SECTOR_L)
LD IX,(CURRENT_SECTOR_H)
PUSH DE PUSH DE
PUSH IX PUSH IX
;[ ] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢ ;[ ] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
LD A,(ExtendedPartitionFlag) LD A,(.ExtendedPartitionFlag)
INC A INC A
LD (ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
; ;
CALL EXTDOS CALL .ParseExtended
;[ ] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢ ;[ ] 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 (CURSECL),DE LD (CURRENT_SECTOR_L),DE
LD (CURSECH),IX LD (CURRENT_SECTOR_H),IX
CALL LOADSEC CALL .LOAD_SECTOR
POP IY POP IY
NXTPART: .NextPartition:
LD DE,#10 ;!HARDCODE SZ_PTE - 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:
EXTDOS: LD HL,(EXTDOSL) LD HL,(EXTDOSL)
LD DE,(EXTDOSH) LD DE,(EXTDOSH)
LD A,L LD A,L
OR H OR H
OR E OR E
OR D OR D
LD E,(IY+08) LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD D,(IY+09) LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD L,(IY+10) LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IY+11) LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
JP NZ,EXTDOS2 JP NZ,.EXTDOS2
LD (EXTDOSL),DE LD (EXTDOSL),DE
LD (EXTDOSH),HL LD (EXTDOSH),HL
LD IX,(EXTDOSH) LD IX,(EXTDOSH)
JP PARTIT2 .EXTDOS2:
;
EXTDOS2:
LD IX,(EXTDOSL) LD IX,(EXTDOSL)
ADD IX,DE ADD IX,DE
PUSH IX PUSH IX
@ -693,27 +691,28 @@ EXTDOS2:
PUSH HL PUSH HL
POP IX POP IX
POP DE POP DE
JP PARTIT2 JP .LOOP
;
LOADSEC: .LOAD_SECTOR:
PUSH IY PUSH IY
LD IX,(CURSECL) LD IX,(CURRENT_SECTOR_L)
LD HL,(CURSECH) LD HL,(CURRENT_SECTOR_H)
LD DE,PART LD DE,PARTITION_BUFFER
LD A,(DRV_NUM) LD A,(DRV_NUM)
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS RST ToBIOS
POP IY POP IY
RET RET
;----------------------------------------------------------------------;
;
DRV_NUM DB #00 ;PHISICAL DRIVE NUMBER. ­®¬¥à ¤¥¢ ©á  (#80/#81 - primary ¬ áâ¥à/á«¥©¢, #82/#83 - secondary ¬ áâ¥à/á«¥©¢) ;=======================================================================
; PHISICAL DRIVE NUMBER
CURSECL DW #0000 ;CURRENT SECTOR LOADED ; #80/#81 - primary ¬ áâ¥à/á«¥©¢, #82/#83 - secondary ¬ áâ¥à/á«¥©¢
CURSECH DW #0000 DRV_NUM: DB #00
CURRENT_SECTOR_L: DW #0000
EXTDOSL DW #0000 ;CURRENT PARTITION TABLE CURRENT_SECTOR_H: DW #0000
EXTDOSH DW #0000 EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE
EXTDOSH: DW #0000
OFFSECT DW LOGDRV ;POINTER ON CURRENT DISK RECORD OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD
;=======================================================================
;=======================================================

View File

@ -1,41 +1,43 @@
; ;
STRUCT _sStack ; 256 bytes STRUCT _sStack ; 256 bytes
buffer BLOCK 256,0 .buffer BLOCK 256,0
SPoint BYTE 0 .SPoint BYTE 0
ENDS ENDS
; ;
; ;
STRUCT _sEXE_HEADER ; 512 bytes STRUCT _sEXE_HEADER ; 512 bytes
EXE_EXT TEXT 3,{"EX","E"} .EXE_EXT TEXT 3,{"EX","E"}
VERSION BYTE 0 .VERSION BYTE 0
OFFCOD1 WORD 0 .OFFCOD1 WORD 0
OFFCOD2 WORD 0 .OFFCOD2 WORD 0
LOADER WORD 0 .LOADER WORD 0
RESERVED BLOCK 6,0 .RESERVED BLOCK 6,0
LD_ADDR WORD 0 .LD_ADDR WORD 0
PC_REG WORD 0 .PC_REG WORD 0
SP_REG WORD 0 .SP_REG WORD 0
RESERVED2 BLOCK 490,0 .RESERVED2 BLOCK 490,0
ENDS ENDS
; ;
;File Manipulator (FM) ;File Manipulator (FM)
STRUCT _sFM ; 47 bytes ;[ ] fat32
STRUCT _sFM ; 51 bytes
; from FAT ; from FAT
.NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME ; .NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME
.EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT ; .EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT
.ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT ; .ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT
.RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED ; .RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED
.RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED ; .RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED
.CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED ; .CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED
.CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED ; .CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED
.RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED ; .RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED
.RESERVED_FAT32_2: WORD #0000 ;+ #14 +20 RESERVED ; .FIRST_CLUSTER_H: WORD #0000 ;+ #14 +20 RESERVED
.TIME: WORD #0000 ;+ #16 +22 TIME ; .TIME: WORD #0000 ;+ #16 +22 TIME
.DATE: WORD #0000 ;+ #18 +24 DATE ; .DATE: WORD #0000 ;+ #18 +24 DATE
.ST_CLUSTER: WORD #0000 ;+ #1A +26 START CLUSTER ; .FIRST_CLUSTER_L: WORD #0000 ;+ #1A +26 START CLUSTER ;!TODO fat32
.F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; .F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE
.FS_REC: _sFAT_DIRECTORY_RECORD
; from Core ; from Core
.F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) .F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP)
.DIR_CLUSTER: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER .DIR_CLUSTER: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER
@ -44,10 +46,10 @@ RESERVED2 BLOCK 490,0
.ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©«  .ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE ¯à¨§­ ª ¨§¬¥­¥­¨ï ä ©« 
.TASK_NUM: BYTE #00 ;+ #2A +42 TASK .TASK_NUM: BYTE #00 ;+ #2A +42 TASK
;.EMPTY: BYTE #00 ;+ #2B +43 EMPTY ;.EMPTY: BYTE #00 ;+ #2B +43 EMPTY
.KnownCluster_L: BYTE 0 ;+ #2B +43 Œ« ¤è¨© ¡ ©â ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩«  .KnownCluster_L: WORD #0000 ;+ #2B +43 Œ« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩« 
.KnownCluster_H: BYTE 0 ;+ #2C +44 ‘â à訩 ¡ ©â ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩«  .KnownCluster_H: WORD #0000 ;+ #2C +44 ‘â à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï ª®â®à®£® ¨§¢¥áâ­® ®â­®á¨â¥«ì­®¥ ᬥ饭¨¥ ¢­ãâਠ䠩« 
.KnownOffset_L: BYTE 0 ;+ #2D +45 Œ« ¤è¨© ¡ ©â ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à . .KnownOffset_L: WORD #0000 ;+ #2D +45 Œ« ¤è¥¥ á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à .
.KnownOffset_H: BYTE 0 ;+ #2E +46 ‘â à訩 ¡ ©â ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à . .KnownOffset_H: WORD #0000 ;+ #2E +46 ‘â à襥 á«®¢® ᬥ饭¨ï (¢ ª« áâ¥à å) ®â­®á¨â¥«ì­® ­ ç «  ä ©«  ¤«ï á®åà ­¥­­®£® ­®¬¥à  ª« áâ¥à .
ENDS ENDS
; ;
@ -67,12 +69,12 @@ RESERVED2 BLOCK 490,0
; ;
STRUCT _sBuffers STRUCT _sBuffers
FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ;
BootSector _sBOOT_SEC ; 62 bytes ;!TODO ¯¥à¥­¥á⨠¢ ®¡« áâì ¡ãä¥à®¢ .BootSector _sBOOT_SECTOR_PARAMS ; 62 bytes ;!TODO ¯¥à¥­¥á⨠¢ ®¡« áâì ¡ãä¥à®¢
EXE_Header _sEXE_HEADER ; 512 bytes .EXE_Header _sEXE_HEADER ; 512 bytes
Stack _sStack ; 256 bytes .Stack _sStack ; 256 bytes
Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF .Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF
MemoryTable BLOCK 256,0 ; 256 bytes .MemoryTable BLOCK 256,0 ; 256 bytes
ENDS ENDS
; ;

View File

@ -1 +1 @@
943 942

View File

@ -1,5 +1,5 @@
; ;
DEFINE TEST_FEATURE 1 DEFINE TEST_FEATURE 0
; ;
; ;
@ -17,6 +17,8 @@
;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥ ;LD_DSK EQU 16 ; ¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ «®£¨ç¥áª¨å HDD ¤¨áª®¢ ¢ á¨á⥬¥
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
DEFINE _FAT32_ENABLE 1 ;!TODO ¯®ª  ­¥¤®¤¥« ­®
define _bit (1<?((FAT_CACHE.Sectors-1) define _bit (1<?((FAT_CACHE.Sectors-1)
define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128)) define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128))
; ;
@ -83,7 +85,7 @@ ENVADDR EQU #E400
;FAT_CACHE EQU #C000 ;FAT_CACHE EQU #C000
FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢ FMCOUNT EQU 10 ; Š®«¨ç¥á⢮ ä ©«®¢ëå ¬ ­¨¯ã«ïâ®à®¢
HANDBUF.SIZE EQU 32 HANDBUF.SIZE EQU 32 ; !HARDCODE _sFAT_DIRECTORY_RECORD
;----------------------------------------------------; ;----------------------------------------------------;
; ;

View File

@ -54,7 +54,7 @@ cmd_dir:
1: ld hl,work_buffer1 ; ¨¬ï ä ©«  1: ld hl,work_buffer1 ; ¨¬ï ä ©« 
ld de,work_buffer1 ; 80 ¡ãä¥à ld de,work_buffer1 ; 80 ¡ãä¥à
ld a,#37 ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ ) ld a,#37 ;  âਡãâ (¢á¥, ªà®¬¥ ¬¥âª¨ ⮬ )
ld bc,0*256 + Dss.F_First ; f_first (ä®à¬ â 11) ld bc,Dss.F_First.FATname ; f_first (ä®à¬ â 11)
RST ToDSS RST ToDSS
JR C,.dir_empty ;R14 JR C,.dir_empty ;R14
CALL .Print_Header CALL .Print_Header
@ -610,7 +610,7 @@ read_disk_info:
ld hl,mask_fname ; "*.*" ¨¬ï ¬¥âª¨ ld hl,mask_fname ; "*.*" ¨¬ï ¬¥âª¨
ld de,work_buffer1 ; ªã¤  ld de,work_buffer1 ; ªã¤ 
ld a,FAT_ATTR.VOLUME_ID ;  âਡãâ ¬¥âª¨ ⮬  ld a,FAT_ATTR.VOLUME_ID ;  âਡãâ ¬¥âª¨ ⮬ 
ld bc,0*256 + Dss.F_First ; f_first, ä®à¬ â 11 ld bc,Dss.F_First.FATname ; f_first, ä®à¬ â 11
RST ToDSS RST ToDSS
push af push af
call restore_path ; ¢®ááâ. ⥪. ¯ãâì call restore_path ; ¢®ááâ. ⥪. ¯ãâì

@ -1 +1 @@
Subproject commit cbc1fd596a5a56298407c13a529a574e968235c7 Subproject commit 42dfec072030351eb386205ead32983bbc1c4909