boot.asm - bugfixes. dssboot.asm - support fat32. Core - bugfixes

This commit is contained in:
Anatoliy Belyanskiy 2024-06-05 03:06:29 +10:00
parent 83bfcf7cdd
commit 568806c67a
8 changed files with 873 additions and 416 deletions

View File

@ -11,10 +11,12 @@
; + System Bootstrap + ; + System Bootstrap +
; + Initial revision 09 Nov 1998 + ; + Initial revision 09 Nov 1998 +
; +------------------------------+ ; +------------------------------+
MODULE DSS_Boot_Loader
; BIOS 3.06 § £à㦠¥â ®¤¨­ ᥪâ®à § £àã§ç¨ª  ¨ ¯¥à¥¤ ñâ ¥¬ã ã¯à ¢«¥­¨¥. ; BIOS 3.06 § £à㦠¥â ®¤¨­ ᥪâ®à § £àã§ç¨ª  ¨ ¯¥à¥¤ ñâ ¥¬ã ã¯à ¢«¥­¨¥.
DEFINE ORIGINAL_DSS 0 DEFINE ORIGINAL_DSS 0
DEFINE UNIVERSAL_BOOT 1 DEFINE UNIVERSAL_BOOT 1
LOAD_SECTORS EQU SECTORS_OF_LOADER-1
DISP #8000 DISP #8000
@ -27,6 +29,9 @@
DRIVE: _mSYSID DRIVE: _mSYSID
DI DI
; ;!TEST 26/03/2024
; LD SP,#C000
; ;
LD (DRIVE),A LD (DRIVE),A
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
XOR A XOR A
@ -171,18 +176,15 @@ FATMSG: DB "FAT"
GOOD_DRIVE: LD DE,#8200 ;!HARDCODE GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD HL,0 LD HL,0
LD IX,2 LD IX,2
LD BC,2*256 + BIOS.DRV_READ ;!HARDCODE ¤®§ £à㧪  ¥éñ ¤¢ãå ᥪâ®à®¢ § £àã§ç¨ª  LD BC,LOAD_SECTORS*256 + BIOS.DRV_READ ; ¤®§ £à㧪  ᥪâ®à®¢ § £àã§ç¨ª 
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
JP C,FAIL.NULL JP C,FAIL.NULL
; ;
; CONTINUE ; CONTINUE
;!TEST 26/03/2024
;LD SP,#C000
;
LD HL,0 LD HL,0
LD (DISKL),HL LD (PARTITION_START_L),HL
LD (DISKH),HL LD (PARTITION_START_H),HL
; ;
LD BC,1*256 + BIOS.GetMem LD BC,1*256 + BIOS.GetMem
RST ToBIOS_18 ;GET PAGE FOR DOS RST ToBIOS_18 ;GET PAGE FOR DOS
@ -210,7 +212,10 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
OR A OR A
PUSH AF PUSH AF
; § £à㧪  ; § £à㧪 
LD HL,(FCLUSTR) EXX
LD HL,(FCLUSTER_H)
EXX
LD HL,(FCLUSTR_L)
LD DE,#C000 LD DE,#C000
CALL LOAD_CORE CALL LOAD_CORE
; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢ ; [ ] § £à㧪  system.dos ¡®«ìè¥ #4000 ¡ ©â®¢
@ -229,8 +234,12 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢ CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
JP NC,INC_SECTOR_NUM JP NC,INC_SECTOR_NUM
CALL R_F_FAT ; next cluster in chain ;CALL R_F_FAT ; next cluster in chain
CALL READ_FROM_FAT ; next cluster in chain
EX DE,HL EX DE,HL
EXX
EX DE,HL
EXX
LD DE,#C000 LD DE,#C000
CALL NC,LOAD_CORE CALL NC,LOAD_CORE
.no_big_core: ; .no_big_core: ;
@ -326,7 +335,7 @@ RUN_CORE: DI
; ;
INC_SECTOR_NUM: PUSH DE INC_SECTOR_NUM: PUSH DE
CALL NSECTOR CALL CLUSTER_TO_SECTOR
LD DE,#20 ;!HARDCODE ª®«¨ç¥á⢮ ¯à®ç¨â ­­ëå ᥪâ®à®¢ LD DE,#20 ;!HARDCODE ª®«¨ç¥á⢮ ¯à®ç¨â ­­ëå ᥪâ®à®¢
ADD IX,DE ADD IX,DE
JR NC,.no_inc JR NC,.no_inc
@ -335,7 +344,10 @@ INC_SECTOR_NUM: PUSH DE
POP DE POP DE
LD BC,RUN_CORE LD BC,RUN_CORE
PUSH BC PUSH BC
PUSH HL PUSH HL ; ¤«ï ¡ « ­á 
;EXX
PUSH HL ; ¤«ï ¡ « ­á 
;EXX
JP LOAD_CORE.subload JP LOAD_CORE.subload
; CALL .set_stack ; CALL .set_stack
@ -408,20 +420,20 @@ PART_TB: PUSH BC
YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® YEPDOS: ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,#80 LD A,#80
CP (IX+0) CP (IX + _sMBR_PARTITION_RECORD.isActive)
JR NZ,PART_TB.next JR NZ,PART_TB.next
LD A,4 ;!HARDCODE áç¥â稪 § ¯¨á¥© ¯ àâ¨æ¨© ¢ MBR LD A,4 ;!HARDCODE áç¥â稪 § ¯¨á¥© ¯ àâ¨æ¨© ¢ MBR
SUB B SUB B
PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥«  PUSH AF ; ­®¬¥à § £à㧮筮£® à §¤¥« 
; ;
LD E,(IX+08) LD E,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD D,(IX+09) LD D,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD L,(IX+10) LD L,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IX+11) LD H,(IX + _sMBR_PARTITION_RECORD.Start_LBA + 3)
PUSH DE PUSH DE
POP IX POP IX
LD (DISKL),IX LD (PARTITION_START_L),IX
LD (DISKH),HL LD (PARTITION_START_H),HL
LD A,(DRIVE) LD A,(DRIVE)
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
@ -438,7 +450,7 @@ YEPDOS: ;[ ] 17.12.2023
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
;/* /*
GET_BPB: LD IX,#0000 GET_BPB: LD IX,#0000
LD HL,#0000 LD HL,#0000
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
@ -551,8 +563,8 @@ GET_BPB: LD IX,#0000
.BPB_FAT: LD (FatBuffer.FAT_TYPE),A .BPB_FAT: LD (FatBuffer.FAT_TYPE),A
;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL
; ;
LD IX,(DISKL) LD IX,(PARTITION_START_L)
LD HL,(DISKH) LD HL,(PARTITION_START_H)
LD DE,(FatBuffer.FAT1_SEC_L) LD DE,(FatBuffer.FAT1_SEC_L)
LD BC,#0000 LD BC,#0000
ADD IX,DE ADD IX,DE
@ -583,7 +595,7 @@ GET_BPB: LD IX,#0000
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* ;/*
GET_BPB: LD IX,#0000 GET_BPB: LD IX,#0000
LD HL,#0000 LD HL,#0000
LD DE,BOOT_BUFFER LD DE,BOOT_BUFFER
@ -639,7 +651,7 @@ GET_BPB: LD IX,#0000
; ;
; ;R08 ; [x] fat32 ; ;R08 ; [x] fat32
; LD HL,BOOT_BUFFER ; LD HL,BOOT_BUFFER
; LD DE,CORE_BUFFERS.BootSector ; LD DE,BootSector
; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size
; LDIR ; LDIR
; ;
@ -647,20 +659,21 @@ GET_BPB: LD IX,#0000
CP #F0 CP #F0
RET C RET C
; ;
; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
; LD (FatBuffer.BytesPerSector),HL LD (FatBuffer.BytesPerSector),HL
; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
; LD (FatBuffer.SectorsPerCluster),A LD (FatBuffer.SectorsPerCluster),A
; calc. first sector FAT ; calc. first sector FAT
LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS)
LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 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 (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2
; fat32 ; fat32
XOR A XOR A
LD B,A LD B,A
LD C,A LD C,A
LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; fat32 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.FAT2_SEC_H),BC ; high word first sector FAT #1 ; fat32
LD (FatBuffer.RootDirFirstSector_H),BC
LD (FatBuffer.SectorsPerFAT_H),A ; fat32 LD (FatBuffer.SectorsPerFAT_H),A ; fat32
; ;
; ;
@ -692,9 +705,8 @@ GET_BPB: LD IX,#0000
JR NZ,.loop1 JR NZ,.loop1
; ;
LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD (FatBuffer.FirstDataSector_H),BC
;LD BC,(FatBuffer.BytesPerSector) LD BC,(FatBuffer.BytesPerSector)
LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
LD A,B LD A,B
AND A AND A
; ;
@ -736,10 +748,10 @@ GET_BPB: LD IX,#0000
LD (FatBuffer.FirstDataSector_L),HL LD (FatBuffer.FirstDataSector_L),HL
; B = 0 ; B = 0
; ;
;LD HL,(FatBuffer.BytesPerSector) LD HL,(FatBuffer.BytesPerSector)
LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) ;LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector)
;LD A,(FatBuffer.SectorsPerCluster) LD A,(FatBuffer.SectorsPerCluster)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
;!TODO FATcacheSize ;!TODO FATcacheSize
; calc. cluster size ; calc. cluster size
XOR 1 XOR 1
@ -774,17 +786,7 @@ GET_BPB: LD IX,#0000
SBC HL,DE SBC HL,DE
; ;
.HDDBIG: CALL SectorToCluster .HDDBIG: CALL SectorToCluster
; LD A,(FatBuffer.SectorsPerCluster) INC HL
; SCF
; .loop7: RRA
; JR C,.loop7_exit
; RR B
; RR C
; RR H
; RR L
; JP .loop7
;
.loop7_exit: INC HL
LD (FatBuffer.MaxClusterLow),HL LD (FatBuffer.MaxClusterLow),HL
LD A,L LD A,L
OR H OR H
@ -838,8 +840,8 @@ GET_BPB: LD IX,#0000
POP DE ; Total Sectors low POP DE ; Total Sectors low
; HL:DE = DataSec ; HL:DE = DataSec
; ;
;LD A,(FatBuffer.SectorsPerCluster) LD A,(FatBuffer.SectorsPerCluster)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
CALL DIV_for_SPC CALL DIV_for_SPC
; ¢ëïá­ï¥¬ à §à來®áâì FAT ; ¢ëïá­ï¥¬ à §à來®áâì FAT
@ -906,12 +908,12 @@ GET_BPB: LD IX,#0000
EXX EXX
LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD (FatBuffer.RootDirStartCluster_L),HL LD (FatBuffer.RootDirStartCluster_L),HL
LD BC,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD DE,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (FatBuffer.RootDirStartCluster_H),BC LD (FatBuffer.RootDirStartCluster_H),DE
; ;
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR.no_prepare
LD (FatBuffer.RootDirFirstSector_L),HL LD (FatBuffer.RootDirFirstSector_L),IX
LD (FatBuffer.RootDirFirstSector_H),BC LD (FatBuffer.RootDirFirstSector_H),HL
; ;
LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector)
LD (FatBuffer.FSINFO_Sector),HL LD (FatBuffer.FSINFO_Sector),HL
@ -931,89 +933,11 @@ GET_BPB: LD IX,#0000
LD DE,FatBuffer.BPB_LABEL LD DE,FatBuffer.BPB_LABEL
LD BC,11 ;!HARDCODE LD BC,11 ;!HARDCODE
LDIR LDIR
;
SET_PAGE_X FATPAGE
PUSH AF
LD DE,0 LD DE,0
CALL READ_FAT_TABLE CALL READ_FAT_TABLE
POP AF AND A
OUT (SLOT3),A
;
; “áâ ­®¢¨âì ­ ç «ì­ë© ª« áâ¥à ¤«ï ç⥭¨ï
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
JR Z,.set_FSinfo
;
LD HL,#0001
LD (G_CLUST.low),HL
DEC L
LD (G_CLUST.high),HL
;
DEC HL
LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL
LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL
XOR A
RET RET
; ;
.set_FSinfo: CALL READ_FSinfo
; !FIXIT ¯à®¢¥àª  ­  ®è¨¡ªã
;
; ¯à®¢¥àª  ®¤­®© ¨§ á®â­¨ áà ­ëå ᨣ­ âãà
LD HL,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE)
LD DE,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE + 2)
LD BC,#7272
SBC HL,BC
JR NZ,.error
EX DE,HL
LD DE,#6141
SBC HL,DE
JR NZ,.error
; FREE_CLUSTERS_COUNT
LD BC,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT)
LD DE,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2)
; CF = 0
CALL .check_cluster
JR NC,.skip_FFFF
;
LD B,#FF
LD C,B
LD D,B
LD E,B
;
.skip_FFFF: LD (FatBuffer.FREE_CLUSTERS_COUNT_L),BC
LD (FatBuffer.FREE_CLUSTERS_COUNT_H),DE
;
; FIRST_FREE_CLUSTER
LD BC,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER)
LD DE,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2)
; CF = 0
CALL .check_cluster
JR C,.error
;
LD (G_CLUST.high),DE
LD (G_CLUST.low),BC
XOR A
.error: LD (FatBuffer.UPD_FSINFO),A
RET Z
;!TODO FREE_CLUSTERS_COUNT
;LD HL,#FFFF
;LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL
;LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL
;
XOR A
LD H,A
LD L,2
LD (G_CLUST.low),HL
LD L,H
LD (G_CLUST.high),HL
RET
;
;!TODO MaxCluster - ¬ ªá¨¬ «ì­® ¤®¯ãáâ¨¬ë© ¨«¨ ­  1 ¡®«ìè¥ ¬ ªá¨¬ «ì­® ¤®¯ãá⨬®£®?
.check_cluster: LD HL,(FatBuffer.MaxClusterLow)
SBC HL,BC
LD HL,(FatBuffer.MaxClusterHigh)
SBC HL,DE
RET
;;;;;;;; ;;;;;;;;
; --> BC:HL - Sector ; --> BC:HL - Sector
@ -1022,8 +946,8 @@ SectorToCluster:
LD A,B LD A,B
AND #0F AND #0F
LD B,A LD B,A
;LD A,(FatBuffer.SectorsPerCluster) LD A,(FatBuffer.SectorsPerCluster)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ;LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
SCF SCF
.loop: RRA .loop: RRA
RET C RET C
@ -1033,15 +957,85 @@ SectorToCluster:
RR L RR L
JP .loop JP .loop
; ;
*/ ; HL:DE / A => DE:BC, H=0, L - ®áâ â®ª
DIV_for_SPC:
LD C,A
DEC A
JR Z,.exit
;
AND E
LD B,A ; ®áâ â®ª
LD A,C
RRCA
;
.loop: SRL H
RR L
RR D
RR E
RRCA
JP NC,.loop
LD A,B
.exit: LD B,D
LD C,E
EX DE,HL
LD H,0
LD L,A
RET
;
;NSECTOR:
; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR
CLUSTER_TO_SECTOR:
EXX
PUSH HL
EXX
POP DE
; DE:HL - cluster
;
.no_prepare: PUSH BC
LD BC,-2
ADD HL,BC
JR C,.no_dec_de
DEC DE
.no_dec_de: ; cluster = cluster - 2
;
LD A,(FatBuffer.SectorsPerCluster)
XOR 1
JR Z,.skip
;
RRA
.loop: ADD HL,HL
RL E
RL D
;
RRA
JP NC,.loop
;
.skip: EX DE,HL
LD XL,E
LD XH,D
LD DE,(FatBuffer.FirstDataSector_L)
ADD IX,DE
LD DE,(FatBuffer.FirstDataSector_H)
ADC HL,DE
;
POP BC
RET
;
;*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; ¯®¨áª system.dos ; ¯®¨áª system.dos
GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
LD IX,(FatBuffer.RootDirFirstSector_L) LD IX,(FatBuffer.RootDirFirstSector_L)
LD BC,(DISKL) LD BC,(PARTITION_START_L)
LD DE,(DISKH) LD DE,(PARTITION_START_H)
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x32
LD A,(FatBuffer.DirSizeInSectors) LD A,(FatBuffer.DirSizeInSectors)
JR NZ,.NEXTSEC
;
LD A,(FatBuffer.SectorsPerCluster);!FIXIT ¯à®çâñâ ⮫쪮 ¯¥à¢ë© ª« áâ¥à ä ©«®¢ ­  FAT32
.NEXTSEC: PUSH AF .NEXTSEC: PUSH AF
ADD IX,BC ADD IX,BC
ADC HL,DE ADC HL,DE
@ -1049,7 +1043,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
PUSH IX PUSH IX
PUSH HL PUSH HL
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
LD DE,DIR LD DE,DIR_BUFFER
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
CALL SEARCH CALL SEARCH
@ -1069,7 +1063,7 @@ GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H)
; ;
SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
LD IX, DIR - FAT_DIRECTORY_RECORD LD IX, DIR_BUFFER - FAT_DIRECTORY_RECORD
.SKIPNAM: LD DE,FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD
ADD IX,DE ADD IX,DE
DEC C DEC C
@ -1108,12 +1102,27 @@ SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1
AND A ; ­  ¢ë室¥ ZF = CF = 0 AND A ; ­  ¢ë室¥ ZF = CF = 0
RET RET
; ; HL - CLUSTER ; HL - CLUSTER
; ; DE - ADDRESS ; DE - ADDRESS
; ;!TODO ᤥ« âì âãâ ®¯à¥¤¥«¥­¨¥ à §¬¥à  SYSTEM.DOS ¨ ¢®§¬®¦­®áâì § £à㧨âì ¡®«ìè¥ 1 áâà ­¨æë ; !TODO ᤥ« âì âãâ ®¯à¥¤¥«¥­¨¥ à §¬¥à  SYSTEM.DOS
; [ ] ¨ ¢®§¬®¦­®áâì § £à㧨âì ¡®«ìè¥ 1 áâà ­¨æë
LOAD_CORE: LD (READMEM),DE LOAD_CORE: LD (READMEM),DE
.loop: PUSH HL .loop: PUSH HL
CALL NSECTOR EXX
PUSH HL
EXX
;
CALL CLUSTER_TO_SECTOR
;
;LD A,(FatBuffer.FAT_TYPE)
; CP FAT_TYPE.x32
; JR NZ,.skip_it
;
LD DE,(PARTITION_START_L)
ADD IX,DE
LD DE,(PARTITION_START_H)
ADC HL,DE
;.skip_it: ;
LD DE,(READMEM) LD DE,(READMEM)
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
.max_sectors+1: CP #20 .max_sectors+1: CP #20
@ -1126,6 +1135,10 @@ LOAD_CORE: LD (READMEM),DE
EX AF,AF' EX AF,AF'
LD A,(DRIVE) LD A,(DRIVE)
RST ToBIOS_18 RST ToBIOS_18
EXX
POP HL
EXX
POP HL POP HL
;AND A ;AND A
RET RET
@ -1141,6 +1154,9 @@ LOAD_CORE: LD (READMEM),DE
LD DE,(FatBuffer.BytesPerCluster) LD DE,(FatBuffer.BytesPerCluster)
ADD HL,DE ADD HL,DE
LD (READMEM),HL LD (READMEM),HL
EXX
POP HL
EXX
POP HL POP HL
CCF CCF
RET NC RET NC
@ -1150,8 +1166,12 @@ LOAD_CORE: LD (READMEM),DE
LD (BIG_CORE),A LD (BIG_CORE),A
RET Z RET Z
; ;
CALL R_F_FAT CALL READ_FROM_FAT
;CALL R_F_FAT
RET C RET C
EXX
EX DE,HL
EXX
EX DE,HL EX DE,HL
JP .loop JP .loop
@ -1240,7 +1260,7 @@ LOAD_CORE: LD (READMEM),DE
; ;
/*
; --> HL - CLUSTER ; --> HL - CLUSTER
; <-- HL:IX - SECTOR ; <-- HL:IX - SECTOR
NSECTOR: LD DE,0 NSECTOR: LD DE,0
@ -1267,13 +1287,260 @@ NSECTOR: LD DE,0
LD E,A LD E,A
ADC HL,DE ADC HL,DE
; ;
LD DE,(DISKL) LD DE,(PARTITION_START_L)
ADD IX,DE ADD IX,DE
LD DE,(DISKH) LD DE,(PARTITION_START_H)
ADC HL,DE ADC HL,DE
RET RET
*/
;------------------------------------------------------------------------------------------------
; <20>à®ç¨â âì ¨§ ª¥è  FAT-  ­®¬¥à á«¥¤. ª« áâ¥à 
; ¢å®¤: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®. ⮫쪮 ¤«ï FAT32)
; ¢ë室: hl - ­®¬¥à ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; hl' - ­®¬¥à ª« áâ¥à  (áâ à襥 á«®¢®)
; de - ­®¬¥à á«¥¤. ª« áâ¥à  (¬« ¤è¥¥ á«®¢®)
; de' - ­®¬¥à á«¥¤. ª« áâ¥à  (áâ à襥 á«®¢®)
; ¥á«¨ DE':DE = 0, â® ª« áâ¥à HL':HL ᢮¡®¤¥­
; CF - ª®­¥æ 楯®çª¨
;------------------------------------------------------------------------------------------------
READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER
RET C
PUSH HL
;
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
;
LD A,(FatBuffer.FAT_TYPE)
CP FAT_TYPE.x16
JR C,.FAT12
JR NZ,.FAT32
; fat16, ¯à®áâ® ç¨â âì á«¥¤. ­®¬¥à
.FAT16: CALL GET_FAT16_CELL
LD E,(HL) ; ¯à®ç¨â âì ­®¬¥à ª« áâ¥à 
INC HL
LD D,(HL)
;
LD HL,SERVICE_SECTORS.FAT16
.exit: POP AF
OUT (SLOT3),A
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë
SBC HL,DE
POP HL
;!FIXIT fat32 ¯¥à¥áâà å®¢ª 
EXX
LD H,A
LD L,A
LD D,A
LD E,A
EXX
RET
;
;
.FAT12: CALL GET_FAT12_CELL
LD E,(HL)
INC HL
LD D,(HL)
LD HL,SERVICE_SECTORS.FAT12
JR NC,.Correct_2
.Correct_1: LD A,E
AND #F0
DUP 4 ; ¢¯à ¢® ­  4 ¡¨âa
RR D
RRA
EDUP
LD E,A
JR .exit
;
.Correct_2: LD A,D
AND #0F
LD D,A
JR .exit
;
.FAT32: EXX
PUSH HL
EXX
;
CALL GET_FAT32_CELL
; ¯à®ç¨â âì ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
LD E,(HL)
INC HL
LD D,(HL)
INC HL
; ¯à®ç¨â âì áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
LD A,(HL)
INC HL
EX AF,AF'
LD A,(HL)
EXX
AND #0F
LD D,A
EX AF,AF'
LD E,A
EXX
; ®¡­ã«ï¥¬ CF ¨ ãáâ ­ ¢«¨¢ ¥¬ ª®¤ ®è¨¡ª¨ = DssErr.sys.NO_ERROR
XOR A
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë ¬« ¤è¥£® á«®¢  ª« áâ¥à 
LD HL,SERVICE_SECTORS.FAT32.Low
SBC HL,DE
; ¯à®¢¥àª  ­  á«ã¦. ª« áâ¥àë áâ à襣® á«®¢  ª« áâ¥à 
EXX
LD HL,SERVICE_SECTORS.FAT32.High
SBC HL,DE
POP HL
EXX
POP BC
LD A,B
OUT (SLOT3),A
POP HL
LD A,0
RET
;
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
; CF - çñâ­ë©/­¥çñâ­ë©  ¤à¥á ª« áâ¥à 
GET_FAT12_CELL: LD D,H
LD E,L
SRL H
RR L ; ᤢ¨£ ¢¯à ¢® ç¥à¥§ CF
PUSH AF ; á®åà. ä« £
ADD HL,DE ; CLUSTER * 1.5
;
IF FAT_CACHE.Size_12 < #1800
;!FIXIT ®¯â¨¬¨§¨à®¢ âì
LD A,H
LD B,H
;
AND #1F
;AND FAT_CACHE.Size_Mask_16
;
LD H,A
LD A,B
;
RLCA
RLCA
RLCA
;DUP FAT_CACHE.Degree_16
; RRCA
;EDUP
AND #07
;AND FAT_CACHE.Part_Mask_16
;
; [ ] ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; ¯à®ç¨â âì ¢ ª¥è 16 ᥪâ®à®¢ FAT- 
ENDIF
;
LD DE,FATPAGE.cache
ADD HL,DE
POP AF
RET
;
;¢å®¤: HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT16_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)
; [x] fat32 ¯®¬¥­ï«áï ¢å®¤ ¢ ¯à®æ¥¤ãàã READ_FAT_TABLE. <20> ­ìè¥ ­®¬¥à ¡«®ª  ¢ ॣ. A ¯¥à¥¤ ¢ «áï
; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
; CP C
LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
CP E
LD E,A
;
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
;¢å®¤: HL':HL - ­®¬¥à ª« áâ¥à 
;¢ë室: HL -  ¤à¥á ­ã¦­®© ï祩ª¨ ¢ áâà ­¨æ¥ FATPAGE
GET_FAT32_CELL: ; ¤¢¨£ ¥¬ ¢«¥¢® HL':H
LD A,H
EXX
LD C,A
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
LD A,C
;
LD B,FAT_CACHE.Degree ; 4 ᤢ¨£ 
.loop_block: RLCA ; << H
RL L ; << L'
RL H ; << H'
DJNZ .loop_block
EXX
; ¨â®£¥ âãâ ¢ HL' ­®¬¥à ¡«®ª  FAT
;
; HL - FAT32 OFFSET (FROM CASH)
LD A,H
AND FAT_CACHE.Size_Mask_32 ; #0F
LD H,A
ADD HL,HL
ADD HL,HL
PUSH HL ; [ç] fat32 á®å࠭塞 ­  á«ãç ©, ¥á«¨ READ_FAT_TABLE ¨á¯®àâ¨â
AND A
;
EXX
EX DE,HL
LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH
SBC HL,DE
CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT
POP HL
LD DE,FATPAGE.cache ; ­ ç «® ª¥è  FAT- 
ADD HL,DE ; ­  ï祩ªã FAT
RET
;
; [x] fat32 ;!TEST
; ¢å®¤: hl = ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster
; hl' = áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à  ¤«ï áà ¢­¥­¨ï á FAT_Max_Cluster (⮫쪮 ¤«ï fat32)
CHECK_CLUSTER_IS_SMALLER:
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
JR NZ,.low ; Z=0 ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
; ¯à®¢¥à塞 áâ à襥 á«®¢® ­®¬¥à  ª« áâ¥à 
EXX
EX DE,HL
LD HL,(FatBuffer.MaxClusterHigh)
; CF = 0
SBC HL,DE
EX DE,HL
EXX
LD A,DSS_Error.sys.DISK_FULL
RET C
RET NZ
; ¯à®¢¥à塞 ¬« ¤è¥¥ á«®¢® ­®¬¥à  ª« áâ¥à 
.low: EX DE,HL
LD HL,(FatBuffer.MaxClusterLow)
SBC HL,DE
EX DE,HL
LD A,DSS_Error.sys.DISK_FULL
RET
;
/*
;----------------- ;-----------------
;!TODO ᤥ« âì íâ® ¬ ªà®á ¬¨ ¨«¨ ¨­ª«î¤ ¬¨ ã­¨¢¥àá «ì­ë¬¨. ¯®¢â®àïîâáï ¢ ¤®á¥ ¨ ¥éñ £¤¥-â®
; HL - CLUSTER ; HL - CLUSTER
; DE - (CLUSTER) ; DE - (CLUSTER)
R_F_FAT: PUSH HL R_F_FAT: PUSH HL
@ -1358,8 +1625,11 @@ R_F_FAT: PUSH HL
; POP HL ; POP HL
; RET ; RET
; ;
*/
;
; ;
/*
RE_FAT: PUSH HL RE_FAT: PUSH HL
LD L,A LD L,A
LD H,0 LD H,0
@ -1374,10 +1644,10 @@ RE_FAT: PUSH HL
EX DE,HL EX DE,HL
JR NC,.NOINX JR NC,.NOINX
INC IX INC IX
.NOINX: LD HL,(DISKL) .NOINX: LD HL,(PARTITION_START_L)
ADD HL,DE ADD HL,DE
EX DE,HL EX DE,HL
LD BC,(DISKH) LD BC,(PARTITION_START_H)
JR NC,.NOINX2 JR NC,.NOINX2
INC IX INC IX
.NOINX2: ADD IX,BC .NOINX2: ADD IX,BC
@ -1391,18 +1661,123 @@ RE_FAT: PUSH HL
RST ToBIOS_18 RST ToBIOS_18
POP HL POP HL
RET RET
*/
; ;
;RE_FAT:
;RX01
; <20>à®ç¨â âì ¢ ª¥è •• ᥪâ®à®¢ FAT- 
; DE - NEW FAT BLOCK
READ_FAT_TABLE: PUSH HL
;
EX DE,HL
LD (FatBuffer.CacheBlock),HL
;
CALL GET_SECTOR_OF_FAT
;
; BC:HL - ­®¬¥à «®£.ᥪâ®à 
LD DE,(FatBuffer.FAT1_SEC_L)
ADD HL,DE
EX DE,HL
LD XH,D
LD XL,E
LD HL,(FatBuffer.FAT1_SEC_H)
; JR NC,.no_inc
; INC HL
.no_inc: ADC HL,BC
; HL:IX - SECTOR FAT FOR READING
;
LD DE,(PARTITION_START_L)
ADD IX,DE
LD DE,(PARTITION_START_H)
ADC HL,DE
LD DE,FAT_SECTORS_BUFFER
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
;
LD A,(FatBuffer.FAT_TYPE)
XOR FAT_TYPE.x32
LD BC,FAT_CACHE.Sectors_16*256 + BIOS.DRV_READ
JR NZ,.next
LD B,FAT_CACHE.Sectors_32
.next: LD A,(DRIVE)
RST ToBIOS_18
;
POP AF
OUT (SLOT3),A
POP HL
RET
;
;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT
; in: HL - Cache block
; out: C:HL - logical number
; B = 0
GET_SECTOR_OF_FAT:
LD A,(FatBuffer.FAT_TYPE)
LD B,FAT_CACHE.Degree_32 ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî
XOR FAT_TYPE.x32
JR Z,.next
LD B,FAT_CACHE.Degree ;!FIXIT ᤥ« âì ç¥à¥§ ¯¥à¥¬¥­­ãî
XOR A
.next: LD C,A
;
.loop: ADD HL,HL ;x2
ADC A,C
DJNZ .loop
;
LD C,A
RET
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
; Area for boot sector [512Bytes] ; Area for boot sector [512Bytes]
;BOOT _sBOOT_SECTOR_PARAMS = $ ;BOOT _sBOOT_SECTOR_PARAMS = $
BOOT_BUFFER EQU $ BOOT_BUFFER EQU $
DIR EQU BOOT_BUFFER+512 DIR_BUFFER EQU BOOT_BUFFER+512
;
FAT_SECTORS_BUFFER EQU DIR+512
VALUE EQU 3*512+FAT_SECTORS_BUFFER
; ;
;FAT_SECTORS_BUFFER EQU DIR_BUFFER+512
;VALUE EQU 3*512+FAT_SECTORS_BUFFER
FAT_SECTORS_BUFFER EQU #C000
VALUE EQU DIR_BUFFER+512
FatBuffer _sysFatBuffer = VALUE
/*
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; fat32
.CacheBlock: WORD #0000
.CacheUpdated: 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
.Number_Of_FATs BYTE #02
.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
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector: WORD #0000
.SectorsPerCluster: BYTE #00
.FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
.UPD_FSINFO: BYTE 0
.FREE_CLUSTERS_COUNT_L: WORD #FFFF
.FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
FatBuffer EQU VALUE FatBuffer EQU VALUE
.CacheBlock EQU FatBuffer+0 ; FatCache .CacheBlock EQU FatBuffer+0 ; FatCache
.FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT .FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT
@ -1412,7 +1787,13 @@ FatBuffer EQU VALUE
.FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC .FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC
.FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) .FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit)
.BytesPerCluster EQU FatBuffer+12; CLU_LEN .BytesPerCluster EQU FatBuffer+12; CLU_LEN
.FAT1_SEC_H EQU FatBuffer+14 ;
.SectorsPerFAT_L EQU FatBuffer+16
.SectorsPerFAT_H EQU FatBuffer+18
.FAT2_SEC_L EQU FatBuffer+20
.FAT2_SEC_H EQU FatBuffer+22
;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS ;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS
*/
; FatCache EQU VALUE+0 ; .CacheBlock ; FatCache EQU VALUE+0 ; .CacheBlock
@ -1427,20 +1808,19 @@ FatBuffer EQU VALUE
HANDBUF EQU VALUE+16 HANDBUF EQU VALUE + _sysFatBuffer
FCLUSTER32 EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H FCLUSTER_H EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H
; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME ; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME
; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE ; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE
FCLUSTR EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L FCLUSTR_L EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L
FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE
FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2
PARTITION_START_H EQU FSIZE1+2
DISKH EQU VALUE+48 PARTITION_START_L EQU PARTITION_START_H+2
DISKL EQU VALUE+50 READMEM EQU PARTITION_START_L+2
READMEM EQU VALUE+52 BIG_CORE EQU READMEM+2
;SHEL_FM EQU VALUE+54 BANKDOS EQU BIG_CORE+1
BIG_CORE EQU VALUE+54 ;SHEL_FM EQU VALUE+54
BANKDOS EQU VALUE+55
; EQU VALUE+56 ; EQU VALUE+56
;----------------- ;-----------------
@ -1454,6 +1834,11 @@ BANKDOS EQU VALUE+55
;STACK EQU (($/256)+2)*256 ;STACK EQU (($/256)+2)*256
DISPLAY "BOOT_BUFFER ",/H,BOOT_BUFFER
DISPLAY "DIR_BUFFER ",/H,DIR_BUFFER
DISPLAY "FatBuffer ",/H,FatBuffer
ENT ENT
ENDMODULE
OUTEND OUTEND
;[]-----------------------------------------------------------[] ;[]-----------------------------------------------------------[]

