DSS: детект разрядности FAT в BPB теперь по всем канонам. Допиливание до FAT32.

SYS: Загрузка System.dos > #4000 байтов. Исправлен баг с ненужной проверкой расстояния от BPB до FAT для HDD.
SHELL: мелкие правки
This commit is contained in:
Anatoliy Belyanskiy 2024-04-14 01:54:39 +10:00
parent 9b975b7a88
commit bb63a4071d
21 changed files with 1124 additions and 919 deletions

View File

@ -19,8 +19,8 @@
OUTPUT 'build/DSSloader.bin'
ADRIVE EQU #00
CDRIVE EQU #02
;ADRIVE EQU #00
;CDRIVE EQU #02
@ -33,8 +33,13 @@ DRIVE: _mSYSID
;
LD C,BIOS.DRV_VERSION
RST ToBIOS_18
;
LD HL,FAIL
PUSH HL
;
LD A,INCORR
JR C,FAIL
;JR C,FAIL
RET C
LD A,(DRIVE)
BIT 7,A
JR Z,GOOD_DRIVE
@ -42,144 +47,66 @@ DRIVE: _mSYSID
LD DE,2*256 + 21 ;!HARDCODE ¥á«¨ ¢¥àá¨ï ­¨¦¥ 2.21, â® ®è¨¡ª 
SBC HL,DE
LD A,INCORR
JR C,FAIL
GOOD_DRIVE:
LD DE,#8200 ;!HARDCODE
;JR C,FAIL
RET C
GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD HL,0
LD IX,2
LD BC,2*256 + BIOS.DRV_READ
LD A,(DRIVE)
RST ToBIOS_18
JR C,NULL
JP CONTINUE
FAIL CALL MESSAGE
NULL LD A,FAILURE
CALL MESSAGE
DI
HALT
JR $
FMESAGE LD HL,MSG0
LD BC,MSGE-MSG0
INC A
EX AF,AF'
XOR A
EX AF,AF'
NEXTMSG EX AF,AF'
CPIR
RET PO
RET NZ
EX AF,AF'
DEC A
JR NZ,NEXTMSG
RET
MESSAGE CALL FMESAGE
JR PRINTZ
;R01 Start
PRINTZ LD A,(HL) ;R01
INC HL
OR A
RET Z
CALL PRINTX
JR PRINTZ
PRINTX CP #0D
JR Z,CR_
CP #0A
JR Z,LF_
LD BC,1*256 + BIOS.LP_PRINT_SYM
RST ToBIOS_18
RET
CR_ LD C,BIOS.LP_GET_PLACE
RST ToBIOS_18
LD E,0
LD C,#84
RST ToBIOS_18
RET
LF_ LD C,BIOS.LP_GET_PLACE
RST ToBIOS_18
LD A,#1F
CP D
JR NZ,LF2
PUSH DE
PUSH HL
LD DE,#0020
LD BC,1*256 + BIOS.LP_SCROLL_UD
RST ToBIOS_18
LD DE,#1F00
LD C,BIOS.LP_SET_PLACE
RST ToBIOS_18
LD A," "
LD BC,#50 + BIOS.LP_PRINT_SYM
RST ToBIOS_18
POP HL
POP DE
DEC D
LF2 INC D
LD C,BIOS.LP_SET_PLACE
RST ToBIOS_18
RET ;R01
;R01 End
FAILURE EQU 0
INCORR EQU 1
ERRPART EQU 2
ERRIBPB EQU 3
NO_SYS EQU 4
NOSHELL EQU 5
STARTDO EQU 6
;a BIOS version that is incompatible with this version of DOS
; 0 10 20 30 40 50 60 70 80
MSG0: DB 0
DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0
DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10
DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0
DB "Invalid partition table.",13,10,0
DB "Invalid BOOT sector.",13,10,0
DB "Can't open file SYSTEM.DOS...",13,10,0
DB 13,10,"Starting DSS... ",13,10,13,10,0
MSGE DB 0
CONTINUE:
JP C,FAIL.NULL
;
; CONTINUE
;!TEST 26/03/2024
LD SP,#C000
;
LD HL,0
LD (DISKL),HL
LD (DISKH),HL
;
LD BC,1*256 + BIOS.GetMem
RST ToBIOS_18 ;GET PAGE FOR DOS
LD (BANKDOS),A
;
OUT (SLOT0),A
;
CALL GET_BPB ;READ BPB
LD A,ERRIBPB
JP C,FAIL
;JP C,FAIL
RET C
CALL GETROOT
LD A,NO_SYS
JP C,FAIL
;JP C,FAIL
RET C
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
LD HL,(FSIZE1)
LD A,H
OR L
JR NZ,.set_size
LD DE,(FSIZE0)
LD HL,#4000
SBC HL,DE
RLA
.set_size: LD (BIG_SHELL),A
;
LD HL,(FCLUSTR)
LD DE,#C000
CALL FLOAD ; § £à㧪 
DI
XOR A
OUT (SYS_PORT.OFF),A
;
LD A,#10
LD BC,#7FFD
OUT (C),A
;
LD A,1
LD B,#1F ;1FFD
OUT (C),A
LD A,(BANKDOS)
OUT (SLOT0),A
;
; LD A,(BANKDOS)
; OUT (SLOT0),A
;DOS LOADED
IF UNIVERSAL_BOOT
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
@ -189,19 +116,17 @@ CONTINUE:
LD A,(DRIVE) ; ­®¬¥à ãáâனá⢠
LD C,Dss.Version
RST ToDSS
jp c,XFAIL.fail
JP C,XFAIL.fail
;
LD A,STARTDO
CALL DOSMESS
;
LD A,(DRIVE)
LD BC,Dss.BootDSK.Set
RST ToDSS
;LD B,high Dss.BootDSK.Get
;
LD BC,Dss.BootDSK.Get
ELSE
IF ORIGINAL_DSS
LD C,Dss.Version
RST ToDSS
@ -211,62 +136,49 @@ CONTINUE:
RST ToDSS
jp c,XFAIL.fail
LD C,Dss.BootDSK
ENDIF
ENDIF ;
LD A,STARTDO
CALL DOSMESS
IF ORIGINAL_DSS
LD A,(DRIVE)
LD BC,Dss.BootDSK.Set
RST ToDSS
;LD B,high Dss.BootDSK.Get
LD B,Dss.BootDSK.Get
ENDIF
ENDIF
;LD C,Dss.BootDSK
;
RST ToDSS
;
ADD A,"A"
;
LD HL,ROOT
LD (HL),A
LD C,Dss.ChDir
RST ToDSS
;
LD HL,PSHELL
LD BC,Dss.Exec
RST ToDSS
LD A,NOSHELL
JP XFAIL
PSHELL: DB '\SYSTEM.EXE /P',0
ROOT: DB 'X:\',0
DOSMESS CALL FMESAGE
LD C,Dss.PChars
RST ToDSS
RET
.NoShell: LD A,NOSHELL
;JP XFAIL
XFAIL: CALL DOSMESS
.fail: LD A,FAILURE
CALL DOSMESS
DI
HALT
.halt: JR .halt
;
;
PART_TB: PUSH BC
LD HL,(BOOT+510)
LD DE,#AA55
AND A
SBC HL,DE
JR NZ,ERRP
JR NZ,.ERRP
LD IX,BOOT+#01BE
LD B,4 ;!HARDCODE áç¥â稪 § ¯¨á¥© ¯ àâ¨æ¨© ¢ MBR
DOSAGA: LD A,(IX+4)
.DOSAGA: LD A,(IX+4)
CP PartitionSysTypes.FAT16_LBA
JR Z,YEPDOS
CP PartitionSysTypes.FAT16
@ -277,14 +189,16 @@ DOSAGA: LD A,(IX+4)
JR Z,YEPDOS
.next: LD DE,#10
ADD IX,DE
DJNZ DOSAGA
ERRP: LD A,ERRPART
DJNZ .DOSAGA
.ERRP: LD A,ERRPART
JP FAIL
;
;
YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,#80
CP (IX+0)
JR NZ,DOSAGA.next
JR NZ,PART_TB.next
LD A,4 ;!HARDCODE áç¥â稪 § ¯¨á¥© ¯ àâ¨æ¨© ¢ MBR
SUB B
PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥« 
@ -309,7 +223,9 @@ YEPDOS: ;[ ] 17.12.2023
;LD A,C
;
RET
;
;
SET_PRM: PUSH BC
LD A,B
LD C,BIOS.DRV_GET_PAR
@ -323,7 +239,9 @@ SET_PRM: PUSH BC
POP BC
LD A,C
RET
;
;
GET_BPB: LD IX,#0000
LD HL,#0000
LD DE,BOOT
@ -336,16 +254,16 @@ GET_BPB: LD IX,#0000
AND #F0
LD C,A
CP #80
JR NZ,NX1
JR NZ,.NX1
CALL PART_TB ;HDD
RET C
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD (DRIVE+1),HL
;
NX1: CP #00
JR NZ,NX2
.NX1: CP #00
JR NZ,.NX2
CALL SET_PRM ;FDD
NX2: LD HL,(BOOT+510)
.NX2: LD HL,(BOOT+510)
LD DE,#AA55
AND A
SBC HL,DE
@ -357,7 +275,7 @@ NX2: LD HL,(BOOT+510)
RET C
LD HL,0 ;calc. first sector FAT
LD (DIR_FRH),HL
;
LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec
LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1)
ADD HL,DE
@ -365,9 +283,9 @@ NX2: LD HL,(BOOT+510)
LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT
LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1)
LD A,(BOOT.Number_of_FATs) ;amount FATs
C_DATA1: ADD HL,DE
.C_DATA1: ADD HL,DE
DEC A
JR NZ,C_DATA1
JR NZ,.C_DATA1
LD (DIR_FRM),HL ;first sector DIR
EX DE,HL
LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel
@ -384,46 +302,42 @@ C_DATA1: ADD HL,DE
LD H,0
ADD HL,DE
LD (DAT_FRM),HL ;First sector data
;
LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector
LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1)
LD HL,0
LD A,(BOOT.SectorsPerCluster)
NEXTAD3:
ADD HL,BC ;calc. cluster size
.NEXTAD3: ADD HL,BC ;calc. cluster size
DEC A
JR NZ,NEXTAD3
JR NZ,.NEXTAD3
LD (CLU_LEN),HL
LD HL,BOOT.ID_FAT
LD DE,FATMSG
LD B,3
R_BPBL1:
LD A,(DE)
.R_BPBL1: LD A,(DE)
CP (HL)
JP NZ,IBMDOS_
JP NZ,.IBMDOS_
INC HL
INC DE
DJNZ R_BPBL1
FID: LD A,(HL)
DJNZ .R_BPBL1
.FID: LD A,(HL)
INC HL
CP " "
JR Z,FID
JR Z,.FID
CP "1"
SCF
RET NZ
LD A,(HL)
CP "6" ; FAT16
LD HL,#FFFF
JR Z,BPB_FAT
JR Z,.BPB_FAT
CP "2" ; FAT12
SCF
RET NZ
LD HL,#0FFF
BPB_FAT
LD (FAT_TYP),A
.BPB_FAT: LD (FAT_TYP),A
LD (ENDCLUS),HL
;
LD IX,(DISKL)
LD HL,(DISKH)
LD DE,(FAT_FRM)
@ -440,17 +354,18 @@ BPB_FAT
LD (FatCache),HL
XOR A
RET
IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
;
.IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0
RET C
CP #F8
LD A,"6"
LD HL,#FFFF
JR Z,BPB_FAT
JR Z,.BPB_FAT
LD A,"2"
LD HL,#0FFF
JR BPB_FAT
JR .BPB_FAT
;
; ¯®¨áª system.dos
GETROOT: LD HL,(DIR_FRH)
@ -458,7 +373,7 @@ GETROOT: LD HL,(DIR_FRH)
LD BC,(DISKL)
LD DE,(DISKH)
LD A,(DIR_S_S)
NEXTSEC: PUSH AF
.NEXTSEC: PUSH AF
ADD IX,BC
ADC HL,DE
;HL:IX
@ -478,13 +393,15 @@ NEXTSEC: PUSH AF
LD DE,0
LD BC,1
DEC A
JR NZ,NEXTSEC
JR NZ,.NEXTSEC
SCF
RET
;
;
SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
LD IX,DIR-#0020
SKIPNAM: LD DE,#0020
.SKIPNAM: LD DE,#0020
ADD IX,DE
DEC C
RET Z
@ -493,20 +410,20 @@ SKIPNAM: LD DE,#0020
SCF
RET Z
CP #E5
JR Z,SKIPNAM
JR Z,.SKIPNAM
LD A,(IX+11)
AND #10
JR NZ,SKIPNAM
JR NZ,.SKIPNAM
LD HL,MASKARE
LD D,XH
LD E,XL
LD B,11
SEARCH2: LD A,(DE)
.SEARCH2: LD A,(DE)
CP (HL)
JR NZ,SKIPNAM
JR NZ,.SKIPNAM
INC HL
INC DE
DJNZ SEARCH2
DJNZ .SEARCH2
LD D,XH
LD E,XL
LD HL,HANDBUF
@ -521,67 +438,86 @@ SEARCH2: LD A,(DE)
; DE - ADDRESS
;!TODO ᤥ« âì âãâ ®¯à¥¤¥«¥­¨¥ à §¬¥à  SYSTEM.DOS ¨ ¢®§¬®¦­®áâì § £à㧨âì ¡®«ìè¥ 1 áâà ­¨æë
FLOAD: LD (READMEM),DE
LD_FILE: PUSH HL
CALL NSECTOR
.LD_FILE: PUSH HL ; system.dos first cluster
CALL NSECTOR ; Cluster to Sector
LD DE,(READMEM)
LD A,(BOOT.SectorsPerCluster)
CP #20
JR C,SMALL_CLUSTER
LD BC,#20*256 + BIOS.DRV_READ_LONG
LD A,(BANKDOS)
EX AF,AF'
LD A,(DRIVE)
RST ToBIOS_18
POP HL
AND A
RET
SMALL_CLUSTER:
LD B,A
LD C,BIOS.DRV_READ_LONG
JR C,.SMALL_CLUSTER
LD A,(BANKDOS)
EX AF,AF'
;LD BC,#20*256 + BIOS.DRV_READ_LONG
LD B,#20 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
.set_drv: LD A,(DRIVE)
RST ToBIOS_18
JP C,GOOD_DRIVE.NoShell
POP HL
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
;AND A
;RET
LD A,(BIG_SHELL)
OR A
RET Z
;
XOR A
LD (BIG_SHELL),A
PUSH HL
CALL NSECTOR
LD DE,#20 ; !HARDCODE ª®«-¢® ¯à®ç¨â ­­ëå ᥪâ®à®¢
AND A
ADD IX,DE
JR NC,.no_inc_hl
INC HL
.no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE ª®«-¢® „ާ £à㦠¥¬ëå ᥪâ®à®¢
LD DE,#4000
JR .set_drv
;
.SMALL_CLUSTER: LD B,A
;LD C,BIOS.DRV_READ_LONG
LD A,(BANKDOS)
EX AF,AF'
LD A,(DRIVE)
RST ToBIOS_18
JP C,GOOD_DRIVE.NoShell
;
LD HL,(READMEM)
LD DE,(CLU_LEN)
ADD HL,DE
LD (READMEM),HL
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
;POP HL
;RET C
CALL C,.more_than_1
POP HL
RET C
CALL R_F_FAT
;
CALL R_F_FAT ; next cluster in chain
RET C
EX DE,HL
JP LD_FILE
; HL - CLUSTER
; HL:IX - SECTOR
; NSECTOR:
; DEC HL
; DEC HL
; EX DE,HL
; LD A,(BOOT.SectorsPerCluster)
; LD B,A
; LD HL,0
; LD IX,0
; ADD_DE1 ADD IX,DE
; JP NC,ADD_DE2
; INC HL
; ADD_DE2 DJNZ ADD_DE1
; LD DE,(DAT_FRM)
; ADD IX,DE
; LD DE,#0000
; ADC HL,DE
; LD DE,(DISKL)
; ADD IX,DE
; LD DE,(DISKH)
; ADC HL,DE
; RET
JP .LD_FILE
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
.more_than_1: LD A,(BIG_SHELL)
OR A
SCF
RET Z
IN A,(SLOT1)
LD HL,BANKDOS
CP (HL)
CCF
RET Z
LD (BANKDOS),A
LD HL,#C000
LD (READMEM),HL
AND A
RET
NSECTOR:
LD DE,0
;
; --> HL - CLUSTER
; <-- HL:IX - SECTOR
NSECTOR: LD DE,0
DEC HL
DEC HL
LD A,(BOOT.SectorsPerCluster)
@ -592,7 +528,6 @@ NSECTOR:
.loop: ADD HL,HL
RL E
RL D
;
RRA
JP NC,.loop
;
@ -618,12 +553,13 @@ NSECTOR:
R_F_FAT: PUSH HL
LD A,(FAT_TYP)
CP "2"
JP Z,R_F_F12
R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH
JP Z,.R_F_F12
;
.R_F_F16: LD DE,768 ; DE - CLUSTERS IN CASH
XOR A
R_F_00H INC A ; HL - CLUSTER
.R_F_00H: INC A ; HL - CLUSTER
SBC HL,DE
JP NC,R_F_00H
JP NC,.R_F_00H
ADD HL,DE
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
DEC A
@ -640,8 +576,8 @@ R_F_00H INC A ; HL - CLUSTER
SBC HL,DE
POP HL
RET
R_F_F12 LD D,H
;
.R_F_F12 LD D,H
LD E,L
ADD HL,HL
ADD HL,DE
@ -656,9 +592,9 @@ R_F_F12 LD D,H
ADD HL,BC
EX DE,HL
XOR A ; DE - SIZE SECTOR * 3
R_F_00 INC A ; HL - FAT OFFSET
.R_F_00: INC A ; HL - FAT OFFSET
SBC HL,DE
JP NC,R_F_00
JP NC,.R_F_00
ADD HL,DE
DEC A
LD BC,(FatCache)
@ -670,13 +606,13 @@ R_F_00 INC A ; HL - FAT OFFSET
LD E,(HL)
INC HL
LD D,(HL)
JP C,R_F_F01
JP C,.R_F_F01
LD A,D
AND #0F
LD D,A
JP R_F_F02
R_F_F01 LD A,E
JP .R_F_F02
;
.R_F_F01: LD A,E
AND #F0
RR D ; ¢¯à ¢® ­  4 ¡¨âa
RRA
@ -687,13 +623,15 @@ R_F_F01 LD A,E
RR D
RRA
LD E,A
R_F_F02 LD HL,#0FEF
.R_F_F02: LD HL,#0FEF
XOR A
SBC HL,DE
POP HL
RET
;
RE_FAT PUSH HL
;
RE_FAT: PUSH HL
LD L,A
LD H,0
LD (FatCache),HL
@ -705,15 +643,15 @@ RE_FAT PUSH HL
LD DE,(FAT_FRM)
ADD HL,DE
EX DE,HL
JR NC,NOINX
JR NC,.NOINX
INC IX
NOINX LD HL,(DISKL)
.NOINX: LD HL,(DISKL)
ADD HL,DE
EX DE,HL
LD BC,(DISKH)
JR NC,NOINX2
JR NC,.NOINX2
INC IX
NOINX2 ADD IX,BC
.NOINX2: ADD IX,BC
PUSH IX
PUSH DE
POP IX
@ -724,11 +662,118 @@ NOINX2 ADD IX,BC
RST ToBIOS_18
POP HL
RET
;
MASKARE DB "SYSTEM DOS"
////////////////////////////////////////////////////////////////////////
FAIL: CALL MESSAGE
.NULL: LD A,FAILURE
CALL MESSAGE
DI
HALT
JR $
;
FATMSG DB "FAT"
;
DOSMESS: CALL FMESAGE
LD C,Dss.PChars
JP ToDSS
;
;
FMESAGE: LD HL,MSG0
LD BC,MSGE-MSG0
INC A
EX AF,AF'
XOR A
EX AF,AF'
.NEXTMSG: EX AF,AF'
CPIR
RET PO
RET NZ
EX AF,AF'
DEC A
JR NZ,.NEXTMSG
RET
;
;
MESSAGE: CALL FMESAGE
;R01 Start
PRINTZ: LD A,(HL) ;R01
INC HL
OR A
RET Z
CALL PRINTX
JR PRINTZ
;
;
PRINTX: CP #0D
JR Z,.CR_
CP #0A
JR Z,.LF_
LD BC,1*256 + BIOS.LP_PRINT_SYM
RST ToBIOS_18
RET
.CR_: LD C,BIOS.LP_GET_PLACE
RST ToBIOS_18
LD E,0
LD C,#84
JP ToBIOS_18
;RET
;
.LF_: LD C,BIOS.LP_GET_PLACE
RST ToBIOS_18
LD A,#1F
CP D
JR NZ,.LF2
PUSH DE
PUSH HL
LD DE,#0020
LD BC,1*256 + BIOS.LP_SCROLL_UD
RST ToBIOS_18
LD DE,#1F00
LD C,BIOS.LP_SET_PLACE
RST ToBIOS_18
LD A," "
LD BC,#50 + BIOS.LP_PRINT_SYM
RST ToBIOS_18
POP HL
POP DE
DEC D
.LF2: INC D
LD C,BIOS.LP_SET_PLACE
JP ToBIOS_18
;RET ;R01
;R01 End
FAILURE EQU 0
INCORR EQU 1
ERRPART EQU 2
ERRIBPB EQU 3
NO_SYS EQU 4
NOSHELL EQU 5
STARTDO EQU 6
;a BIOS version that is incompatible with this version of DOS
; 0 10 20 30 40 50 60 70 80
MSG0: DB 0
DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0
DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10
DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0
DB "Invalid partition table.",13,10,0
DB "Invalid BOOT sector.",13,10,0
DB "Can't open file SYSTEM.DOS...",13,10,0
DB 13,10,"Starting DSS... ",13,10,13,10,0
MSGE: DB 0
;
PSHELL: DB '\SYSTEM.EXE /P',0
ROOT: DB 'X:\',0
MASKARE: DB "SYSTEM DOS"
FATMSG: DB "FAT"
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
; Area for boot sector [512Bytes]
BOOT _sBOOT_SECTOR_PARAMS = $
@ -775,7 +820,8 @@ FSIZE1 EQU VALUE+16+30
DISKH EQU VALUE+48
DISKL EQU VALUE+50
READMEM EQU VALUE+52
SHEL_FM EQU VALUE+54
;SHEL_FM EQU VALUE+54
BIG_SHELL EQU VALUE+54
BANKDOS EQU VALUE+55
; EQU VALUE+56
@ -791,14 +837,5 @@ BANKDOS EQU VALUE+55
;STACK EQU (($/256)+2)*256
ENT
;START DI
; LD (SPZ+1),SP
; LD SP,#BFFF
; LD C,#FE
; CALL #3D13
;SPZ LD SP,#0000
; EI
; RET
OUTEND
;[]-----------------------------------------------------------[]

