diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 136f0a1..d7350fe 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -184,10 +184,10 @@ CONTINUE: CALL DOSMESS LD A,(DRIVE) - LD BC,Dss.BootDSK.Set*256 + Dss.BootDSK + LD BC,Dss.BootDSK.Set RST ToDSS - LD B,0 + LD B,high Dss.BootDSK.Get ELSE IF ORIGINAL_DSS @@ -205,10 +205,10 @@ CONTINUE: IF ORIGINAL_DSS LD A,(DRIVE) - LD BC,Dss.BootDSK.Set*256 + Dss.BootDSK + LD BC,Dss.BootDSK.Set RST ToDSS - LD B,0 + LD B,high Dss.BootDSK.Get ENDIF ENDIF diff --git a/DSS/CHANGES.LOG b/DSS/CHANGES.LOG index 9d9c223..2256ee4 100644 --- a/DSS/CHANGES.LOG +++ b/DSS/CHANGES.LOG @@ -1,8 +1,9 @@ !TODO Важное: - +[ ] перед началом работы любой процедуры записи/чтения драйва устанавливать флаг, чтоб не было повторного вызова (из прерывания, например) +[ ] блокировка файлов в файловых манипуляторах (чтоб не открывать на запись уже открытый на запись файл, например) Среднее: -[ ] перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле +[x] ;!TEST перед ресканом драйвов проверять открытые хэндлы и если буква диска меняется, то менять драйв в хэндле [ ] начать работать с функциями REMOVABLE и MEDIA CHECK rst #18. Возвращать значение #FF, если порядок букв изменился Вообще не важное: @@ -11,14 +12,16 @@ DSS 1.70.2 Изменения после версии 1.70 - [+] исправлен баг с "C:\>CD E:\" - [+] исправлен баг с переключением на другой диск из некорневой директории, когда на новом диске оказывался в несуществующей директории - [+] при чтении/записи файла не происходит избыточное перечитывание кластеров от начала файла +CORE: + [+] при чтении/записи файла не происходит "холостое" перечитывание кластеров от начала файла [+] перечитывание BPB теперь делается не на каждый чих, а когда надо (и бага при загрузке с диска "B:" нет :-P ) [+] изменена работа с RAM DISK, теперь он может быть загрузочным - [+] переход на другой диск происходит без бага с директорией от старого диска - [+] исправлены баги с обработкой буферов командной строки [+] исправлены баги в функциях: WINCOPY, WINREST, SCROLL, SETVMOD, SELPAGE +SHELL: + [+] исправлен баг с "C:\>CD E:\" + [+] исправлены баги с обработкой буферов командной строки +UNSORTED: + [+] исправлен баг с переключением на другой диск из некорневой директории, когда на новом диске оказывался в несуществующей директории [+] мелкие и не очень оптимизации ;Изменения после версии 1.60 diff --git a/DSS/DOS5.ASM b/DSS/DOS5.ASM index 028aa57..f2ebd7c 100644 --- a/DSS/DOS5.ASM +++ b/DSS/DOS5.ASM @@ -316,6 +316,7 @@ OPEN_FN:;!TEST Current Dir ;[x] 15/10/23 POP HL RET C LD A,C + ;!FIXIT сделать как в mkdir или rmdir ; ;R08 OPEN: LD (.TMP),A ; enter point for CREATE @@ -328,7 +329,15 @@ OPEN: LD (.TMP),A ; enter point for CREATE .FILE: CALL SEARCH ; enter point for EXEC RET C ;R02 -.FM: CALL GET_FM ; enter point for ATTRIB +.FM: ; enter point for ATTRIB + ; [ ] 13/11/2023 -bug with bad clusters ;!TEST + ; XOR A + ; CALL SET_FM + ; LD C,(IY+_sFM.ST_CLUSTER) + ; LD B,(IY+_sFM.ST_CLUSTER+1) + ; PUSH BC + ; + CALL GET_FM RET C LD A,C EX AF,AF' @@ -390,6 +399,13 @@ CLOSE: LD (.TMP),A LD D,(IY+_sFM.DIR_CLUSTER) LD E,(IY+_sFM.DIR_CLUSTER+1) PUSH DE + ; [ ] 13/11/2023 -bug with bad clusters ;!TEST + LD A,(IY+_sFM.DRIVE) + CALL OPENDSK + IF TEST_FEATURE + CALL SET_DIR + ENDIF + ; XOR A CALL SET_FM POP DE @@ -866,7 +882,14 @@ CHDIR_FN: POP HL RET C CALL CHDIR - JP DIR_PATH_CHANGE.FullCurrent + ; если удачно, то копируем WorkDirectory в CurrentDirectory + JP NC,DIR_PATH_CHANGE.FullCurrent + ; если неудачно, то возвращаемся туда откуда пришли + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + POP AF + RET ; CHDIR: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C @@ -876,6 +899,7 @@ CHDIR: CALL GETWORD ; CALL NZ,OPENDIR RET + //////////////////////////////////////////////////////////////////////// ; Функция #1B. Создание каталога. ; @@ -893,15 +917,22 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 POP HL RET C LD A,C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + POP AF + RET ; - - CALL GETWORD ; тест на допуст. имя и настр. на диск +.START: CALL GETWORD ; тест на допуст. имя и настр. на диск RET C LD HL,TMPNAME ; 8.3 имя LD DE,MASKARE ; буфер имени 11 симв. формата CALL MASK ; преобр. имя 8.3 -> 11 формат RET C - CALL LOADDIR ; прочитать список каталога + ;!TEST optimization ранее GETWORD уже загрузил директорию + ;CALL LOADDIR ; прочитать список каталога + ; CALL DSEARCH ; поиск записи каталога в списке диска LD A,DSS_Error.sys.DIR_EXISTS CCF @@ -1049,6 +1080,7 @@ MKDIR: ;!TEST Current Dir ;[x] 15/10/23 AND A RET + //////////////////////////////////////////////////////////////////////// ; Функция #1C. Удаление каталога. ; Можно удалить только пустой каталог. @@ -1067,8 +1099,15 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 POP HL RET C LD A,C + CALL .START + PUSH AF + LD HL,CurrentDirectory + CALL CHDIR + CALL DIR_PATH_CHANGE.Current + POP AF + RET ; - CALL GETWORD +.START: CALL GETWORD RET C LD HL,TMPNAME LD DE,MASKARE @@ -1605,7 +1644,9 @@ TMPNAME: DZ ' ' ; 12 ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; IN: A - drive number +; ;????? R10 OPENDSK: ;!TEST DRV.Open обход @@ -1616,6 +1657,13 @@ OPENDSK: LD A,C ; .force: PUSH AF + ; [ ] 13/11/2023 -bug with bad clusters ;!TEST + ;PUSH AF + ;LD A,(FATCASH.Update) + ;OR A + ;CALL NZ,WR_FAT + ;POP AF + ; LD C,Dss.DRV.Open RST ToDSS.DRV POP BC @@ -1666,18 +1714,17 @@ OPENDIR: DEC HL ;R05 JR Z,.REROOT1 ;R05 .SUDI1: EXX - LD HL,MASKARE - LD DE,MASKARE+1 - LD BC,10 ;!HARDCODE - LD (HL),' ' - LDIR + LD HL,MASKARE ;!FIXIT можно не затирать предварительно? + LD DE,MASKARE+1 + LD BC,10 ;!HARDCODE + LD (HL),' ' + LDIR EXX LD DE,MASKARE -.SUBDIR0: - LDI +.loop: LDI LD A,(HL) OR A - JR NZ,.SUBDIR0 + JR NZ,.loop JR .SUBDIR3 .SUBDIR2: LD DE,MASKARE @@ -1688,7 +1735,7 @@ OPENDIR: RET C LD (IY+_sFM.ST_CLUSTER),E LD (IY+_sFM.ST_CLUSTER+1),D - LD DE,#4000 + LD DE,#4000 ;!HARDCODE LD (IY+_sFM.F_SIZE),E LD (IY+_sFM.F_SIZE+1),D CALL LOADDIR @@ -1993,11 +2040,11 @@ LOADDIR: PUSH AF ;!TEST no ldir ; очистить кеш каталога - ;LD HL,#C000 - ;LD DE,#C001 - ;LD BC,#3FFF - ;LD (HL),L - ;LDIR + ; LD HL,#C000 + ; LD DE,#C001 + ; LD BC,#3FFF + ; LD (HL),L + ; LDIR ; LD A,(FatBuffer.DRIVE) ; номер диска LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор @@ -2010,7 +2057,7 @@ LOADDIR: LD DE,#4000 ; сколько XOR A ; дескриптор CALL READ ; чтение из файла - LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов + LD (SAVEDIR.DIRSIZE),DE ; число прочит. байтов POP AF OUT (SLOT3),A AND A @@ -2019,11 +2066,17 @@ LOADDIR: LD HL,(FatBuffer.DIR_FRH) ; ст. разряд LD IX,(FatBuffer.DIR_FRL) ; номер лог. сектора LD A,(FatBuffer.DIR_S_S) - LD B,32 ; !HARDCODE размер root-каталога - SUB B - JR NC,.RTD1 - ADD A,B - LD B,A ; число секторов + ;!TEST + LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога + CP B + JR NC,.RTD1 + LD B,A ; число секторов + ;LD B,32 ; !HARDCODE 16384/(sector 512). размер root-каталога + ;SUB B + ;JR NC,.RTD1 + ;ADD A,B + ;LD B,A ; число секторов + ; .RTD1: LD A,(FatBuffer.DRIVE) ; номер диска LD DE,DIR ; буфер LD C,Dss.DRV.Read ; чтение секторов @@ -2086,26 +2139,34 @@ SAVEDIR: ;----------------------------------------------------------------------; +;!TEST Current Dir ;[x] 15/10/23 DIR_PATH_CHANGE: .FullCurrent: LD A,(FatBuffer.DRIVE) ADD 'A' LD (CurrentPath),A ; -.Current: LD HL,WorkDirectory - LD DE,CurrentDirectory - LD BC,DIRECTORY_PATH_LENGTH - LDIR - RET +.Current: ;LD HL,WorkDirectory + ;LD DE,CurrentDirectory + ;LD BC,DIRECTORY_PATH_LENGTH + ;LDIR + ;RET + LD HL,CurrentDirectory + JP CURRDIR ; .FullWork: LD A,(CurrentPath) SUB 'A' LD (FatBuffer.DRIVE),A ; -.Work: LD HL,CurrentDirectory - LD DE,WorkDirectory - LD BC,DIRECTORY_PATH_LENGTH - LDIR - RET +.Work: ;LD HL,CurrentDirectory + ;LD DE,WorkDirectory + ;LD BC,DIRECTORY_PATH_LENGTH + ;LDIR + ;RET + LD HL,WorkDirectory + JP CURRDIR_FN +; + +; DIR_PATH_CHECK: LD A,(HL) CP '\' JR NZ,.notRootDir @@ -2158,6 +2219,41 @@ DIR_PATH_CHECK: LD A,(HL) JP GETWORD ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; + IF TEST_FEATURE + +; [ ] 13/11/2023 -bug with bad clusters ;!TEST +; in: IY - FM для файла дирректорию которого грузим +SET_DIR: + LD L,(IY+_sFM.DIR_CLUSTER) + LD H,(IY+_sFM.DIR_CLUSTER+1) + ; + PUSH IY + XOR A + CALL SET_FM + EX DE,HL + LD L,(IY+_sFM.ST_CLUSTER) + LD H,(IY+_sFM.ST_CLUSTER+1) + AND A + SBC HL,DE + JR Z,.exit + LD HL,#4000 ;!HARDCODE + ;LD A,D + ;OR E + ;JR Z,.ROOT + + EX DE,HL + LD (IY+_sFM.F_SIZE),E + LD (IY+_sFM.F_SIZE+1),D + LD (IY+_sFM.ST_CLUSTER),L + LD (IY+_sFM.ST_CLUSTER+1),H + CALL LOADDIR + ; +.exit: POP IY + RET + + ENDIF +;----------------------------------------------------------------------; diff --git a/DSS/DOS_FM.ASM b/DSS/DOS_FM.ASM index bbd5489..e653c66 100644 --- a/DSS/DOS_FM.ASM +++ b/DSS/DOS_FM.ASM @@ -118,7 +118,8 @@ GET_FM: LD IY,0 ; HL:IX - OFFSET POINTER ; A - FILE MANIPULATOR -MOVE_FP CALL SET_FM +MOVE_FP: + CALL SET_FM RET C INC B DEC B @@ -254,7 +255,6 @@ BLOK_RD: PUSH BC POP DE JP BLOKRD2 ; - BLOKRD1: PUSH BC CALL R_F_FAT @@ -357,15 +357,18 @@ BLOKWRC: ;[x] SAVE CLUSTER AFTER WRITE ;!TEST POP BC ; -BLOKWR0 POP BC +BLOK_WR.ErrorWrite: + POP BC POP DE + LD A,DSS_Error.sys.WRITE_ERROR SCF RET ;WRITE SECTORS OF FILE -;HL:DE - FP (in sectors) +;HL:DE - FP (in sectors), IX - data in RAM ; B - Amount sectors -BLOK_WR PUSH BC +BLOK_WR: + PUSH BC LD (READ.MEM),IX LD A,(CORE_BUFFERS.BootSector.S_P_C) ;SECTORS PER CLUSTER LD C,A @@ -396,7 +399,7 @@ BLOK_WR PUSH BC CALL WR_FAT POP HL POP BC - JP BLOKWR2 + JP .WR2 .saveClustersOffset: ;[x] SAVE CLUSTER AFTER WRITE ;!TEST @@ -404,7 +407,7 @@ BLOK_WR PUSH BC LD D,(IY+_sFM.KnownCluster_H) LD A,D OR E - JR Z,BLOKWR2 + JR Z,.WR2 ; PUSH DE PUSH HL @@ -426,30 +429,30 @@ BLOK_WR PUSH BC POP DE ; EX DE,HL - JP BLOKWR2 + JP .WR2 .noOptimization_1: POP BC .noOptimization_2: POP HL POP DE - JP BLOKWR2 + JP .WR2 ; -BLOKWR1 PUSH BC +.loop: PUSH BC CALL R_F_FAT - JR NC,BLOKWRB + JR NC,.WRB PUSH HL CALL INC_FAT POP HL JR C,BLOKWRC CALL R_F_FAT -BLOKWRB POP BC +.WRB: POP BC EX DE,HL DEC BC -BLOKWR2 LD A,B +.WR2: LD A,B OR C - JR NZ,BLOKWR1 + JR NZ,.loop ;[x] SAVE CLUSTER AFTER WRITE ;!TEST LD (IY+_sFM.KnownCluster_L),L @@ -465,9 +468,9 @@ BLOKWR2 LD A,B SUB E LD C,A CP B - JR C,BLOKWR3 ;SIZE > RESIDUE CLUSTER + JR C,.WR3 ;SIZE > RESIDUE CLUSTER LD C,B ;SIZE < CLUSTER -BLOKWR3 LD A,B +.WR3: LD A,B SUB C LD B,A PUSH HL @@ -476,94 +479,99 @@ BLOKWR3 LD A,B CALL NSECTOR POP DE ADD IX,DE - JR NC,BLOKWR4 + JR NC,.WR4 INC HL -BLOKWR4 LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV - JP C,BLOKWR0 - POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -BLOKWR5 ADD HL,DE - DEC C - JR NZ,BLOKWR5 - LD (READ.MEM),HL - POP DE + ; DOUBLE 1 +.WR4: LD DE,(READ.MEM) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JP C,.ErrorWrite + 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 -BLOKWR6 LD HL,CORE_BUFFERS.BootSector.S_P_C +.WR6: LD HL,CORE_BUFFERS.BootSector.S_P_C LD A,B SUB (HL) LD B,A LD C,(HL) - JR NC,BLOKWR7 + JR NC,.WR7 LD B,0 ADD A,(HL) ;0 AND CF LD C,A OR A ;CLEAR CF RET Z -BLOKWR7 EX DE,HL +.WR7: EX DE,HL PUSH BC CALL R_F_FAT - JR NC,BLOKWR9 + JR NC,.WR9 PUSH HL CALL INC_FAT POP HL - JR C,BLOKWRA + JR C,.ErrorFull CALL R_F_FAT -BLOKWR9 POP BC +.WR9: POP BC EX DE,HL PUSH HL PUSH BC CALL NSECTOR - LD DE,(READ.MEM) - LD A,(FatBuffer.DRIVE) - LD B,C - LD C,Dss.DRV.Write - RST ToDSS.DRV - JP C,BLOKWR0 + ; DOUBLE 1 + LD DE,(READ.MEM) + LD A,(FatBuffer.DRIVE) + LD B,C + LD C,Dss.DRV.Write + RST ToDSS.DRV + JP C,.ErrorWrite + POP BC + LD HL,(READ.MEM) + LD DE,(CORE_BUFFERS.BootSector.B_P_S) +.loop3: ADD HL,DE + DEC C + JR NZ,.loop3 + LD (READ.MEM),HL + POP DE + ; + JR .WR6 +.ErrorFull: POP BC - LD HL,(READ.MEM) - LD DE,(CORE_BUFFERS.BootSector.B_P_S) -BLOKWR8 ADD HL,DE - DEC C - JR NZ,BLOKWR8 - LD (READ.MEM),HL - POP DE - JR BLOKWR6 - -BLOKWRA POP BC LD A,DSS_Error.sys.DISK_FULL SCF RET -TSTSIZE XOR A +TSTSIZE: + XOR A LD (READ.COD),A - LD L,(IY+32) ;FP LOW _sFM.F_POSITION - LD H,(IY+33) + 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+34) ;FP HIGH - LD H,(IY+35) + LD L,(IY+_sFM.F_POSITION+2) ;FP HIGH + LD H,(IY+_sFM.F_POSITION+3) ADC HL,DE - EXX ;HL':HL - NEW FP - LD C,(IY+28) ; _sFM.F_SIZE - LD B,(IY+29) ;SIZE LOW + EXX ;HL':HL - NEW FP + LD C,(IY+_sFM.F_SIZE) + LD B,(IY+_sFM.F_SIZE+1) ;SIZE LOW AND A SBC HL,BC EXX - LD C,(IY+30) ;SIZE HIGH - LD B,(IY+31) + LD C,(IY+_sFM.F_SIZE+2) ;SIZE HIGH + LD B,(IY+_sFM.F_SIZE+3) SBC HL,BC EXX - RET C ;OK READ ALL + RET C ;OK READ ALL EX DE,HL - SBC HL,DE ;VERY BIG + SBC HL,DE ;VERY BIG EX DE,HL LD A,#FF LD (READ.COD),A @@ -577,7 +585,7 @@ TSTSIZE XOR A ; HL - ADDRESS ; DE - SIZE ; A - FM -READ: LD (R_POINT),HL +READ: LD (.R_POINT),HL LD (.S_POINT),HL CALL SET_FM RET C @@ -628,17 +636,17 @@ READ: LD (R_POINT),HL JR Z,.ROV2 LD (.SECTORH),HL LD (.SECTORL),DE - LD IX,(R_POINT) +.R_POINT+2: LD IX,0 CALL BLOK_RD JP C,.ERR_1 - LD DE,(R_POINT) + LD DE,(.R_POINT) .MEM+1: LD HL,0 // LD HL,(READMEM) AND A SBC HL,DE LD C,H LD B,0 ADD HL,DE - LD (R_POINT),HL + LD (.R_POINT),HL SRL C .SECTORL+1: LD HL,0 // LD HL,(SECTORL) ADD HL,BC @@ -665,14 +673,13 @@ READ: LD (R_POINT),HL OUT (C),B JP C,.ERR_1 LD HL,CORE_BUFFERS.BUFFER - LD DE,(R_POINT) + LD DE,(.R_POINT) POP BC LDIR - LD (R_POINT),DE -.ROV6: -.S_POINT+1: LD HL,0 - LD DE,(R_POINT) - EX DE,HL + LD (.R_POINT),DE +.ROV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ;EX DE,HL AND A SBC HL,DE PUSH HL @@ -709,7 +716,7 @@ READ: LD (R_POINT),HL ADC HL,BC EXX POP DE - LD HL,512 + LD HL,512 ;!HARDCODE AND A SBC HL,DE LD B,H @@ -721,13 +728,13 @@ READ: LD (R_POINT),HL ADD HL,BC LD B,H LD C,L - LD HL,0 + LD HL,0 ;!TODO можно тут упростить дальнейшую ветку? .ROV3: PUSH HL LD HL,CORE_BUFFERS.BUFFER ADD HL,DE - LD DE,(R_POINT) + LD DE,(.R_POINT) LDIR - LD (R_POINT),DE + LD (.R_POINT),DE EXX JP .ROV4 .ERR_3: POP HL @@ -750,11 +757,11 @@ RD_ONLY: POP DE ; HL - ADDRESS ; DE - SIZE ; A - FM -WRITE: LD (R_POINT),HL - LD (READ.S_POINT),HL +WRITE: LD (.R_POINT),HL + LD (.S_POINT),HL PUSH DE CALL SET_FM - JP C,PWERR1 + JR C,PWERR1 LD A,(IY+_sFM.ACCESS_MODE) AND FAT_ATTR.READ_ONLY JR NZ,RD_ONLY @@ -762,7 +769,13 @@ WRITE: LD (R_POINT),HL SET 5,(IY+_sFM.ATTRIBUT) LD A,(IY+_sFM.DRIVE) CALL OPENDSK - JP C,PWERR1 + JR C,PWERR1 + ; [ ] 13/11/2023 -bug with bad clusters ;!TEST + ; IF TEST_FEATURE + ; CALL SET_DIR + ; JR C,PWERR1 + ; ENDIF + ; LD C,(IY+_sFM.F_POSITION) LD A,(IY+_sFM.F_POSITION+1) LD E,A @@ -779,38 +792,39 @@ WRITE: LD (R_POINT),HL ; BC - FP residue (in bytes) LD A,B OR C - JP NZ,WOV1 -WOV4: POP BC + JP NZ,.WOV1 +.WOV4: POP BC PUSH BC SRL B - JR Z,WOV2 + JR Z,.WOV2 PUSH HL PUSH DE PUSH BC -R_POINT+2: LD IX,0 // LD IX,(R_POINT) - +.R_POINT+2: + LD IX,0 CALL BLOK_WR POP BC - JP C,PWERR3 + JR C,PWERR3 LD C,B - LD HL,(R_POINT) - LD DE,#0200 -WOV5: ADD HL,DE - DJNZ WOV5 - LD (R_POINT),HL - LD B,0 + LD HL,(.R_POINT) + LD DE,#0200 ;!HARDCODE +.WOV5: ADD HL,DE + DJNZ .WOV5 + ; B=0 + LD (.R_POINT),HL + ;LD B,0 POP HL ADD HL,BC EX DE,HL POP HL LD C,B ADC HL,BC -WOV2: POP BC +.WOV2: POP BC LD A,B AND #01 LD B,A OR C - JP Z,WOV6 + JR Z,.WOV6 PUSH HL PUSH DE PUSH BC @@ -825,11 +839,11 @@ WOV2: POP BC LD C,SLOT3 OUT (C),B LD DE,CORE_BUFFERS.BUFFER - LD HL,(R_POINT) + LD HL,(.R_POINT) POP BC JP C,PWERR2 LDIR - LD (R_POINT),HL + LD (.R_POINT),HL POP DE POP HL LD IX,CORE_BUFFERS.BUFFER+#C000 @@ -843,9 +857,10 @@ WOV2: POP BC LD C,SLOT3 OUT (C),B RET C -WOV6: LD DE,(READ.S_POINT) - LD HL,(R_POINT) - AND A +.WOV6: LD HL,(.R_POINT) +.S_POINT+1: LD DE,0 + ; CF=0 + ;AND A SBC HL,DE PUSH HL EX DE,HL @@ -855,18 +870,19 @@ WOV6: LD DE,(READ.S_POINT) CALL MOVE_FP.F_current CALL MOVE_CP POP DE - RET NC - LD L,(IY+32) - LD H,(IY+33) - LD C,(IY+34) - LD B,(IY+35) - LD (IY+28),L - LD (IY+29),H - LD (IY+30),C - LD (IY+31),B + RET NC ; Если размер файла на диске НЕ стал больше, чем был + ; Если размер файла на диске стал больше, чем был + LD L,(IY+_sFM.F_POSITION+0) + LD H,(IY+_sFM.F_POSITION+1) + LD C,(IY+_sFM.F_POSITION+2) + LD B,(IY+_sFM.F_POSITION+3) + LD (IY+_sFM.F_SIZE+0),L + LD (IY+_sFM.F_SIZE+1),H + LD (IY+_sFM.F_SIZE+2),C + LD (IY+_sFM.F_SIZE+3),B AND A RET -WOV1: PUSH BC +.WOV1: PUSH BC PUSH HL PUSH DE LD IX,CORE_BUFFERS.BUFFER+#C000 @@ -884,7 +900,7 @@ WOV1: PUSH BC EXX POP DE JP C,PWERR1 - LD HL,512 + LD HL,512 ;!HARDCODE AND A SBC HL,DE LD B,H @@ -892,18 +908,18 @@ WOV1: PUSH BC POP HL AND A SBC HL,BC - JR NC,WOV3 + JR NC,.WOV3 ADD HL,BC LD B,H LD C,L LD HL,0 -WOV3: PUSH HL +.WOV3: PUSH HL LD HL,CORE_BUFFERS.BUFFER ADD HL,DE - LD DE,(R_POINT) + LD DE,(.R_POINT) EX DE,HL LDIR - LD (R_POINT),HL + LD (.R_POINT),HL EXX PUSH HL PUSH DE @@ -925,7 +941,7 @@ WOV3: PUSH HL POP HL LD C,B ADC HL,BC - JP WOV4 + JP .WOV4 ////////////// OLD //////////////// ; HL - CLUSTER diff --git a/DSS/EXECUTE.ASM b/DSS/EXECUTE.ASM index c14bcca..37d66eb 100644 --- a/DSS/EXECUTE.ASM +++ b/DSS/EXECUTE.ASM @@ -882,7 +882,7 @@ EXEC0_SHORT: ; GET PATH AND ETC. LD HL,ENVPATH LD DE,ENVTEMP - LD B,Dss.Environ.Get + LD B,high Dss.Environ.Get CALL ENVIRON LD HL,(CMDLINE) diff --git a/DSS/FAT_X.ASM b/DSS/FAT_X.ASM index 65a9cc6..42c7ee9 100644 --- a/DSS/FAT_X.ASM +++ b/DSS/FAT_X.ASM @@ -16,14 +16,14 @@ R_CLUST LD HL,#0001 G_CLUST: .num+1: LD HL,#0001 -G_CLUS1: INC HL ; номер кластера +.loop: INC HL ; номер кластера CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера CP DSS_Error.sys.DISK_FULL SCF RET Z ; ошибка ? LD A,D OR E - JR NZ,G_CLUS1 + JR NZ,.loop LD (G_CLUST.num),HL XOR A RET @@ -36,9 +36,9 @@ INC_FAT PUSH HL PUSH HL PUSH HL EX DE,HL ; hl=номер кластера -INC_FA2 CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера +.loop: CALL R_F_FAT ; прочитать из кеша FAT-а номер след. кластера EX DE,HL - JR NC,INC_FA2 ; не конец цепочки + JR NC,.loop ; не конец цепочки EX DE,HL POP DE ; номер кластера CALL W_T_FAT ; записать в кеш FAT-а номер кластера @@ -59,6 +59,7 @@ INC_FA2 CALL R_F_FAT ; ; CF - конец цепочки ;!FIXIT далее заточка на то, что в DE всегда 0 - раздел не больше 2Gb ;----------------------------------------------------------- +;!FIXIT отдаёт разный CF при удачном завершении в зависимости от FAT16/FAT12 R_F_FAT: EX DE,HL LD HL,(MAX_CLU) @@ -171,7 +172,8 @@ R_F_F16: ; RR H ; сдвиг вправо через CF ; RR L ; CLUSTER * 1.5 ; PUSH AF ; сохр. флаг -R_F_F12 LD D,H +R_F_F12: + LD D,H LD E,L RR H RR L ; сдвиг вправо через CF @@ -217,7 +219,8 @@ R_F_F12 LD D,H ; RR E ; RR D ; RR E -R_F_F01 LD A,E +R_F_F01: + LD A,E AND #F0 RR D ; вправо на 4 битa RRA @@ -228,7 +231,8 @@ R_F_F01 LD A,E RR D RRA LD E,A -R_F_F02 POP AF +R_F_F02: + POP AF OUT (SLOT3),A LD HL,#0FEF XOR A ; обнуляем CF и устанавливаем код ошибки = нулю @@ -295,7 +299,8 @@ W_T_F16: RET ; ; fat12 -W_T_F12 PUSH DE +W_T_F12: + PUSH DE LD D,H LD E,L ; ADD HL,HL @@ -408,35 +413,34 @@ RE_FAT: PUSH HL ; Подключить банку кеша FAT и записать его на диск WR_FAT: SET_PAGE_X FATPAGE PUSH AF - CALL .Start + CALL .Start ;!TODO нет контроля ошибок POP AF OUT (SLOT3),A RET ; Запись кеша (всего?) FAT-а на диск .Start: LD HL,(FATCASH) LD H,0 - LD (FATCASH),HL + ;LD (FATCASH),HL ADD HL,HL ADD HL,HL ADD HL,HL - ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT ;!TODO FATcacheSize + ADD HL,HL ;FAT BLOCK * 16 = SECTOR OF FAT ;!TODO FATcacheSize PUSH HL LD B,H - LD C,L ;BC - BLOCK OF FAT - LD DE,16 ;!HARDCODE ;!TODO FATcacheSize - ADD HL,DE ;+ SIZE CASH (16 SECTORS) - - LD DE,(CORE_BUFFERS.BootSector.S_P_F) ; секторов на FAT - LD A,16 ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize + LD C,L ;BC - BLOCK OF FAT + LD DE,16 ;!HARDCODE ;!TODO FATcacheSize + ADD HL,DE ;+ SIZE CASH (16 SECTORS) + LD A,E ;!HARDCODE ; MAX число секторов для чтения в кэш ;!TODO FATcacheSize + 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,16 ;!HARDCODE ; число секторов ;!TODO FATcacheSize ; CF = 0 SBC HL,DE - JP C,FATERR + JP C,.ERR LD A,L .WALLFAT: LD H,B @@ -466,9 +470,15 @@ WR_FAT: SET_PAGE_X FATPAGE LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.Write RST ToDSS.DRV + AND A ;!TODO нет контроля ошибок + ; +.ERR: LD A,0 + LD (FATCASH.Update),A + RET NC + POP HL + ; CF = 1 RET ;R01 - ;R01WR_FAT LD HL,(FATCASH) ;R01 LD H,0 ;R01 LD (FATCASH),HL @@ -521,10 +531,6 @@ WR_FAT: SET_PAGE_X FATPAGE ;R01 RST #18 ;R01 RET -FATERR: POP HL - ; CF = 1 - RET - FATCASH: WORD #0000 .Block EQU FATCASH .Update EQU FATCASH+1 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index fcf1d4d..2798e6b 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -23,31 +23,31 @@ RESERVED2 BLOCK 490,0 ;File Manipulator (FM) STRUCT _sFM ; 47 bytes ; from FAT -.NAME: TEXT 8,{". "," "} ;+00 NAME -.EXT: TEXT 3,{" "," "} ;+08 EXT -.ATTRIBUT: BYTE #10 ;+11 ATTRIBUT -.RESERVED_NT: BYTE #00 ;+12 RESERVED -.RESERVED_FAT32: BYTE #00 ;+13 RESERVED -.CREATE_TIME_FAT32: WORD #0000 ;+14 RESERVED -.CREATE_DATE_FAT32: WORD #0000 ;+16 RESERVED -.RESERVED_FAT32_1: WORD #0000 ;+18 RESERVED -.RESERVED_FAT32_2: WORD #0000 ;+20 RESERVED -.TIME: WORD #0000 ;+22 TIME -.DATE: WORD #0000 ;+24 DATE -.ST_CLUSTER: WORD #0000 ;+26 START CLUSTER -.F_SIZE: DWORD #00000000 ;+28 SIZE FILE +.NAME: TEXT 8,{". "," "} ;+ #00 +00 NAME +.EXT: TEXT 3,{" "," "} ;+ #08 +08 EXT +.ATTRIBUT: BYTE #10 ;+ #0B +11 ATTRIBUT +.RESERVED_NT: BYTE #00 ;+ #0C +12 RESERVED +.RESERVED_FAT32: BYTE #00 ;+ #0D +13 RESERVED +.CREATE_TIME_FAT32: WORD #0000 ;+ #0E +14 RESERVED +.CREATE_DATE_FAT32: WORD #0000 ;+ #10 +16 RESERVED +.RESERVED_FAT32_1: WORD #0000 ;+ #12 +18 RESERVED +.RESERVED_FAT32_2: WORD #0000 ;+ #14 +20 RESERVED +.TIME: WORD #0000 ;+ #16 +22 TIME +.DATE: WORD #0000 ;+ #18 +24 DATE +.ST_CLUSTER: WORD #0000 ;+ #1A +26 START CLUSTER +.F_SIZE: DWORD #00000000 ;+ #1C +28 SIZE FILE ; from Core -.F_POSITION: DWORD #00000000 ;+32 FILE POSITION (FP) -.DIR_CLUSTER: WORD #0000 ;+36 DIRECTORY CLUSTER -.HANDLE: WORD #0000 ;+38 HANDLE NUMBER -.DRIVE: BYTE #00 ;+40 DRIVE OR CURRENT -.ACCESS_MODE: BYTE #00 ;+41 ACCESS MODE признак изменения файла -.TASK_NUM: BYTE #00 ;+42 TASK -;.EMPTY: BYTE #00 ;+43 EMPTY -.KnownCluster_L: BYTE 0 ;+43 Младший байт номера кластера для которого известно относительное смещение внутри файла -.KnownCluster_H: BYTE 0 ;+44 Старший байт номера кластера для которого известно относительное смещение внутри файла -.KnownOffset_L: BYTE 0 ;+45 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. -.KnownOffset_H: BYTE 0 ;+46 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.F_POSITION: DWORD #00000000 ;+ #20 +32 FILE POSITION (FP) +.DIR_CLUSTER: WORD #0000 ;+ #24 +36 DIRECTORY CLUSTER +.HANDLE: WORD #0000 ;+ #26 +38 HANDLE NUMBER +.DRIVE: BYTE #00 ;+ #28 +40 DRIVE OR CURRENT +.ACCESS_MODE: BYTE #00 ;+ #29 +41 ACCESS MODE признак изменения файла +.TASK_NUM: BYTE #00 ;+ #2A +42 TASK +;.EMPTY: BYTE #00 ;+ #2B +43 EMPTY +.KnownCluster_L: BYTE 0 ;+ #2B +43 Младший байт номера кластера для которого известно относительное смещение внутри файла +.KnownCluster_H: BYTE 0 ;+ #2C +44 Старший байт номера кластера для которого известно относительное смещение внутри файла +.KnownOffset_L: BYTE 0 ;+ #2D +45 Младший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. +.KnownOffset_H: BYTE 0 ;+ #2E +46 Старший байт смещения (в кластерах) относительно начала файла для сохраненного номера кластера. ENDS ; diff --git a/DSS/build.txt b/DSS/build.txt index d759b56..2bf5aee 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -537 \ No newline at end of file +567 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index d931abd..9bba147 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -1,5 +1,5 @@ ; - DEFINE TEST_FEATURE 1 + DEFINE TEST_FEATURE 0 ; ; diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index 3496c7a..f025f2a 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -403,7 +403,7 @@ EVALSTR: ld a,(hl) ld h,b ; hl=имя перем. ld l,c inc hl - ld bc,Dss.Environ.Get*256 + Dss.Environ ; получить перем. окружения + ld bc,Dss.Environ.Get ; получить перем. окружения RST ToDSS .TNOVAR: pop hl inc hl diff --git a/SHELL/Commands/PATH.ASM b/SHELL/Commands/PATH.ASM index 949cfc5..9f18de3 100644 --- a/SHELL/Commands/PATH.ASM +++ b/SHELL/Commands/PATH.ASM @@ -27,7 +27,7 @@ cmd_path: ld (hl),"A" dec hl ld (hl),"P" ; начало строки имени - ld bc,Dss.Environ.Set*256 + Dss.Environ ; устан./удалить перем. окружения + ld bc,Dss.Environ.Set ; устан./удалить перем. окружения RST ToDSS call c,print_err_message ; вывод сообщения ret @@ -36,7 +36,7 @@ cmd_path: A85B9: ;ld de,T9186 ; куда ld de,work_buffer1; ld hl,T858C ; имя переменной "PATH=" - ld bc,Dss.Environ.Get*256 + Dss.Environ ; получить переменную окружения + ld bc,Dss.Environ.Get ; получить переменную окружения RST ToDSS jp c,print_err_message ; вывод сообщения ld hl,T858C ; "PATH=",0 diff --git a/SHELL/Commands/SET.ASM b/SHELL/Commands/SET.ASM index e388ec9..7034ad2 100644 --- a/SHELL/Commands/SET.ASM +++ b/SHELL/Commands/SET.ASM @@ -14,7 +14,7 @@ cmd_set:ld a,(de) ; jr c,cmd_set dec de ex de,hl - ld bc,Dss.Environ.Set*256 + Dss.Environ + ld bc,Dss.Environ.Set RST ToDSS call c,print_err_message ; вывод сообщения ret @@ -22,7 +22,7 @@ cmd_set:ld a,(de) ; ; Показать системное окружение A85EE: ;ld hl,T9186 ; куда ld hl,work_buffer1; - ld bc,Dss.Environ.Read*256 + Dss.Environ ; получить сист. окружение + ld bc,Dss.Environ.Read ; получить сист. окружение RST ToDSS ;ld hl,T9186 ld hl,work_buffer1; diff --git a/Shared_Includes b/Shared_Includes index 8641b77..b69773d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8641b77d8ebe42ae042bb8df3902300e678048eb +Subproject commit b69773d50cb2c0e1da44f7f20c7daa32871f2308