mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-18 10:50:34 +03:00
boot.asm - bugfixes. dssboot.asm - support fat32. Core - bugfixes
This commit is contained in:
parent
83bfcf7cdd
commit
568806c67a
725
BOOT/DSSBOOT.ASM
725
BOOT/DSSBOOT.ASM
@ -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
|
||||||
;[]-----------------------------------------------------------[]
|
;[]-----------------------------------------------------------[]
|
||||||
|
|||||||
481
BOOT/boot.asm
481
BOOT/boot.asm
@ -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 ; ¯ãâì á¨á⥬ë
|
||||||
|
|
||||||
|
|||||||
@ -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
|
|
||||||
;
|
;
|
||||||
POP AF
|
_mDECTASK
|
||||||
POP HL
|
LD SP,(EXSTACK)
|
||||||
OUT (SLOT1),A
|
; âãâ á⥪ ¢ ã«¥¢®© áâà ¨æ¥!
|
||||||
LD A,L
|
POP AF
|
||||||
OUT (SLOT2),A
|
POP HL
|
||||||
LD A,H
|
OUT (SLOT1),A
|
||||||
OUT (SLOT3),A
|
LD A,L
|
||||||
POP DE
|
OUT (SLOT2),A
|
||||||
POP HL
|
LD A,H
|
||||||
LD (EXSTACK),SP
|
OUT (SLOT3),A
|
||||||
LD SP,HL
|
POP DE
|
||||||
|
POP 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)
|
||||||
;/////////////////////////////////////////////////////////////////////
|
;/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 ¥ ¨á¯®«ì§ãîâáï ¥ª®â®àë¥ § 票ï, ® § ¤ã¬ª ¥¯«®å ï)))
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
987
|
988
|
||||||
Loading…
Reference in New Issue
Block a user