View File

@ -24,6 +24,7 @@
include 'shared_includes/macroses/accelerator.z80'
include 'shared_includes/macroses/macros.z80'
include 'shared_includes/structures/FileSystem.inc'
include '../DSS/defines.inc'
DEFINE EXEinfoMACRO 0
DEFINE App_EXE_Version 1
@ -350,6 +351,8 @@ write_to_: ld a,(disk) ;
scf
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
dec c
CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD
JR NC,.skip_FAT_check
push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
LD HL,0
@ -364,6 +367,7 @@ write_to_: ld a,(disk) ;
SBC HL,DE
RET C
;
.skip_FAT_check:;
push bc
ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 

View File

@ -79,7 +79,7 @@
; POP BC
; JP C,NDISK11
; LD A,B
; LD (FatBuffer.DRIVE),A
; LD (CORE_BUFFERS.FatBuffer.DRIVE),A
; CALL RD_BPB
; RET C
; LD A,(LDRIVE)

View File

@ -62,9 +62,9 @@ DEL_FN: ;!TEST
PUSH DE
LD DE,#0000 ; ­®¬¥à ª« áâ¥à 
CALL WRITE_TO_FAT.Custom ; § ¯¨á âì ¢ ª¥è FAT-  ­®¬¥à ª« áâ¥à 
POP AF
POP DE
EXX
POP AF
POP DE
EXX
JP NC,.loop