View File

@ -18,12 +18,52 @@
; ¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©. ; ¤¨áª¥â  ¤«ï á®§¤ ­¨ï ¨§ ­¥¥ § £à㧮筮©.
; ;
; ;
STRUCT _sysFatBuffer
.DRIVE: BYTE #FF
.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; 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
.Number_Of_FATs BYTE #02
.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
.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE
.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low
.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high
.BytesPerCluster: WORD #0000 ; CLUSTER_LEN
.END_CHAIN_CLUSTER_L: WORD #FFFF
.END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector: WORD #0000
.SectorsPerCluster: BYTE #00
.FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
;.UPD_FSINFO: BYTE 0
;.FREE_CLUSTERS_COUNT_L: WORD #FFFF
;.FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))
;.S_X_H: DWORD #0000 ; ª®«¨ç¥á⢮ ᥪâ®à®¢ ­  樫¨­¤à¥
ENDS
include 'shared_includes/constants/sp2000.inc' include 'shared_includes/constants/sp2000.inc'
include 'shared_includes/constants/bios_equ.inc' include 'shared_includes/constants/bios_equ.inc'
include 'shared_includes/constants/dss_equ.inc' include 'shared_includes/constants/dss_equ.inc'
include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/accelerator.z80'
include 'shared_includes/macroses/macros.z80' include 'shared_includes/macroses/macros.z80'
include 'shared_includes/structures/FileSystem.inc' include 'shared_includes/structures/FileSystem.inc'
;include 'DSS/structures.inc'
include '../DSS/defines.inc' include '../DSS/defines.inc'
DEFINE EXEinfoMACRO 0 DEFINE EXEinfoMACRO 0
@ -42,18 +82,19 @@
; ¢¥àá¨ï ¯à®£à ¬¬ë ; ¢¥àá¨ï ¯à®£à ¬¬ë
major_version equ 1 ; áâ. ­®¬¥à ¢¥àᨨ major_version equ 2 ; áâ. ­®¬¥à ¢¥àᨨ
minor_version equ 5 ; ¬«. ­®¬¥à minor_version equ 0 ; ¬«. ­®¬¥à
;; ;;
SECTORS_OF_LOADER EQU 4
org_addr EQU #8000 + CLP_Buffer org_addr EQU #8000 + CLP_Buffer
code_addr EQU BEGIN code_addr EQU BEGIN
program_start EQU BEGIN program_start EQU BEGIN
stack_point EQU #BFFE stack_point EQU #BFFE
Loader_length EQU 0 Loader_length EQU 0
; ;
page_buffer equ #C000 ; ¡ãä¥à ä ©«®¢ page_buffer equ #C000 ; ¡ãä¥à ä ©«®¢
;; ;;
include 'Shared_Includes/constants/EXE_Header.z80' include 'Shared_Includes/constants/EXE_Header.z80'
@ -108,40 +149,40 @@ version_ok: xor a ;
ld hl,root_path ; "X:\" ª®à¥­ì ¤¨áª  ld hl,root_path ; "X:\" ª®à¥­ì ¤¨áª 
add a,'A' add a,'A'
ld (hl),a ld (hl),a
ld c,1Dh ; ᬥ­  ª â «®£  ld c,Dss.ChDir ; ᬥ­  ª â «®£ 
RST ToDSS RST ToDSS
;-------------------------------------------- ;--------------------------------------------
; —⥭¨¥ ä ©«  system.exe ; —⥭¨¥ ä ©«  system.exe
;-------------------------------------------- ;--------------------------------------------
ld hl,name2 ; ¨¬ï ä ©«  ld hl,name2 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
jr nc,read_file1_ok ;jr nc,read_file1_ok
; ®á¢®¡. ¡«®ª ¯ ¬ï⨠; ®á¢®¡. ¡«®ª ¯ ¬ïâ¨
read_file_err: ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠;read_file_err: ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
ld a,-1 ; ª®¤ ®è¨¡ª¨ ;ld a,DSS_Error.sys.DISK_FULL ; ª®¤ ®è¨¡ª¨
jp exit jp c,exit
; á®åà. à ¡. ï祩ª¨ ä ©«  system.exe ; á®åà. à ¡. ï祩ª¨ ä ©«  system.exe
read_file1_ok: ld hl,file_handle ; ®âªã¤  read_file1_ok: ld hl,FILE1_PARAMS ; ®âªã¤ 
ld de,hFile1 ; ªã¤  ld de,FILE2_PARAMS ; ªã¤ 
ld bc,6 ld bc,FILE2_PARAMS.dataSize
ldir ldir
;-------------------------------------------- ;--------------------------------------------
; —⥭¨¥ ä ©«  system.dos ; —⥭¨¥ ä ©«  system.dos
;-------------------------------------------- ;--------------------------------------------
ld hl,name1 ; ¨¬ï ä ©«  ld hl,name1 ; ¨¬ï ä ©« 
call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë call read_file ; ¢áï à ¡®â  ¯® § £à㧪¥ ä ©«  ¢ áâà ­¨æë
jr nc,read_file2_ok ;jr c,read_file_err
;ld a,DSS_Error.sys.DISK_FULL; ª®¤ ®è¨¡ª¨
jp c,exit
;jr nc,read_file2_ok
; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.exe ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.exe
file_err1: ld a,(id_mem) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠; file_err1: ld a,(FILE2_PARAMS.id_blck); ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
jr read_file_err ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.dos ;jr read_file_err ; ®á¢®¡. ¡«®ª ¯ ¬ï⨠system.dos
confirm_flag+1: ld a,0
read_file2_ok:
confirm_flag+*: ld a,0
or a or a
jr z,no_confirm jr z,no_confirm
ld a,(boot_disk) ; á¨áâ. ¤¨áª ld a,(boot_disk) ; á¨áâ. ¤¨áª
@ -153,7 +194,7 @@ confirm_flag+*: ld a,0
ld (messages.lett2),a ld (messages.lett2),a
ld a,5 ; ¨­¤¥ªá áâப¨ "Insert destination disk..." ld a,5 ; ¨­¤¥ªá áâப¨ "Insert destination disk..."
call print_string call print_string
ld bc,3035h ; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨ ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
RST ToDSS RST ToDSS
no_confirm: ld a,2 ; ¨­¤¥ªá áâப¨ "Installing boot loader..." no_confirm: ld a,2 ; ¨­¤¥ªá áâப¨ "Installing boot loader..."
call print_string call print_string
@ -162,7 +203,7 @@ no_confirm: ld a,2 ;
ld hl,root_path ; "X:\" áâப  ¯ã⨠ld hl,root_path ; "X:\" áâப  ¯ãâ¨
add a,'A' add a,'A'
ld (hl),a ld (hl),a
ld c,1Dh ; ᬥ­  ⥪. ª â «®£  ld c,Dss.ChDir ; ᬥ­  ⥪. ª â «®£ 
RST ToDSS RST ToDSS
;-------------------------------------------- ;--------------------------------------------
; ‡ ¯¨á âì boot-§ £àã§ç¨ª ; ‡ ¯¨á âì boot-§ £àã§ç¨ª
@ -174,29 +215,29 @@ no_confirm: ld a,2 ;
; ‡ ¯¨áì ä ©«  system.dos ; ‡ ¯¨áì ä ©«  system.dos
ld hl,name1 ; ¨¬ï ä ©«  ld hl,name1 ; ¨¬ï ä ©« 
call write_file call write_file
jr nc,ok_write1 jr c,write_error
jr file_err1
;
ok_write1: ; ®á¢®¡®¤¨âì ¯ ¬ïâì ok_write1: ; ®á¢®¡®¤¨âì ¯ ¬ïâì
ld a,(id_blck) ; ¡«®ª system.dos ; ld a,(FILE1_PARAMS.id_blck) ; ¡«®ª system.dos
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
; ;
; § £à. à ¡. ï祩ª¨ ; § £à. à ¡. ï祩ª¨
ld hl,hFile1 ; ®âªã¤  ld hl,FILE2_PARAMS ; ®âªã¤ 
ld de,file_handle ; ªã¤  ld de,FILE1_PARAMS ; ªã¤ 
ld bc,6 ld bc,FILE1_PARAMS.dataSize
ldir ldir
; ‡ ¯¨áì ä ©«  system.exe ; ‡ ¯¨áì ä ©«  system.exe
ld hl,name2 ; ¨¬ï ä ©«  ld hl,name2 ; ¨¬ï ä ©« 
call write_file call write_file
; ®á¢®¡®¤¨âì ¯ ¬ïâì ; ®á¢®¡®¤¨âì ¯ ¬ïâì
push af ; push af
ld a,(id_blck) ; ¡«®ª system.exe ; ld a,(FILE1_PARAMS.id_blck) ; ¡«®ª system.exe
ld c,3Eh ; ld c,Dss.FreeMem
RST ToDSS ; RST ToDSS
pop af ; pop af
jr c,exit ; ®è¨¡ª  ;
jr c,write_error
;jr c,exit ; ®è¨¡ª 
; ;
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
add a,'A' add a,'A'
@ -209,25 +250,24 @@ ok_write1: ;
; § ¯à®á¨âì á¨á⥬­ë© ¤¨áª ; § ¯à®á¨âì á¨á⥬­ë© ¤¨áª
ld a,(boot_disk) ; á¨áâ. ¤¨áª ld a,(boot_disk) ; á¨áâ. ¤¨áª
cp 2 cp 2
jr nc,exit-1 ; ­¥ ¤¨áª®¢®¤ë jr nc,.not_fdd ; ­¥ ¤¨áª®¢®¤ë
add a,'A' add a,'A'
ld (messages.lett3),a ld (messages.lett3),a
ld a,6 ; ¨­¤¥ªá áâப¨ "Insert system disk..." ld a,6 ; ¨­¤¥ªá áâப¨ "Insert system disk..."
call print_string call print_string
ld bc,3035h ; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨ ld bc,Dss.K_CLEAR + Dss.WaitKey*256; ¦¤¥¬ ­ ¦ â¨ï ª« ¢¨è¨
RST ToDSS RST ToDSS
xor a ; ª®¤ "Ok" .not_fdd: xor a ; ª®¤ "Ok"
exit: push af exit: push af
call restore_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì call restore_path ; ¢®ááâ. ⥪. ¤¨áª ¨ ¯ãâì
port: ld a,-1 ; á®åà. ¯®àâ port: ld a,-1 ; á®åà. ¯®àâ
out (SLOT3),a out (SLOT3),a
pop af pop af
ld c,41h ; ¢ë室 ¢ „Ž‘ ld c,Dss.Exit ; ¢ë室 ¢ „Ž‘
ld b,a ld b,a
RST ToDSS RST ToDSS
jr $ jr $
;
help: ld a,8 ; ¨­¤¥ªá áâப¨ "Invalid drive specification" help: ld a,8 ; ¨­¤¥ªá áâப¨ "Invalid drive specification"
call print_string call print_string
ld a,4 ; ¨­¤¥ªá áâப¨ åí«¯  ld a,4 ; ¨­¤¥ªá áâப¨ åí«¯ 
@ -255,8 +295,8 @@ name2: db "SYSTEM.EXE",0
;------------------------------------------------- ;-------------------------------------------------
write_boot_loader: write_boot_loader:
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,1 ; open device ld c,Dss.DRV.Open ; open device
rst 18h rst ToDSS.DRV
ret c ret c
ld hl,close_device ; â®çª  ¢ë室  ld hl,close_device ; â®çª  ¢ë室 
push hl push hl
@ -264,10 +304,10 @@ write_boot_loader:
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤ ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ªã¤  ld de,buffer ; ªã¤ 
ld bc,0105h ; ¯à®ç¨â âì 1 ᥪâ®à (boot) ld bc,1*256 + Dss.DRV.Read ; ¯à®ç¨â âì 1 ᥪâ®à (boot)
rst 18h rst ToDSS.DRV
ret c ; ®è¨¡ª  ç⥭¨ï ret c ; ®è¨¡ª  ç⥭¨ï
ld a,(buffer+21) ; ¡ ©â ä®à¬ â  ld a,(buffer + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE)
cp #F0 ; 1.44Mb cp #F0 ; 1.44Mb
ret c ; ­¥§­ ª®¬ë© ä®à¬ â ret c ; ­¥§­ ª®¬ë© ä®à¬ â
jr z,write_to_floppy jr z,write_to_floppy
@ -285,8 +325,8 @@ write_boot_loader:
; § ªàëâì ¤¥¢ ©á ; § ªàëâì ¤¥¢ ©á
close_device: push af ; á®åà. ä« £ close_device: push af ; á®åà. ä« £
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld c,2 ; close device ld c,Dss.DRV.Close ; close device
rst 18h rst ToDSS.DRV
pop af pop af
ret ret
@ -298,38 +338,45 @@ close_device: push af ;
; ¢ë室: CF - ¯à¨ ®è¨¡ª¥ § ¯¨á¨ ; ¢ë室: CF - ¯à¨ ®è¨¡ª¥ § ¯¨á¨
;------------------------------------------------- ;-------------------------------------------------
write_to_floppy: write_to_floppy:
ld a,(buffer+16) ; ç¨á«® ª®¯¨© FAT-®¢ ld a,(buffer + BOOT_SECTOR.Number_of_FATs) ; ç¨á«® ª®¯¨© FAT-®¢
or a or a
scf scf
ret z ; ®è¨¡ª  ret z ; ®è¨¡ª 
dec a ; --ç¨á«® ª®¯¨© dec a ; --ç¨á«® ª®¯¨©
jr z,overwrite_floppy ; § £àã§ç¨ª 㦥 § ¯¨á ­, ¯¥à¥§ ¯¨á âì ¥£® jr z,overwrite_floppy ; § £àã§ç¨ª 㦥 § ¯¨á ­, ¯¥à¥§ ¯¨á âì ¥£®
; ­ áâநâì ï祩ª¨ boot-ᥪâ®à  ; ­ áâநâì ï祩ª¨ boot-ᥪâ®à 
ld (buffer+16),a ; ç¨á«® ª®¯¨© FAT-®¢ ld (buffer + BOOT_SECTOR.Number_of_FATs),a ; ç¨á«® ª®¯¨© FAT-®¢
ld hl,(buffer+14) ; § à¥§¥à¢. ᥪâ®à®¢ ld hl,(buffer + BOOT_SECTOR.RESERVED_SECTORS) ; § à¥§¥à¢. ᥪâ®à®¢
ld bc,(buffer+22) ; ᥪâ®à®¢ ­  FAT ld bc,(buffer + BOOT_SECTOR.SectorsPerFAT16) ; ᥪâ®à®¢ ­  FAT
ld a,b ; ld a,b
or c ; or c
scf ; scf
ret z ; 0 ᥪâ®à®¢ ­  FAT ; ret z ; 0 ᥪâ®à®¢ ­  FAT
; ;
add hl,bc add hl,bc
ld (buffer+14),hl ; § à¥§¥à¢. ᥪâ®à®¢ ld (buffer + BOOT_SECTOR.RESERVED_SECTORS),hl ; § à¥§¥à¢. ᥪâ®à®¢
ex hl,de
ld hl,SECTORS_OF_LOADER-1
and a
sbc hl,de
ccf
ret c
overwrite_floppy: overwrite_floppy:
; § ¯¨á âì boot-ᥪâ®à ­ § ¤ ; § ¯¨á âì boot-ᥪâ®à ­ § ¤
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤ ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤  ld de,buffer ; ®âªã¤ 
ld bc,0106h ; § ¯¨á âì 1 ᥪâ®à ld bc,1*256 + Dss.DRV.Write ; § ¯¨á âì 1 ᥪâ®à
rst 18h rst ToDSS.DRV
ret c ; ®è¨¡ª  § ¯¨á¨ ret c ; ®è¨¡ª  § ¯¨á¨
; § ¯¨á âì § £àã§ç¨ª ; § ¯¨á âì § £àã§ç¨ª
ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª  ld a,(disk) ; § ¤ ­­ë© ­®¬¥à ¤¨áª 
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤ ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª ) ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,0306h ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.) ld bc,SECTORS_OF_LOADER*256 + Dss.DRV.Write ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst 18h rst ToDSS.DRV
ret ret
@ -340,20 +387,20 @@ overwrite_floppy:
; ¢ë室: CF-®è¨¡ª  § ¯¨á¨ ; ¢ë室: CF-®è¨¡ª  § ¯¨á¨
;------------------------------------------------- ;-------------------------------------------------
write_to_ram_disk: write_to_ram_disk:
write_to_: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª  write_to_: ld a,(disk) ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
ld de,#55AA ld de,#55AA
ld bc,0 * 256 + 8 ld bc,Dss.DRV.GenIOCTL.GetParams
rst #18 rst ToDSS.DRV
ex af,af' ex af,af'
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
ld b,a ld b,a
inc c inc c
scf scf
ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï ret z ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
dec c dec c
CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD CP #80 ;!HARDCODE ⨯ ¤à ©¢  - HDD
JR NC,.skip_FAT_check JR NC,.skip_FAT_check
push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR
; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â) ; [x] 02/02/2024 ¯à®¢¥àª  ­  ¢«¥§ ¥¬®áâì § £àã§ç¨ª  (ç⮡ ­¥ ¯®¯®àâ¨âì ä â)
LD HL,0 LD HL,0
LD IX,0 LD IX,0
@ -362,7 +409,7 @@ write_to_: ld a,(disk) ;
RST ToBIOS RST ToBIOS
POP BC POP BC
LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) LD HL,(buffer + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS)
LD DE,04 ;!HARDCODE ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1) LD DE,SECTORS_OF_LOADER + 1 ; ¬¨­¨¬ «ì­®¥ à ááâ®ï­¨¥ ­  ¤à ©¢¥ ®â ­ã«¥¢®£® ᥪâ®à  ¤® ä â  (¤«¨­  § £àã§ç¨ª  + 1)
AND A AND A
SBC HL,DE SBC HL,DE
RET C RET C
@ -370,10 +417,10 @@ write_to_: ld a,(disk) ;
.skip_FAT_check:; .skip_FAT_check:;
push bc push bc
ld a,b ld a,b
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,1 ; ¬«. à §àï¤ ld ix,1 ; ¬«. à §àï¤
ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª ) ld de,code_loader ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,3*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.) ld bc,SECTORS_OF_LOADER*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.)
rst ToBIOS rst ToBIOS
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
pop bc pop bc
@ -396,7 +443,7 @@ write_to_hard_disk:
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS RST ToBIOS
; check signature ; check signature
LD HL,(buffer+510) ;!HARDCODE Signature word LD HL,(buffer + _sBOOT_SECTOR.MBR_SIGNATURE)
LD DE,#AA55 LD DE,#AA55
AND A AND A
SBC HL,DE SBC HL,DE
@ -406,9 +453,9 @@ write_to_hard_disk:
PUSH BC PUSH BC
; set active in buffer ; set active in buffer
INC C INC C
LD HL,buffer + #01BE + #30 ;!HARDCODE MBR: Offset of last record of partition table in the MBR LD HL,buffer + _sBOOT_SECTOR.PARTITION_TABLE.Record_4
LD DE,#10 ; à §¬¥à ®¤­®© § ¯¨á¨ MBR LD DE,_sMBR_PARTITION_RECORD ; à §¬¥à ®¤­®© § ¯¨á¨ MBR
LD B,4 ;!HARDCODE MBR: Number of entries in the partition table LD B,_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD; MBR: Number of entries in the partition table
.loop: XOR A .loop: XOR A
LD (HL),A LD (HL),A
; ;
@ -434,6 +481,10 @@ write_to_hard_disk:
JR Z,.next JR Z,.next
CP PartitionSysTypes.FAT16_LBA CP PartitionSysTypes.FAT16_LBA
JR Z,.next JR Z,.next
CP PartitionSysTypes.FAT32
JR Z,.next
CP PartitionSysTypes.FAT32_LBA
JR Z,.next
; NOT SUPPORTED FS ; NOT SUPPORTED FS
POP BC POP BC
SCF SCF
@ -448,8 +499,9 @@ write_to_hard_disk:
ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à  ld hl,0 ; áâ. à §àï¤ «®£. ᥪâ®à 
ld ix,0 ; ¬«. à §àï¤ ld ix,0 ; ¬«. à §àï¤
ld de,buffer ; ®âªã¤  (ª®¤ § £àã§ç¨ª ) ld de,buffer ; ®âªã¤  (ª®¤ § £àã§ç¨ª )
ld bc,1*256 + BIOS.DRV_WRITE ; § ¯¨á âì 3 ᥪâ®à  (à §¬¥à § £à.) ld bc,1*256 + BIOS.DRV_WRITE ; § ¯¨á âì 1 ᥪâ®à
JP ToBIOS RST ToBIOS
RET
; ;
;------------------------------------------------- ;-------------------------------------------------
; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨ ; ‚뤥«¨âì § ¤ ­­ë© ¤¨áª ¨§ ª®¬-áâப¨
@ -461,7 +513,7 @@ write_to_hard_disk:
get_drive_letter: get_drive_letter:
inc hl ; ¡ãä¥à áâப¨ inc hl ; ¡ãä¥à áâப¨
ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà  ld de,buffer ; ¡ãä¥à ¤«ï ¢ë¤¥«. ¯ à ¬¥âà 
ld c,43h ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨ ld c,Dss.GSwitch ; ¢ë¤¥«¨âì ¯ à ¬¥âà ª®¬. áâப¨
RST ToDSS RST ToDSS
ld de,buffer ld de,buffer
ld a,(de) ld a,(de)
@ -480,7 +532,7 @@ get_drive_letter:
jr c,get_drive_err jr c,get_drive_err
cp 'z'+1 cp 'z'+1
jr nc,get_drive_err jr nc,get_drive_err
res 5,a and %1101'1111
sub 'A' sub 'A'
or a or a
ret ret
@ -495,11 +547,11 @@ get_drive_err: scf ;
;---------------------------------------------------- ;----------------------------------------------------
; á®åà. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì ; á®åà. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;---------------------------------------------------- ;----------------------------------------------------
save_path: ld c,2 ; ã§­ âì ¤¨áª save_path: ld c,Dss.CurDisk ; ã§­ âì ¤¨áª
RST ToDSS RST ToDSS
ld (sys_disk),a ld (sys_disk),a
ld hl,sys_path ld hl,sys_path
ld c,1Eh ; ã§­ âì ¯ãâì ld c,Dss.CurDir ; ã§­ âì ¯ãâì
RST ToDSS RST ToDSS
ret ret
@ -508,38 +560,40 @@ save_path: ld c,2 ; 㧭
; ¢®ááâ. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì ; ¢®ááâ. ⥪. á¨á⥬­ë© ¤¨áª ¨ ¯ãâì
;---------------------------------------------------- ;----------------------------------------------------
restore_path: ld a,(sys_disk) restore_path: ld a,(sys_disk)
ld c,1 ; ᬥ­  ¤¨áª  ld c,Dss.ChDisk ; ᬥ­  ¤¨áª 
RST ToDSS RST ToDSS
ld hl,sys_path ld hl,sys_path
ld c,1Dh ; ᬥ­  ¯ã⨠ld c,Dss.ChDir ; ᬥ­  ¯ãâ¨
RST ToDSS RST ToDSS
ret ret
;
;
disk: db 0 ; ­®¬¥à § ¤ ­­®£® ¤¨áª  disk: db 0 ; ­®¬¥à § ¤ ­­®£® ¤¨áª 
boot_disk: db 0 ; ­®¬¥à boot-¤¨áª  á¨á⥬ë boot_disk: db 0 ; ­®¬¥à boot-¤¨áª  á¨á⥬ë
; à ¡. ï祩ª¨ ⥪. ä ©«  ; à ¡. ï祩ª¨ ⥪. ä ©« 
; ;
; ç⥭¨¥: system.exe, ¤ «¥¥ system.dos ; ç⥭¨¥: system.exe, ¤ «¥¥ system.dos
; § ¯¨áì: system.dos, ¤ «¥¥ system.exe ; § ¯¨áì: system.dos, ¤ «¥¥ system.exe
file_handle: db -1 ; ¤¥áªà¨¯â®à ä ©«  FILE1_PARAMS:
id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ï⨠.handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
.id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
; ;
lsize: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©«  .sizeLow: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
hsize: dw 0 ; áâ.à §àï¤ .sizeHigh: dw 0 ; áâ.à §àï¤
.dataSize EQU $-FILE1_PARAMS
; á®åà. ¤ ­­ë¥ system.exe ; á®åà. ¤ ­­ë¥ system.exe
hFile1: db -1 ; ¤¥áªà. ä ©«  FILE2_PARAMS:
id_mem: db -1 ; ¨¤¥­â¨ä. ¡«®ª  .handle: db -1 ; ¤¥áªà¨¯â®à ä ©« 
.id_blck: db -1 ; ¨¤¥­â¨ä. ¢ë¤¥«. ¡«®ª  ¯ ¬ïâ¨
; ;
dw 0 ; ¬«.à §àï¤ .sizeLow: dw 0 ; ¬«.à §àï¤ à §¬¥à  ä ©« 
dw 0 ; áâ.à §àï¤ .sizeHigh: dw 0 ; áâ.à §àï¤
.dataSize EQU $-FILE2_PARAMS
ASSERT FILE1_PARAMS.dataSize = FILE2_PARAMS.dataSize, "Erorr! FILE1_PARAMS != FILE2_PARAMS"
; ;
; ;
; ;
@ -550,8 +604,8 @@ messages: db 0
db "\r\nBoot and System files Installer v" ;0 db "\r\nBoot and System files Installer v" ;0
db major_version + '0','.' db major_version + '0','.'
db (minor_version / 10) + '0',(minor_version % 10) + '0','.' db (minor_version / 10) + '0',(minor_version % 10) + '0','.'
db "\r\n\nCopyright (c) 2006-2022 Vasil Ivanov." db "\r\n\nCopyright (c) 2006 Vasil Ivanov."
db "\r\n\nCopyright (c) 2023 Sprinter Team." db "\r\n\nCopyright (c) 2023-2024 Sprinter Team."
db "\r\n\n",0 db "\r\n\n",0
; ;
db "System successfully installed on disk " ;1 db "System successfully installed on disk " ;1
@ -586,7 +640,7 @@ messages: db 0
; ‚뢥á⨠áâப㠯® ¨­¤¥ªáã ; ‚뢥á⨠áâப㠯® ¨­¤¥ªáã
; ¢å®¤: a=¨­¤¥ªá áâப¨ ; ¢å®¤: a=¨­¤¥ªá áâப¨
print_string: call get_string ; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a' print_string: call get_string ; ¯®¨áª áâப¨ ¯® ¥¥ ¨­¤¥ªáã ¢ 'a'
ld c,5Ch ; ¢ë¢®¤ áâப¨ ld c,Dss.PChars ; ¢ë¢®¤ áâப¨
RST ToDSS RST ToDSS
ret ret
@ -616,33 +670,43 @@ get_loop: ex af,af'
; ¢å®¤: hl=¨¬ï ä ©«  ; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥ ; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;==================================================== ;====================================================
read_file: ld a,1 ; ­  ç⥭¨¥ read_file: ld a,Dss.Open.R ; ­  ç⥭¨¥
ld c,11h ; ®âªàëâì ä ©« ld c,Dss.Open ; ®âªàëâì ä ©«
RST ToDSS RST ToDSS
jr nc,ok ; ¡¥§ ®è¨¡®ª jr nc,.ok ; ¡¥§ ®è¨¡®ª
;
push af
ld a,9 ; ¨­¤¥ªá "Can't open file" ld a,9 ; ¨­¤¥ªá "Can't open file"
call print_string call print_string
scf pop af
ret
ok: ld (file_handle),a ; ¤¥áªà. ä ©« 
ld hl,0
ld ix,0
ld bc,0215h ; 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
RST ToDSS
ld (hsize),hl ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld (lsize),ix ; ¬«.à §àï¤
call get_memory ; à áç. ¨ ¢ë¤¥«. áâà ­¨æë ¯®¤ ä ©«
jr c,not_enough ; ­¥ 墠⠥⠯ ¬ïâ¨
call file_to_bank ; § £à. ä ©« ¢ áâà ­¨æë
close_file: ld a,(file_handle) ; ¤¥áªà. ä ©« 
ld c,12h ; § ªàëâì ä ©«
RST ToDSS
ret ret
; ;
not_enough: call close_file .ok: ld (FILE1_PARAMS.handle),a ; ¤¥áªà. ä ©« 
ld hl,0
ld ix,0
ld bc,Dss.Move_FP.FrEnd ; 㪠§ â¥«ì ­  ª®­¥æ ä ©« 
RST ToDSS
ld (FILE1_PARAMS.sizeHigh),hl ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld (FILE1_PARAMS.sizeLow),ix ; ¬«.à §àï¤
call get_memory ; à áç. ¨ ¢ë¤¥«. áâà ­¨æë ¯®¤ ä ©«
jr c,.not_enough ; ­¥ 墠⠥⠯ ¬ïâ¨
call file_to_bank ; § £à. ä ©« ¢ áâà ­¨æë
.close_file: push af
ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,Dss.Close ; § ªàëâì ä ©«
RST ToDSS
pop af
ret
;
.not_enough: push af
call .close_file
ld a,10 ; ¨­¤¥ªá "Can't allocate memory" ld a,10 ; ¨­¤¥ªá "Can't allocate memory"
call print_string call print_string
pop af
or a
scf scf
ret nz
ld a,DSS_Error.sys.NOT_ENOUGH_MEMORY
ret ret
@ -652,9 +716,9 @@ not_enough: call close_file
; ç¨á«® áâà ­¨æ ¨ ¢ë¤¥«¨âì ¨å. ; ç¨á«® áâà ­¨æ ¨ ¢ë¤¥«¨âì ¨å.
; ‚ë室: CF - ¯à¨ ­¥å¢ âª¥ ¯ ¬ï⨠; ‚ë室: CF - ¯à¨ ­¥å¢ âª¥ ¯ ¬ïâ¨
;---------------------------------------------------- ;----------------------------------------------------
get_memory: ld hl,(hsize) ; áâ.à §àï¤ à §¬¥à  ä ©«  get_memory: ld hl,(FILE1_PARAMS.sizeHigh) ; áâ.à §àï¤ à §¬¥à  ä ©« 
ld bc,(lsize) ; ¬«.à §àï¤ ld bc,(FILE1_PARAMS.sizeLow) ; ¬«.à §àï¤
ld de,4000h ; ¤¥«¨â¥«ì (à §¬¥à áâà ­¨æë) ld de,#4000 ; ¤¥«¨â¥«ì (à §¬¥à áâà ­¨æë)
xor a xor a
scf scf
malloc1: rr d malloc1: rr d
@ -669,7 +733,7 @@ malloc1: rr d
jr malloc1 jr malloc1
; ;
malloc2: or a malloc2: or a
jr z,$+3 jr z,$+3 ;!FIXIT $
inc bc inc bc
xor a xor a
cp b cp b
@ -677,9 +741,9 @@ malloc2: or a
ret nz ret nz
; ¢ë¤¥«¨âì ¡«®ª ¯ ¬ï⨠; ¢ë¤¥«¨âì ¡«®ª ¯ ¬ïâ¨
ld b,c ; b=ç¨á«® áâà ­¨æ ld b,c ; b=ç¨á«® áâà ­¨æ
ld c,3Dh ld c,Dss.GetMem
RST ToDSS RST ToDSS
ld (id_blck),a ; ¨¤¥­â¨ä. ¡«®ª  ld (FILE1_PARAMS.id_blck),a ; ¨¤¥­â¨ä. ¡«®ª 
ret ret
@ -688,39 +752,38 @@ malloc2: or a
;---------------------------------------------------- ;----------------------------------------------------
file_to_bank: ld hl,0 file_to_bank: ld hl,0
ld ix,0 ld ix,0
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld bc,0015h ; 㪠§ â¥«ì ­  ­ ç «® ä ©«  ld bc,Dss.Move_FP.FrStart ; 㪠§ â¥«ì ­  ­ ç «® ä ©« 
RST ToDSS RST ToDSS
ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ;ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld c,0C4h ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ld bc,0*256 + BIOS.GetMemPage; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst 08h rst ToBIOS
ret c ret c
loop_to_bank: push af .loop: push af
out (SLOT3),a out (SLOT3),a
ld hl,page_buffer ; #C000 ªã¤  ld hl,page_buffer ; #C000 ªã¤ 
ld de,4000h ; ᪮«ìª® ld de,#4000 ; ᪮«ìª®
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,13h ; ç¨â âì ä ©« ld c,Dss.Read ; ç¨â âì ä ©«
RST ToDSS RST ToDSS
pop bc pop bc
jr nc,ok_to_bank jr c,.error
ld a,12 ; ¨­¤¥ªá "Reading error" ; ok
cp -1 ; ¯à®ç¨â ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ret z ; ¤ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,BIOS.GetMemPageNext ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst ToBIOS
ret c
cp #FF
jr nz,.loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
; error
.error: ld a,12 ; ¨­¤¥ªá "Reading error"
call print_string call print_string
scf scf
ret ret
;
ok_to_bank: cp -1 ; ¯à®ç¨â ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ret z ; ¤ 
ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,0C7h ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst 08h
ret c
cp 255
jr nz,loop_to_bank ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret
;==================================================== ;====================================================
@ -728,72 +791,76 @@ ok_to_bank: cp -1 ;
; ¢å®¤: hl=¨¬ï ä ©«  ; ¢å®¤: hl=¨¬ï ä ©« 
; ¢ë室: CF-¯à¨ ®è¨¡ª¥ ; ¢ë室: CF-¯à¨ ®è¨¡ª¥
;==================================================== ;====================================================
write_file: ld a,20h ;  âਡãâ " à娢­ë©" write_file: ld a,FAT_ATTR.ARCHIVE ;  âਡãâ " à娢­ë©"
ld c,0Ah ; á®§¤ âì ä ©« ld c,Dss.Create ; á®§¤ âì ä ©«
RST ToDSS RST ToDSS
jr nc,create_ok ; ¡¥§ ®è¨¡®ª jr nc,.create_ok ; ¡¥§ ®è¨¡®ª
push af
ld a,13 ; ¨­¤¥ªá "Can't create file" ld a,13 ; ¨­¤¥ªá "Can't create file"
call print_string call print_string
scf pop af
ret ret
; ;
create_ok: ld (file_handle),a ; ¤¥áªà. ä ©«  .create_ok: ld (FILE1_PARAMS.handle),a ; ¤¥áªà. ä ©« 
ld hl,close_file ; § ªà. ä ©« ld hl,read_file.close_file ; § ªà. ä ©«
push hl ; â®çª  ¢ë室  push hl ; â®çª  ¢ë室 
; ;
; ç⥭¨¥ ä ©«  ¨§ ¡ ­®ª ¨ § ¯¨áì ­  ¤¨áª ; ç⥭¨¥ ä ©«  ¨§ ¡ ­®ª ¨ § ¯¨áì ­  ¤¨áª
ld a,(id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ï⨠ld a,(FILE1_PARAMS.id_blck) ; ¨¤¥­â¨ä. ¡«®ª  ¯ ¬ïâ¨
ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ;ld b,0 ; «®£. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
ld c,0C4h ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥ ld bc,BIOS.GetMemPage ; ¯®«ãç¨âì 䨧. ­®¬¥à áâà ­¨æë ¢ ¡«®ª¥
rst 08h rst ToBIOS
ret c ret c
write_loop: push af .loop: push af
out (SLOT3),a out (SLOT3),a
ld hl,(lsize) ; ¬«.à §àï¤ à §¬¥à  ä ©«  ld hl,(FILE1_PARAMS.sizeLow) ; ¬«.à §àï¤ à §¬¥à  ä ©« 
ld de,(hsize) ; áâ.à §àï¤ ld de,(FILE1_PARAMS.sizeHigh) ; áâ.à §àï¤
ld bc,4000h ld bc,#4000
xor a xor a
sbc hl,bc sbc hl,bc
ld b,a ld b,a
ex de,hl ex de,hl
sbc hl,bc sbc hl,bc
ex de,hl ex de,hl
jr c,write_end ; § ¯¨á âì ®áâ â®ª jr c,.write_end ; § ¯¨á âì ®áâ â®ª
ld (lsize),hl ld (FILE1_PARAMS.sizeLow),hl
ld (hsize),de ld (FILE1_PARAMS.sizeHigh),de
; ;
ld hl,page_buffer ; #C000 ®âªã¤  ld hl,page_buffer ; #C000 ®âªã¤ 
ld de,4000h ; ᪮«ìª® ld de,#4000 ; ᪮«ìª®
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,14h ; § ¯¨áì ä ©«  ld c,Dss.Write ; § ¯¨áì ä ©« 
RST ToDSS RST ToDSS
pop bc pop bc
jr nc,write_ok jr c,.error
ld a,14 ; ¨­¤¥ªá "Writing error"
call print_string
scf
ret
; ;
write_ok: cp -1 ; § ¯¨á ­® ¬¥­ì襥 ç¨á«® ¡ ©â ? .write_ok: cp -1 ; § ¯¨á ­® ¬¥­ì襥 ç¨á«® ¡ ©â ?
ld a,DSS_Error.sys.DISK_FULL
scf scf
ret z ; ¤ , ­  ¤¨áª¥ ­¥â ¬¥áâ  jr nz,.error ; ¤ , ­  ¤¨áª¥ ­¥â ¬¥áâ 
ld a,b ; a=䨧¨ç. áâà ­¨æ  ld a,b ; a=䨧¨ç. áâà ­¨æ 
ld c,0C7h ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª  ld c,BIOS.GetMemPageNext ; ¯®«ãç¨âì ­®¬¥à á«¥¤. 䨧. áâà ­¨æë ¡«®ª 
rst 08h rst ToBIOS
ret c ret c
cp 255 cp #FF
jr nz,write_loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ  jr nz,.loop ; ­¥ ¯®á«¥¤­ïï áâà ­¨æ 
ret ret
; ;
write_end: pop af ; ¡ « ­á á⥪  .write_end: pop af ; ¡ « ­á á⥪ 
ld de,(lsize) ; ᪮«ìª® ld de,(FILE1_PARAMS.sizeLow) ; ᪮«ìª®
ld a,e ld a,e
or d or d
ret z ; 0 ¡ ©â®¢ ret z ; 0 ¡ ©â®¢
ld hl,page_buffer ; #C000 ®âªã¤  ld hl,page_buffer ; #C000 ®âªã¤ 
ld a,(file_handle) ; ¤¥áªà. ä ©«  ld a,(FILE1_PARAMS.handle) ; ¤¥áªà. ä ©« 
ld c,14h ; § ¯¨áì ä ©«  ld c,Dss.Write ; § ¯¨áì ä ©« 
RST ToDSS RST ToDSS
ret nc
;
.error: push af
ld a,14 ; ¨­¤¥ªá "Writing error"
call print_string
pop af
ret ret
@ -807,6 +874,6 @@ code_loader.size EQU $-code_loader
; 512 ¡ ©â, ¡ãä¥à boot-ᥪâ®à  ; 512 ¡ ©â, ¡ãä¥à boot-ᥪâ®à 
buffer equ $ buffer equ $
sys_disk equ buffer+513 ; ¤¨áª á¨á⥬ë sys_disk equ buffer+512 ; ¤¨áª á¨á⥬ë
sys_path equ sys_disk+1 ; ¯ãâì á¨á⥬ë sys_path equ sys_disk+1 ; ¯ãâì á¨á⥬ë

View File

@ -544,23 +544,24 @@ EXSTACK: DW CORE_BUFFERS.XSTACK.Spoint ;
LEAVE: LD A,B LEAVE: LD A,B
LD (ErrorLevel),A LD (ErrorLevel),A
CALL FREE_PROCESS_MEMORY CALL FREE_PROCESS_MEMORY
LD SP,(EXSTACK)
;[x] 10/12/23 close EXE FMs ;[x] 10/12/23 close EXE FMs
CALL FREE_PROCESS_FMs CALL FREE_PROCESS_FMs
; ;
_mDECTASK _mDECTASK
; LD SP,(EXSTACK)
POP AF ; âãâ á⥪ ¢ ­ã«¥¢®© áâà ­¨æ¥!
POP HL POP AF
OUT (SLOT1),A POP HL
LD A,L OUT (SLOT1),A
OUT (SLOT2),A LD A,L
LD A,H OUT (SLOT2),A
OUT (SLOT3),A LD A,H
POP DE OUT (SLOT3),A
POP HL POP DE
LD (EXSTACK),SP POP HL
LD SP,HL LD (EXSTACK),SP
LD SP,HL
;
EX DE,HL EX DE,HL
LD A,(ErrorLevel) LD A,(ErrorLevel)
;R12 ;R12
@ -572,6 +573,9 @@ LEAVE: LD A,B
JP (HL) JP (HL)
; ;
.norm_exit: AND A .norm_exit: AND A
;!TEST
EI
;
JP (HL) JP (HL)
;///////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////

View File

@ -81,15 +81,15 @@ DISKINF: LD C,B
LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER
CALL .mCOPY_LOOP CALL .mCOPY_LOOP
; ;
;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL
CALL GET_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
; fat32 ; fat32
EXX EXX
PUSH DE PUSH DE
PUSH HL PUSH HL
EXX EXX
;LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL
CALL GET_LABEL
LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL
CALL .mCOPY_LOOP
PUSH DE PUSH DE
LD A,XH LD A,XH
LD DE,Dss.DRV.GenIOCTL.Enter LD DE,Dss.DRV.GenIOCTL.Enter

View File

@ -722,8 +722,9 @@ RD_BPB: ; LD C,SLOT3
LD C,A LD C,A
LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32
;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC
LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32
;LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables
; ;
; ;
LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.SectorsPerFAT16)
@ -754,7 +755,8 @@ RD_BPB: ; LD C,SLOT3
JR NZ,.loop1 JR NZ,.loop1
; ;
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR
LD (CORE_BUFFERS.FatBuffer.FirstDataSector_H),BC
;
LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector)
LD A,B LD A,B
AND A AND A
@ -979,18 +981,17 @@ RD_BPB: ; LD C,SLOT3
LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),HL
LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),HL
; ;
.mirrored_FATs: ; .mirrored_FATs: LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL
LD HL,CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FAT32.LABEL
; ;
EXX EXX
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),HL
LD BC,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) LD DE,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.RootDirStartCluster+2)
LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),DE
; ;
CALL CLUSTER_TO_SECTOR CALL CLUSTER_TO_SECTOR.no_prepare
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),IX
LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),BC LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_H),HL
; ;
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector) LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FSINFO_Sector)
LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL LD (CORE_BUFFERS.FatBuffer.FSINFO_Sector),HL

