diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index d7350fe..dcd444f 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -406,7 +406,7 @@ BPB_FAT RST ToBIOS_18 RET C LD HL,0 - LD (FATCASH),HL + LD (FatCache),HL XOR A RET @@ -560,7 +560,7 @@ R_F_00H INC A ; HL - CLUSTER ADD HL,DE ADD HL,HL ; HL - FAT OFFSET (FROM CASH) DEC A - LD BC,(FATCASH) ; A - ELEMENT OF CASH + LD BC,(FatCache) ; A - ELEMENT OF CASH CP C CALL NZ,RE_FAT LD DE,FAT @@ -594,7 +594,7 @@ R_F_00 INC A ; HL - FAT OFFSET JP NC,R_F_00 ADD HL,DE DEC A - LD BC,(FATCASH) + LD BC,(FatCache) CP C CALL NZ,RE_FAT LD DE,FAT @@ -629,7 +629,7 @@ R_F_F02 LD HL,#0FEF RE_FAT PUSH HL LD L,A LD H,0 - LD (FATCASH),HL + LD (FatCache),HL LD E,L LD D,H ADD HL,HL @@ -687,7 +687,7 @@ DIR EQU BOOT+512 FAT EQU DIR+512 VALUE EQU 3*512+FAT -FATCASH EQU VALUE+0 +FatCache EQU VALUE+0 FAT_FRM EQU VALUE+2 ; MSD_FAT_SEC first sector FAT DIR_FRH EQU VALUE+4 ; MSD_CAT_SEC first sector DIR DIR_FRL EQU VALUE+6 ; MSD_CAT_SEC first sector DIR diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 91fe33d..d28b2e5 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -2173,7 +2173,7 @@ SAVEDIR: LD HL,(FatBuffer.DIR_FRH) LD IX,(FatBuffer.DIR_FRL) LD A,(FatBuffer.DIR_S_S) - LD B,32 + LD B,32 ;!HARDCODE SUB B JR NC,.RTD1S ADD A,B diff --git a/DSS/DOS_X.ASM b/DSS/DOS_X.ASM index 22f61ec..8de28c4 100644 --- a/DSS/DOS_X.ASM +++ b/DSS/DOS_X.ASM @@ -198,11 +198,15 @@ CURRDSK: LD A,(FatBuffer.DRIVE) ENDM ; DISKINF:; [ ] 22/11/23 подфункция с доп.инфой + LD C,B + LD B,1 + ; CP #80 JR C,.CustomDisk CP #FF JR Z,.CurrentDisk ; more info + LD B,C PUSH HL AND %0111'1111 CALL .CustomDisk @@ -264,7 +268,7 @@ DISKINF:; [ ] 22/11/23 .FRESP2: LD D,B LD E,C - LD HL,(MAX_CLU) + LD HL,(FAT_Max_Cluster) DEC HL LD BC,(CORE_BUFFERS.BootSector.B_P_S) LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -581,7 +585,7 @@ RD_BPB: LD C,SLOT3 RR L JP .S4C01 .S4C02: INC HL - LD (MAX_CLU),HL + LD (FAT_Max_Cluster),HL //POP IY @@ -594,7 +598,7 @@ RD_BPB: LD C,SLOT3 ; RST ToDSS.DRV ; JP C,RDERR1 LD HL,0 - LD (FATCASH),HL + LD (FatCache),HL SET_PAGE_X FATPAGE diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index debb81d..5c7e355 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -14,6 +14,7 @@ R_CLUST LD HL,#0001 LD (G_CLUST.num),HL RET +; найти первый свободный кластер G_CLUST: .num+1: LD HL,#0001 .loop: INC HL ; номер кластера @@ -62,7 +63,7 @@ INC_FAT PUSH HL ;!FIXIT отдаёт разный CF при удачном завершении в зависимости от FAT16/FAT12 R_F_FAT: EX DE,HL - LD HL,(MAX_CLU) + LD HL,(FAT_Max_Cluster) AND A SBC HL,DE EX DE,HL @@ -80,18 +81,19 @@ R_F_FAT: R_F_F16: LD A,H LD B,H - AND #0F + ;AND #0F + AND FAT_CACHE.Mask LD H,A LD A,B - ; bit7..4 --> bit3..0. + ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + DUP FAT_CACHE.Degree RRCA - RRCA - RRCA - RRCA - AND #0F ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + EDUP + ;AND #0F + AND FAT_CACHE.Mask2 ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + LD BC,(FatCache) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache ; начало кеша FAT-а @@ -107,71 +109,6 @@ R_F_F16: POP HL RET -;R01; HL - CLUSTER -;R01; DE - (CLUSTER) -;R01 -;R01R_F_FAT EX DE,HL -;R01 LD HL,(MAX_CLU) -;R01 AND A -;R01 SBC HL,DE -;R01 EX DE,HL -;R01 LD A,10 -;R01 RET C -;R01 PUSH HL -;R01 LD A,(FAT_TYP) -;R01 CP "2" -;R01 JP Z,R_F_F12 -;R01R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH -;R01 XOR A -;R01R_F_00H INC A ; HL - CLUSTER -;R01 SBC HL,DE -;R01 JP NC,R_F_00H -;R01 ADD HL,DE -;R01 ADD HL,HL ; HL - FAT OFFSET (FROM CASH) -;R01 DEC A -;R01 LD BC,(FATCASH) ; A - ELEMENT OF CASH -;R01 CP C -;R01 CALL NZ,RE_FAT -;R01 LD DE,FAT -;R01 ADD HL,DE -;R01 LD E,(HL) -;R01 INC HL -;R01 LD D,(HL) -;R01 LD HL,#FFEF -;R01 AND A -;R01 SBC HL,DE -;R01 POP HL -;R01 LD A,0 -;R01 RET -;R01 -;R01R_F_F12 LD D,H -;R01 LD E,L -;R01 ADD HL,HL -;R01 ADD HL,DE -;R01 RR H -;R01 RR L -;R01 PUSH AF -;R01 EX DE,HL -;R01 LD HL,(B_P_S) -;R01 LD B,H -;R01 LD C,L -;R01 ADD HL,HL -;R01 ADD HL,BC -;R01 EX DE,HL -;R01 XOR A ; DE - SIZE SECTOR * 3 -;R01R_F_00 INC A ; HL - FAT OFFSET -;R01 SBC HL,DE -;R01 JP NC,R_F_00 -;R01 ADD HL,DE -;R01 DEC A - -; R_F_F12 LD D,H -; LD E,L -; ADD HL,HL -; ADD HL,DE -; RR H ; сдвиг вправо через CF -; RR L ; CLUSTER * 1.5 -; PUSH AF ; сохр. флаг R_F_F12: LD D,H LD E,L @@ -181,7 +118,7 @@ R_F_F12: ADD HL,DE ; CLUSTER * 1.5 ; ;!FIXIT херня какая-то - IF COMPILE_UNUSED_CODE + ;IF COMPILE_UNUSED_CODE LD A,H LD B,H AND #1F @@ -191,10 +128,10 @@ R_F_F12: RLCA RLCA AND #07 - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + LD BC,(FatCache) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а - ENDIF + ;ENDIF ; LD DE,FATPAGE.cache ; начало кеша FAT-а ADD HL,DE ; на ячейку FAT @@ -208,17 +145,6 @@ R_F_F12: LD D,A JP R_F_F02 -; R_F_F01 LD A,E -; AND #F0 -; LD E,A -; RR D ; вправо на 4 битa -; RR E -; RR D -; RR E -; RR D -; RR E -; RR D -; RR E R_F_F01: LD A,E AND #F0 @@ -251,7 +177,7 @@ R_F_F02: ;----------------------------------------------------------- W_T_FAT PUSH DE EX DE,HL - LD HL,(MAX_CLU) + LD HL,(FAT_Max_Cluster) AND A SBC HL,DE EX DE,HL @@ -259,14 +185,12 @@ W_T_FAT PUSH DE LD A,DSS_Error.sys.DISK_FULL RET C EXX - SET_PAGE_X FATPAGE - EXX PUSH HL PUSH AF LD A,1 - LD (FATCASH.Update),A + LD (FatCache.Update),A LD A,(FatBuffer.FAT_TYP) CP "2" ; fat12 JR Z,W_T_F12 @@ -274,16 +198,19 @@ W_T_F16: PUSH DE LD A,H LD B,H - AND #0F + ;AND #0F + AND FAT_CACHE.Mask LD H,A LD A,B - RRCA - RRCA - RRCA - RRCA - AND #0F ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) - ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + DUP FAT_CACHE.Degree + RRCA + EDUP + ;AND #0F + AND FAT_CACHE.Mask2 + ; + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ;!HARDCODE fat16 - размер записи FAT + LD BC,(FatCache) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; A != C - READ NEW BLOCK FAT LD DE,FATPAGE.cache @@ -314,7 +241,7 @@ W_T_F12: ADD HL,DE ; CLUSTER * 1.5 ; ;!FIXIT херня какая-то - IF COMPILE_UNUSED_CODE + ;IF COMPILE_UNUSED_CODE LD A,H LD B,H AND #1F @@ -324,10 +251,10 @@ W_T_F12: RLCA RLCA AND #07 - LD BC,(FATCASH) ; C - BLOCK FAT IN CASH + LD BC,(FatCache) ; C - BLOCK FAT IN CASH CP C CALL NZ,RE_FAT ; прочитать в кеш 16 секторов FAT-а - ENDIF + ;ENDIF ; LD DE,FATPAGE.cache ADD HL,DE @@ -346,15 +273,7 @@ W_T_F12: AND A RET -; W_T_F01 SLA E -; RL D -; RL E -; RL D -; RL E -; RL D -; RL E -; RL D - ; + W_T_F01:; влево на 4 битa SLA E LD A,E @@ -384,28 +303,30 @@ W_T_F01:; ; A - NEW FAT BLOCK RE_FAT: PUSH HL PUSH AF - LD A,(FATCASH.Update) + LD A,(FatCache.Update) OR A CALL NZ,WR_FAT.Start POP AF LD L,A LD H,0 - LD (FATCASH),HL + LD (FatCache),HL ;FAT BLOCK * 16 = SECTOR OF FAT - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL ;!TODO FATcacheSize - ; + DUP FAT_CACHE.Degree + ADD HL,HL ;x2 + EDUP LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL - LD IX,0 - ADD IX,DE ; номер лог. сектора + ; + PUSH DE + POP IX + ;LD IX,0 + ;ADD IX,DE ; номер лог. сектора + ; LD HL,0 ; ст. разряд ; HL:IX - SECTOR FAT FOR READING LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS LD A,(FatBuffer.DRIVE) ; номер диска - LD BC,16*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) ;!TODO FATcacheSize + LD BC,FAT_CACHE.Sectors*256 + Dss.DRV.Read ;рег B: 16 * 512 = 8192 (CASH SIZE) RST ToDSS.DRV POP HL RET @@ -418,26 +339,24 @@ WR_FAT: SET_PAGE_X FATPAGE OUT (SLOT3),A RET ; Запись кеша (всего?) FAT-а на диск -.Start: LD HL,(FATCASH) +.Start: LD HL,(FatCache) LD H,0 - ;LD (FATCASH),HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT ;!TODO FATcacheSize - + ;FAT BLOCK * 16 = SECTOR OF FAT + DUP FAT_CACHE.Degree + ADD HL,HL ;x2 + EDUP PUSH HL LD B,H LD C,L ;BC - BLOCK OF FAT - LD DE,16 ;!HARDCODE ;!TODO FATcacheSize + LD DE,FAT_CACHE.Sectors ADD HL,DE ;+ SIZE CASH (16 SECTORS) - LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize + LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT AND A SBC HL,DE JR C,.WALLFAT EX DE,HL - LD HL,16 ;!HARDCODE ; число секторов ;!TODO FATcacheSize + LD HL,FAT_CACHE.Sectors ; CF = 0 SBC HL,DE JP C,.ERR @@ -448,10 +367,14 @@ WR_FAT: SET_PAGE_X FATPAGE LD DE,(FatBuffer.FAT_FRM) ADD HL,DE EX DE,HL - LD IX,0 - ;HL:IX - SECTOR OF FAT FOR SAVE - ADD IX,DE ; номер лог. сектора + ; + PUSH DE + POP IX + ;LD IX,0 + ;ADD IX,DE ; номер лог. сектора + ; LD HL,0 ; ст. разряд + ;HL:IX - SECTOR OF FAT FOR SAVE LD DE,FATPAGE.cache ; откуда LD B,A ; число секторов LD C,Dss.DRV.Write ; запись секторов @@ -463,8 +386,12 @@ WR_FAT: SET_PAGE_X FATPAGE LD DE,(FatBuffer.FAT2_XX) ADD HL,DE EX DE,HL - LD IX,0 - ADD IX,DE + ; + PUSH DE + POP IX + ;LD IX,0 + ;ADD IX,DE ; номер лог. сектора + ; LD DE,FATPAGE.cache LD HL,0 LD A,(FatBuffer.DRIVE) @@ -473,70 +400,132 @@ WR_FAT: SET_PAGE_X FATPAGE AND A ;!TODO нет контроля ошибок ; .ERR: LD A,0 - LD (FATCASH.Update),A + LD (FatCache.Update),A RET NC POP HL ; CF = 1 RET -;R01 -;R01WR_FAT LD HL,(FATCASH) -;R01 LD H,0 -;R01 LD (FATCASH),HL -;R01 LD E,L -;R01 LD D,H -;R01 ADD HL,HL -;R01 ADD HL,DE -;R01 PUSH HL -;R01 LD B,H -;R01 LD C,L -;R01 INC HL -;R01 INC HL -;R01 INC HL -;R01 LD DE,(S_P_F) -;R01 LD A,3 -;R01 AND A -;R01 SBC HL,DE -;R01 JP C,WR_FAT1 -;R01 EX DE,HL -;R01 LD HL,3 -;R01 AND A -;R01 SBC HL,DE -;R01 JP C,FATERR -;R01 LD A,L -;R01WR_FAT1 LD H,B -;R01 LD L,C -;R01 LD DE,(FAT_FRM) -;R01 ADD HL,DE -;R01 EX DE,HL -;R01 LD IX,0 -;R01 ADD IX,DE -;R01 LD DE,FAT -;R01 LD HL,0 -;R01 LD B,A -;R01 LD C,6 -;R01 LD A,(DRIVE) -;R01 PUSH BC -;R01 RST #18 -;R01 POP BC -;R01 POP HL -;R01 LD DE,(FAT2_XX) -;R01 ADD HL,DE -;R01 EX DE,HL -;R01 LD IX,0 -;R01 ADD IX,DE -;R01 LD DE,FAT -;R01 LD HL,0 -;R01 LD A,(DRIVE) -;R01 LD C,6 -;R01 RST #18 -;R01 RET -FATCASH: WORD #0000 -.Block EQU FATCASH -.Update EQU FATCASH+1 -MAX_CLU: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) + +FatCache: WORD #0000 +.Block EQU FatCache +.Update EQU FatCache+1 +FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) ;//MODULE: FAT_X ;[END] +;R01 + ;; HL - CLUSTER + ;; DE - (CLUSTER) + ; + ;R_F_FAT EX DE,HL + ; LD HL,(FAT_Max_Cluster) + ; AND A + ; SBC HL,DE + ; EX DE,HL + ; LD A,10 + ; RET C + ; PUSH HL + ; LD A,(FAT_TYP) + ; CP "2" + ; JP Z,R_F_F12 + ;R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH + ; XOR A + ;R_F_00H INC A ; HL - CLUSTER + ; SBC HL,DE + ; JP NC,R_F_00H + ; ADD HL,DE + ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + ; DEC A + ; LD BC,(FatCache) ; A - ELEMENT OF CASH + ; CP C + ; CALL NZ,RE_FAT + ; LD DE,FAT + ; ADD HL,DE + ; LD E,(HL) + ; INC HL + ; LD D,(HL) + ; LD HL,#FFEF + ; AND A + ; SBC HL,DE + ; POP HL + ; LD A,0 + ; RET + ; + ;R_F_F12 LD D,H + ; LD E,L + ; ADD HL,HL + ; ADD HL,DE + ; RR H + ; RR L + ; PUSH AF + ; EX DE,HL + ; LD HL,(B_P_S) + ; LD B,H + ; LD C,L + ; ADD HL,HL + ; ADD HL,BC + ; EX DE,HL + ; XOR A ; DE - SIZE SECTOR * 3 + ;R_F_00 INC A ; HL - FAT OFFSET + ; SBC HL,DE + ; JP NC,R_F_00 + ; ADD HL,DE + ; DEC A + ; + ; + + ;WR_FAT LD HL,(FatCache) + ; LD H,0 + ; LD (FatCache),HL + ; LD E,L + ; LD D,H + ; ADD HL,HL + ; ADD HL,DE + ; PUSH HL + ; LD B,H + ; LD C,L + ; INC HL + ; INC HL + ; INC HL + ; LD DE,(S_P_F) + ; LD A,3 + ; AND A + ; SBC HL,DE + ; JP C,WR_FAT1 + ; EX DE,HL + ; LD HL,3 + ; AND A + ; SBC HL,DE + ; JP C,FATERR + ; LD A,L + ;WR_FAT1 LD H,B + ; LD L,C + ; LD DE,(FAT_FRM) + ; ADD HL,DE + ; EX DE,HL + ; LD IX,0 + ; ADD IX,DE + ; LD DE,FAT + ; LD HL,0 + ; LD B,A + ; LD C,6 + ; LD A,(DRIVE) + ; PUSH BC + ; RST #18 + ; POP BC + ; POP HL + ; LD DE,(FAT2_XX) + ; ADD HL,DE + ; EX DE,HL + ; LD IX,0 + ; ADD IX,DE + ; LD DE,FAT + ; LD HL,0 + ; LD A,(DRIVE) + ; LD C,6 + ; RST #18 + ; RET +; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index c8a110e..e8cbd7d 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -621 \ No newline at end of file +734 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index d0a96f5..33862cb 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -9,6 +9,31 @@ ; ;LD_DSK EQU 16 ; максимальное количество логических HDD дисков в системе + +///////////////////////////////////////////////////////////////////////////////////////////////////////////// + define _bit (1>> (.Sectors/8) +.Mask EQU high (.Size/.bytes_record - 1) ;#07 ;.Sectors - 1 +.Mask2 EQU ((1<<(.bytes_record*8)) / (.Size/2))-1 +; + undefine _bit + undefine _shift + + DISPLAY ".Size = ",/A,.Size + DISPLAY ".Sectors = ",/A,.Sectors + DISPLAY ".Degree = ",/A,.Degree + DISPLAY ".Mask = ",/A,.Mask + DISPLAY ".Mask2 = ",/A,.Mask2 +; DISPLAY " test = ",/A, (1