View File

@ -132,14 +132,14 @@ MKDIR:
CP "."
JR Z,.copy_dir_record
; fat32
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR NZ,.fat16_root_dir
; fat 32
EX DE,HL
LD HL,(FatBuffer.RootDirStartCluster_L)
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL
LD HL,(FatBuffer.RootDirStartCluster_H)
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL
EX DE,HL
JR .set_rec
@ -169,7 +169,7 @@ MKDIR:
EXX
POP HL ; ¬« ¤è¨© ­®¬¥à ᥪâ®à 
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; ᥪâ®à®¢ ­  ª« áâ¥à
.MKD12: PUSH AF
PUSH HL ; áâ. à §àï¤
PUSH IX ; ­®¬¥à «®£. ᥪâ®à 
@ -178,7 +178,7 @@ MKDIR:
IN A,(SLOT0)
OUT (SLOT3),A
;
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000
LD BC,1*256 + Dss.DRV.Write
RST ToDSS.DRV

View File

@ -67,7 +67,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23
LD (IY+_sFM.F_POSITION+1),A
LD (IY+_sFM.F_POSITION+2),A
LD (IY+_sFM.F_POSITION+3),A
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
; fat32
LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H

View File

@ -51,7 +51,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
PUSH HL
EXX
CALL CLUSTER_TO_SECTOR
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
LD B,A
LD C,Dss.DRV.Read
; ­ ç¨­ ¥¬ ¢ëç¨â뢠âì ᮤ¥à¦¨¬®¥ ª â «®£  ¯®á¥ªâ®à­®
@ -67,7 +67,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23
LD DE,CORE_BUFFERS.SECBUF+#C000
;LD BC,1*256 + Dss.DRV.Read
LD B,1
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
RST ToDSS.DRV
POP AF
OUT (SLOT3),A