View File

@ -968,17 +968,17 @@ GET_FAT12_CELL:
;[x] fat32 ;!TEST ;[x] fat32 ;!TEST
;NSECTOR: ;CLUSTER_TO_SECTOR:
; in: HL':HL - CLUSTER ; in: HL':HL - CLUSTER
; out: HL:IX - SECTOR ; out: HL:IX - SECTOR
CLUSTER_TO_SECTOR: CLUSTER_TO_SECTOR:
PUSH BC
EXX EXX
PUSH HL PUSH HL
EXX EXX
POP DE POP DE
; DE:HL - cluster ; DE:HL - cluster
; ;
.no_prepare: PUSH BC
LD BC,-2 LD BC,-2
ADD HL,BC ADD HL,BC
JR C,.no_dec_de JR C,.no_dec_de

View File

@ -100,14 +100,14 @@
.END_CHAIN_CLUSTER_H: WORD #0FFF .END_CHAIN_CLUSTER_H: WORD #0FFF
.MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterLow: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.) .MaxClusterHigh: WORD #0000 ; ¬ ªá. ç¨á«® ª« áâ¥à®¢ (¡¥§ á«ã¦.)
.BytesPerSector WORD #0000 .BytesPerSector: WORD #0000
.SectorsPerCluster BYTE #00 .SectorsPerCluster: BYTE #00
.FSINFO_Sector WORD #01 .FSINFO_Sector: WORD #01
.BPB_SERIAL_NUMBER DWORD #00000000 .BPB_SERIAL_NUMBER: DWORD #00000000
.BPB_LABEL BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS .BPB_LABEL: BLOCK 11,' ' ; 11 ¤«ï FAT, 31 ¤«ï CDFS
.UPD_FSINFO BYTE 0 .UPD_FSINFO: BYTE 0
.FREE_CLUSTERS_COUNT_L WORD #FFFF .FREE_CLUSTERS_COUNT_L: WORD #FFFF
.FREE_CLUSTERS_COUNT_H WORD #FFFF .FREE_CLUSTERS_COUNT_H: WORD #FFFF
;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥ ;.FilesPerSector: BYTE #00 ; ç¨á«® ä ©«®¢ëå § ¯¨á¥© ¢ ᥪâ®à¥
;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“) ;.ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (ç¨á«® ª« áâ¥à®¢ ­  ¡«®ª އ“)
;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï))) ;.READ_PG: BYTE #00 ;!TODO ­¥ ¨á¯®«ì§ãîâáï ­¥ª®â®àë¥ §­ ç¥­¨ï, ­® § ¤ã¬ª  ­¥¯«®å ï)))

View File

@ -1 +1 @@
987 988