diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 63cea09..4cfb9d2 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -46,6 +46,6 @@ DEL_FN: ;!TEST POP AF POP DE JP NC,.loop - CALL WR_FAT + CALL WR_FAT ;!FIXIT может не нужна тут? Там дальше будет JP SAVEDIR ; сбросить кеш каталога на диск ; \ No newline at end of file diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index 72e1d29..b8c12cd 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -350,9 +350,8 @@ BLOKRD8 ADD HL,DE ECL1 AND A RET -;-------------------- - -BLOKWRC: +;----------------------------------------------------------------------- +BLOK_WR.Error: POP BC ;[x] SAVE CLUSTER AFTER WRITE ;!TEST POP BC @@ -363,7 +362,7 @@ BLOK_WR.ErrorWrite: LD A,DSS_Error.sys.WRITE_ERROR SCF RET - + ; ;WRITE SECTORS OF FILE ;HL:DE - FP (in sectors), IX - data in RAM ; B - Amount sectors @@ -390,13 +389,15 @@ BLOK_WR: ; PUSH BC CALL G_CLUST - JR C,BLOKWRC + JR C,.Error LD (IY+_sFM.ST_CLUSTER),L LD (IY+_sFM.ST_CLUSTER+1),H LD DE,(FatBuffer.ENDCLUS) CALL W_T_FAT PUSH HL - CALL WR_FAT + ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? + ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ; POP HL POP BC JP .WR2 @@ -438,14 +439,13 @@ BLOK_WR: JP .WR2 ; - .loop: PUSH BC CALL R_F_FAT JR NC,.WRB PUSH HL CALL INC_FAT POP HL - JR C,BLOKWRC + JR C,.Error CALL R_F_FAT .WRB: POP BC EX DE,HL @@ -461,7 +461,6 @@ BLOK_WR: LD (IY+_sFM.KnownOffset_L),C LD (IY+_sFM.KnownOffset_H),B ; - POP DE POP BC LD A,(CORE_BUFFERS.BootSector.S_P_C) @@ -491,16 +490,20 @@ BLOK_WR: POP BC LD HL,(READ.MEM) LD DE,(CORE_BUFFERS.BootSector.B_P_S) + ; .loop2: ADD HL,DE DEC C JR NZ,.loop2 + ; LD (READ.MEM),HL POP DE ; LD A,B OR A RET Z -.WR6: LD HL,CORE_BUFFERS.BootSector.S_P_C + ; +.big_loop: + LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A @@ -541,7 +544,8 @@ BLOK_WR: LD (READ.MEM),HL POP DE ; - JR .WR6 + JR .big_loop + ; .ErrorFull: POP BC LD A,DSS_Error.sys.DISK_FULL @@ -554,12 +558,19 @@ TSTSIZE: LD L,(IY+_sFM.F_POSITION) ;FP LOW LD H,(IY+_sFM.F_POSITION+1) ADD HL,DE + ; EXX - LD DE,0 - LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH - LD H,(IY+_sFM.F_POSITION+3) - ADC HL,DE + ;LD DE,0 ;!TEST + LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH + LD H,(IY+_sFM.F_POSITION+3) + ;!TEST + JR NC,.no_inc_hl + INC HL + ;ADC HL,DE + ; +.no_inc_hl: EXX ;HL':HL - NEW FP + ; LD C,(IY+_sFM.F_SIZE) LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW AND A @@ -757,7 +768,18 @@ RD_ONLY: POP DE ; HL - ADDRESS ; DE - SIZE ; A - FM -WRITE: LD (.R_POINT),HL +WRITE: + ;!TEST ;!TODO 5/12/23 [ ] баг с избыточной записью WR_FAT? + CALL WRITE_ + PUSH AF + LD A,(FatCache.Update) + OR A + CALL NZ,WR_FAT ; подкл. банку кеша FAT и записать его на диск + POP AF + RET + ; + ; +WRITE_: LD (.R_POINT),HL LD (.S_POINT),HL PUSH DE CALL SET_FM diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 73b42b3..c3040f3 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -456,7 +456,7 @@ DIR_PATH_CHECK: LD A,(HL) CP ':' RET Z ; -.forceCheck: LD HL,CurrentDirectory+1 +.forceCheck: ;LD HL,CurrentDirectory+1 LD BC,CurrentDirectory.DEPTH-1 CALL .checkDrive JR Z,.checkDir diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index be7d562..a9bd714 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -923,7 +923,7 @@ EXEC02: LD (EXE_FM),A LD XL,A LD XH,A ; - LD B,#02 + LD B,high Dss.Move_FP.FrEnd LD A,(EXE_FM) CALL MOVE_FP LD DE,(CORE_BUFFERS.EXEBUFF.LD_ADDR) @@ -931,8 +931,13 @@ EXEC02: LD (EXE_FM),A AND #3F LD D,A ADD IX,DE - LD DE,#0000 - ADC HL,DE + ;!TEST + JR NC,.no_inc_hl + INC HL + ;LD DE,#0000 + ;ADC HL,DE + ; +.no_inc_hl: LD A,XH SLA A RL L @@ -1251,7 +1256,7 @@ M_PSP: LD HL,(CORE_BUFFERS.EXEBUFF.LD_ADDR) CPIR ;!FIXIT нет проверки на выход по BC=0 DEC HL DEC HL - LD A,'\' + LD A,'\' ; CP (HL) INC HL JR Z,.YP_ESLA diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 5863482..3c95275 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -309,6 +309,8 @@ FINDDIR: RET Z LD (HL),A INC HL + LD (HL),0 + INC HL RET ;----------------------------------------------------------------------; diff --git a/DSS/FS/FAT/FAT12_16.asm b/DSS/FS/FAT/FAT12_16.asm index 8ecd30d..a8b3a82 100644 --- a/DSS/FS/FAT/FAT12_16.asm +++ b/DSS/FS/FAT/FAT12_16.asm @@ -54,7 +54,7 @@ INC_FAT PUSH HL LD DE,(FatBuffer.ENDCLUS) ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера ;!TEST ;!TODO 2/12/23 [ ] баг с избыточной записью WR_FAT? - CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск + ;CALL WR_FAT ; подкл. банку кеша FAT и записать его на диск ; AND A RET @@ -68,7 +68,6 @@ INC_FAT PUSH HL ; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb ;----------------------------------------------------------- -;!FIXIT отдаёт разный CF при удачном завершении в зависимости от FAT16/FAT12 R_F_FAT: EX DE,HL LD HL,(FAT_Max_Cluster) @@ -87,25 +86,26 @@ R_F_FAT: JR Z,R_F_F12 ; fat16, просто читать след. номер R_F_F16: - LD A,H - LD B,H - ;AND #0F - AND FAT_CACHE.Size_Mask_16 - LD H,A - LD A,B - ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) - DUP FAT_CACHE.Degree_16 - RRCA - EDUP - ;AND #0F - AND FAT_CACHE.Part_Mask_16 - ; - ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - LD BC,(FatCache) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT + ; LD A,H + ; LD B,H + ; ;AND #0F + ; AND FAT_CACHE.Size_Mask_16 + ; LD H,A + ; LD A,B + ; ; A=A/16 ; A - BLOCK FAT (1 BLOCK = 8192 BYTES) + ; DUP FAT_CACHE.Degree_16 + ; RRCA + ; EDUP + ; ;AND #0F + ; AND FAT_CACHE.Part_Mask_16 + ; ; + ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH + ; CP C + ; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT + ; LD DE,FATPAGE.cache ; начало кеша FAT-а + ; ADD HL,DE ; на ячейку FAT + CALL GET_FAT16_CELL LD E,(HL) ; прочитать номер кластера INC HL LD D,(HL) @@ -119,32 +119,34 @@ R_F_F16: RET ; R_F_F12: - LD D,H - LD E,L - RR H - RR L ; сдвиг вправо через CF - PUSH AF ; сохр. флаг - ADD HL,DE ; CLUSTER * 1.5 - ; - ;!FIXIT херня какая-то - ;IF COMPILE_UNUSED_CODE - LD A,H - LD B,H - AND #1F - LD H,A - LD A,B - RLCA - RLCA - RLCA - AND #07 - LD BC,(FatCache) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а - ;ENDIF - ; - LD DE,FATPAGE.cache ; начало кеша FAT-а - ADD HL,DE ; на ячейку FAT - POP AF ; восст. флаг + CALL GET_FAT12_CELL + ; LD D,H + ; LD E,L + ; RR H + ; RR L ; сдвиг вправо через CF + ; PUSH AF ; сохр. флаг + ; ADD HL,DE ; CLUSTER * 1.5 + ; ; + ; ;!FIXIT оптимизировать + ; ;IF COMPILE_UNUSED_CODE + ; LD A,H + ; LD B,H + ; AND #1F + ; LD H,A + ; LD A,B + ; RLCA + ; RLCA + ; RLCA + ; AND #07 + ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH + ; CP C + ; CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а + ; ;ENDIF + ; ; + ; LD DE,FATPAGE.cache ; начало кеша FAT-а + ; ADD HL,DE ; на ячейку FAT + ; POP AF ; восст. флаг + LD E,(HL) INC HL LD D,(HL) @@ -208,25 +210,26 @@ W_T_FAT: JR Z,W_T_F12 W_T_F16: PUSH DE - 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) ;!HARDCODE fat16 - размер записи FAT - LD BC,(FatCache) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT - LD DE,FATPAGE.cache - ADD HL,DE ; на ячейку FAT + ; 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) ;!HARDCODE fat16 - размер записи FAT + ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH + ; CP C + ; CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT + ; LD DE,FATPAGE.cache + ; ADD HL,DE ; на ячейку FAT + CALL GET_FAT16_CELL POP DE LD (HL),E ; сохр. в кеше FAT-а INC HL ; номер кластера @@ -244,37 +247,39 @@ W_T_F16: ; fat12 W_T_F12: ;!FIXIT переделать на переменные FAT_CACHE PUSH DE - LD D,H - LD E,L - ; ADD HL,HL - ; ADD HL,DE + ; LD D,H + ; LD E,L + ; ; ADD HL,HL + ; ; ADD HL,DE + ; ; RR H + ; ; RR L ;CLUSTER * 1.5 + ; ; PUSH AF ; RR H - ; RR L ;CLUSTER * 1.5 - ; PUSH AF - RR H - RR L ; сдвиг вправо через CF - PUSH AF ; сохр. флаг - ADD HL,DE ; CLUSTER * 1.5 - ; - ;!FIXIT херня какая-то - ;IF COMPILE_UNUSED_CODE - LD A,H - LD B,H - AND #1F - LD H,A - LD A,B - RLCA - RLCA - RLCA - AND #07 - LD BC,(FatCache) ; C - BLOCK FAT IN CASH - CP C - CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а - ;ENDIF - ; - LD DE,FATPAGE.cache - ADD HL,DE - POP AF + ; RR L ; сдвиг вправо через CF + ; PUSH AF ; сохр. флаг + ; ADD HL,DE ; CLUSTER * 1.5 + ; ; + ; ;!FIXIT оптимизировать + ; ;IF COMPILE_UNUSED_CODE + ; LD A,H + ; LD B,H + ; AND #1F + ; LD H,A + ; LD A,B + ; RLCA + ; RLCA + ; RLCA + ; AND #07 + ; LD BC,(FatCache) ; C - BLOCK FAT IN CASH + ; CP C + ; CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а + ; ;ENDIF + ; ; + ; LD DE,FATPAGE.cache + ; ADD HL,DE + ; POP AF + + CALL GET_FAT12_CELL POP DE JP C,W_T_F01 ; номер нечётный LD (HL),E @@ -314,6 +319,10 @@ W_T_F01:; POP AF POP HL OUT (SLOT3),A + ; [x] 2/12/23 FAT не всегда мог записаться на HDD + LD A,1 + LD (FatCache.Update),A + ; AND A RET @@ -429,11 +438,80 @@ WR_FAT: SET_PAGE_X FATPAGE 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) + LD BC,(FatCache) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT ; A != C - READ NEW BLOCK FAT + LD DE,FATPAGE.cache ; начало кеша FAT-а + ADD HL,DE ; на ячейку FAT + RET + +;вход: HL - номер кластера +;выход: HL - адрес нужной ячейки в странице FATPAGE +; CF - чётный/нечётный адрес кластера +GET_FAT12_CELL: + LD D,H + LD E,L + RR H + RR L ; сдвиг вправо через CF + PUSH AF ; сохр. флаг + ADD HL,DE ; CLUSTER * 1.5 + ; + ;!FIXIT оптимизировать + ;IF COMPILE_UNUSED_CODE + 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 + ; + + LD BC,(FatCache) ; C - BLOCK FAT IN CASH + CP C + CALL NZ,READ_FAT ; прочитать в кеш 16 секторов FAT-а + ;ENDIF + ; + LD DE,FATPAGE.cache + ADD HL,DE + POP AF + RET + FatCache: WORD #0000 .Block EQU FatCache .Update EQU FatCache+1 -FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров FAT12 (без служ.) +FAT_Max_Cluster: WORD #0FF0 ; макс. число кластеров (без служ.) ;//MODULE: FAT_X ;[END] diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 05f0ec5..61cd369 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -4,8 +4,8 @@ ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module -CMOUSE EQU #1B ; !FIXIT на sp2000.inc -DMOUSE EQU #1A ; !FIXIT на sp2000.inc +PORT_MOUSE.Ctrl EQU Z84.SIO.Ch_B.Ctrl +PORT_MOUSE.Data EQU Z84.SIO.Ch_B.Data ; MOUSE SOFTWARE SPECIFICATION ;--------------------------------------------- @@ -164,27 +164,30 @@ MS_INIT DI ;OUT (#10),A ; XOR A ;LD A,0 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A INC A ;LD A,1 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A DEC A ;LD A,0 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A LD A,3 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A LD A,#41 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A LD A,4 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A ;!TEST mouse LD A,#47 ; первый множитель = 16 875000/Мн1*Мн2=1215 ;LD A,#44 ;LD A,#04 ; первый множитель = 1 875000/Мн1*Мн2=4807 + OUT (PORT_MOUSE.Ctrl),A ; - OUT (CMOUSE),A LD A,5 - OUT (CMOUSE),A - LD A,#E0 - OUT (CMOUSE),A + OUT (PORT_MOUSE.Ctrl),A + ; [ ] для корректного инита Sega джойстика в порту кемпстон джойстика + LD A,%1110'0000 + ;LD A,%0110'0000 + ; + OUT (PORT_MOUSE.Ctrl),A ;!TEST mouse LD A,#55 @@ -637,10 +640,10 @@ MS003 POP BC XOR A RET -READ_M: IN A,(CMOUSE) +READ_M: IN A,(PORT_MOUSE.Ctrl) RRCA RET NC - IN A,(DMOUSE) + IN A,(PORT_MOUSE.Data) LD L,A BIT 6,A CCF @@ -649,7 +652,7 @@ READ_M: IN A,(CMOUSE) ;!TEST mouse freeeeezzzz LD BC,#2000 ; -TST_01: IN A,(CMOUSE) +TST_01: IN A,(PORT_MOUSE.Ctrl) RRCA ;!TEST mouse freeeeezzzz JR C,.NXT @@ -662,7 +665,7 @@ TST_01: IN A,(CMOUSE) ;JR NC,TST_01 ; -.NXT: IN A,(DMOUSE) +.NXT: IN A,(PORT_MOUSE.Data) LD E,A BIT 6,A CCF @@ -671,7 +674,7 @@ TST_01: IN A,(CMOUSE) ;[x] mouse freeeeezzzz !TEST LD BC,#2000 ; -TST_02: IN A,(CMOUSE) +TST_02: IN A,(PORT_MOUSE.Ctrl) RRCA ;[x] mouse freeeeezzzz !TEST JR C,.NXT @@ -682,7 +685,7 @@ TST_02: IN A,(CMOUSE) RET ;JR NC,TST_02 ; -.NXT: IN A,(DMOUSE) +.NXT: IN A,(PORT_MOUSE.Data) LD D,A BIT 6,A CCF diff --git a/DSS/build.txt b/DSS/build.txt index c189136..83249da 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -769 \ No newline at end of file +784 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index c074761..0611879 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -15,7 +15,7 @@ define _shift _bit&1)) + _bit&2)) + _bit&4)) + _bit&8)) + _bit&16)) + _bit&32)) + _bit&64)) + _bit&128)) ; FAT_CACHE: -.Size EQU #2000 +.Size EQU #1000 .Sector_Size EQU #200 .Sectors EQU .Size / .Sector_Size ; for FAT16 @@ -23,7 +23,7 @@ FAT_CACHE: .Degree_16 EQU _shift .Size_Mask_16 EQU high (.Size/.bytes_record_16 - 1) .Part_Mask_16 EQU ((1<<(.bytes_record_16*8)) / (.Size/2))-1 -; for FAT12 +; for FAT12 ;!TODO .bytes_record_12 EQU 2 .Degree_12 EQU _shift .Size_Mask_12 EQU high (.Size/.bytes_record_12 - 1) diff --git a/Shared_Includes b/Shared_Includes index 349ba28..21c7eb6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 349ba286106d21a77cf3f8a25b6f7c952eccb046 +Subproject commit 21c7eb690adb62e35c41fdcda76dc3bf97f369b4