View File

@ -18,7 +18,7 @@ WRITE.RD_ONLY:
WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] ¨§ĄëâŽç­ëĽ ˘ë§Ž˘ë WRITE_FAT_TABLE
CALL .Start
PUSH AF
LD A,(FatBuffer.CacheUpdated)
LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated)
OR A
CALL NZ,WRITE_FAT_TABLE ; ŻŽ¤ŞŤ. Ą ­Şă ŞĽč  FAT ¨ § Ż¨á âě ĽŁŽ ­  ¤¨áŞ
POP AF

View File

@ -16,7 +16,7 @@ CURDISK_FN:
CURDISK:
LD A,(LDRIVE)
LD C,A
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
AND A
RET
;

View File

@ -59,7 +59,7 @@ DISKINF: LD C,B
1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP
; 12, 16 or 32
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.next_prm
;
@ -73,11 +73,11 @@ DISKINF: LD C,B
.put_char: LD (DE),A
POP DE
;
.next_prm: LD HL,FatBuffer.BPB_SERIAL_NUMBER
.next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER
LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP
;
LD HL,FatBuffer.BPB_LABEL
LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
; fat32
@ -121,7 +121,7 @@ DISKINF: LD C,B
;JR Z,CURRDS ;R06
.CurrentDisk: LD A,(CurrentPath)
SUB 'A'
LD HL,FatBuffer.DRIVE
LD HL,CORE_BUFFERS.FatBuffer.DRIVE
CP (HL)
JR Z,.CheckFreeSpace
;
@ -138,15 +138,15 @@ DISKINF: LD C,B
;.FRESP2:
LD D,B
LD E,C
LD HL,(FatBuffer.MaxClusterLow)
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
DEC HL
; fat 32
EXX
LD HL,(FatBuffer.MaxClusterHigh)
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
DEC HL
EXX
LD BC,(CORE_BUFFERS.BootSector.BytesPerSector)
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
AND A
RET
;

View File

@ -181,7 +181,7 @@ TMPNAME: DZ ' ' ; 12
; IN: A - drive number
OPENDSK:;!TEST DRV.Open ®¡å®¤ R10
LD C,A
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
CP C
IF CHECK_DRIVE_CHANGE
JR NZ,.open
@ -200,12 +200,12 @@ OPENDSK:;!TEST DRV.Open
POP BC
JP C,.error
;[x] 29/02/2024 fix "open drive error"
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD D,A
PUSH DE
;
LD A,B
LD (FatBuffer.DRIVE),A
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
CALL RD_BPB
;[x] 29/02/2024 fix "open drive error"
@ -217,6 +217,7 @@ OPENDSK:;!TEST DRV.Open
.exit: LD A,(LDRIVE)
AND A
RET
;
.error: CP DSS_Error.sys.INVALID_DRIVE
SCF
RET Z
@ -356,7 +357,7 @@ MASK: LD HL,TMPNAME
;----------------------------------------------------------------------;
;!TEST Current Dir ;[x] 15/10/23
DIR_PATH_CHANGE:
.FullCurrent: LD A,(FatBuffer.DRIVE)
.FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A'
LD (CurrentPath),A
;
@ -365,7 +366,7 @@ DIR_PATH_CHANGE:
;
.FullWork: LD A,(CurrentPath)
SUB 'A'
LD (FatBuffer.DRIVE),A
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
.Work: LD HL,WorkDirectory
JP CURRDIR_FN
@ -391,7 +392,7 @@ DIR_PATH_CHECK: LD A,(HL)
JR Z,.checkDir
;
LD HL,CurrentPath
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A'
CP (HL)
JR NZ,.gotoPath
@ -413,7 +414,7 @@ DIR_PATH_CHECK: LD A,(HL)
JR .gotoPath
;
.checkDrive: LD HL,CurrentPath
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A'
CP (HL)
RET

View File

@ -241,11 +241,16 @@ PORTAL.out_MAIN: ;
CLEAR_BUFFER_AND_INIT_PROC:
;------[CLEAR BUFFERS]------;
;R07 ;R11
XOR A
LD HL,CLEAR_ZONE.start
LD DE,CLEAR_ZONE.start+1
LD BC,CLEAR_ZONE.size-1
LD (HL),0
LD (HL),A
LDIR
; A = 0
DEC A
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
;
;R07 ;R11
;R11
LD HL,CORE_BUFFERS.FM_BUF
@ -405,7 +410,8 @@ BUFFERSplace _sBuffers=$
FM_BUF _sFM = BUFFERSplace.FileManipulator
.Size EQU _sFM
.FullSize EQU FMCOUNT*FM_BUF.Size
BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector à §­®© ¤«¨­ë
;BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector à §­®© ¤«¨­ë
FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer
EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header
XSTACK EQU BUFFERSplace.Stack.SPoint
BUFFER EQU BUFFERSplace.Buffer
@ -415,11 +421,11 @@ CLEAR_ZONE.size EQU _sBuffers
ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0"
DISPLAY "--- --- --- --- --- --- --- ---"
DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector
DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector
DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector
DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace
DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer
DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer
DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF
DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector
DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF
DISPLAY "--- --- --- --- --- --- --- ---"
@ -597,7 +603,9 @@ DRV_CONTENT:
DRV_CONTENT.SIZE EQU $-DRV_CONTENT
DISPLAY "END ADDRESS: ",/H,$
ASSERT $<#4001,'-> Memory leack!!!';
DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512
ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!';
ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!';
;[END]
;

View File

@ -345,9 +345,9 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF
JR NZ,.SUBDIR
.REROOT: ; fat32
EX DE,HL
LD HL,(FatBuffer.RootDirStartCluster_L)
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL
LD HL,(FatBuffer.RootDirStartCluster_H)
LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H)
LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL
EX DE,HL
CALL LOADDIR
@ -423,11 +423,11 @@ LOADDIR: ;!TODO optimize
; ; LD (HL),L
; ; LDIR
; ;
; LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
; LD (IY+_sFM.DRIVE),A ; á®åà. ¢ ¤¥áªà¨¯â®à
; ; ­®¬¥à ¯¥à¢®£® ª« áâ¥à 
; ; [x] fat32
; LD A,(FatBuffer.FAT_TYPE)
; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
; XOR 32
; JR Z,.read_dir
; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
@ -446,14 +446,14 @@ LOADDIR: ;!TODO optimize
OUT (SLOT3),A
RET
;
.LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤
LD IX,(FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(FatBuffer.DirSizeInSectors)
.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; áâ. à §àï¤
LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; ­®¬¥à «®£. ᥪâ®à 
LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). à §¬¥à root-ª â «®£ 
CP B
JR NC,.RTD1
LD B,A ; ç¨á«® ᥪâ®à®¢
.RTD1: LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD DE,DIRPAGE.buffer ; ¡ãä¥à
LD C,Dss.DRV.Read ; ç⥭¨¥ ᥪâ®à®¢
RST ToDSS.DRV
@ -475,10 +475,10 @@ LOAD_SAVE_DIR_PREPARE:
AND A
EX AF,AF'
;
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD (IY+_sFM.DRIVE),A
; [x] fat32
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32 - 1
JR NC,.exit
;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
@ -504,10 +504,10 @@ SAVEDIR: ;!TODO optimize
; AND A
; PUSH AF
; ;
; LD A,(FatBuffer.DRIVE)
; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD (IY+_sFM.DRIVE),A
; ; [x] fat32
; LD A,(FatBuffer.FAT_TYPE)
; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
; XOR 32
; JR Z,.save_dir
; ;!FIXIT ¯¥à¥¤¥« âì ­  à ¡®âã ¡¥§ IY
@ -528,15 +528,15 @@ SAVEDIR: ;!TODO optimize
OUT (SLOT3),A
RET
;
.SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L)
LD A,(FatBuffer.DirSizeInSectors)
.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H)
LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L)
LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors
SUB B
JR NC,.RTD1S
ADD A,B
LD B,A
.RTD1S: LD A,(FatBuffer.DRIVE)
.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,DIRPAGE.buffer
LD C,Dss.DRV.Write
RST ToDSS.DRV
@ -593,7 +593,7 @@ WRT_HND: SET_PAGE_X DIRPAGE
SBC HL,DE
JR NC,SAVEDIR
LD HL,(SAVEDIR.DIRSIZE)
LD BC,(FatBuffer.BytesPerCluster)
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster)
ADD HL,BC
LD (SAVEDIR.DIRSIZE),HL
AND A
@ -604,7 +604,7 @@ WRT_HND: SET_PAGE_X DIRPAGE
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ­¥ ¨á¯®«ì§ã¥âáï
; TESTDSK: ;????? ¢®§¬®¦­®, çâ® âãâ «®£¨ç­¥¥, 祬 ¢ ­ ç «¥ OPENDSK, ¥á«¨ ¡ã¤¥â à ¡®â âì Dss.DRV.Open
; LD A,(FatBuffer.DRIVE)
; LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
; LD C,Dss.DRV.MediaCheck
; RST ToDSS.DRV
; OR A
@ -618,7 +618,7 @@ RD_BPB: LD C,SLOT3
PUSH BC
IN A,(SLOT0)
OUT (SLOT3),A
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08
LD C,Dss.DRV.GetBPB
RST ToDSS.DRV
@ -642,6 +642,17 @@ RD_BPB: LD C,SLOT3
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
CP #F0
JP C,DOS_X_Error.UnknownBPB
;
;!TODO ¯à®¢¥à¨âì ¯® ¬¥âª¥ à §¤¥« , çâ® íâ® FAT, ¯®â®¬ ®¯à¥¤¥«ïâì ª ª®© FAT
;
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector)
LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster)
LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER)
LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),HL
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER+2)
LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),HL
; calc. first sector FAT
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
;
@ -650,19 +661,19 @@ RD_BPB: LD C,SLOT3
; ADD HL,DE
;
;!FIXIT ¤«ï fat32 ¢â몠âì á ᥪâ®à   ªâ¨¢­®© â ¡«¨æë
LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1
LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2
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
;[ ] fat32
XOR A
LD B,A
LD C,A
LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32
LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32
LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables
LD (FatBuffer.SectorsPerFAT_H),A ; [ ] fat32
LD (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.RootDirStartCluster_L),BC ; [ ] fat32
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32
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 DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16)
@ -670,20 +681,21 @@ RD_BPB: LD C,SLOT3
OR D
JR NZ,.skip_high
;
LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4)
LD (FatBuffer.SectorsPerFAT_H),BC
LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32)
.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32+4)
LD A,C
LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A
LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32)
.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE
;
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs
CP 1
JR Z,.one_FAT
DEC A
ADD HL,DE
LD (FatBuffer.FAT2_SEC_L),HL
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL
JR NC,.no_inc_BC
INC BC
.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC
.no_inc_BC: LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC
.one_FAT: ;C_DATA1
.loop1: ADD HL,DE
JR NC,.loop1_1
@ -691,9 +703,9 @@ RD_BPB: LD C,SLOT3
.loop1_1: DEC A
JR NZ,.loop1
;
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector)
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,B
AND A
;
@ -708,7 +720,7 @@ RD_BPB: LD C,SLOT3
LD B,0 ; BC - File handels in sectors
;;;;
IF COMPILE_UNUSED_CODE
LD (FatBuffer.FilesPerSector),A
LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A
ENDIF
;
EX DE,HL
@ -724,14 +736,14 @@ RD_BPB: LD C,SLOT3
EX DE,HL
LD C,A ; A - sectors in DIR
LD B,0
LD (FatBuffer.DirSizeInSectors),A
LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A
ADD HL,BC ; Start DATA area
LD (FatBuffer.FirstDataSector_L),HL
LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL
; B = 0
;
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector)
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster)
LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
;!TODO FATcacheSize
; calc. cluster size
XOR 1
@ -741,7 +753,7 @@ RD_BPB: LD C,SLOT3
RRA
JP NC,.loop3
.loop3.end: ;
LD (FatBuffer.BytesPerCluster),HL
LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL
;
IF COMPILE_UNUSED_CODE
EX DE,HL
@ -752,69 +764,71 @@ RD_BPB: LD C,SLOT3
JP Z,DOS_X_Error.UnknownBPB
SBC HL,DE
JR NC,.loop4
LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k)
ENDIF
;
;!TODO detect fat type by clusters!
; [ ] fat32
LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.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
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
; 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'
;[ ] fat32
JP Z,.fat1x
CP '3'
JP NZ,DOS_X_Error.UnknownBPB
LD A,#52 ; #52-#20 = #32 fat type
LD HL,#0FFF
LD (FatBuffer.END_CHAIN_CLUSTER_H),HL
LD (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 (FatBuffer.FAT_TYPE),A
LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
; .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
////////////////////////////////////////////////////////////////////////
; LD HL,0
; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track
; LD A,(CORE_BUFFERS.BootSector.HEADS)
; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track
; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS)
; .BPB_L1: ; calc. sector per cylinder
; ADD HL,BC
; DEC A
; JR NZ,.BPB_L1
; LD (FatBuffer.S_X_H),HL
; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL
////////////////////////////////////////////////////////////////////////
; [ ] fat32
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive)
LD DE,(FatBuffer.FirstDataSector_L)
LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L)
LD A,H
OR L
JP NZ,.HDDSMAL
;
LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L)
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H)
PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low
AND A
SBC HL,DE
JP NC,.HDDBIG
@ -822,25 +836,104 @@ RD_BPB: LD C,SLOT3
JP .HDDBIG
;
.HDDSMAL: ; CF = 0
SBC HL,DE
LD BC,0
.HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster)
PUSH BC ; Total Sectors high
PUSH HL ; Total Sectors low
SBC HL,DE
;
.HDDBIG: LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
SCF
.S4C01: RRA
JR C,.S4C02
.loop7: RRA
JR C,.loop7_exit
RR B
RR C
RR H
RR L
JP .S4C01
.S4C02: INC HL
LD (FatBuffer.MaxClusterLow),HL
JP .loop7
;
.loop7_exit: INC HL
LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL
;
XOR A
LD H,A
LD L,A
LD (FatBuffer.CacheBlock),HL
LD (FatBuffer.CacheUpdated),A
LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL
LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
; A = 0
LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H)
LD H,A
EX DE,HL
LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L)
; DE:HL = SectorsPerFAT
;
LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs)
LD B,A
DEC A
JR Z,.loop_mul_end
; .Number_of_FATs * .SectorsPerFAT
.loop_mul: ADD HL,HL
EX DE,HL
ADC HL,HL
EX DE,HL
DJNZ .loop_mul
.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD B,0
LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors)
LD C,A
ADD HL,BC
JR NC,.no_inc_DE
INC DE
.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT
LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
ADD HL,BC
JR NC,.no_inc_de
INC DE
.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT)
AND A
LD B,D
LD C,E
POP DE ; Total Sectors low
EX DE,HL
SBC HL,DE
EX (SP),HL ; Total Sectors high
SBC HL,BC
POP DE ; Total Sectors low
; HL:DE = DataSec
;
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
CALL DIV_for_SPC
; ¢ëïá­ï¥¬ à §à來®áâì FAT
LD A,D
OR E
JR NZ,.its_FAT32
;
LD HL,4084
SBC HL,BC
JR NC,.its_FAT12
;
LD HL,65525
SBC HL,BC
JR C,.its_FAT32
;
; It's FAT16
LD A,FAT_TYPE.x16
LD HL,#FFFF
JR .BPB_FAT
;
.its_FAT12: LD HL,#0FFF
LD A,FAT_TYPE.x12
JR .BPB_FAT
;
.its_FAT32: LD A,FAT_TYPE.x32
LD HL,#0FFF
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL
LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT
LD H,L
;
.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A
LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL
;
SET_PAGE_X FATPAGE
@ -848,8 +941,9 @@ RD_BPB: LD C,SLOT3
; [ ] fat32
; XOR A
; HL = 0
EX DE,HL
; EX DE,HL
;
LD DE,0
CALL READ_FAT_TABLE
POP AF
OUT (SLOT3),A
@ -881,6 +975,7 @@ DOS_X_Error:
;
;
;!TODO ª ¡ãä¥à ¬!
/*
FatBuffer:
;.MSG: DB 'FAT'
.DRIVE: DB #FF
@ -918,4 +1013,5 @@ FatBuffer:
;.READ_PG: DB #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DW #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥ ; ????? íâ® ¨á¯®«ì§ã¥âáï?
;
*/
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -113,23 +113,23 @@ INC_FAT:
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
CHECK_CLUSTER_IS_SMALLER:
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
EXX
EX DE,HL
LD HL,(FatBuffer.MaxClusterHigh)
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
;RET C
RET NZ ; ¥á«¨ FatBuffer.MaxClusterHigh - hl' != 0, â® ª« áâ¥à ª®à४â­ë©
RET NZ ; ¥á«¨ CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, â® ª« áâ¥à ª®à४â­ë©
; ¯à®¢¥à塞 ¬« ¤è¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL
LD HL,(FatBuffer.MaxClusterLow)
LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow)
; CF = 0
SBC HL,DE
EX DE,HL
@ -157,7 +157,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
;
PUSH HL
PUSH AF
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
; .Custom:
; HL':HL ¨ DE':DE â ª¨¥ ¦¥ ª ª ¨ ­  ¢å®¤¥
;------------------------------------------------------------------------------------------------
WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ­®¬¥à ª« áâ¥à 
WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; ­®¬¥à ª« áâ¥à 
EXX
LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; ­®¬¥à ª« áâ¥à 
LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H) ; ­®¬¥à ª« áâ¥à 
EXX
.Custom: PUSH DE
EXX
@ -278,9 +278,9 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ;
PUSH DE ; ¬« ¤è¨© ­®¬¥à ª« áâ¥à  ª®â®àë© ¢¯¨á âì
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
;LD A,1
;LD (FatBuffer.CacheUpdated),A
;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
;
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
@ -296,7 +296,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ;
; [x] 2/12/23 FAT ­¥ ¢á¥£¤  ¬®£ § ¯¨á âìáï ­  HDD
XOR A
INC A
LD (FatBuffer.CacheUpdated),A
LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
; CF = 0
RET
;
@ -360,7 +360,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ;
; out: C:HL - logical number
; B = 0
GET_SECTOR_OF_FAT:
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
LD B,FAT_CACHE.Degree_32 ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî
XOR FAT_TYPE.x32
JR Z,.next
@ -383,7 +383,7 @@ GET_SECTOR_OF_FAT:
; ADC A,C
; EDUP
; LD C,A
; LD A,(FatBuffer.FAT_TYPE)
; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
; CP FAT_TYPE.x32
; RET NZ
; ADD HL,HL ;x2
@ -400,34 +400,34 @@ GET_SECTOR_OF_FAT:
; DE - NEW FAT BLOCK
READ_FAT_TABLE: PUSH HL
PUSH DE
LD A,(FatBuffer.CacheUpdated)
LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated)
OR A
CALL NZ,WRITE_FAT_TABLE.Start
POP DE
;
EX DE,HL
LD (FatBuffer.CacheBlock),HL
LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL
;
CALL GET_SECTOR_OF_FAT
;
; BC:HL - ­®¬¥à «®£.ᥪâ®à 
LD DE,(FatBuffer.FAT1_SEC_L)
LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L)
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(FatBuffer.FAT1_SEC_H)
LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H)
; JR NC,.no_inc
; INC HL
.no_inc: ADC HL,BC
; HL:IX - SECTOR FAT FOR READING
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
JR NZ,.next
LD B,FAT_CACHE.Sectors_32 ; ॣ B * FAT_CACHE.Sector_Size = CASH SIZE
.next: LD DE,FATPAGE.cache ; ªã¤  ; DE - FAT ADDRESS
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
RST ToDSS.DRV
POP HL
RET
@ -443,7 +443,7 @@ WRITE_FAT_TABLE:
OUT (SLOT3),A
RET
; ‡ ¯¨áì ª¥è  FAT-  ­  ¤¨áª
.Start: LD HL,(FatBuffer.CacheBlock)
.Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock)
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
CALL GET_SECTOR_OF_FAT
; B=0, C:HL - ᬥ饭¨¥ ¢ ᥪâ®à å ¢­ãâਠ⠡«¨æë FAT ­  ­ ç «® ¡«®ª 
@ -453,7 +453,7 @@ WRITE_FAT_TABLE:
;LD C,L
;
LD DE,FAT_CACHE.Sectors_32
LD A,(FatBuffer.FAT_TYPE)
LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR Z,.next
LD DE,FAT_CACHE.Sectors_16 ; !FIXIT ¡à âì íâ® §­ ç¥­¨¥ ¨§ ¯¥à¥¬¥­­®© ¢¥§¤¥
@ -466,10 +466,10 @@ WRITE_FAT_TABLE:
;
.no_inc: ; ª®­¥æ ¡«®ª  ¢ë室¨â §  ¯à¥¤¥«ë â ¡«¨æë?
LD B,E ; MAX ç¨á«® ᥪâ®à®¢ ¤«ï ç⥭¨ï ¢ ªíè
LD A,(FatBuffer.SectorsPerFAT_H)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H)
LD (.sub_A),A
;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
LD DE,(FatBuffer.SectorsPerFAT_L)
LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L)
AND A
LD A,C
SBC HL,DE
@ -493,8 +493,8 @@ WRITE_FAT_TABLE:
;PUSH HL
;
; B = ç¨á«® ᥪâ®à®¢
LD IX,(FatBuffer.FAT1_SEC_H)
LD DE,(FatBuffer.FAT1_SEC_L)
LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H)
LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L)
;LD B,A
;LD C,Dss.DRV.Write ; § ¯¨áì ᥪâ®à®¢
PUSH BC
@ -505,26 +505,26 @@ WRITE_FAT_TABLE:
CALL .SAVE_FAT_XX
; [x] ¥á«¨ ¢á¥£® ®¤­  â ¡«¨æ  FAT, â® ¯®¢â®à­®© § ¯¨á¨ ­¥ ¯à®¨á室¨â 13/03/2024
POP BC ; B = ç¨á«® ᥪâ®à®¢, C = áâ à訩 ¡ ©â ᬥ饭¨ï ¢ ᥪâ®à å
LD HL,(FatBuffer.FAT1_SEC_H)
LD DE,(FatBuffer.FAT2_SEC_H)
LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H)
LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H)
AND A
SBC HL,DE
JR NZ,.not_one_FAT
LD HL,(FatBuffer.FAT2_SEC_L)
LD DE,(FatBuffer.FAT1_SEC_L)
LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L)
LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L)
; CF = 0
SBC HL,DE
JR Z,.only_one_FAT
;
; á®å࠭塞 ¢â®àãî ª®¯¨î FAT
.not_one_FAT: LD IX,(FatBuffer.FAT2_SEC_H)
LD DE,(FatBuffer.FAT2_SEC_L)
.not_one_FAT: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H)
LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L)
LD HL,(.save_hl)
CALL .SAVE_FAT_XX
AND A ;!TODO ­¥â ª®­âà®«ï ®è¨¡®ª
.only_one_FAT: ;
.ERR: LD A,0
LD (FatBuffer.CacheUpdated),A
LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A
RET
; ‚室: IX:DE - ­ ç «® â ¡«¨æë FAT ¢ ᥪâ®à å
; C:HL - ᬥ饭¨¥ ¢ â ¡«¨æ¥ ¢ ᥪâ®à å
@ -546,7 +546,7 @@ WRITE_FAT_TABLE:
LD XL,E
; HL:IX - ᬥ饭¨¥ ¢­ãâਠࠧ¤¥«  ­  ­ ç «® ­ã¦­®£® ¡«®ª  FAT
LD DE,FATPAGE.cache ; ®âªã¤ 
LD A,(FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; ­®¬¥à ¤¨áª 
LD C,Dss.DRV.Write
JP ToDSS.DRV
@ -585,7 +585,7 @@ GET_FAT32_CELL:
;
EXX
EX DE,HL
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
@ -611,9 +611,9 @@ GET_FAT16_CELL:
;
ADD HL,HL ; HL - FAT OFFSET (FROM CASH)
; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
@ -654,9 +654,9 @@ GET_FAT12_CELL:
;AND FAT_CACHE.Part_Mask_16
;
; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
@ -683,7 +683,7 @@ CLUSTER_TO_SECTOR:
; DE:HL - cluster
DEC HL
DEC HL
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster)
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster)
XOR 1
JR Z,.skip
;
@ -698,13 +698,13 @@ CLUSTER_TO_SECTOR:
.skip: EX DE,HL
LD XL,E
LD XH,D
LD DE,(FatBuffer.FirstDataSector_L)
LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L)
; [x] fat32
;XOR A
;
ADD IX,DE
; [x] fat32
LD DE,(FatBuffer.FirstDataSector_H)
LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H)
;LD D,A
;LD E,A
;
@ -720,7 +720,7 @@ CLUSTER_TO_SECTOR:
; IX - buffer in RAM
; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï
BLOCK_READ: LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER
LD C,A
PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï, C - SectorsPerCluster
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
@ -809,7 +809,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
JR NC,.skip2
INC HL
.skip2: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Read
RST ToDSS.DRV
@ -817,7 +817,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
JR C,.Error
POP BC ; B = ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã, C = (SectorsPerCluster - ®áâ â®ª) «¨¡® ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
;!TEST
LD A,B
LD B,C
@ -833,7 +833,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã = 0?
LD B,A
;
.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
.loop4: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster
LD A,B
SUB (HL)
LD B,A
@ -861,7 +861,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
PUSH BC
CALL CLUSTER_TO_SECTOR
LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Read
RST ToDSS.DRV
@ -869,7 +869,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX
;
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
.loop3: ADD HL,DE
DEC C
JR NZ,.loop3
@ -915,7 +915,7 @@ CHECK_FIRST_CLUSTER:
; IY - FM
; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï § ¯¨á¨
BLOK_WRITE: LD (READ.PointerOnBuffer),IX
LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER
LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER
LD C,A
PUSH BC ; B - ª®«¨ç¥á⢮ ᥪâ®à®¢ ¤«ï ç⥭¨ï, C - SectorsPerCluster
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
@ -1031,7 +1031,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
INC HL
; DOUBLE 1
.skip2: LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Write
RST ToDSS.DRV
@ -1040,7 +1040,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
JR C,.Error_3
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
;
LD A,B
LD B,C
@ -1057,7 +1057,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
RET Z ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  ¤®ç¨âªã = 0?
LD B,A
;
.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster
.big_loop: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster
LD A,B
SUB (HL)
LD B,A
@ -1090,7 +1090,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
CALL CLUSTER_TO_SECTOR
; DOUBLE 1
LD DE,(READ.PointerOnBuffer)
LD A,(FatBuffer.DRIVE)
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
LD B,C
LD C,Dss.DRV.Write
RST ToDSS.DRV
@ -1098,7 +1098,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
JR C,.Error_3
POP BC
LD HL,(READ.PointerOnBuffer)
LD DE,(CORE_BUFFERS.BootSector.BytesPerSector)
LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector)
.loop3: ADD HL,DE
DEC C
JR NZ,.loop3
@ -1268,12 +1268,12 @@ GET_OFFSET_IN_SECTORS:
;!TODO fat32
;=======================================================================
;BPB
;LD (FatBuffer.FAT2_SEC_L),HL
;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL
;LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
;BPB32
;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 <20>¥à¢ë© ª« áâ¥à ª®à­¥¢®£® ª â «®£  (®¡ëç­® 2) 4 ¡ ©â 
;FAT Max Cluster
;LD (FatBuffer.MaxClusterLow),HL
;LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL
;=======================================================================
;//MODULE: FAT_X

View File

@ -538,5 +538,12 @@ GET_RAMDRV_NUM:
LD A,(BC)
OR #60 ;!HARDCODE ᤥ« âì ­®¬¥à  à §­ëå ãáâனá⢠ç¥à¥§ ¬¥âª¨
RET
ENDDRVR EQU $
;
;
;TEST_DB_DEL_ME: DB 'Make here more than one page to load test'
;
;
;ENDDRVR EQU $
;

View File

@ -73,11 +73,52 @@
; LEN2 EQU 29 ; AMODE EQU 41
; LEN3 EQU 30 ; FTASK EQU 42
;
STRUCT _sFatBuffer
;.MSG: BYTE 'FAT'
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32
.CacheBlock: WORD #0000
.CacheUpdated: BYTE #00
;.SectorsPerBank: BYTE #00
.RootDirStartCluster_L: WORD #0000
.RootDirStartCluster_H: WORD #0000 ; [ ] fat32
.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM)
.FAT1_SEC_H: WORD #0000 ; [ ] fat32
.FAT2_SEC_L: WORD #0000
.FAT2_SEC_H: WORD #0000 ; [ ] fat32
.SectorsPerFAT_L WORD #0000
.SectorsPerFAT_H BYTE #00
.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR
.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£  ;!FIXIT ­¥ ¨á¯®«ì§ã¥âáï
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high ; [ ] fat32 ¡ë«® ®£à ­¨ç¥­¨¥ ¢ 32 ƒ¨£ 
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
;
.BytesPerSector WORD #0000
.SectorsPerCluster BYTE #00
.BPB_SERIAL_NUMBER DWORD #00000000
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
; IF COMPILE_UNUSED_CODE
; .FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
; ENDIF
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
ENDS
;
;
STRUCT _sBuffers
.FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1)
.FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ;
.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32
.FatBuffer _sFatBuffer
;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32
.EXE_Header _sEXE_HEADER ; 512 bytes
.Stack _sStack ; 256 bytes
.Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF

View File

@ -1 +1 @@
952
950

View File

@ -150,3 +150,8 @@ MOUSE_BAUD:
ENDIF
;----------------------------------------------------;
;
;
;----------------------------------------------------;
SUBLOAD_SIZE EQU 10 ; ª®«-¢® ᥪâ®à®¢ ª®â®à®¥ ­ ¤® ¯®¤£à㧨âì ¯®á«¥ § £à㧪¨ system.dos ¢ áâà ­¨æã
;----------------------------------------------------;

View File

@ -103,8 +103,14 @@ BATCH:
;CALL Restore_Screen
;R10
;pop af
ret c
ld (BAT_FM),a ; ¤¥áªà. bat-ä ©« 
JR NC,.good
CP DSS_Error.sys.TOO_MANY_FILES_IN_DIR
SCF
RET NZ
LD A,DSS_Error.sys.FILE_NOT_FOUND
RET
;
.good: ld (BAT_FM),a ; ¤¥áªà. bat-ä ©« 
; ¢ë¯®«­. ª®¬ ­¤ bat-ä ©« 
call NEWLINE
;!TODO ¢«®¦¥­­ë¥ bat. ¯¥à¥¤ ¢ âì ®è¨¡ªã ®¡à â­® ¢ ¢ë§ë¢ î騩 bat

View File

@ -1 +1 @@
314
315

@ -1 +1 @@
Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292
Subproject commit 0e2bbfb73ceb70a16b2ab2b5ee6cbc6bd5005bf7